Vsftpd (Very Secure FTP Daemon)

Posted On 01 Gen 2008
Comment: Off

linuxtutorialTutorial LinuxVsFTPd e’ un server ftp scritto con un occhio di riguardo per la sicurezza, rispetto ai suoi fratelli maggiori risulta piu’ snello, semplice da configurare e con molte opzioni utili. Tutti fattori che hanno portato questo demone su server importanti come kernel.org (sostituendo il piu’ famoso ProFTPd), kde.org, gnu.org, redhat.com etc… In particolar modo l’aspetto della sicurezza e’ stato raggiunto grazie ad un’accurata fase di design, all’uso dei chroot ove possibile, alle capabilities e al ridottissimo utilizzo dei privilegi di root, con routine particolarmente compatte per ridurre al minimo la possibilita’ di bug.


Installazione (ho scritto che il file e’ allegato al cdrom, cancellate le relative righe se non potete inserirlo)



Per prima cosa procuriamoci una copia del programma (l’ultima release stabile, al momento in cui scrivo, e’ la 2.0.1, ma potete anche provare una delle pre-release) copiandola dal cdrom allegato alla rivista, oppure scaricandola da ftp://vsftpd.beasts.org/users/cevans/ quindi unzippiamola e compiliamola:


# tar xzf vsftpd-2.0.1.tar.gz
# cd vsftpd-2.0.1
# make


Se tutto e’ andato bene, dopo qualche secondo avremo un file chiamato vsftpd di circa 90kb:


# ls -l vsftpd
-rwxr-xr-x 1 root root 90656 Aug 30 16:40 vsftpd


Il server ha bisogno dell’utente nobody (tutte le operazioni non privilegiate le fara’ con questo user), di default dovrebbe gia’ essere presente su tutte le distribuzioni, controlliamo che ci sia o aggiungiamolo in caso contrario:


# grep nobody /etc/passwd
nobody:x:65534:65534:nobody:/:/bin/false


Nel caso non fosse presente basterebbe fare:


# useradd -s /bin/false nobody


Vsftpd ha anche bisogno della directory /usr/share/empty, quindi creiamola:

# mkdir /usr/share/empty


Questa parte e’ molto importante, se pensate di dare accesso anonimo al vostro server, allora dovrete creare l’utente ftp, altrimenti potete saltare questa fase:


# useradd -s /bin/false -d /home/ftp ftp


Con questo comando creiamo un utente che ha come login “ftp”, la cui home si trova in /home/ftp al quale pero’ viene preclusa la facolta’ di loggarsi sul sistema (ad esempio tramite ssh o telnet) questo perche’ come shell ha /bin/false. E’ importante che la home directory dell’utente ftp non sia scrivibile dall’utente stesso, e risolviamo semplicemente cambiando l’owner e il gruppo della directory:


# chown root:root /home/ftp
# chmod 755 /home/ftp


La sua home appartiene ora al root, ed e’ scrivibile solo dal root stesso.
Fatto cio’ siamo pronti ad installare il nostro server ftp sul sistema, percio’ date:


# make install


Vsftpd e’ ora pronto a partire (lo troverete in /usr/sbin/vsftpd o /usr/local/sbin/vsftpd).
Prima di configurarlo dobbiamo scegliere se far girare il nuovo server tramite inetd/xinetd oppure farlo girare in standalone mode.
La differenza risiede nel fatto che utilizzandolo in standalone mode, dovremo avviarlo quando la nostra macchina fa il boot, poi il programma restera’ in ascolto per le richieste ftp. Utilizzando inetd/xinet il server verra’ avviato soltanto quando qualcuno fa esplicita richiesta di connessione alla porta ftp. A voi la scelta che piu’ risulta comoda.
Se avete scelto di usarlo in standalone mode allora potete saltare la prossima lezione, altrimenti…


Configuriamo inetd e xinetd


Se utilizzate inetd non dovrete far altro che aprire /etc/inetd.conf ed aggiungere:


ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/vsftpd /etc/vsftpd.conf


al posto della riga che avviava il vostro vecchio server ftp (o aggiungetela semplicemente se non avevate un server ftp). In questo modo inetd sapra’ che alla richiesta di una connessione FTP dovra’ aprire vsftpd.
Se invece utilizzate xinetd potete semplicemente creare un file chiamato vsftpd nella directory dove risiedono i file di configurazione dei servizi di xinetd (in genere /etc/xinetd.d/) ed inserirci:


service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd.conf
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
disable = no
}


