Skip to main content

Cómo configurar SFTP con usuarios enjaulados en Ubuntu Server 12.04

El servicio ssh es excelente y lo es por las muchas posibilidades que brinda. Una de ellas es la sustitución del viejo y poco seguro servicio FTP. El servicio ssh ofrece un protocolo llamado SFTP que funciona parecido al FTP, pero de forma más segura. Aplicaciones como Filezilla tienen soporte para este protocolo.

Nada más instalar SSH en nuestro servidor Ubuntu, ya queda disponible para usar con nuestros usuarios y un cliente SFTP. Pero un problema que tiene esto es que el cliente SFTP puede navegar por todo el sistema de ficheros exponiendo el contenido del servidor. Esto lógicamente no nos gusta nada.

Pero podemos enjaular (chroot) los usuarios para que no puedan perderse entre los directorios del servidor. Y esto es magnífico, porque podemos así permitirles subir sus archivos a estos usuarios y que queden publicados en Internet.

Veamos como hacerlo.

Creamos un grupo nuevo.

Los usuarios de este grupo tendrán automáticamente restringido el sistema de directorios a su propio directorio enjaulado. No pudiendo salir y perderse más allá de su directorio raíz.

sudo groupadd hostusers

Creamos el usuario.

Este usuario tiene la particularidad que no podrá acceder a un terminal y sólo podrá acceder mediante un cliente sftp a sus directorios enjaulados.

sudo useradd -g hostusers -d /home -s /sbin/nologin testuser
sudo passwd testuser

Verificamos que el usuario se creo con:

grep testuser /etc/passwd

Configuramos el servicio sftp enjaulado.

Tenemos que editar el fichero sshd_config donde se configura el servicio del servidor ssh. En este archivo preparamos ssh para funcionar como queramos. Cambiando el sftp-server que viene configurado por defecto por el internal-sftp.

sudo nano /etc/ssh/sshd_config

Comentamos la línea para deshabilitarla:

#Subsystem sftp /usr/lib/openssh/sftp-server

Al final del archivo de configuración añadimos una línea nueva para que use el sftp interno:

Subsystem sftp internal-sftp

Y después añadimos el siguiente texto para instruir al servicio ssh cual será el directorio enjaulado.

Match Group hostusers
ChrootDirectory /hosting/%u
ForceCommand internal-sftp

La primera línea indica que las siguientes sólo aplican a los usuarios del grupo hostusers. La segunda línea indica que los usuarios estarán enjaulados en un directorio con su propio nombre. Y la tercera indica que se debe forzar para estos usuarios el uso del sftp interno.

Creamos el directorio de la jaula.

sudo mkdir /hosting

Creamos los directorios para el usuario.

sudo mkdir /hosting/testuser
sudo mkdir /hosting/testuser/home
sudo mkdir /hosting/testuser/home/public_html

Para estos usuarios especiales /hosting/testuser será como / para el usuario testuser. Este usuario no podrá ver nada por encima de su directorio raíz  El directorio public_html queda ahí para poder usarlo con Apache y orientar los dominios virtuales a ese directorio. De modo que cuando esté configurado Apache, lo que cada usuario suba ahí se publicará en Internet.

Aplicamos los permisos correctos.

Como estos directorios son creados por root debemos cambiarles el propietario para que el usuario testuser pueda usarlos.

sudo chown testuser:hostusers /hosting/testuser/home
sudo chown testuser:hostusers /hosting/testuser/home/public_html

Podremos comprobar que los permisos son correctos con el alias ll (disponible en Ubuntu Server para ls -ld)

ll /hosting/testuser/home

Reiniciar el servicio SSH

Finalmente reiniciamos el servicio ssh para que los cambios aplicados tomen efecto.

sudo service ssh restart

Ahora deberíamos poder acceder con un cliente SFTP como Filezilla.

Más usuarios

Si queremos añadir mas usuarios enjaulados repetiremos para cada nuevo usuario. En cada comando sustituiremos testuser por el nombre del nuevo usuario que queremos crear en cada uno de los pasos siguientes:

  • Creamos el usuario.
  • Creamos los directorios.
  • Aplicamos los permisos correctos
  • Reiniciar el servicio SSH.

Con estas instrucciones podemos permitir que usuarios suban sus ficheros al servidor y no puedan comprometer la visibilidad de los contenidos en él. Estas instrucciones están probadas en Ubuntu Server 12.04 LTS.

Cómo mostrar mensaje de advertencia en el servicio ssh en Ubuntu server 12.04

El servicio SSHd para acceso remoto a un servidor, permite cuando nos conectamos a él, mostrar un mensaje informativo. Este mensaje lo podemos configurar para que transmita lo que queremos. El archivo de configuración de ssh es /etc/ssh/sshd_config que podemos abrir para editar con:

sudo nano /etc/ssh/sshd_config

En este archivo de configuración de sshd se controla el mensaje que se muestra con la clave:

Banner /etc/issue.net

Que por defecto lleva una almohadilla (#) para convertir en comentario y no se tome en consideración. Por tanto si queremos que se muestre el mensaje eliminaremos la almohadilla.
Como se ve en Ubuntu Server 12.04 LTS esta clave lleva a un archivo de texto llamado issue.net, que contiene solamente el nombre del sistema en ejecución. Cosa que no nos interesa de ningún modo.

Si queremos que muestre una mensaje de advertencia simplemente debemos cambiar el contenido de ese archivo por nuestro mensaje.

Mensaje que podría ser:

###############################################################
#        Warning, only authorized access is allowed.          #
#       Aviso, solo se permite acceso a autorizados.          #
#           Actions are monitored and recorded.               #
#        Sus acciones son monitorizadas y registradas.        #
###############################################################

Así que hacemos copia de seguridad del mensaje con

sudo cp /etc/issue.net /etc/issue.net.original

Lo editamos con:

sudo nano /etc/issue.net

Y ponemos en el archivo el mensaje de arriba u otro que consideremos oportuno. Guardamos y salimos de nano. Después reinicamos el servicio sshd con:

sudo service ssh restart 

Y ahora cuando queramos conectar nos mostrará el mensaje elegido.