Instalar VSFTPD en Ubuntu 14.04 Server

Vsftpd es un servidor FTP.
Para instalar
sudo apt-get install vsftpd

El archivo de configuración lo encontramos en
/etc/vsftpd.conf

La configuración por defecto trae desactivado la conexión del usuario anónimo, en caso de querer activar esta opción modificar la entrada
anonymous_enable=YES

Local_enable permitir a los usuarios autenticados tener sus propias carpetas locales
local_enable=YES

Write_enable permite el modo de escritura en la carpeta del usuario
write_enable=YES

Local_umask permite enmascarar con permisos los archivo que subimos al servidor
local_umask=037
El primer valor son los permisos para el usuario, el segundo para el grupo y el tercero para el resto.
Valores de umask
0 : lectura, escritura y ejecución
1 : lectura y escritura
2 : lectura y ejecución
3 : lectura
4 : escritura y ejecución
5 : escritura
6 : ejecución
7 : no permisos

Ftpd_banner presenta un mensaje de bienvenida al servidor
ftpd_banner=Bienvenido al servidor FTP

Enjaulamos a los usuarios para que accedan a su directorio personal /home.
chroot_local_user=YES
chroot_list_enable=YES

Chroot_list_file llama a un archivo donde se encuentran los usuarios enjaulados. Creamos este archivo y agregamos las cuentas de los usuarios.
chroot_list_file=/etc/vsftpd.chroot_list

Para restaurar el servicio
sudo service vsftpd restart

Gestión de usuarios

Si no hay creado un grupo ftp crearlo con
sudo groupadd ftp

Creamos en /home un directorio /ftp y dentro de este otro con el nombre de cada usuario
mkdir /home/ftp/pepe

Creamos un shell FTP virtual para que los usuarios no puedan conectarse a una sesión del sistema operativo.
sudo mkdir /bin/ftp

Editamos el archivo /etc/shells y añadimos /bin/ftp

Creamos un usuario con
sudo useradd -g ftp -d /home/ftp/usuario -s /bin/ftp usuario

Asignamos contraseña al usuario
sudo passwd contraseña

Ponemos el directorio a su nombre
sudo chown carlos.ftp ./usuario

Otras opciones
non_max_rate=5100 Ancho de banda para usuario anónimo 5kb.
local_max_rate=5100 Ancho de banda por usuario local 5kb.
max_clients=3 Numero máximo clientes conectados.
max_per_ip=2 Numero máximo de conexiones por ip.

Para conectarse con instancia Amazon
pasv_enable=YES
pasv_min_port=1024
pasv_mas_port=1048
pasv_address=ip_servidor

FTP sobre SSL

Existen dos diferentes métodos para realizar una conexión SSL/TLS a través de FTP. La primera y más antigua es a través del FTPS Implícito (Implicit FTPS), que consiste en cifrar la sesión completa a través de los puertos 990 (FTPS), y 998 (FTPS Data), sin permitir negociación con el cliente, el cual está obligado a conectarse directamente al servidor FTPS con el inicio de sesión SSL/TLS. El segundo método, que es el recomendado por el RFC 4217, y el utilizado por Vsftpd, es FTPS Explícito (Explicit FTPS o FTPES), donde el cliente realiza la conexión normal a través del puerto 21, y permitiendo negociar, de manera opcional, una conexión TLS. Voy a usar el FTPS Explícito usando los puertos del 30300 al 30309.

El certificado y firma digital se pueden generar ejecutando lo siguiente para utilizar una estructura X.509, algoritmo de cifrado RSA de 4096 bits, y una validez por 1825 días (cinco años).

Creamos el directorio /etc/vsftpd

Creamos el certificado con
sudo openssl req -sha256 -x509 -nodes -days 1825 -newkey rsa:4096 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

Damos permisos de solo lectura para root
sudo chmod 400 vsftpd.pem vsftpd.crt

En el archivo de configuración /etc/vsftpd.conf especificamos
# Especificar cualquier rango arbitrario, y estrecho, de puertos para
# conexiones pasivas
pasv_enable=YES
pasv_min_port=30300
pasv_max_port=30309
# Habilita el soporte de TLS/SSL
ssl_enable=YES
# Deshabilita o habilita utilizar TLS/SSL con usuarios anónimos
allow_anon_ssl=NO
# Obliga a utilizar TLS/SSL para todas las operaciones, es decir,
# transferencia de datos y autenticación de usuarios locales.
# Establecer el valor NO, hace que sea opcional utilizar TLS/SSL.
force_local_data_ssl=NO
force_local_login_ssl=NO
# Se prefiere TLSv1 sobre SSLv2 y SSLv3
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# Rutas del certificado y firma digital
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
require_ssl_reuse=NO
ssl_ciphers=HIGH

Para conectarnos usamos el cliente Filezilla en modo Explicito sobre TLS.