El protocolo FTP (File Transfer Protocol) es un protocolo utilizado para la transferencia de ficheros entre una máquina local y otra remota. Básicamente son dos operaciones las que se pueden realizar, subir ficheros a la máquina remota o bien descargarlos. Además existen más comandos pero se utilizan para manejarse dentro del servidor con el objetivo de poder navegar por la estructura de directorios, crear nuevos, eliminar ficheros y alguna otra tarea.
Proftpd es uno de los servidores FTP más utilizados en entornos Linux. En nuestro caso, que contamos con Debian 9, podemos instalarlo directamente utilizando apt-get
santi@zenbook:$ sudo apt-get install proftpd
El fichero de configuración principal lo podemos encontrar en /etc/proftpd/proftpd.conf
, donde podremos configurar algunos parámetros como pueden ser los mensajes de bienvenida (será útil ocultarlos o modificarlos para no dar pistas a futuros atacantes) y el puerto donde escucha el servicio.
. . . Include /etc/proftdp/modules.conf ServerName "Debian" DisplayLogin welcome.msg Port 21 . . .
En el caso de que queramos utilizar una opción segura a este protocolo, podemos utilizar también sftp
que permite, utilizando SSH, realizar las mismas operaciones que un servidor FTP y de forma segura.
santi@zenbook:$ sudo apt-get install openssh-server openssh-sftp-server
En este caso el fichero de configuración lo encontraremos en /etc/ssh/sshd_config
Como cliente FTP de consola tendremos el comando ftp
santi@zenbook:$ ftp misitio.com Connected to misitio.com. 220 ProFTPD 1.3.5b Server (Debian) [::ffff:127.0.0.1] Name (misitio.com:santi): santi 331 Password required for santi Password: 230 User santi logged in Remote system type is UNIX. Using binary mode to transfer files. ftp> |
Utilizando el comando help
podemos contar con ayuda interactiva acerca de todos los comandos disponibles
ftp> help Commands may be abbreviated. Commands are: ! dir mdelete qc site $ disconnect mdir sendport size account exit mget put status append form mkdir pwd struct ascii get mls quit system bell glob mode quote sunique binary hash modtime recv tenex bye help mput reget tick case idle newer rstatus trace cd image nmap rhelp type cdup ipany nlist rename user chmod ipv4 ntrans reset umask close ipv6 open restart verbose cr lcd prompt rmdir ? delete ls passive runique debug macdef proxy send
A continuación se describen los más utilizados
Hay que tener en cuenta que podemos obtener, interactivamente, ayuda específica de cada comando a través de help
ftp> help rmdir rmdir remove directory on the remote machine
En el caso de que queramos conectar a un FTP seguro, utilizando el servicio SSH, podemos hacerlo conectando a través del comando sftp
santi@zenbook:$ sftp misitio.com The authenticity of host 'misitio.com (::1)' cannot be established. ECDSA key fingerprint is SHA256:B5y+uH5grBUJRLnN5ZNMvKHS4USELBfv5J2Gyf+s37s. Are you sure you want to continue connecting (yes/no)?
Igualmente contamos con ayuda sobre los diferentes comandos de que disponemos, muy del estilo a los que podemos encontrar en un servicio FTP
sftp> help Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-afPpRr] remote [local] Download file reget [-fPpRr] remote [local] Resume download file reput [-fPpRr] [local] remote Resume upload file help Display this help text lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ln [-s] oldpath newpath Link remote file (-s for symlink) lpwd Print local working directory ls [-1afhlnrSt] [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory progress Toggle display of progress meter put [-afPpRr] local [remote] Upload file pwd Display remote working directory quit Quit sftp rename oldpath newpath Rename remote file rm path Delete remote file rmdir path Remove remote directory symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help sftp>
Conviene tener en cuenta que la IP asociada a un dominio puede cambiar. En ese caso el comando sftp
de conexión con el servidor nos avisará de que quizás nos estén realizando un ataque man in the middle puesto que el guarda la firma del equipo y ahora ya coincide al haberse modificado su IP.
santi@zenbook:$ sftp misitio.com @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:B5y+uH5grBUJRLnN5ZNMvKHS4USELBfv5J2Gyf+s37s. Please contact your system administrator. Add correct host key in /home/santi/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/santi/.ssh/known_hosts:3 remove with: ssh-keygen -f "/home/santi/.ssh/known_hosts" -R misitio.com ECDSA host key for misitio.com has changed and you have requested strict checking. Host key verification failed. Couldn't read packet: Connection reset by peer
En el caso de que estemos seguros de que simplemente ha sido un cambio de IP y confiemos plenamente en el servidor al que nos vamos a conectar, podremos añadir dicho dominio al registro de hosts conocidos con el siguiente comando:
santi@zenbook:$ ssh-keygen -f "/home/santi/.ssh/known_hosts" -R misitio.com # Host misitio.com found: line 13 /home/santi/.ssh/known_hosts updated. Original contents retained as /home/santi/.ssh/known_hosts.old
El primer paso será instalar el servidor FTP proftpd
y el módulo para que éste sea capaz de trabajar con Bases de Datos MySQL, puesto que usaremos una Base de Datos para almacenar los diferentes usuarios junto con la información necesaria.
santi@zenbook:$ sudo apt-get install proftpd proftpd-mod-mysql
En el sistema tendremos que crear un grupo y usuario al que asignaremos a todos aquellos usuarios que, más adelante, se registren a través de la Base de Datos
santi@zenbook:$ groupadd grupoftp santi@zenbook:$ useradd -s /bin/false -d /dev/null -g grupoftp usuarioftp
Y echando un vistazo a los ficheros /etc/passwd
y /etc/group
veremos cuáles son los UID y GID asignados
santi@zenbook:$ cat /etc/passwd | grep usuarioftp usuarioftp:x:1002:1003::/dev/null:/bin/false santi@zenbook:$ cat /etc/group | grep grupoftp grupoftp:x:1003:
De la salida de los dos últimos comandos podemos concluir que el usuario usuarioftp
tiene un UID de 1002 y un GID de 1003 (que coincide con el grupo al que pertenece). Tomaremos esos valores como por defecto para los valores de UID y GID de los usuarios en la Base de Datos
CREATE DATABASE ftp; USE ftp; CREATE TABLE usuarios ( usuario VARCHAR(30) NOT NULL UNIQUE, password VARCHAR(80) NOT NULL, uid INTEGER DEFAULT 1002, gid INTEGER DEFAULT 1003, home VARCHAR(255), shell VARCHAR(255) DEFAULT NULL, bloqueado BOOLEAN DEFAULT 0 ); CREATE TABLE grupos ( nombre VARCHAR(30) NOT NULL, gid INTEGER NOT NULL, miembros VARCHAR(255) );
Activamos el módulo de SQL en la configuración de proftpd
. . .
LoadModule mod_sql.c
. . .
Y en el fichero de configuración principal modificamos algunos parámetros
. . . # No es necesario que los usuarios tengan una consola de sistema RequireValidShell Off # Hace que los usuarios no puedan salir de su carpeta de inicio DefaultRoot ~ . . .
Ahora pasamos a configurar la conexión de proftpd con la Base de Datos
SQLBackend mysql
SQLAuthTypes Backend Crypt
SQLConnectInfo ftp@localhost usuario_mysql contrasena_mysql
SQLUserInfo usuarios usuario password uid gid home shell
SQLGroupInfo grupos nombre gid miembros
SQLUserWhereClause "bloqueado = '0'"
Para que los cambios sean efectivos tendremos que reiniciar el servicio
santi@zenbook:$ sudo service proftpd restart
Y registrar el grupo en la Base de Datos:
INSERT INTO grupos (nombre, gid, miembros) VALUES ("grupoftp", 1003, "usuarioftp");
Por último, nos queda dar de alta algún usuario en la Base de Datos para comprobar que todo funciona correctamente
INSERT INTO usuarios (usuario, password, home) VALUES ("santi", PASSWORD("misupercontraseña"), "/var/ftp/santi");
Habrá que asegurarse de que dicha carpeta existe y, en caso contrario, crearla y asignarle permisos correctamente
santi@zenbook:$ sudo chown -R usuarioftp:grupoftp /var/ftp
Y ahora ya podemos probar a conectarnos a nuestro servidor FTP con el nuevo usuario creado
santi@zenbook:$ ftp localhost Connected to localhost. 220 Proftpd 1.3.5b Server (Debian) [::1] Name (localhost:santi): |
santi@zenbook:$ sudo apt-get install openssh-server
santi@zenbook:$ sudo apt-get install openssh-client
santi@zenbook:$ scp -r misitio santi@misitio.com:/var/www/html
documentos
© 2017 Santiago Faci