La configurazione e’ simile a quella dell’inetd tranne per il fatto che specifichiamo con “nice” la priorita’ con cui far girare il server (-20 e’ la priorita’ piu’ alta, 19 e’ la piu’ bassa) e in piu’ chiediamo a xinetd di loggare ogni richiesta di connessione al server.
Se in futuro voleste disabilitare il server (perche’ ad esempio lo state aggiornando) settate “disable” a “yes” e poi reimpostatelo a “no” non appena sarete pronti a farlo tornare online.
In entrambi i casi ricordate di inserire il path corretto in cui si trova il demone, e soprattutto: ravviate inetd/xinetd con questo comando:


# killall -HUP `pidof inetd`


Oppure:


# killall -HUP `pidof xinetd`


Diciamo cosi’ a inetd/xinetd di rileggere il file di configurazione per tener conto degli ultimi cambiamenti nella configurazione.


Configuriamo il server


Passiamo ora al server ftp, il file di configurazione puo’ chiamarsi come vogliamo, e lo possiamo mettere dove piu’ ci e’ comodo, partiamo con un file vuoto di nome vsftpd.conf in /etc:


# cd /etc
# touch vsftpd.conf

Editiamo il file appena creato aggiungendo le seguenti opzioni, una per riga:


background=YES


in questo modo il server si mettera’ automaticamente in modalita’ demone e tornera’ il controllo alla shell.


listen=YES


Listen possiamo settarlo a NO se utilizziamo inetd/xinetd, altrimenti lo setteremo a YES, cosi’ una volta avviato si mettera’ da solo in ascolto sulla porta ftp.


anonymous_enable=YES


Questa opzione e’ importante, mettendola a YES consentiamo l’accesso anonimo all’ftp, mettendola a NO ovviamente la disabilitiamo. Se il vostro sara’ un ftp pubblico potrete tenerla a YES, altrimenti vi consiglio caldamente di disabilitarla.


local_enable=YES


local_enable indica al server se consentire o meno l’accesso agli utenti locali, tenendolo a YES tutti gli utenti con una shell valida, presenti in /etc/passwd, saranno in grado di fare il login sull’ftp, in caso contrario non gli sara’ consentito di usare il server.


write_enable=YES


wrte_enable impostato a YES abilita i seguenti comandi: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, SITE. Se pensate di fare un server ftp in sola lettura (dal quale gli utenti possono solo scaricare) allora settatelo a NO, altrimenti potete metterlo a YES.


local_umask=022


la umask sono i permessi di default con cui vengono creati i file nella directory del server, quella di default di vsftpd e’ un po’ restrittiva (tutti i file vengono creati con i permessi 700) settandola a 022 i file vengono creati con i permessi 755, cioe’ scrivibili e leggibili dal proprietario, leggibili dal gruppo e da tutti gli altri.


anon_upload_enable=NO


settando a NO questa opzione (valida solo se abbiamo abilitato il login anonimo), non consentiamo agli utenti anonimi di mandare file sul nostro server, se desiderate settarla a YES ricordate di creare all’interno di /home/ftp una directory (ad esempio /home/ftp/incoming) scrivibile dall’user ftp.


anon_mkdir_write_enable=NO


evitiamo che gli utenti anonimi creino delle directory, se avete particolare fiducia potete anche settarla a YES.


dirmessage_enable=YES


dirmessage_enable e’ un’opzione puramente estetica, abilitandola gli utenti riceveranno un messaggio se nella directory in cui stanno accedendo e’ presente il file .message con dentro scritto qualcosa (potete ad esempio inserire un .message nella directory incoming, con scritto qualcosa tipo: “In questa directory sono consentiti solo gli upload”, oppure potete inserire una breve descrizione delle directory se avete intenzione di fare un server contenente molte cartelle). Settatela a NO se non prevedete di usarla.


connect_from_port_20=YES


questa opzione fa si che il flusso di dati per il server abbia luogo dalla porta 20 (che e’ la porta ftp-data), in realta’ possiamo disabilitarla (consentendo al server di utilizzare qualche privilegio in meno) ma qualche client potrebbe lamentarsi nel vedere che i dati arrivano da una porta non-standard, credendo magari ad un tentativo di hijacking. Per motivi di compatibilita’ possiamo tenerla abilitata.


xferlog_enable=YES


xferlog fa si che venga creato un log contenente tutti i file uploadati e scaricati dal server. Se prevedete un massiccio traffico sul server potete disabilitarla, anche se e’ una buona idea tener traccia di cosa succede sui nostri server.


xferlog_std_format=YES


