Chroot, enjaular o jail. Incrementa la seguridad de tu sistema.
Tiemblo cada vez que me piden cuentas de usuario o de ftp. Como dirían en las historias de BOFH (Bastard Operator From Hell)), si los usuarios supiesen la responsabilidad que nos piden a los administradores de sistemas por pedirnos una cuenta para un cliente, se flagelarían echándose sal en las heridas. En fin, me dejo de tonterías y a lo serio que es lo que interesa:
¿Cómo montar un servidor de sftp (secure ftp) o scp con el usuario enjaulado y SIN CUENTA shell?
Enjaular a un usuario en un directorio, de tal modo que no pueda salir de ese PATH y curiosear en donde no le llaman o ejecutar código que pueda afectar al sistema anfitrión, no es algo trivial. El truco está en cambiar el directorio raiz del sistema de ficheros para ese usuario. Esto se puede hacer con el comando chroot, por ejemplo
# chroot /home/freemem
si hiciese esto, todo mi raiz [/] sería lo que hay en /home/freemem.
Parece sencillo, pero no lo es porque ahora, ese archivo raiz debe tener todo lo necesario para comportarse como un S.O. funcional, es decir, que contenga las librerías y programas de sistema necesarios para que el entorno funcione. Si eres un experto puedes dedicarte a coleccionar todo ese software y ponerlo donde corresponde, creando lo básico que puede haber en un /etc, /lib, /usr, etc. Si no, hay gente en la comunidad Open Source que se ha entretenido en recopilar esto para tí.
Para realizar el servidor de sftp o scp (SIN CUENTA SHELL) vamos a utilizar una de estas recopilaciones que viene acompañado de un programita que restringe el uso de comandos a los estrictos usados por scp y sftp. El paquete es el scponly.
Instalación:
Primero bajar el software
http://www.sublimation.org/scponly/
descomprimir, meterse dentro del directorio recién creado con las fuentes y hacer
#./configure –enable-chrooted-binary
#make
#make install
Esto generará un ejecutable que se instalará en /usr/local/sbin/scponlyc y esta será la «shell» por defecto que se le dará al usuario que se quiere enjaular (en vez de /bin/bash, que se le da por lo general)
Se pueden dar más opciones en la compilación
–disable-wildcards
Esta opción desabilita el uso de wildcards.
«The wildcard processing is new and although I know of no vulnerabilities, the especially paranoid may wish to disable this feature. Also note, it only relates to «scp» transfers, and not «sftp», which handles its own wildcards. By default, wildcards are enabled.»
–disable-scp
–disable-sftp
–disable-winscp-compat
Estos últimos no hace falta explicarlos.
Una vez instalado tenemos que crear y enjaular al usuario, para ello, el autor del programa incluye un script que nos ahorra la tarea de metertodas las librerías que harán falta para el entorno chroot. Para ello ejecutar
#make jail
Hará una serie de preguntas de donde quieres instalar el home del
usuario, por ejemplo «/public/usuario» y el nombre del usuario, en este caso «usuario». El script tiene algunos fallos, como por ejemplo que se le olvida crear algunos directorios y falla. No pasa nada, los creas a mano o corriges el script setup_chroot.sh.
Ahora le pones un passwd al usuario «usuario» y listo.
#passwd usuario
en el /etc/passwd berás tener algo parecido a esto:
usuario:x:1004:1004:,,,:/home/usuario:/usr/local/sbin/scponlyc
La shell que se la ha asignado a este usuario es «/usr/local/sbin/scponlyc» y no bash.
No hay nada más que hacer.
Fíjate en la estructura de directorios que ha quedado ahora en /home/usuario. Verás una estructura de directorio con un /incoming, /lib, /etc, /usr, /bin y el skel correspondiente. El usuario, cuando se loguee con sftp o scp (winscp en los Windows) no podrá salir de /home/usuario y sólo podrá escribir en el directorio incoming.
Hay otro proyecto para shell chrooteadas que está genial (Jail Chroot Project, hecho por el español Juan M. Casillas, de nick assman. Por cierto este nick de hombre culo, en realidad viene de assembler man, así que un respeto). Este proyecto lo instalé en algunos servidores y el portátil que compré y devolví hace unos meses porque se calentaba mucho (algún día contaré esta penosa experiencia) y funcionaba de maravilla. El proyecto lo podeis encontrar en http://www.gsyc.inf.uc3m.es/~assman/jail/. Es de lo mejorcito que he usado para estas cosas.
Por supuesto, la instalación en Debian de todo este software del que he hablado es muy sencilla, bastando con un simple
#apt-get install scponly
#apt-get install makejail
#apt-get install jailtool
scponly – Restricts the commands available to scp- and sftp-users
jailtool – Tool to build chroot-jails for daemons.
makejail – Automatically create chroot jails for programs.
En otro artículo intentaré explicar el software de assman que aunque está muy bien documentado, no lo ha hecho es castellano y seguro que hay quien no entiende nada. Intentaré también explicar como instalar servicios chrooteados como puede ser DNS, correo, http, etc
Nota: este artículo es recuperado del antiguo portal tapiasbravo.com, escrito el 5 de septiembre del 2003. A este artículo le hicieron un cmentario bastante interesante y que también tendré en cuenta para añadir varias anotaciones. Ahí va el comentario:
El unico problema que le veo al scponly es, como le dije a Amaya por telefano, que tiene algo mas que «solo scp». De scponly.c:
#ifdef ENABLE_SCP2
{ PROG_LS, 1 },
{ PROG_CHMOD, 1 },
{ PROG_CHOWN, 1 },
{ PROG_CHGRP, 1 },
{ PROG_MKDIR, 1 },
{ PROG_RMDIR, 1 },
{ PROG_SCP, 1 },
{ PROG_LN, 1 },
{ PROG_MV, 1 },
{ PROG_RM, 1 },
{ PROG_CD, 1 },
#endif /*ENABLE_SCP2*/
Que si, que mola, que esta en chroot, pero rssh tiene algo mas de restricciones.
apt-get install rssh
😉
Publicado en old.tapiasbravo.com el 28 de septiembre de 2004. Recuperado de la Wayback Machine en 2026.