Hace unos días expliqué cómo instalar y configurar Openbox en Debian. Ahora voy a demostrar cómo iniciar Openbox y ejecutar una aplicación gráfica (GUI) en un host remoto, todo a través de una sesión SSH, como si la aplicación estuviese corriendo en nuestro escritorio. Sólo es necesario contar con OpenSSH y el servidor X.org en ambos extremos de la conexión (tanto en el cliente OpenSSH, como en el servidor).

El problema que me llevó a instalar Openbox en un servidor GNU/linux es el siguiente: una aplicación Java propietaria, que corre en un servidor Debian, tiene un sistema de licenciamiento cuya activación sólo puede ser realizada ejecutando una aplicación gráfica en el propio servidor. Esto se debe a que se trataba originalmente una aplicación para servidores Windows, a la que luego se le agregó soporte para sistemas GNU/Linux. Se imaginarán que, al tratarse de una aplicación Java, no hubo mucho mérito en agregarle soporte para GNU/Linux (Java es multiplataforma), mucho peor si es requisito que el servidor posea un entorno de escritorio, el cual es utilizado sólo durante la activación. Lógicamente el servidor X se inicia sólo para activar la licencia, y luego se detiene inmediatamente. Pero hay que tenerlo instalado de todas formas, lo que agrega una mayor superficie de ataque, entorpece en gran medida el mantenimiento, impide la automatización de tareas, e incrementa el uso de recursos.

Ahora bien, a simple vista a muchos incautos les puede parecer que mis argumentos no tienen peso suficiente para evitar el uso de un entorno de escritorio en un servidor GNU/Linux, pero ¿qué pasa si no tenemos acceso físico al servidor en cuestión?

Para lanzar un entorno de escritorio es necesario tener acceso a una terminal. Esto es trivial en sistemas de escritorio ya que nuestros periféricos están conectados directamente al sistema, es decir, el sistema es a su vez la propia terminal. Pero la situación cambia cuando se trata de un sistema remoto, cuya terminal física está fuera de nuestro alcance, y al cual accedemos utilizando, por ejemplo, SSH.

El problema entonces, es que para poder iniciar un servidor gráfico, es necesario contar con un display, cosa que no se tiene en una sesión SSH (ya que por defecto se trata de una sesión de texto plano). Pero afortunadamente OpenSSH tiene la capacidad de redirigir el tráfico del servidor X, a fin de poder abrir aplicaciones gráficas desde el cliente.

Manos a la obra

Partiendo de un sistema Debian con un gestor de ventanas instalado (por ejemplo Openbox), sólo es necesario configurar correctamente el servidor OpenSSH.

Abrir con un editor (vi o nano) el archivo de configuración del demonio OpenSSH (/etc/ssh/sshd_config) y verificar que se encuentre activado el forwarding de tráfico de X11:

X11Forwarding yes

Si es necesario realizar modificaciones, guardar el archivo y reiniciar el servidor OpenSSH:

# service ssh restart

Desde un cliente con entorno gráfico (es decir con X11 en ejecución, por ejemplo FreeBSD 10.1 con KDE) iniciar una sesión SSH con el servidor en cuestión, utilizando los siguientes parámetros:

% ssh -X -Y admin@debian.linuxito.com

La opción -X se utiliza para permitir el reenvío de tráfico del servidor X11, y la opción -Y para indicar que se trata de una conexión confiable (para que no sea sujeta a los controles de seguridad de X11). Esto es necesario ya que el forwarding de tráfico de X11 es considerado inseguro por naturaleza. Aquellos usuarios con la capacidad de evitar las restricciones a nivel permisos en el archivo de base de datos de autorización de X, pueden acceder al display X11 a través de la conexión reenviada. Un atacante puede entonces ser capaz de realizar actividades tales como el monitoreo de teclado (keylogging).

Una vez establecida la conexión, configurar el X11 para que se permita iniciar el servidor desde cualquier sesión, no sólo desde una TTY:

$ su
# nano /etc/X11/Xwrapper.config

La variable allowed_users debe tener el valor "anybody":

allowed_users=anybody

Guardar los cambios y cerrar la sesión de root:

# exit
$

Luego iniciar el servidor X en el host remoto:

$ xinit > /dev/null 2>&1 &

Al iniciar el servidor X en segundo plano (&), Bash reporta el PID (process ID).

A partir de este momento es posible comenzar a lanzar aplicaciones gráficas, las cuales aparecen en el escritorio del cliente, por ejemplo xterm (una terminal gráfica para X11):

Notar que para cada aplicación se abre una ventana nueva en el cliente:

Para abrir muchas aplicaciones al mismo tiempo, simplemente basta con lanzarlas en segundo plano:

En este ejemplo sólo abrí aplicaciones gráficas incluidas en el paquete x11-apps, pero es posible abrir cualquier tipo de aplicación gráfica como Firefox, Nautilus, Konkeror, Gedit, Kwrite, etc.

Finalmente resta detener el servidor X, antes de cerrar la sesión SSH. Para ello basta con enviar la señal 15 (SIGTERM) al proceso en cuestión.

$ kill -15 [PID]

Si no recordamos el PID reportado al ejecutar xinit, es posible obtenerlo observando la primera columna de la salida del comando ps:

Para más información:

man ssh
man sshd_config
man xorg


Tal vez pueda interesarte


Compartí este artículo