Hasta ahora hemos visto dos formas de transferir ficheros desde una máquina
Unix mediante FTP: o bien el usuario conecta utilizando su login y
su clave al sistema y descarga de él cualquier archivo sobre el que tenga
permiso de lectura, de cualquier parte del sistema de ficheros, o bien
accede a un entorno restringido mediante chroot() como usuario anónimo,
con un login genérico y usando como contraseña una dirección de
correo - seguramente falsa -. En muchas ocasiones, estos modelos pueden
resultar insuficientes o al menos poco adecuados a nuestras necesidades.
Imaginemos esta situación: un proveedor de acceso a Internet decide ofrecer
a sus clientes la posibilidad de actualizar sus páginas web personales
mediante
FTP, de forma que cada uno de ellos no tiene más que conectar con su
nombre de usuario y su contraseña al servidor y subir sus ficheros HTML; dichos login y password serán por supuesto diferentes para
cada usuario, por lo que parece claro que un entorno de FTP anónimo no
es aplicable - al menos de forma inmediata - en esta situación. El FTP `normal' funcionaría correctamente, pero su utilización tampoco es
óptima: si un usuario no necesita acceder más que a su $HOME para
actualizar sus páginas, >por qué permitirle que vea todo nuestro sistema de
ficheros, aunque sea vía FTP, y que pueda descargar archivos tan
comprometedores como /etc/passwd?
Los potenciales problemas de seguridad que la situación anterior implica
han dado lugar a un tercer tipo de acceso FTP denominado invitado
(guest), que se puede contemplar como una mezcla de los dos vistos hasta
el momento. La idea de este mecanismo es muy sencilla: se trata de permitir que
cada usuario conecte a la máquina mediante su login y su contraseña,
pero evitando que tenga acceso a partes del sistema de ficheros que no necesita
para realizar su trabajo; conectará a un entorno restringido mediante chroot(), algo muy similar a lo que sucede en los accesos anónimos.
Para poder crear fácilmente entornos FTP restringidos a cada usuario
es conveniente instalar WU-ftpd en la máquina; este servidor está
disponible libremente a través de Internet, en la dirección ftp://ftp.wu-ftpd.org/pub/wu-ftpd/. Otros servidores, como el distribuido con
Solaris, permiten crear usuarios FTP invitados pero de una forma más
compleja; en los ejemplos que veamos en este punto vamos a asumir que utilizamos
WU-ftpd.
Lo primero que necesitamos para configurar el entorno al que van a conectar
este tipo de usuarios es una estructura de directorios y archivos muy similar
a la que hemos estudiado para los accesos a través de FTP anónimo,
pero esta vez colgando del directorio de conexión del usuario invitado; con
unas pequeñas variaciones, podemos utilizar para crear este entorno el
shellscript que hemos presentado en el punto anterior. Así, si
queremos que nuestro usuario toni acceda como invitado vía FTP podemos crear esta estructura en su $HOME:
anita:~# /usr/local/sbin/creaentorno /export/home/toni
Creando estructura de directorios para SunOS
Instalando programas y librerias...
Generando /etc/passwd...
Generando /etc/group...
Generando pub/ e incoming...
SunOS: Instalando librerias...
SunOS: Generando dispositivos...
FIN
anita:~#
Realmente, son necesarias pequeñas modificaciones sobre el esquema anterior
para que todo funcione correctamente; por un lado, los directorios pub/
e incoming/ no son necesarios en los accesos como invitado, ya que a
priori los usuarios que accedan de esta forma necesitarán escribir en
varios directorios del entorno. Además, quizás nos interese repasar los
permisos de toda la jerarquía de directorios creada, para afinar más
los lugares en los que se les permita escribir a los usuarios; por ejemplo,
si sólo van a subir archivos a un directorio $HOME/public_html/,
donde se ubicarán sus páginas web, no tienen por qué escribir en el
resto del entorno. De la misma forma, si el directorio $HOME es
propiedad de cada usuario quizás pueda borrar archivos como lib, que es
un enlace a usr/lib/, lo que puede llegar a comprometer nuestra
seguridad.
Otro punto a tener en cuenta es quién va a poseer ficheros dentro del
entorno restringido, ya que esos usuarios y sus grupos deberán tener una
entrada en los archivos etc/passwd y etc/group; como sucedía
con los usuarios anónimos, estos ficheros no se van a usar aquí para
realizar autenticación, sino simplemente para ver los nombres del usuario y
grupo propietarios de cada fichero al realizar un listado, por lo que en
ninguno de ellos es necesaria una contraseña real: basta con un asterisco en
el campo correspondiente.
Una vez que hemos creado correctamente el entorno es necesario configurar
el acceso del usuario en cuestión. Generalmente no nos interesará que
acceda por telnet o similar, por lo que su shell en /etc/passwd (el original de la máquina, no el del entorno restringido) ha de
ser algo como /bin/false. Es necesario que exista una entrada para este
shell en /etc/shells, ya que de lo contrario el usuario no podrá
autenticarse; si este último archivo no existe, es necesario crearlo. Su
directorio $HOME, indicado en /etc/passwd, también ha de ser
modificado de la siguiente forma:
toni:x:1002:10:Toni at ANITA:/export/home/toni/./:/bin/sh
Como vemos, se añade `/./' al directorio $HOME del usuario. Esta
cadena
indica dónde se va a efectuar el chroot() (por ejemplo, si quisiéramos
que el chroot() se hiciera sobre /export/home/ y tras esta llamada
el usuario entrara a su directorio toni, lo indicaríamos como
/export/home/./toni/).
Tras modificar /etc/passwd hemos de modificar /etc/group para
incluir al usuario `toni' en un grupo que luego definiremos como
invitado, por ejemplo `rftp':
anita:~# grep toni /etc/group
rftp::400:toni
anita:~#
Ahora falta por configurar el archivo /etc/ftpaccess; hemos de indicarle
al demonio que utilice este fichero (por ejemplo, mediante la opción `-a'). En él definimos el grupo `guest' en las clases apropiadas:
class local real,guest,anonymous *.domain 0.0.0.0
class remote real,guest,anonymous *
También le damos a los usuarios `guest' los permisos que consideremos
oportunos; habitualmente, interesará que puedan borrar, sobreescribir y
renombrar sus archivos. Pero no es normal que necesiten ejecutar cambios en los
modos de los ficheros o en su máscara de permisos:
delete no anonymous # delete permission?
overwrite no anonymous # overwrite permission?
rename no anonymous # rename permission?
chmod no anonymous,guest # chmod permission?
umask no anonymous,guest # umask permission?
Y por último, también en /etc/ftpaccess, definimos al grupo `rftp' como invitado:
guestgroup rftp
Una vez llegados a este punto el usuario ya está en disposición de
conectar como invitado vía FTP; aunque realmente accederá a su
$HOME, para él será el directorio raíz, y no verá ningún
archivo del sistema que no se encuentre en este directorio.
Antes de finalizar, un último apunte: el entorno restringido que acabamos
de ver sólo se aplica para accesos por FTP; así, si el usuario
tiene definido un shell estándar en /etc/passwd, cuando conecte
mediante telnet o similar seguirá teniendo acceso a todo el sistema de
ficheros, por lo que todo el trabajo que hemos realizado perdería su
sentido. Aunque en el siguiente punto daremos alguna idea para crear entornos
restringidos en los accesos por terminal remota, esta situación es mucho
más extraña que la de los accesos invitados, por lo que normalmente (y esto
es muy importante) los shells de los usuarios invitados han de ser
del tipo /bin/false, es decir, no les permitiremos una sesión
interactiva en el sistema por terminal remota. Con un shell de este
estilo, si intentan acceder a la máquina (por ejemplo mediante telnet),
nada más introducir correctamente su login y su password serán
desconectados:
luisa:~# telnet anita
Trying 192.168.0.3...
Connected to anita.
Escape character is '^]'.
SunOS 5.7
login: toni
Password:
Connection closed by foreign host.
luisa:~#
© 2002 Antonio Villalón Huerta