vsftpd: configurazione ftp con SSL e utenti locali

Ora, su internet ci sono una marea di guide su come configurare vsftpd con utenti virtuali (ovvero utenti che creiamo solo nell'ambito di vsftpd, e non sono utenti di sistema)
Questo è probabilmente più sicuro per alcune ragioni tra le quali:
1. Maggiore sicurezza dell'accesso
Qualora la connessione FTP non fosse SSL, la password sarebbe trasmessa in chiaro, e una volta intercettata, darebbe anche l'accesso ad una shell SSH valida dell'utente linux che usa il servizio ftp.
2. Migliore separazione degli utenti
Creare un utente FTP non significa automaticamente voler dare all'utente una shell valida della nostra macchina. Alcuni utenti potrebbero essere semplicemente designati per l'upload di file e nient'altro (vedi servizi di hosting).

Tuttavia, trovo la gestione degli utenti virtuali in vsftpd alquanto scomoda e macchinosa, e di limitata granularità in termini di permessi da poter assegnare a livello filesystem.

Alcuni vantaggi nell'usare utenti unix per l'accesso ftp (anziché virtuali):
1. Nessuna ridondanza per gli utenti che hanno anche accesso SSH
Con lo stesso username e password, sarà possibile accedere sia alla shell, sia all'area ftp. Nel caso non volessimo dare accesso SSH all'utente in questione, è sufficiente assegnargli una shell non valida (/bin/false)
2. Gestione degli utenti più diretta e semplice da automatizzare
Sarà possibile aggiungere, rimuovere, cambiare password o impostare una scadenza agli utenti con i classici useradd e userdel, usermod... creare scripts da qui è molto semplice.
3. Ogni utente FTP potrà avere i propri permessi a livello filesystem
Oltre alla classica pratica di chrootare gli utenti nelle proprie home, avremmo un ulteriore livello di sicurezza a lato filesystem ad assicurarci che anche in caso di bachi del servizio ftp o della sua configurazione, un utente compromesso non possa modificare file di altri utenti

premetto che per ragioni di sicurezza, è assolutamente raccomandato, per non dire obbligatorio installare vsftpd con un certificato SSL, di modo da poter crittare i dettagli di autenticazione ed avere un ftp sicuro.

PS: generare un certificato self-signed:
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem -subj "/C=IT/ST=Rome/L=Rome/O=Organizzazione/OU=Dipartimento/CN=example.com

CONFIGURAZIONE Veniamo alla configurazione, dando per scontato che abbiate già installato il servizio di vsftpd (diversamente, google è vostro amico)

/etc/vsftpd/vsftpd.conf

userlist_deny=YES                    #tutti sono autorizzati di default  
userlist_enable=YES                #eccetto quelli elencati in una lista:  
userlist_file=/etc/vsftpd/denied_users    #lista degli utenti da blacklistare

anonymous_enable=NO                #non permette utenti guest o anonimi  
guest_enable=NO  
guest_username=virtual                #fancy

virtual_use_local_privs=YES            #non necessario se non usiamo virtual user

write_enable=YES                    #permesso di scrivere agli utenti  
local_umask=022                    #maschera dei permessi di default 755

xferlog_enable=YES                #abilita gli xferlog  
xferlog_file=/var/log/vsftpd.log        #location dei log  
connect_from_port_20=YES            #autorizza la connessione alla porta 20 (FTP-DATA)

local_enable=YES                    #abilita gli utenti **locali**  
chroot_local_user=YES                #e li chroota nelle proprie home  
local_root=/srv/httpd/$USER            #percorso delle home degli utenti locali user_sub_token=$USER  
chroot_list_enable=NO                #tutti gli utenti sono chrootati di default  
chroot_list_file=/etc/vsftpd/chroot_list    #contiene una lista degli utenti che non vengono chrootati  
allow_writeable_chroot=YES            #necessario con vsftpd v3.0.0 e successivi  
listen=YES                        #esegue vsftpd in modalità standalone

pam_service_name=vsftpd            #nome del file di PAM riguardante il servizio di vsftpd

tcp_wrappers=YES  
pasv_enable=Yes  
port_promiscuous=YES  
pasv_addr_resolve=NO  
pasv_max_port=10100  
pasv_min_port=10090


ssl_enable=YES                    #abilita ssl  
allow_anon_ssl=NO                #disabilita login anonimi via ssl  
ssl_tlsv1=YES  
ssl_sslv2=YES  
ssl_sslv3=YES  
ssl_ciphers=HIGH                    #compatibilità con FileZilla

rsa_cert_file=/etc/ssl/certs/vsftpd.pem        #i vostri certificati per ssl  
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem  

/etc/pam.d/vsftpd

bash  
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke  
auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed  
#auth       required    pam_shells.so
auth       include    password-auth  
account    include    password-auth  
session    required     pam_loginuid.so  
session    include    password-auth  
#auth required pam_userdb.so db=/etc/vsftpd/logins crypt=hash
#account required pam_userdb.so db=/etc/vsftpd/logins crypt=hash

Configurazione di un utente con solo accesso ftp:

getent passwd prova prova:x:502:502::/srv/httpd/prova:/bin/false ls -lahd /srv/httpd/prova/
drwxr-xr-x 2 prova prova 4,0K 10 apr 16:59 /srv/httpd/prova/

Configurazione di un utente completo (ftp e ssh)

getent passwd prova2 prova2:x:502:502::/srv/httpd/prova2:/bin/bash ls -lahd /srv/httpd/prova2/
drwxr-xr-x 2 prova2 prova2 4,0K 10 apr 16:59 /srv/httpd/prova2/

Notate che ho impostato "/srv/httpd/prova" come home per l'utente prova (anziché /home/prova) Ma è anche possibile fare un semplice link a questo percorso e lasciare immutato il percorso home dell'utente.
Nel qual caso, è necessario cambiare la riga di configurazione
local_root=/srv/httpd/$USER con
local_root=/home/$USER La home dell'utente deve coincidere con il parametro local_root

FIREWALL

Nelle distribuzioni RedHat-Like iptables è abilitato di default, e dovrete probabilmente creare una regola come questa:

iptables -A INPUT -p tcp -m tcp --sport 10090:10100 --dport 10090:10100 -m conntrack --ctstate ESTABLISHED -m comment --comment "Allow passive inbound connections" -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --sport 10090:10100 --dport 10090:10100 -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment "Allow passive outbound connections" -j ACCEPT  

A questo punto dovreste avere un sistema ftp sufficientemente sicuro con utenti decentemente gestibili

A presto!