Il linguaggio da forma al modo in cui pensiamo e a quello che possiamo pensare.
Al lavoro mi son ritrovato a dover risolvere lo scenario del dare accesso ad un certo numero di dati (di dimensione di qualche GB per file) e documenti ad un paio pool di utenti, per la maggior parte esterni alla nostra struttura.
Questo mi ha portato allo scarto di soluzioni che prevedevano l’accesso fisico alla macchina (no ssh quindi). Ho purtroppo dovuto scartare anche soluzioni basate sul “paradigma” LAMP, per le intrinseche limitaziondi di Apache come gestore di trasferimento file … ad esempio DocMgr che pure avevamo implementato ma che ha retto sino a quando ci si è trovati a dover caricare/scaricare file >1GB … e tenendo conto che ne ho diversi altri tra i 5/8GB capirai perché ho ritenuto poco proficuo tenerlo in funzione.
Ancora, nel tempo è sorta anche la necessità di imporre ragionevoli limiti alla banda di rete utilizzabile da questo singolo servizio, specie in occasioni di limitazioni di utilizzo della banda “Internet” disponibile.

Mi sono quindi messo alla ricerca di una soluzione collaudata, di semplice implementazione e ragionevolmente sicura, trovando alcuni tutorial su come implementare un servizio di FTP che mi permettesse di avere un pool di “Utenti Virtuali“.
La scelta è del server FTP da utilizzare è caduta alla fine su pureFTPd che implementa nativamente un modulo che permette questa funzionalità di utenze virtuali mappando su un unico utente “reale” del sistema tutto un insieme di utenze del servizio le cui caratteristiche sono gestite da un database MySQL.
![]()
Andiamo a vedere passo passo come procedere.
Come detto più volte al lavoro si è deciso l’utilizzo la distribuzione GNU/Linux CentOS e quindi la mia piccola guida trattarà questa piattaforma. Installo il server con un semplice:
yum install pure-ftpd
Vado a creare l’utente di sistema su cui andrò a mappare quelli virtuali con i comandi:
groupadd -g 2001 virtualftpuser
useradd -u 2001 -s /bin/false -d /bin/null -c "system pureftpd user" -g virtualftpuser virtualftpuser
Con i due precedenti comandi ho creato un utente virtualftpuser, facente parte del gruppo omonimo e, con il parametro -s /bin false ho detto al sistema di NON assegnare una shell all’utente e con -d /bin/null ho detto di non creare una home directory per esso.
Con il comando:
passwd virtualftpuser
vado ad inserire la password dell’utente di sistema appena creato.
Creiamo ora un database di nome pureftpd e un utente del DBMS che chiameremo a sua volta pureftpd, il quale vi avrà successivamente accesso ad esso con la password che scegliamo ed andiamo ad inserire come segue:
mysql -u root -p
CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'password-da-impostare';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'password-da-impostare';
FLUSH PRIVILEGES;
Sempre rimanendo nella shell di MySQL, su cui siamo autenticati, andiamo ora a popolare il database appena creato con il seguente comando:
USE pureftpd;
CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) TYPE=MyISAM;
e quindi usciamo dal DBMS
quit;
Fatto questo siamo quasi al termine dei passi salienti della procedura, ci rimane da rifinire la configurazione di pureFTPd. Tra la pacchettizzazione di CentOS ed Ubuntu {su cui avevo implementato una prima istanza del servizio} ci sono alcune differenze (come per un numero fastidiosamente alto di altri programmi), in ogni caso nella nostra piattaforma operativa tutti i file di configurazione del nostro server sono contenuti in /etc/pure-ftpd/ e sono:
Come possiamo vedere pureFTPd presenta delle opzioni per gestire gli utenti anche tramite LDAP o su di un DBMS postgreSQL … ma torniamo a noi ed andiamo ad editare il file pureftpd-mysql.conf assicurandoci che i seguenti valori siano selezionati:
MYSQLSocket /var/run/mysqld/mysqld.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUser pureftpd
MYSQLPassword password-da-impostare
MYSQLDatabase pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
Dobbiamo poi impostare una “gabbia” chroot agli utenti in modo che non possano mettersi a curiosare nel nostro sistema una volta utenticati, andiamno quindi ad editare il file pure-ftpd.conf nel modo seguente:
# Cage in every user in his home directory
ChrootEveryone yes
quindi diamo la possibilità di creare le home directory quando l’utente si autentica sul sitema la prima volta ed essa non è presente:
# Automatically create home directories if they are missing
CreateHomeDir yes
infine andiamo a decommentare la linea relativa ai parametri di configurazione di MySQL:
# MySQL configuration file (see README.MySQL)
MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf
nel mio caso ho scelto di disabilitare l’accesso anonimo al nostro server mediante l’impostazione del seguente parametro:
NoAnonymous yes
Ed infine, come ulteriore passaggio (forse inutile) disabilitiamo la possibilità di caricare nuovi file nel sistema da parte di utenti anonimi impostando a yes la voce seguente:
AnonymousCantUpload yes
A questo punto possiamo avviare il demone pureFTPd con il comando
/etc/init.d/pure-ftpd start
Se tutto e’ funzionante possiamo passare alla creazione di utenze e al loro testing:
mysql -u root -p
USE pureftpd;
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.esempio.com', '100', '100', '', '*', '50', '0');
Con lo statement precedente abbiamo detto al sistema di:
La gestione dei permessi su disco, e di come gli utenti possono interagire col sistema si lascia come esercizio al lettore
–
Riferimenti:
... nel mio blog, la mia Island on WWW ... continuo work in progress, porto nel mare magnum degli eventi della vita.
Esplora liberamente questo sito e - se ti va - lascia traccia del tuo passaggio, mi farai felice !