El entorno
X Window proporciona herramientas increíblemente potentes, pero que si no son correctamente configuradas pueden convertirse en peligrosas. Este sistema está formado por una serie de piezas que trabajan conjuntamente para ofrecer al usuario final un interfaz gráfico:
- La más importante de ellas, sobre todo desde el punto de vista de la seguridad es el servidor X. Este programa generalmente se ejecuta en la terminal de usuario, y tiene como función principal ofrecer unas primitivas básicas de dibujo (trazado de rectas, relleno de áreas...) sobre la pantalla; además gestiona eventos de teclado y ratón.
- Las aplicaciones X son programas de usuario que lanzan llamadas contra un servidor X. Mientras que el servidor se ejecuta habitualmente en la terminal desde donde conecta el usuario las aplicaciones se pueden lanzar desde el mismo equipo o también desde una máquina más potente, de forma que aprovechamos la capacidad de procesamiento de ese equipo pero visualizamos el resultado en la terminal gráfica; en este caso se ha de indicar a los clientes la ubicación del servidor, mediante la variable de entorno $DISPLAY o mediante la opción de línea de comandos `-display'.
- El gestor de ventanas es un caso particular de aplicación, ya que se encarga de ofrecer un entorno de trabajo más amigable al usuario que está trabajando en la terminal: dibujo de marcos, menús, cerrado de ventanas...
Es el servidor
X Window quien establece su política de seguridad para permitir a determinados clientes utilizar sus servicios. Para ello existen dos mecanismos básicos: la autenticación por testigo y la autenticación por máquina ([Fis95]; otros esquemas, como SUN-DES-1, no los vamos a contemplar aquí.
Autenticación por máquina
La autenticación por máquina cliente (
host authentication) es el mecanismo más simple, pero la seguridad que proporciona es muy limitada; es útil en entornos donde los clientes
X se ejecutan o bien en estaciones monousuarios o bien en equipos donde todos los usuarios son confiables ([Vic94]). Además, en sistemas antiguos es el único modelo de seguridad disponible, por lo que en ocasiones no queda más remedio que limitarse a él. Funciona configurando el servidor para permitir conexiones a él provenientes de una lista de máquinas, por ejemplo con la orden
xhosts:
anita:~# xhost +luisa
luisa being added to access control list
anita:~#
Si ejecutamos la sentencia anterior en la máquina donde se ejecuta el servidor,
cualquier usuario del sistema remoto estará autorizado a lanzar aplicaciones contra él15.4:
luisa:~# xterm -display anita:0.0 &
[1] 11974
luisa:~#
La orden
xhost sin opciones nos dará una lista de los clientes que pueden lanzar aplicaciones contra el servidor, mientras que la opción especial
`+' deshabilitará este control de acceso, algo que evidentemente no es recomendable: cualquier usuario de cualquier sistema podrá utilizar nuestro servidor:
anita:~# xhost
access control enabled, only authorized clients can connect
LOCAL:
INET:anita
INET:localhost
INET:luisa
anita:~# xhost +
access control disabled, clients can connect from any host
anita:~# xhost
access control disabled, clients can connect from any host
LOCAL:
INET:anita
INET:localhost
INET:luisa
anita:~#
Una medida de seguridad básica utilizando este modelo es habilitar la máquina en nuestra lista de
hosts sólo el tiempo necesario para que el cliente arranque, y deshabilitarla después; así la ejecución de la aplicación cliente funcionará normalmente, pero no se podrán lanzar nuevas peticiones al servidor. También para eliminar una dirección de la lista utilizamos la orden
xhost:
anita:~# xhost
access control enabled, only authorized clients can connect
LOCAL:
INET:anita
INET:localhost
INET:luisa
anita:~# xhost -luisa
luisa being removed from access control list
anita:~# xhost
access control enabled, only authorized clients can connect
LOCAL:
INET:anita
INET:localhost
anita:~#
De esta forma, cuando alguien intente lanzar una aplicación contra nuestro servidor desde un sistema no autorizado verá un mensaje de error similar al siguiente:
luisa:~# xterm -display anita:0.0
Xlib: connection to "anita:0.0" refused by server
Xlib: Client is not authorized to connect to Server
Error: Can't open display: anita:0.0
luisa:~#
Como hemos dicho, este modelo de seguridad es demasiado vulnerable; por un lado, estamos autenticando clientes en base a una dirección o a un nombre de máquina, algo fácilmente falsificable por un atacante. Por otro, aunque los usuarios de los sistemas a los que permitimos utilizar nuestro servidor sean conocidos, fiables, y amantes de la naturaleza, nada nos demuestra que sus sistemas sean seguros, por lo que si sus equipos se ven comprometidos, nuestro servidor también.
Autenticación por testigo
Este mecanismo de
X Window es el más seguro, y por tanto el más recomendado; en él, el servidor controla el acceso de los clientes mediante una
`cookie' MIT-MAGIC-COOKIE-1, que no es más que un código de acceso aleatorio de 128 bits en un formato legible por la máquina: esta
cookie actua como un
password temporal, de forma que sólo los clientes que conozcan ese
password podrán acceder al servidor. La
cookie es generada por
xdm o por el propio usuario al principio de cada sesión, con
xauth, y guardada en el fichero
$HOME/.Xauthority; a partir de ese momento, los programas clientes leerán su valor y lo enviarán al servidor cada vez que deseen conectar a él. Podemos comprobar que poseemos - al menos - la
cookie correspondiente a nuestro
display con una orden como la siguiente:
luisa:~# xauth list
luisa:0 MIT-MAGIC-COOKIE-1 8c1d09aab44573a524467c4e8faaaeb5
luisa/unix:0 MIT-MAGIC-COOKIE-1 8c1d09aab44573a524467c4e8faaaeb5
luisa:~#
El comando anterior,
xauth, se utiliza para manejar la información de las
cookies de cada usuario; por ejemplo, un uso muy habitual es la transferencia de
cookies a máquinas remotas, para que puedan así conectar al servidor
X de un determinado equipo. Para ello debemos extraer la
cookie de nuestro
$DISPLAY y enviarla al fichero
$HOME/.Xauthority del sistema remoto, con una orden como esta:
luisa:~# xauth extract - $DISPLAY | ssh anita -l toni xauth merge -
luisa:~#
Este mecanismo tiene principalmente dos problemas de seguridad: por un lado, las
cookies se transmiten en texto claro por la red, por lo que son susceptibles de ser interceptadas; por otro, al estar guardadas en el fichero
$HOME/.Xauthority, cualquiera que lo pueda leer tendrá acceso a ellas: es muy importante que este archivo tenga permiso de lectura y escritura sólo para su propietario, y que también tomemos precauciones si los directorios
$HOME de los usuarios son exportados vía NFS.