in questo modo diciamo a vsftpd che vogliamo il log scritto con il formato standard xferlog, questa opzione risulta utile se utilizzate dei parser per i log che tracciano delle statistiche, se non ne fate uso e volete provare un formato nuovo settatela a NO.


xferlog_file=/var/log/vsftpd.log


questo e’ il path in cui verra’ creato il file di log, che in questo caso abbiamo chiamato vsftpd.log.


idle_session_timeout=600


questo parametro indica dopo quanto tempo di inattivita’ l’utente viene disconnesso, se prevedete molti utenti allora potete abbassare il limite anche a 30-60 secondi piuttosto che a 600.


data_connection_timeout=300


questi invece sono i secondi che il server attendera’ un flusso di dati prima di annullare la connessione. Data_connection_timeout torna utile nel caso che un utente venga disconnesso dalla rete, per cause indipendenti da noi, durante l’upload o il download di dati.


nopriv_user=nobody


dopo aver eseguito il bind sulla porta da noi scelta, il server ftp (per ovvi motivi di sicurezza) deve lasciare i privilegi dell’utente root e passarli a qualcun altro, con nopriv_user specifichiamo quale sara’ l’utente dal quale verranno ereditati i privileg, nobody e’ in genere l’utente con meno privilegi di tutto il sistema.


async_abor_enable=NO


questa opzione fa si che il server riconosca le richieste di ABOR (interruzione) asincrone, possiamo settarla a NO per motivi di sicurezza, anche se i client piu’ vecchi potrebbero risentirne (ma gli utenti con client cosi’ obsoleti dovrebbero decisamente aggiornarsi ;-)).


ascii_upload_enable=YES
ascii_download_enable=YES


queste due opzioni sono piuttosto delicate, indicano al server se consentire o meno gli upload o i download in modalita’ ASCII, potete settarle a NO se prevedete di non far mai trasferimenti di file ascii (vale a dire: file di testo). Settandole a YES risolvete il problema dei file ascii, con la consapevolezza che se un utente iniziasse a chiedere ripetutamente il SIZE di un file molto grande, consumerebbe gran parte delle vostre risorse causandovi un vero e proprio DoS.


ftpd_banner=”Welcome to xyz”


ftpd_banner e’ semplicemente il banner che apparira’ in fase di connessione, settatelo come volete, evitando di scrivere il nome e la versione del vostro ftp server, in modo da rendere un tantino piu’ difficile un eventuale attacco da parte di qualche utente, o peggio, da parte di qualche worm.


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


le ultime tre opzioni sono molto importanti, la prima serve a dire se vogliamo chrootare gli utenti nelle rispettive home directory (in pratica agli utenti del sistema loggati sul vostro server, non sara’ concesso di uscire dalla loro home directory durante la sessione ftp), settando la prima opzione a YES diciamo al demone che tutti gli utenti devono essere chrootati. La seconda opzione specifica che abbiamo una lista di utenti che NON vogliamo chrootare (supponiamo di avere un account amministrativo su un server remoto, sarebbe giusto chrootare gli utenti, ma noi stessi dovremmo poter gironzolare liberamente per il sistema).
Il path di questa lista e’ specificato dalla terza opzione.
Il file ovviamente va riempito con i nomi degli utenti che vogliamo lasciar liberi, uno per riga.


Possiamo chiudere a questo punto il file di configurazione, le altre opzioni che vi mostro serviranno solo in particolari casi, ma visto che tornano comunque utili, ne faro’ una breve panoramica:


max_clients=x il numero massimo di connessioni accettato dal server.
max_per_ip=x il numero massimo di connessioni che puo’ stabilire un singolo IP.
Pasv_max_port=x
Pasv_min_port=x La porta piu’ alta e piu’ bassa che verranno utilizzate nelle connessioni passive (utilissima se il firewall vi concede solo un determinato range).
local_max_rate=x La massima velocita’ di trasferimento consentita ad ogni utente locale.
Ssl_enable=Y/N Viene abilitato il trasferimento crittografato dei dati, logicamente dovete aver OpenSSL installato, e i client devono essere predisposti per accettare connessioni SSL.
No_anon_password=Y/N Se settata a YES agli utenti anonimi non verra’ chiesta la password ma solo il login.
Ls_recurse_enable=Y/N Abilita o disabilita “ls -R” che puo’ consumare molte risorse se il vostro server contiene molti dati.
Download_enable=Y/N Se settato a NO agli utenti non sara’ consentito di scaricare nulla dal vostro server.
Listen_ipv6=Y/N Se abilitato il server ricevera’ soltanto connessioni ipv6 e non ipv4


