Questa sarà l'istanza del server che sarà raggiungibile dalla rete internet.
Stò inoltre configurando l'istanza in modo gli utenti siano autenticati con le credenziali locali del server che, ricordo, in assenza di SSL il protocollo ftp trasmette in chiaro. Questo è, quindi, un rischio per la sicurezza del server molto più che potenziale: Personalmente è un configurazione che non metterei mai in esercizio. Un'istanza pubblica con autenticazione sulle credenziali locali senza cifratura è un semplice esercizio, riportato più per completezza che per altri motivi.
I passi da seguire ricalcano esattamente quelli visti per l'istanza locale (la creazione del file di configurazione dell'istanza, la creazione di un utente limitato da associare al servizio, la copia del modulo PAM da utilizzare per l'autenticazione, la creazione del banner e delle liste utente richieste per permettere l'accesso al server e le eventuali jail chroot) con in aggiunta le modifiche da apportare allo script che configura il firewall per permettere l'accesso al server FTP dalla rete pubblica.
Per questa istanza, ho creato i file di configurazione “vsftpd_pubblico.conf” che fornirà la configurazione del server ftp bindato sull'IP 192.168.50.2 del mio server, in quanto è l'interfaccia su cui il router natta le porte in ingresso.
Per creare l'utente ftp_pubblico uso nuovamente i comandi visti in precedenza, che mi mostrano il gruppo cui "ftp" appartiene, creano l'utente e mi mostrano il risultato, per verifica:
Non sarebbe neppure male specificare per l'utente una shell fittizia invece che quella standard, tipo "/bin/false" ma è un'operazione che si può fare anche editando a mano come root il file "/etc/passwd", sempre per una questione di maggiore sicurezza.root@server:/home/matteo# id ftp
uid=107(ftp) gid=112(ftp) groups=112(ftp)
root@server:/home/matteo# adduser --gid 112 --disabled-password ftp_pubblico
Adding user `ftp_pubblico' ...
Adding new user `ftp_pubblico' (1005) with group `ftp' ...
Creating home directory `/home/ftp_pubblico' ...
Copying files from `/etc/skel' ...
Changing the user information for ftp_pubblico
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
root@server:/home/matteo# id ftp_pubblico
uid=1005(ftp_pubblico) gid=112(ftp) groups=112(ftp)
Creo poi il file "/etc/vsftpd/ftp_pubblico_banner" che conterrà, appunto, il banner da mostrare agli utenti ftp al momento della connessione ed i file con la lista di utenti autorizzati al login e degli utenti costretti all'interno della loro home directory, che questa volta userò.
In questa sezione, ho configurato il server per avviarsi in modalità standalone e mettersi in ascolto sulla porta 21 dell'IP 192.168.50.2, che è la mia interfaccia di rete esposta sulla rete pubblica. Per una questione di sicurezza non sarebbe sbagliato cambiare la porta utilizzata per il server ftp: E' poi sufficiente ricordarsi di comunicare agli utenti che il server usa una porta non standard per la connessione. In questa configurazione ho poi attivato la sola modalità passiva per il server ftp, specificando di utilizzare per le connessioni dei client solo il range di porte dinamiche dalla 30000 alla 31000.Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
Se si vuole valorizzare il parametro "pasv_address" con, ad esempio, un hostname tipo "ftp.miodominio.it" è necessario però che esista la risoluzione inversa nel dns pubblico. In caso contrario, i client riusciranno a stabilire la connessione ma al tentativo di listare la una qualunque directory vengono restituiti fastidiosi e criptici problemi di permessi che possono rendere difficile identificare il problema.
Qui imposto lo username non privilegiato da usare per l'istanza, ed il nome del modulo PAM da utilizzare per l'autenticazione (dato che uso gli utenti locali è ancora solo una copia dell'originale). Lascio attivo il "session_support" che dovrebbe semplificare l'analisi dell'attività degli utenti.Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
In questa sezione ho abilitato il server sia alle operazioni di lettura che di scrittura. Ovviamente solo gli utenti locali saranno abilitati alle operazioni di "write" e ho lasciato le mask invariate in modo che per impostazione predefinita solo l'utente stesso abbia i permessi di lettura sui propri files.Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
Ho poi attivato anche i "directory message" utili all'amministratore per lasciare avvisi agli utenti...
La lista dei comandi supportati da vsftpd si può ottenere facendo login sul server ed usando il comando "?".
E' davvero una buona idea restringere il range di comandi ai minimi indispensabili. Una descrizione si può trovare su wikipedia, sono davvero parecchi anche se ormai forse non più molto usati. A maggior ragione, se le intezioni dell'amministratore sono di mettere a disposizione il server ftp solo per permettere agli utenti di caricare, scaricare e movimentare files all'interno della propria home directory, i comandi da abilitare sono proprio pochi...
Personalmente ho scelto i comandi da consentire avviando il server, eseguendo un set delle operazioni che voglio permettere e ho poi autorizzato solo i comandi registrati nel log...
In questa sezione, abilito l'accesso al server sia degli utenti anonimi che degli utenti locali. Per capirci qualcosa, è necessario premettere che per vsftpd non esistono utenti "anonimi" nel vero senso della parola ma solo utenti "non autenticati".Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
In pratica, è sempre e comunque necessario, al login, inserire un nome utente per l'accesso al server in quanto lasciare il campo vuoto restituisce un errore. Per questi accessi, convenzionalmente si utilizzano gli username "anonymous" e/o "ftp" che vengono riconosciute dal server come login "non autenticate".
E' però necessario che questi account compaiano nel file utilizzato per la lista degli utenti autorizzati all'accesso (nel mio caso "ftp_pubblico_user_list") oppure non compaiano nell'elenco degli utenti cui è negato l'accesso, altrimenti si ottiene sempre un "accesso negato".
Per questo motivo preferisco non utilizzare l'account predefinito "ftp" di Debian come username per le mie istanze, voglio essere sicuro che la cosa non generi confusione e preferisco quindi usare uno username diverso. Anzi, per stare sul sicuro provvedo proprio ad eliminare l'account locale denominato "ftp":
Nel file "/etc/vsftpd/ftp_pubblico_user_list", come detto, vengono indicati gli utenti ammessi al login, come nella configurazione precedente. Per abilitare l'accesso "anonimo" quindi, il mio files "ftp_pubblico_user_list" lo preparo così:root@server:/etc/vsftpd# userdel ftp
userdel: group ftp is the primary group of another user and is not removed.
Quindi "anonymous" è utilizzabile per le login non autenticate. Se volessi aggiungere anche "ftp" mi basta inserirlo nel file. Ripeto che stò parlando di uno username convenzionale, non dell'utente locale "ftp" che ho precedentemente eliminato dal server.# Lista utenti abilitati all'accesso FTP.
# Account da utilizzare per l'accesso anonimo:
anonymous
# Accounts autorizzati al login non anonimo:
matteo
[etc...]
Per comodità degli utenti lo specifico nel banner:
Valorizzare il parametro "user_config_dir" in questo caso può essere molto utile in quanto permette di indicare una configurazione specifica per utente (potrei, ad esempio, configurare la sessione di uno specifico utente per non avere restrizioni sui comandi ftp) semplicemente copiando le opzioni "user level" del file configurazione in un altro file denominato con il nome utente posto all'interno della directory indicata.****************************************
*** Server FTP sulla rete pubblica ***
****************************************
ATTENZIONE:
****************************************
Tutte le attivita' del server sono
strettamente monitorate.
****************************************
Login anonimo consentito solo come "anonymous"
Passo finalmente a specificare i permessi per le login anonime sul server. Ho specificato "ftp_pubblico" come account utilizzato da server ftp per interfacciarsi con il filesystem locale. Anche qui vsftpd si dimostra molto protettivo nei confronti del server: Non è consentito utilizzare come "anon_root" una directory che risulti scrivibile quindi il percorso indicato non deve essere scrivibile da "ftp_pubblico", pena il "deny" della login.Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
Se vogliamo permettere l'upload anonimo è quindi necessario indicare un percorso non scrivibile per "anon_root" ed indicare agli utenti (magari tramite .message) dove effettuare l'upload (ad esempio, la directory "/download/ftp" non deve essere scrivibile da "ftp_pubblico" ma la sottodirectory "/download/ftp/upload_anonimi" può esserlo ed in questa directory gli utenti anonimi possono effettuare le operazioni di scrittura). Ovviamente, permette l'upload anonimo su un server ftp è quanto di più assurdo si possa fare, a meno di situazioni particolari.
Il parametro "no_anon_password" regola semplicemente il fatto che venga o meno richiesta una password per la login non autenticata... Serve a poco, anche perchè è solo un campo fittizio a meno che non si voglia implementare il molto poco sicuro meccanismo basato sulla lista di email.
I 3 parametri successivi regolano poi vari livelli di permessi di write sul server per gli utenti anonimi... Per quanto mi riguarda, deve essere tutto disabilitato. Il parametro "anon_world_readable_only" aumenta poi la sicurezza del server perchè permette agli utenti anonimi di scaricare solo file che risultino leggibili all'utente "ftp_pubblico" utilizzato dal servizio. Quindi impedisce ad una login anonima di scaricare un file su cui non ha i permessi di lettura per forzarlo con calma in un secondo momento...
Non avendo permesso upload da parte di utenti anonimi, i parametri relativi al "chown" non si applicano.
Infine posso specificare i permessi che attribuisco sul server agli utenti locali o, meglio, autenticati.
Se non viene indicato un percorso nel parametro "local_root" gli utenti verrano loggati all'interno della loro home directory. Selezionare il parametro "chroot_local_user" permette di restringere comunque gli utenti locali solo al quella determinata directory. E' utile soprattutto per mantenere separate le aree di lavoro, ma valgono le considerazioni fatte in sede di commento del file di configurazione per le questioni legate alla sicurezza.
Ne consegue, in base alle politiche implementate sul server, la lista degli utenti da restringere o meno nella jail: Avendo specificato come valore per "chroot_local_user=YES" allora, impostando il valore di "chroot_list_enable=YES", nel file "chroot_list_file" posso indicare un'elenco di utenti da non restringere nella jail chroot e che quindi possono esplorare liberamente il filesystem del server. Se invece impostassi il valore di "chroot_list_enable=NO" allora tutti gli utenti locali verrebbero costretti nella jail chroot. Specificando invece come valore per "chroot_local_user=NO", impostando il valore di "chroot_list_enable=YES", nel file "chroot_list_file" dovrei indicare un'elenco di utenti da restringere nella jail chroot e che quindi non possono esplorare liberamente il filesystem del server, mentre settare lo stesso valore a "NO" tutti gli utenti locali sarebbero liberi di esplorare il filesystem del server.
Quanto sopra, ovviamente, compatibilmente con i propri permessi sul filesystem, che rimangono sempre la policy di sicurezza più affidabile.
Il parametro "passwd_chroot_enable" permette, se abilitato con "chroot_local_user ,=YES" di specificare un percorso diverso per la jail chroot di ogni utente locale, derivandone il percorso dal file /etc/passwd. Utile, probabilmente, per configurazioni piuttosto complesse.
Il parametro "secure_chroot_dir" è il percorso di una directory vuota, preferibilmente non scrivibile dall'utente ftp, utilizzata quando non è necessario un accesso al filesystem da parte del servizio ftp... lo ammetto, non capisco l'utilità di un servizio ftp senza accesso al filesystem ma evidentemente un motivo di sarà... Il parametro indicato è il valore di default di Debian, diverso da quello previsto da vsftpd.
Infine il parametro "chmod_enable" permette l'uso del comando "SITE CHMOD" sul server ftp. Si applica solo agli utenti locali per un'ovvia questione di sicurezza ma ho disabilitato sia "SITE" che "CHMOD" tra i comandi utilizzabili sul server quindi comunque il suo funzionamento è annullato a monte. Lo lascio abilitato per evitare interferenze con eventuali configurazione "per-utente" che potrei andare a specificare in un secondo momento.
Anche stavolta rimando a più tardi questa sezione.Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
Infine, il logging del server. Anche qui preferisco mantenere il doppio log anche se una volta trovata un configurazione stabile e definitiva può essere utile disabilitare il parametro "log_ftp_protocol" in quanto scrive veramente un sacco di roba... Mantengo il doppio logging, con il parametro "dual_log_enable" e specifico i due files in cui salvare le registrazioni, disabilitando la scrittura nel log di sistema con il parametro "syslog_enable=NO".Originariamente inviato da /etc/vsftpd/vsftpd_pubblico.conf
Nel file "vsftpd_pubblico.xferlog" vengono registrati solo i trasferimenti avvenuti via ftp, nel file "vsftpd_pubblico.log" anche i comandi ftp finchè questa registrazione non viene disabilitata.
In ultimo devo aggiungere le seguenti righe al mio script di generazione del firewall, per aprire le porte necessarie. Faccio riferimento sempre allo script utilizzato nel thread di installazione del server, ringraziando di nuovo l'autore del tool di generazione dello script.
Nella sezione iniziale "Load Modules", in cui vengono impostati i moduli di del kernel da caricare per il funzionamento del firewall, aggiungo o decommento le righe:
Il primo è necessario per le connessioni in modalità attiva, per la modalità passiva che ho implementato non dovrebbe essere indispensabile.# The ftp nat module is required for non-PASV ftp support
/sbin/modprobe ip_nat_ftp
# the module for full ftp connection tracking
/sbin/modprobe ip_conntrack_ftp
Infine devo aprire le porte utilizzate nella chain "INPUT", sia la porta di "listen" (21, se non modificata) che le porte usate per il trasferimento dei files.
In modalità attiva la porta di trasferimento è la porta 20, se non modificata o se il parametro "connect_from_port_20" è stato impostato a "YES") mentre in modalità passiva c'è da specificare un range (consigliato) oppure da aprire tutto il range di porte dinamiche (di massima è preferibile evitare).
Io ho attivato la sola modalità passiva e indicato il range da 31000 a 32000 e quindi nel mio firewall devo aggiungere/modificare le seguenti sezioni:
Originariamente inviato da /etc/firewall
Ora che la configurazione del server è completa, creo la directory "/download/ftp/" e ne stabilisco i permessi a livello filesystem.
I permessi da assegnare sono molto diversi sulla base della configurazione del server, difficile trovare una configurazione che vada bene per tutti. I requisiti da soddisfare sono la sola lettura da parte dell'utente utilizzato per il servizio ftp che gestisce le login anonime ed i permessi di scrittura per l'utente o gli utenti che dovranno effettuare l'upload dei file per renderli disponibili (nelle proprie home directory gli utenti locali hanno già i permessi di scrittura).
Nel mio caso, voglia che il servizio ftp renda disponibile l'accesso anonimo ad un directory che si trova all'interno di una share samba. In questo modo, tramite samba da un pc connesso in rete posso pubblicare files e directory sul server ftp semplicemente copiandoli nella share Windows.
La directory di pubblicazione è, appunto, "/download/ftp/" e "/download/" il percorso delle directory sul filesystem condivisa via samba. Perchè la directory ftp sia scrivibile dalla LAN via samba è necessario che l'utente con cui samba scrive sul filesystem abbia i permessi di scrittura mentre gli utenti che il servizio ftp presenta come anonimi dovranno avere solo i permessi di lettura ed, eventualmente, esecuzione.
Sempre rifacendomi alla configurazione del mio serverino, l'utente con cui samba scrive sul filesystem è "guest" mentre l'utente utilizzato dal servizio FTP appartiene al gruppo "ftp".
root@server:/download# mkdir /download/ftp
root@server:/download# ls -al ftp
total 4
drwxr-xr-x 2 root root 6 Dec 26 17:43 .
drwxr-xrwx 11 root root 4096 Dec 26 17:43 ..
root@server:/download# chown -R guest:ftp /download/ftp/
root@server:/download#ls -al /download/ftp/
total 4
drwxr-xr-x 2 guest ftp 6 Dec 26 18:00 .
drwxr-xrwx 11 root root 4096 Dec 26 18:00 ..
[EDIT del 13/04/2013]
Aggiornata l'istruzione cmds_allowed.