Configuración de un Servidor FTP con vsftp en Linux

¿Qué es un servidor FTP?

Un servidor FTP es un programa de ordenador que ofrece servicios de transferencia de archivos a través del protocolo FTP. FTP es un acrónimo que significa File Transfer Protocol. El servidor FTP se ejecuta en un equipo conectado a Internet y permite a los usuarios acceder a él mediante la red para transferir archivos. Los usuarios pueden iniciar sesión en el servidor utilizando un software de cliente FTP o bien pueden acceder a él mediante un navegador web, si el servidor FTP está configurado para admitir conexiones web.

El servidor FTP tiene acceso a una carpeta o directorio de archivos en el disco duro del equipo, que se denomina directorio raíz o directorio de inicio. Los usuarios pueden navegar por los archivos y carpetas alojados en el directorio raíz y transferirlos a sus ordenadores personales. El servidor FTP también puede permitir que los usuarios creen nuevas carpetas y subcarpetas dentro del directorio raíz para organizar sus archivos.

Siempre que podamos, utilizaremos SFTP en vez de FTP si queremos cifrar el tráfico, ya que SFTP es un protocolo seguro mientras que FTP no lo es. En cualquier caso, FTP todavía es un servicio muy utilizado en servicios públicos donde no importa la seguridad de los datos almacenados.

Configurar un servidor FTP en Linux con VSFTP

En Linux es muy común utilizar el producto vsftp (Very Secure FTP) para configurar un servicio de FTP público.

El fichero de configuración suele estar el /etc/vsftpd/vsftpd.conf y dependiendo de si queremos un servicio privado o anónimo configuraremos las directivas de este fichero de una manera u otra.

Un ejemplo de configuración sería el siguiente:

Deshabilitamos los accesos anónimos

anonymous_enable=NO

Enjaular usuarios con vsftpd (chroot)

  • Habilitamos el enjaulamiento de usuarios para que únicamente puedan acceder a un directorio concreto de nuestro sistema y no más allá:

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

chroot_local_user indica que el directorio de enjaulamiento es el $HOME del usuario que se conecta.

chroot_list_enable y chroot_list_file se utilizan para excluir el enjaulamiento de los usuarios que se definen en el fichero especificado.

  • Si deseamos enjaular las conexiones FTP de los usuarios anónimos, también podemos:

anonymous_enable=YES
anon_root=/home/ftp

Deshabilitar el acceso a la shell del sistema

Por seguridad, es altamente recomendable que los usuarios que solamente se conectan por FTP no puedan iniciar una sesión en el servidor:

myftpuser:x:1050:1050:FTP de test:/ftp/myftpuser:/sbin/nologin

# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
/bin/false
/usr/bin/ksh
/usr/bin/pdksh
/usr/libexec/openssh/sftp-server
/usr/bin/ftp
#

Arranque del servicio VSFTPD

Una vez que ya hemos terminado de configurar vsftp, lo arrancaremos como un servicio más del sistema operativo.

En RedHat 7, utilizaríamos los comandos:

  • Arranque del servicio con el boot del sistema: systemctl enable vsftpd
  • Arranque del servicio: systemctl start vsftpd
  • Parada del servicio: systemctl stop vsftpd

Errores con los que me he encontrado

# ftp localhost
Connected to localhost (127.0.0.1).
500 OOPS: vsftpd: cannot locate user specified in ‘ftp_username’:ftp
ftp> bye
#

Se soluciona incluyendo esta directiva en el fichero /etc/vsftpd/vsftpd.conf:

ftp_username=nobody

Subir archivos al servidor FTP con lftp

Hay muchos clientes ftp en el mercado, gratuitos y de pago. El propio linux tiene el comando «ftp» para ello.

A mi me gusta utilizar lftp cuando uso Linux porque es muy versátil y lo podemos utilizar fácilmente detrás de un proxy, por ejemplo.

