Hola a todos en otro post en Byte Mind. En esta ocasión os vamos a enseñar como instalar y configurar un servidor ftp en nuestro sistema y restringir a cada usuario el acceso a una serie concreta de directorios pero, antes de nada, y para todos aquellos que empiezan, vamos a explicar que es el protocolo ftp.
Índice
Qué es el protocolo ftp
El protocolo FTP (File Transfer Protocol) o en español Protocolo de Transferencia de Ficheros, es un protocolo de red para la transferencia de archivos entre sistemas conectados a una red TCP (Transmission Control Protocol) basado en la arquitectura Cliente – Servidor. Desde un equipo, independientemente del sistema operativo, un usuario puede conectarse a un servidor para descargar datos o para subir sus datos a dicho servidor.
Este servicio es ofrecido por la capa de aplicación del modelo de capas de red TCP/IP al usuario que normalmente, lo hace a través de los puertos 20 o 21. Este protocolo fue diseñado para una transferencia rápida entre el servidor y el cliente pero, no es lo que diríamos seguro. Esto lo digo porque el protocolo ftp, realiza una transferencia de ficheros en texto plano, en otras palabras, si en el proceso hubiese alguien escuchando podría ver los datos tal cual han sido enviados. Como solución a este problema, podemos utilizar para la conexión sftp o scp para esta transferencia de archivos pero, con la peculiaridad de qué de esta otra forma, los datos se envían encriptados asegurando la privacidad en el envío de datos.
Volviendo al asunto del que hablábamos en un principio, para la instalación del servidor ftp, vamos a utilizar la herramienta vsftd.
Instalación de vsftpd
Para instalar nuestro servicio ftp deberemos instalar la herramienta vsftpd de la siguiente forma en máquinas Debian
1 |
sudo apt-get install vsftpd |
Configuración vsftpd
Para configurar nuestro servidor, deberemos editar el fichero vsftpd.conf, nosotros lo haremos utilizando vim
1 |
sudo vim /etc/vsftpd.conf |
En este archivo nos vamos a centrar en los parámetros que necesitamos por ahora
- listen = YES -> Con esta opción especificamos si queremos iniciar el servicio al iniciar el sistema.
- anonymous_enable = NO -> Con esta opción controlamos si los usuarios anónimos puedan conectarse a nuestro sistema. Por seguridad se establecerá en no.
- local_enable = YES -> Permitimos o denegamos que los usuarios locales, es decir, el sistema en el cual está instalado pueden loguearse o no.
- write_enable = YES -> Para permitir o no que los usuarios además de descargar puedan subir sus propios ficheros.
- local_umask = 022 -> La umask establece los permisos para aquellos directorios y ficheros que se creen nuevos en el servidor. Estableceremos el valor 022 (755 para directorios y 644 para ficheros).
- chroot_local_user = YES -> Esta directiva la utilizaremos para enjaular al usuario en su directorio y evitar que pueda navegar por todo el sistema.
- chroot_list_enable = YES -> Con esta directiva podemos especificar aquellos usuarios que queremos que tengan permisos para acceder al árbol del sistema.
- chroot_list_file = /etc/vsftpd.chroot_list -> Con esta opción, indicamos el fichero donde estará el listado de usuarios que pueden navegar por encima de los directorios del servidor, es decir, podrá salir de su home de usuario.
- allow_writeable_chroot = YES -> Con esta directiva indicamos al servidor que el usuario enjaulado puede escribir en el servidor.
Creación del grupo ftp
En este caso, los usuarios que se conectarán deberán tener ciertos permisos, para ello vamos a crear un grupo ftp que los englobe a todos
1 |
sudo groupadd ftp |
Con nuestro grupo ya creado, vamos a crear una shell fantasma para que no puedan entrar directamente a la consola del servidor
1 |
sudo mkdir /bin/ftp |
Con nuestra shell fantasma creada, vamos a añadirla al listado de shells del sistema, editamos el fichero
1 |
sudo vi /etc/shells |
Y al final añadimos la carpeta previamente creada
1 |
/bin/ftp |
Creación de nuestro usuario ftp
Ahora que ya tenemos configurado nuestro servidor, vamos a crear un usuario con el que poder acceder vía ftp y le asignamos los permisos correctos.
Vamos a crear la carpeta home para el usuario, en nuestro caso lo hemos llamado usuarioftp y a la carpeta que engloba los usuarios para este servicio, la hemos llamado ftp
1 |
mkdir -p /home/ftp/usuarioftp |
Con la opción -p indicamos que si los padres no existen, nos cree el árbol completo.
Vamos a crear nuestro usuario ftp
1 |
sudo useradd -g ftp -d /home/ftp/usuarioftp -c "Nombre usuario" usuarioftp |
Vamos a explicar los parámetros utilizados en este comando
- Lo primero la palabra clave useradd para la creación de un nuevo usuario
- Con -g especificamos el grupo del usuario
- Con la opción -d especificamos la ruta de la home de nuestro usuario
- Utilizando la opción -c especificamos el nombre completo de nuestro usuario
- La última palabra, “usuarioftp”, sería el nombre de nuestro usuario
Ahora añadimos una contraseña a nuestro usuario con el comando
1 |
sudo passwd usuarioftp |
Tendremos que ingresar la contraseña dos veces para que el sistema nos la valide y acepte.
Ahora vamos a darle permisos al usuario en su home
1 |
sudo chown -R usuarioftp:ftp /home/ftp |
Enjaulando al usuario
Ahora que ya tenemos nuestro grupo y usuario creados, así como la configuración del servidor, si hemos habilitado la directiva chroot_local_user ya lo tenemos hecho y el usuario ya está enjaulado en su home. Esto quiere decir que el usuario no podrá escalar en la jerarquía del directorio y sólo permanecerá en su propio directorio.
Si por otra parte queremos que ese usuario tenga permisos para escalar en el sistema, activamos la directiva chroot_list_enable y chroot_list_file y añadimos el usuario en el fichero indicado en la directiva como vemos a continuación.
Buscamos nuestro usuario en el fichero /etc/passwd
1 |
cat /etc/passwd | grep usuarioftp |
Copiamos los datos de nuestro usuario, en nuestro caso
1 |
usuarioftp:x:1001:114:usuarioftp:/home/ftp/usuarioftp: |
Y lo pegamos en el fichero /etc/vsftpd.chroot_list
Con todo esto ya sólo nos faltaría reiniciar el servicio ftp
1 |
sudo service vsftpd restart |
Conexión con el servidor ftp
Ahora probamos la conexión, como vemos en la siguiente imagen
Ya tenemos nuestro usuario creado y enjaulado para conectarse por ftp. Para aquellos interesados, en los próximos días, crearé un post explicando como trabajar desde un servicio ftp y resolveré aquellas dudas que expongáis en los comentarios. Gracias por leernos y nos vemos en el próximo post.
Copiado tal cual y lo de enjaular no funciona, me deja subr y bajaar y hacer lo que quiera con el usuario
Hola Jon,
De que forma lo has configurado?, qué has copiado y pegado exactamente?
Con respecto a las opciones que se indican, chroot_local_user y allow_writeable_chroot, entiendo que las has habilitado.
Puedes darme más información de cómo has configurado el servicio con el fin de poder ayudarte a solucionar tu problema concreto.
Saludos
como debe quedar para que no puedan navegar hacia todo el directorio ?
Hola Alejandro,
Una vez hayas creado al usuario, lo hayas añadido al grupo utilizado para el ftp y hayas creado los directorios a los que tendrá acceso, junto con los permisos para ese usuario/grupo, tendrás que añadir las siguientes directivas al fichero de configuración de vsftpd
chroot_local_user = YES
chroot_list_enable = YES
chroot_list_file = /etc/vsftpd.chroot_list
Editas el fichero configurado en la directiva chroot_list_file y añades la línea correspondiente del mismo que obtendrás del fichero /etc/passwd, que sería algo parecido a lo siguiente:
usuarioftp:x:1004:118:Nombre del Usuario:/home/ftp/usuarioftp:/bin/ftp
Reinicias el servicio de ftp y listo, el usuario no podrá subir más haya de la ruta que hayas configurado.
Pruébalo y cualquier cosa me dices.
Saludos
Hola.
Trato de ejecutar este comando
sudo useradd -g ftp -d /home/ftp/usuarioftp -c “Nombre usuario” usuarioftp y me arroja error, indica que el grupo no está creado. Sabes que sucede? Gracias
Hola Michael,
Para solucionar el error que indicas lo que debes de hacer es crear previamente el grupo ftp por el cual te da el error.
Para ello, si miras un poco más arriba tienes el comando a tu disposición, aunque te lo indico aquí de nuevo:
groupadd ftp
Una vez creado el grupo, lanza de nuevo el comando de creación del usuario y te lo creará sin problemas.
Si necesitas algo más al respecto me dices.
Saludos.
Hola, gracias por tu tiempo en crear este manual, funciona perfecto a la primera.
Hola, me pasa algo muy raro. Todo funciona ok si me conecto por ftp. Cuando me conecto usando SFTP puedo subir y navegar los directorios.
Hola Juan Marcos,
En este caso, utilizan métodos de conexión diferentes, por lo tanto la configuración a aplicar también deberá de ser diferente, o en su defecto especificar en que casos se debe de aplicar.
A fin de ayudarte, puedes darme más información acerca de la configuración que has aplicado.
Saludos
Hola amigo podrias ayudarme, tengo problemas para enjaular
Hola,
Claro, puedes indicar la configuración que has aplicado para ver si existe algún error en la misma.
Saludos
Buenas, me pasa lo mismo, puedo subir hacía arriba, llevo bastante tiempo usando OMV porqué no consigo enjaular correctamente en el debian o raspbian, lo que he conseguido es que no puedan borrar o escribir fuera de su home pero sí leer, te agradecería muchísimo que me orientes en lo que puedo estar haciendo mal, lo estoy probando en raspbian, lo hago todo igual y no me da ningún error en ningún sentido, cuando entro tengo acceso a todo el árbol, no solo a la home. En el archivo de configuración del ftp lo hago todo tal cual, solo que no aparece una linea, que en vez de descomentar tengo que añadir (la última de tu listado).
Lo dicho quedaría muy agradecido porque es un tema que he probado muchas veces y no consigo hacer.. enhorabuena por el trabajo que hacéis!! sludos!!
Hola Andrés,
Podrías darme más información de cómo tienen configuradas las directivas a fin de poder descartar errores.
Si las directivas están correctamente configuradas deberías de poder enjaular al usuario sin problemas.
Saludos
Yo me conecto con filezilla con SFTP y puedo subir por los directorios hacia arriba.
Con lo cual esto no esta muy bien enjaulado.
userlist_deny=YES
local_root=/mnt/dietpi_userdata
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
use_localtime=YES
connect_from_port_20=YES
chown_uploads=NO
#chown_username=whoever
xferlog_enable=NO
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=60
data_connection_timeout=30
#nopriv_user=ftpsecure
async_abor_enable=NO
ascii_upload_enable=NO
ascii_download_enable=NO
ftpd_banner=DietPi FTP
#banned_email_file=/etc/vsftpd.banned_emails
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES
ls_recurse_enable=NO
secure_chroot_dir=/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem