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