Cuando uso Windows, me gusta utiliza Filezilla.

Veamos un ejemplo de funcionamiento:

[root@server1 ~]# lftp
lftp :~> set ftp:proxy http://XXX.XXX.XXX.XXX:8080
lftp :~> open 52.16.8.90
lftp 52.16.8.90:~> user Usuario_Privado
Password:
lftp Usuario_Privado@52.16.8.90:~> lcd /temporal/temporal
lcd ok, local cwd=/temporal/temporal
lftp Usuario_Privado@52.16.8.90:~> !ls -la
total 2302657520
drwxr-xr-x 2 Usuario_Privado Usuario_Privado          4096 Jun 16 08:07 .
drwxr-xr-x 4 root                 root                          4096 Jun 15 08:18 ..
-rw-r--r-- 1 Usuario_Privado Usuario_Privado 1178960501433 Jun 15 06:18 test_file.tgz
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 15:00 test_file.tgz.partaa
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 15:19 test_file.tgz.partab
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 15:38 test_file.tgz.partac
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 15:54 test_file.tgz.partad
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 16:12 test_file.tgz.partae
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 16:29 test_file.tgz.partaf
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 16:49 test_file.tgz.partag
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 17:07 test_file.tgz.partah
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 17:24 test_file.tgz.partai
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  107374182400 Jun 15 17:41 test_file.tgz.partaj
-rw-r--r-- 1 Usuario_Privado Usuario_Privado  105218677433 Jun 15 17:56 test_file.tgz.partak
lftp Usuario_Privado@52.16.8.90:~> put test_file.tgz
`test_file.tgz' at 538991520 (0%) 6.04M/s eta:52h [Sending data]

También podremos utilizar LFTP para utilizar SFTP con un proxy:

lftp :~> set ssl:verify-certificate no
lftp :~> set ftp:proxy http://192.168.47.162:8080
lftp :~> open sftp://ioc-ftp@servidor_SFTP:2222
Password:

En este caso, el servidor SFTP, además, escucha por el puerto 2222, en vez de con el 22 habitual.

Con el comando SFTP tradicional también podremos usar proxy:

[root@server1~]# sftp -v -o ConnectTimeout=3 -o ProxyCommand='/usr/bin/nc -X connect -x 192.168.47.162:8080 %h %p' -oPort=2222 ioc-ftp@34.249.149.230
Connecting to 34.249.149.230...
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Executing proxy command: exec /usr/bin/nc -X connect -x 192.168.47.162:8080 34.249.149.230 2222
debug1: permanently_set_uid: 0/0
debug1: permanently_drop_suid: 0
debug1: identity file /root/.ssh/id_rsa type 1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.9p1 Debian-10+deb10u2
debug1: match: OpenSSH_7.9p1 Debian-10+deb10u2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-sha1 none
debug1: kex: client->server aes128-ctr hmac-sha1 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<2048<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: checking without port identifier
The authenticity of host '[34.249.149.230]:2222 (<no hostip for proxy command>)' can't be established.
RSA key fingerprint is 89:2c:b5:af:1b:7e:19:9d:8f:25:2c:ca:2c:fe:56:d0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[34.249.149.230]:2222' (RSA) to the list of known hosts.
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: publickey
debug1: Offering public key: /root/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Trying private key: /root/.ssh/id_ecdsa
debug1: Next authentication method: keyboard-interactive
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Next authentication method: password
ioc-ftp@34.249.149.230's password:
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending subsystem: sftp
sftp> ls
upload
sftp>
sftp> cd upload
sftp> put /tmp/test.txt
Uploading /tmp/test.txt to /upload/test.txt
/tmp/test.txt                                                                                                          100%    5     0.0KB/s   00:00
sftp> ls
IOC-mySQL-WO0000002729606     test-sftp-net0.txt            test.txt
sftp>

Te puede interesar

COMPÁRTEME

Deja un comentario