• Come installare e configurare su Ubuntu il server FTP pure-ftp

    In questo articolo mostriamo come installare e configurare pure-ftp, un server FTP semplice e veloce con un'impronta bassa di memoria. Sebbene abbiamo già provveduto alla descrizione di vsFTP, questo server possiede le caratteristiche normali e richiede meno attenzioni particolari.



    In primo luogo entriamo in aptitude con diritti di root, e installiamo pure-ftpd come proposto dal pacchetto. La procedura è veloce e indolore, e accettiamo tutte le eventuali richieste senza applicare alcuna modifica.

    Successivamente, aggiungiamo l'autenticazione tramite database PureDB, che ci permette di usare utenti virtuali, in aggiunta agli utenti di sistema:
    Codice: [Visualizza]
    # cd /etc/pure-ftpd/auth/
    # rm *
    # echo '/etc/pure-ftpd/pureftpd.pdb' > ../conf/PureDB
    # ln -s ../conf/PureDB 10puredb
    Verifichiamo:
    Codice: [Visualizza]
    # ls -lA
    totale 0
    lrwxrwxrwx 1 root root 14 feb 21 22:42 10puredb -> ../conf/PureDB
    Se vogliamo usare anche gli utenti di sistema, scriviamo anche:
    Codice: [Visualizza]
    # ln -s ../conf/PAMAuthentication 20PAMAuthentication
    L'ordine di verifica è determinato dall'ordine alfabetico, in questo caso 10... e poi 20...

    A questo punto passiamo alla creazione di un nuovo utente virtuale FTP, ftp_pincopallino, che deve accedere alla cartella /vhosts/pincopallino.it/, con i diritti di lettura e scrittura del server web. Ci verrà chiesto la password per due volte, che copia-incolliamo da un database di password, possibilmente generato secondo i criteri di sicurezza con almeno 8, meglio 10, caratteri alfanumerici, ad esempio: 5wGCSp3Gc5. Al posto del codice 33 possiamo usare www-data:
    Codice: [Visualizza]
    # pure-pw useradd ftp_pincopallino -m -u 33 -g 33 -d /vhosts/pincopallino.it/
    Password: 
    Enter it again:
    Riavviamo dunque il server FTP:
    Codice: [Visualizza]
    # /etc/init.d/pure-ftpd restart
    Che ci mostra qualcosa simile a:
    Codice: [Visualizza]
    Restarting ftp server: Running: /usr/sbin/pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -l pam -u 1000 -E -8 UTF-8 -O clf:/var/log/pure-ftpd/transfer.log -B
    Se il firewall ce lo permette, possiamo fare il login, altrimenti bisogna aprire le porte 20 e 21 in ingresso. Al login (utilizzo FileZilla) notiamo subito l'errore:
    Codice: [Visualizza]
    21:51:34    Risposta:    220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
    21:51:34    Risposta:    220-You are user number 1 of 50 allowed.
    21:51:34    Risposta:    220-Local time is now 21:51. Server port: 21.
    21:51:34    Risposta:    220-This is a private system - No anonymous login
    21:51:34    Risposta:    220-IPv6 connections are also welcome on this server.
    21:51:34    Risposta:    220 You will be disconnected after 15 minutes of inactivity.
    21:51:34    Comando:    USER ftp_pincopallino
    21:51:34    Risposta:    331 User ftp_pincopallino OK. Password required
    21:51:34    Comando:    PASS *
    21:51:36    Risposta:    530 Sorry, but I can't trust you
    21:51:36    Errore:    Errore grave
    21:51:36    Errore:    Impossibile collegarsi al server
    Questo errore deriva dal fatto che gli utenti con un ID inferiore a 1000 non possono loggarsi, a meno che non si varia questa impostazione. Nelle configurazioni che utilizzano l'utente Apache anche per FTP, bisogna quindi abbassare questo livello a 1, nel file /etc/pure-ftpd/conf/MinUID, impostato a 1000 per valore predefinito, e riavviare il server FTP:
    Codice: [Visualizza]
    # echo '1' > /etc/pure-ftpd/conf/MinUID
    # /etc/init.d/pure-ftpd restart
    Restarting ftp server: Running: /usr/sbin/pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -l pam -u 1 -E -8 UTF-8 -O clf:/var/log/pure-ftpd/transfer.log -B
    A questo punto possiamo fare il login, ma come vediamo, l'utente può risalire le cartelle, e questo lo dobbiamo assolutamente evitare! Aggiungiamo quindi un file di configurazione, /etc/pure-ftpd/conf/ChrootEveryone, e impostiamo il valore a yes:
    Codice: [Visualizza]
    # echo 'yes' > /etc/pure-ftpd/conf/ChrootEveryone
    # /etc/init.d/pure-ftpd restart
    Restarting ftp server: Running: /usr/sbin/pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -l pam -u 1 -E -8 UTF-8 -O clf:/var/log/pure-ftpd/transfer.log -A -B
    Al nuovo login, ed eventuale refresh delle cartelle, vediamo che questo problema è scomparso.

    Per tutte le possibili configurazioni esiste un file che contiene i nomi dei file da creare, e con un po' di intuizione si può quindi rendere il server parecchio versatile: /usr/sbin/pure-ftpd-wrapper. All'inizio si trova questa lista, che riportiamo qui per completezza. Dove appare un parse_number, il valore è numerico, con parse_string è una stringa, altrimenti yes oppure no. Il parametro in parentesi quadre viene poi aggiunto alla riga di comando di avvio del server, come abbiamo visto qui sopra:
    Codice: [Visualizza]
    my %conf = ('AllowAnonymousFXP' => ['-W'],
                            'AllowDotFiles' => ['-z'],
                            'AllowUserFXP' => ['-w'],
                            'AltLog' => ['-O %s', \&parse_string],
                            'AnonymousBandwidth' => ['-t %s', \&parse_number_1_2],
                            'AnonymousCanCreateDirs' => ['-M'],
                            'AnonymousCantUpload' => ['-i'],
                            'AnonymousOnly', => ['-e'],
                            'AnonymousRatio' => ['-q %d:%d', \&parse_number_2],
                            'AntiWarez' => ['-s'],
                            'AutoRename' => ['-r'],
                            'Bind' => ['-S %s', \&parse_string],
                            'BrokenClientsCompatibility' => ['-b'],
                            'CallUploadScript' => ['-o'],
                            'ChrootEveryone' => ['-A'],
                            'CreateHomeDir' => ['-j'],
                            'CustomerProof' => ['-Z'],
                            'Daemonize' => ['-B'],
                            'DisplayDotFiles' => ['-D'],
                            'DontResolve' => ['-H'],
                            'ForcePassiveIP' => ['-P %s', \&parse_string],
                            'FortunesFile' => ['-F %s', \&parse_filename],
                            'FSCharset' => ['-8 %s', \&parse_string],
                            'ClientCharset' => ['-9 %s', \&parse_string],
                            'IPV4Only' => ['-4'],
                            'IPV6Only' => ['-6'],
                            'KeepAllFiles' => ['-K'],
                            'LimitRecursion' => ['-L %d:%d', \&parse_number_2_unlimited],
                            'LogPID' => ['-1'],
                            'MaxClientsNumber' => ['-c %d', \&parse_number_1],
                            'MaxClientsPerIP' => ['-C %d', \&parse_number_1],
                            'MaxDiskUsage' => ['-k %d', \&parse_number_1],
                            'MaxIdleTime' => ['-I %d', \&parse_number_1],
                            'MaxLoad' => ['-m %d', \&parse_number_1],
                            'MinUID' => ['-u %d', \&parse_number_1],
                            'NATmode' => ['-N'],
                            'NoAnonymous' => ['-E'],
                            'NoChmod' => ['-R'],
                            'NoRename' => ['-G'],
                            'NoTruncate' => ['-0'],
                            'PassivePortRange' => ['-p %d:%d', \&parse_number_2],
                            'PerUserLimits' => ['-y %d:%d', \&parse_number_2],
                            'ProhibitDotFilesRead' => ['-X'],
                            'ProhibitDotFilesWrite' => ['-x'],
                            'Quota' => ['-n %d:%d', \&parse_number_2],
                            'SyslogFacility' => ['-f %s', \&parse_word, 99],
                            'TLS' => ['-Y %d', \&parse_number_1],
                            'TrustedGID' => ['-a %d', \&parse_number_1],
                            'TrustedIP' => ['-V %s', \&parse_ip],
                            'Umask' => ['-U %s:%s', \&parse_umask],
                            'UserBandwidth' => ['-T %s', \&parse_number_1_2],
                            'UserRatio' => ['-Q %d:%d', \&parse_number_2],
                            'VerboseLog' => ['-d'],
                        );
    Infine, il manuale di pure-ftpd e pure-pw spiegano gli altri comandi in modo esauriente ... basta tuffarsi un attimo nel mondo di questo server