Menzione a parte fa fatta per un’opzione piuttosto particolare: hide_file.
Grazie a questa opzione possiamo infatti nascondere uno o piu’ file che rispondono ad un determinato pattern. Hide_file utilizza una parte delle regular expression per valutare se il file e’ da nascondere o meno, un esempio che ci viene fornito dalla documentazione e’:


hide_file={*.mp3,.hidden,que*o,hide*,h?}


se configurassimo il nostro ftp server in queste maniera, verrebbero nascosti (ma sarebbero comunque accessibili se un utente ne conoscesse l’esatto nome) i file:
1. con estensione .mp3
2. il cui nome sia .hidden
3. che iniziano per “que” e finiscono in “o” (questo, quello, quequero)
4. che iniziano con “hide” (hidefile, hide1, hideme, hideout)
5. il cui nome sia composto da una “h” e da un carattere qualunque (h1, h2, h3, ha, hh, hQ…)


Ora che il nostro file di configurazione e’ pronto possiamo avviare il server ftp. Ho scelto di utilizzare la modalita’ standalone, quindi per avviare il server bastera’ fare:

# /usr/sbin/vsftpd /etc/vsftpd.conf


Ovvero il path del server seguito dal path del file di configurazione.
Per verificare che tutto e’ andato come prevedevamo facciamo:


# ps aux | grep vsftpd
root 6600 0.0 0.1 1868 528 ? Ss Aug 30 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf


$ ftp localhost
Connected to localhost.
220 “Welcome to xyz FTP server.”
Name (localhost:xyz):
SSL not available
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.


Se avete scelto di utilizzare il server tramite inetd/xinetd vi bastera’ eseguire l’ultimo comando: “ftp localhost” (se siete in locale) oppure “ftp ip_del_server” (nel caso il server si trovi su una macchina remota). Inetd/xinetd avvieranno il server per voi e vi verra’ chiesto username e password.
Provate anche a scaricare un file e poi aprire il log in /var/log/vsftpd.log per vedere se il sistema di logging funziona correttamente, dovreste ottenere qualcosa di simile a:


# tail -n 3 /var/log/vsftpd.log
Mon Aug 30 01:07:24 2004 1 192.168.1.45 80284 /home/ftp/ia.zip b _ o r honeypot ftp 0 * c
Mon Aug 30 01:08:10 2004 6 192.168.1.45 6911796 /home/ftp/epr.pdf b _ o r honeypot ftp 0 * c
Mon Aug 30 01:09:42 2004 27 192.168.1.45 137728 /home/ftp/polansky.pdf b _ o r honeypot ftp 0 * c


Il log va letto in questa maniera: il primo campo e’ il giorno della settimana, seguito dal mese e dal giorno (in forma numerica), l’ora e l’anno, l’ip di chi ha fatto la richiesta di connessione, la dimensione in byte del file prelevato/uploadato, il path assoluto del file prelevato/uploadato, il tipo di trasferimento (a se ascii, b se binario), se sono state eseguite azioni particolari dal server (C se il file era compresso, U se il file era decompresso, T se il file era un archivio TAR, _ se non e’ stata eseguita nessuna azione speciale), la direzione (o se il file e’ andato dal server all’utente, i se e’ andato dall’utente al server), il metodo di login dell’utente (a se anonimo, g se guest, r se tramite username legittimo contenuto in /etc/passwd), l’username dell’utente, il servizio utilizzato (ftp in questo caso) il metodo di autenticazione utilizzato (0 se non e’ stato utilizzato nessun metodo di autenticazione, 1 se e’ stata usata l’autenticazione RFC931), l’id ritornato dall’autenticazione (* se non e’ tornato nessun ID come nel nostro caso, visto che non abbiamo utilizzato alcuna autenticazione) ed infine lo stato del trasferimento (c se completo, i se incompleto).


Conclusioni


Come avete visto vsftpd consente una configurazione estremamente capillare e nonostante questo resta molto intuitivo.
E’ un programma molto versatile, grazie al quale diventa semplicissimo aggiungere il supporto SSL e il supporto ipv6, si nota molto l’approccio alla sicurezza introdotto dall’autore, che ci da’ la possibilita’ di controllare anche quei comportamenti generalmente poco frequenti, ma che comunque potrebbero essere utilizzati per attaccare o rallentare la nostra macchina.
Nonostante le dimensioni contenute, si presenta come un ottimo rivale dei suoi fratelli maggiori proftp e wuftp essendo dotato di ottima scalabilita’ e velocita’.




About the Author

Related Posts