9.4.- Comandos de red seguros

En esta sección veremos el comando de conexión a distancia “ssh” y el comando de transferencia de archivos “sftp“:

Las siglas corresponden a Secure SHell. Sirve para acceder a máquinas remotas, igual que hace telnet, pero de una forma segura ya que la conexión va cifrada. El transporte se hace mediante TCP, por tanto nos garantiza que las órdenes van a llegar a su destino (conectivo, fiable, orientado a conexión).

El cifrado de SSH proporciona autenticidad e integridad de los datos transmitidos por una red insegura como internet. Utiliza llaves públicas para la autenticación en la máquina remota. SSH no sólo sirve para usar comandos en máquinas remotas, sino para transferencias de ficheros de forma segura ya sea por SCP o sFTP y servicios de escritorio remoto.

En la primera conexión al servidor, este envía su clave pública. Esta clave representa el identificador único de la máquina.

El comando ssh solicita al usuario si reconoce el valor de la clave y si acepta la conexión. En caso afirmativo la clave del servidor se almacena en el archivo $HOME/.ssh/known_host de la máquina cliente.

Es posible que tu distribución de Ubuntu no tenga instalado por defecto un servidor SSH. Para comprobar los servidores que tienes instalados y escuchando, puedes utilizar el programa netstat:

También lo podemos comprobado buscando entre los paquetes instalados:

En caso de que no lo tengas, para activar el servidor SSH, simplemente hay que instalar el paquete openssh-server.

sudo apt-get install openssh-server

Una vez instalado, ya puedes utilizar un cliente SSH, como Putty, para conectarte a tu servidor. Puedes también modificar las configuraciones del servidor (cambio de puerto, etc…) en el siguiente fichero de configuración:

/etc/ssh/sshd_config

y para cargar las nuevas configuración, recargar el servidor:

sudo service ssh restart

El comando sftp (secure file transfer) permite transferir archivos de manera encriptada entre 2 máquinas. Es una alternativa al comando ftp. En la primera conexión a la máquina remota, el comportamiento observado es el mismo que en el comando ssh.

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.

Matachín 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 línea 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.