Los servicios r-$\ast $

Los servicios r-* de Unix BSD (aparecieron inicialmente en la versión 4.2 de esta variante de Unix) son herramientas con una parte cliente y una servidora que permiten la conexión remota entre máquinas, principalmente para servicios de terminal remota y transferencia de ficheros. Las herramientas clientes son rsh, rlogin y rcp, mientras que las servidoras son demonios como rexecd, rshd o rlogind (en algunas versiones de Unix, con in. delante del nombre del demonio); rdist y rdistd, otro par de estas herramientas r-*, no los vamos a tratar aquí.

rlogin (puerto 513, TCP) se utiliza como terminal virtual de un sistema Unix , de una forma muy parecida a TELNET. rsh (puerto 514, TCP) es utilizado para ejecutar comandos en una máquina remota sin necesidad de acceder a ella, y rcp (vía rsh) para copiar ficheros entre diferentes máquinas:
luisa:~# rlogin -l toni rosita

Overflow on /dev/null, please empty the bit bucket.

rosita:~$ exit
logout
rlogin: connection closed.
luisa:~# rsh -l toni rosita id
uid=1000(toni) gid=100(users) groups=100(users)
luisa:~# rcp prueba.tex toni@rosita:/tmp/
luisa:~#
Como vemos, la última orden no ha solicitado ninguna contraseña; ha copiado el fichero local `prueba.tex' en el directorio /tmp/ del sistema remoto, bajo la identidad del usuario toni. A continuación veremos por qué no se ha pedido clave para realizar esta acción.

Estos servicios pretenden evitar el tránsito de contraseñas por la red, ya que este movimiento de claves implica molestias a los usuarios y también problemas de seguridad; para conseguirlo, entran en juego lo que los diseñadores del sistema de red de Unix BSD denominaron `máquinas fiables' y `usuarios fiables': cualquier usuario, puede hacer uso de recursos de una máquina remota sin necesidad de una clave si su conexión proviene de una máquina fiable o su nombre de usuario es fiable.

Una máquina se puede considerar fiable de dos formas: o bien su nombre se encuentra en
/etc/hosts.equiv
, o bien se encuentra en un fichero denominado .rhosts y situado en el $HOME de algún usuario. Si estamos en el primer caso, cualquier usuario (excepto el root) del sistema remoto - y fiable - puede hacer acceder a nuestro equipo bajo el mismo login que tiene en el primero, sin necesidad de claves. En el segundo caso, utilizando los ficheros .rhosts, cualquier usuario del sistema remoto podrá conectar al nuestro pero sólo bajo el nombre de usuario en cuyo $HOME se encuentra el archivo. Por ejemplo, imaginemos la siguiente configuración:
rosita:~# cat /etc/hosts.equiv
luisa
rosita:~# cat ~toni/.rhosts
anita
rosita:~#
En esta situación, cualquier usuario de luisa puede acceder a rosita si su nombre de usuario es el mismo; además, el usuario toni de anita puede también conectar a rosita sin necesidad de ninguna contraseña:
anita:~$ rlogin rosita

In the long run, every program becomes rococo, and then rubble.
                -- Alan Perlis

rosita:~$ id
uid=1000(toni) gid=100(users) groups=100(users)
rosita:~$
Aparte de máquinas fiables habíamos hablado de usuarios fiables; la idea es la misma que antes, pero aplicándola ahora a nombres de usuario junto a (o en lugar de) nombres de máquina. Podemos indicar estos nombres tanto en /etc/hosts.equiv como en los archivos .rhosts; no obstante, la primera opción no es recomendable, ya que estaríamos permitiendo al usuario fiable del sistema remoto acceder sin contraseña a cualquier cuenta de nuestra máquina. De esta forma, si deseamos crear usuarios fiables de sistemas remotos, es necesario hacerlo en los archivos .rhosts. Por ejemplo, imaginemos que el usuario toni de nuestra máquina tiene un nombre de usuario distinto (antonio) en un sistema remoto, y desea establecer una relación de confianza; para ello creará en su $HOME el siguiente archivo .rhosts:
rosita:~# cat ~toni/.rhosts
amparo antonio
rosita:~#
Entonces, desde la máquina amparo el usuario antonio podrá acceder a la cuenta de toni en nuestro sistema sin utilizar contraseñas:
amparo:~$ id
uid=102(antonio) gid=10(staff)
amparo:~$ rlogin -l toni rosita

It is practically impossible to teach good programming style to
students that have had prior exposure to BASIC: as potential
programmers they are mentally mutilated beyond hope of
regeneration.
                -- Dijkstra

rosita:~$ id
uid=1000(toni) gid=100(users) groups=100(users)
rosita:~$
Como podemos ver, las relaciones de confianza entre equipos Unix pueden ser muy útiles y cómodas, pero al mismo tiempo muy peligrosas: estamos confiando plenamente en sistemas remotos, por lo que si su seguridad se ve comprometida también se ve la nuestra. Las máquinas fiables se han de reducir a equipos de la misma organización, y administrados por la misma persona; además, es necesario tener siempre presente que si tenemos habilitados los servicios r-* cualquier usuario puede establecer relaciones de confianza, lo que puede suponer una violación de nuestra política de seguridad. Es conveniente chequear los directorios $HOME en busca de ficheros .rhosts (en la sección 13.2.6 se presentaba un shellscript que convenientemente planificado puede ayudarnos en esta tarea); muchos administradores prefieren no complicarse buscando estos ficheros, y configuran sus sistemas para que en cada $HOME exista un fichero con este nombre, propiedad de root y con modo 000: así los usuarios no tienen ocasión de otorgar confianza a sistemas remotos. Esto se puede conseguir con el siguiente shellscript:
#!/bin/sh
for i in `cat /etc/passwd |awk -F: '{print $6}'`; do
    cd $i
    > .rhosts
    chmod 0 .rhosts
done
Las relaciones de confianza son transitivas: si una máquina confía en otra, lo hace también en todas en las que confía ella. De esta forma se crean anillos de confianza entre máquinas, y como las relaciones suelen estar basadas en el nombre del equipo se trata de objetivos ideales para un atacante mediante IP Spoofing: si un pirata consigue hacer pasar su equipo por uno de los confiables, automáticamente ha conseguido acceso - casi ilimitado - al resto de las máquinas.
© 2002 Antonio Villalón Huerta