Escenario
Un cliente nos pide que montemos un servidor FTP para que nos pueda hacer llegar periódimante ficheros con datos. La máquina en la que vamos a configurarlo corre en un ubuntu server 18.04. y tiene instalado un openssh-server.Requisitos
- Debe utilizar el protocolo SFTP, que ofrece las funcionalidades de FTP sobre el protocolo SSH.
- El usuario debe de estar enjaulado (chroot) en su home, no pudiendo acceder a ningún directorio fuera de esta
- Debe registrarse la actividad del usuario FTP
Implementación
Usuarios sftp
Lo primero creamos un grupo para los usuarios que vayan a usar el servicio SFTP.
1 |
$ sudo groupadd sftp |
1 2 3 |
$ GROUPID=$(getent group sftp | cut -d: -f3) $ sudo useradd usuario1 -d /var/ftp/usuario1 -g sftp -M -N -o -u $GROUPID $ sudo useradd usuario2 -d /var/ftp/usuario2 -g sftp -M -N -o -u $GROUPID |
1 2 |
$ sudo mkdir -m2755 /var/ftp/usuario1 $ sudo mkdir -m2755 /var/ftp/usuario2 |
El propietatio de estos directorios y los que estén por encima, ha de ser root:root y estos no pueden ser modificados por ningún otro usuarioY no olvidemos asignar las contraseñas:
1 2 |
$ sudo passwd usuario1 $ sudo passwd usuario2 |
Configuración de SSHD
Vamos a editar /etc/ssh/sshd_config para que el demonio de SSHD reconozca y gestione adecuadamente los usuarios del grupo sftp: Lo primero cambiamos la línea que define el Subsystem sftp:
1 2 |
# Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp |
1 2 3 4 5 |
Match Group sftp ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp -f LOCAL7 -l INFO |
Los registros
Por defecto no vas a ver ningún registro para la actividad del sftp, solo los habituales de sshd «session opened» y «session closed» en /var/log/auth.log El problema es que como los usuarios del grupo sftp están «enjaulados» en su propio directorio, no tienen acceso para escribir en los registros del sistema. De modo que hay crear un socket en su propio directorio para encauzar los registros al nuevo fichero de registro sftp.log. Primero creamos un directorio /dev en cada una de las home de los usuarios sftp:
1 2 |
$ sudo mkdir -m2755 ~usuario1/dev $ sudo mkdir -m2755 ~usuario2/dev |
1 2 3 4 5 6 7 8 9 |
# Crea un socket de los directorios enjaulados para permitir el logging $AddUnixListenSocket /var/ftp/usuario1/dev/log $AddUnixListenSocket /var/ftp/usuario2/dev/log # Parsea los registros de nivel INFO y LOCAL7 en /var/log/sftp.log LOCAL7.info /var/log/sftp.log # Registra logins and logoffs :syslogtag,startswith,"sftp-server" /var/log/sftp.log |
1 |
$ sudo service ssh restart && sudo service rsyslog restart |