Inicio » Linux » Configuración de FTP con vsftp en Linux

Configuración de FTP con vsftp en Linux

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

Las siglas FTP significan File Tranasfer Protocol y es un protocolo de comunicaciones no cifrado y, por lo tanto, inseguro para almacenar ficheros. Siempre que podamos, utilizaremos SFTP en vez de FTP si queremos cifrar el tráfico.

En cualquier caso, FTP todavía es un servicio muy utilizado en servicios públicos donde no importa la seguridad de los datos almacenados.

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.

Western Digital My Book Disco Duro Externo de Sobremesa de 6 TB ,3.5", USB 3.0, Negro
  • Connexion USB 3.0, compatible con USB 2.0
  • Hasta 8 TB de capacidad

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

Lenovo IdeaPad 5 - Ordenador Portátil 15.6" FullHD (AMD Ryzen 5 5500U, 16GB RAM, 512GB...
  • Pantalla de 15.6" FullHD (1920x1080) 300nits
  • Procesador AMD Ryzen 5 5500U (6C/12T, 2.1 GHz/4.04GHz, 8 MB)
  • Memoria RAM de 16GB

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 porque es muy versátil y lo podemos utilizar fácilmente detrás de un proxy, por ejemplo.,

Veamos un ejemplo de funcionamiento:

[[email protected] ~]# 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 [email protected]:~> lcd /temporal/temporal
lcd ok, local cwd=/temporal/temporal
lftp [email protected]:~> !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 [email protected]:~> 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://[email protected]_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:

[[email protected]~]# sftp -v -o ConnectTimeout=3 -o ProxyCommand='/usr/bin/nc -X connect -x 192.168.47.162:8080 %h %p' -oPort=2222 [email protected]
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
[email protected]'s password:
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: client_input_global_request: rtype [email protected] 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

About Author

¿Te ha gustado? Compártelo

Share on facebook
Share on twitter
Share on linkedin
Share on whatsapp
Share on telegram
Share on email

Contenido Relacionado

Linux
David Martínez Perales

Tutorial de Ansible

Tabla de contenidos1 Acceso a la documentación interna de Ansible2 Instalar Ansible3 Configurar Ansible3.1 Mejora de la velocidad de ejecución

Leer más »

Artículos Recientes

Deja un comentario