Per creare gli utenti virtuali dobbiamo tornare sul nostro MySQL e andare a popolare il database. Colleghiamoci alla console:
mysql -u root -p
ed entriamo nel nostro database:
USE ftp;
Per prima cosa andiamo a creare un gruppo al quale associeremo tutti gli utenti. Per farlo lanciamo questa query di inserimento sulla tabella ftpgroup:
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 1500, 'ftpuser');
Questa tabella non necessiterà di ulteriori interventi.
Creiamo ora il nostro primo utente: batman.
Questa volta dobbiamo lanciare 2 istruzioni di inserimento: la prima nella tabella ftpuser per inserire i dati specifici per l’utente, la seconda nella tabella ftpquotalimits per settare le quote a disposizione dell’utente:
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'batman', 'Gotham_City', 1500, 1500, '/home/batman_ftp', '/sbin/nologin', 0, '1970-01-01 00:00:00', '1970-01-01 00:00:00');
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('batman', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
La quarta tabella creata, ftpquotatallies, è utilizzata internamente da ProFTPD per la gestione delle quote. Una volta creata non dobbiamo più andarla a toccare. Possiamo quindi uscire dalla console di MySQL:
quit;
Una volta concluse le operazioni sul database, riavviamo ancora una volta il servizio proftpd:
sudo /etc/init.d/proftpd restart
Abbiamo così creato il primo utente virtuale che potrà collegarsi al nostro server FTP e scambiarsi file con esso.
Osserviamo però più nel dettaglio i campi delle istruzioni sql di inserimento appena lanciate, ne avremo bisogno quando andremo a creare anche altri utenti virtuali. Tabella ftpuser:
- id: id univoco per identificare l’utente.
- userid: Username dell’utente virtuale.
- passwd: Password assegnata all’utente.
- uid: UserID dell’utente ftp che abbiamo creato in precedenza (nel nostro esempio avevamo assegnato 1500).
- gid: GroupID del gruppo ftp che abbiamo creato in precedenza (nel nostro esempio avevamo assegnato 1500).
- homedir: Home directory al quale l’utente avrà accesso per i suoi file.
- shell: Shell linux dell’utente, essendo virtuale lasciamo sempre /sbin/nologin.
Tabella ftpquotalimits:
- name: nome dell’utente al quale settare le quote.
- quota_type: user o group. Nel nostro esempio impostiamo "user".
- per_session: Se impostato su "true" allora il limite della quota varra solamente per una sessione. Ad esempio fissando a 15MB la quota, l’utente può fare un upload di 15MB complessivi dopodichè non gli sarà consentito caricare altro. Se però si disconnette e rientra avrà di nuovo 15MB a disposizione per l’upload. Impostando "false" invece il limite sarà fisso.
- limit_type: hard o soft. Impostando su "hard" la quota non potrà mai essere superata. Con "soft" viceversa sarà tollerato superarla temporaneamente.
- bytes_in_avail: Limite della quota di upload espresso in bytes. Nel nostro caso 15728640=15MB. Mettendo 0 non ci sarà alcun limite.
- bytes_out_avail: Limite della quota di download espresso in bytes. Può essere utile per limitare il consumo eccessivo di banda da parte di un singolo utente. Mettendo 0 non ci sarà alcun limite.
- bytes_xfer_avail: Limite di traffico (upload + download) espresso in bytes. Mettendo 0 non ci sarà alcun limite.
- files_in_avail: Limite numero file in upload. Mettendo 0 non ci sarà alcun limite.
- files_out_avail: Limite numero file in download. Mettendo 0 non ci sarà alcun limite.
- files_xfer_avail: Limite numero di file (upload + download) trasmessi. Mettendo 0 non ci sarà alcun limite.
Tramite il comando:
ls -l /home
andiamo ad osservare anche i diritti della directory /home/batman_ftp creata automaticamente, dove andranno a finire i file caricati dall’utente batman:
davide@srvubuntu:~$ ls -l /home/
totale 8
drwx------ 2 ftpuser ftpgroup 4096 mar 9 17:06 batman_ftp
Come possiamo vedere la cartella è stata assegnata all’utente ftpuser e al gruppo ftpgroup creati in precedenza appositamente per questo scopo.
Gestione database utenti
Per creare ulteriori utenti virtuali è sufficiente inserire i valori nelle tabelle ftpuser e ftpquotalimits. Per farlo possiamo usare la console MySql, come abbiamo fatto nell’esempio precedente, ma visto che abbiamo installato anche phpMyAdmin perchè non sfruttarlo? Eseguiamo l’accesso collegandoci via browser, come visto nella guida MySQL. Apriamo il database "ftp" e vediamo al suo interno le tabelle che abbiamo creato e i dati del nostro primo utente. Adesso vediamo come inserire un secono utente usando l’interfaccia grafica di phpMyAdmin. Apriamo la tabella ftpuser e, dal menù in alto, facciamo click sul tasto "inserisci". Possiamo quindi inserire id, user, password, directory assegnata e dare il comando "esegui".
Apriamo ora la tabella ftpquotalimits, click su "inserisci" e compiliamo i campi partendo dal nuovo nome utente appena creato:
Fatto. Ora abbiamo creato anche il secondo utente che può iniziare ad usufruire del servizio FTP del nostro server! Tramite il pannello di phpMyAdmin abbiamo sotto controllo in modo facilmente comprensibile tutte le informazioni dei nostri utenti per risalire velocemente a credenziali, directory, quote e, tramite i campi "accessed" e "modified" anche la data e l’ora dell’ultimo accesso o modifica di ogni singolo utente.
Accesso anonimo
Possiamo avere però anche l’esigenza di abilitare il trasferimento file ad utenti privi di registrazione. ProFTPD è in grado di assolvere questa esigenza senza problemi ma ovviamente dobbiamo assicurarci che gli utenti non registrati non accedano a dati altrui. Vediamo quindi come possiamo organizzare questa funzione.
Per prima cosa creiamo un nuovo utente e relativo gruppo sul nostro server, dal momento che vogliamo evitare di usare ftpuser e ftpgroup creati per le esigenze dei client registrati. Li chiameremo entrambi anonymous_ftp, andando anche questa volta ad esplicitare preventivamente uid e gid (nel nostro cosa 1501):
sudo groupadd -g 1501 anonymous_ftp
sudo useradd -u 1501 -s /bin/false -d /home/anonymous_ftp -m -c "Utente FTP Anonimo" -g anonymous_ftp anonymous_ftp
Creando l’utente di sistema abbiamo aggiunto anche la directory /home/anonymous_ftp dove verranno stoccati i file a disposizione degli utenti non autenticati. Infatti non useremo utenti virtuali per gli accessi anonimi ma proprio questo utente. Dal momento che questa directory sarà vista dagli utenti all’accesso, cancelliamo le directory nascoste di sistema in essa contenute, non sono necessarie e potrebbero creare confusione negli utenti:
sudo rm -f /home/anonymous_ftp/.bash_logout
sudo rm -f /home/anonymous_ftp/.profile
sudo rm -f /home/anonymous_ftp/.bashrc
Creiamo anche una directory separata per i file che questi utenti caricheranno tramite upload e assegnamo la proprietà all’utente anonymous_ftp:
sudo mkdir /home/anonymous_ftp/incoming
sudo chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming
Torniamo ora a modificare il file di configurazione principale di proftpd:
sudo nano /etc/proftpd/proftpd.conf
In fondo al file troveremo la sezione Anonymous, ma per default è completamente disattivata tramite il carattere cancelletto di commento. Possiamo decommentare e modificare quanto ci serve oppure ignorarla e incollare interamente sotto di essa quanto segue:
<Anonymous ~anonymous_ftp>
User anonymous_ftp
Group nogroup
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous anonymous_ftp
# Cosmetic changes, all files belongs to ftp user
DirFakeUser on anonymous_ftp
DirFakeGroup on anonymous_ftp
RequireValidShell off
# Limit the maximum number of anonymous logins
MaxClients 10
# We want 'welcome.msg' displayed at login, and '.message' displayed
# in each newly chdired directory.
DisplayLogin welcome.msg
DisplayChdir .message
# Limit WRITE everywhere in the anonymous chroot
<Directory *>
<Limit WRITE SITE_CHMOD>
DenyAll
</Limit>
</Directory>
# Uncomment this if you're brave.
<Directory incoming>
# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask 022 022
<Limit READ WRITE SITE_CHMOD>
DenyAll
</Limit>
<Limit STOR>
AllowAll
</Limit>
</Directory>
</Anonymous>
Usciamo salvando il file appena modificato e riavviamo il servizio:
sudo /etc/init.d/proftpd restart
Ora sarà possibile accedere al nostro server FTP anche agli utenti privi di credenziali di login. Vediamo che anche qui il parametro DisplayLogin è settato con il nome relativo del file (welcome.msg). Se creiamo (o copiamo) il file nella cartella /home/anonymous_ftp anche gli utenti anonimi riceveranno il messaggio di benvenuto. Gli utenti anonimi al momento della connessione avranno accesso alla directory /home/anonymous_ftp dalla quale potranno scaricare tramite download i file messi a disposizione dall’amministratore ma non caricare i propri file. Viceversa nella sottodirectory "incoming" possono caricare tramite upload i propri file ma non possono scaricare, modificare o cancellare altri file in essa contenuti. In questo modo, visto che gli utenti anonimi saranno verosimilmente più di uno, si potranno scaricare i file decisi dall’amministratore e caricati i propri senza che altri possano vederli o modificarli. Questa è difatti la maniera più sensata di gestire gli accessi anonimi consentendo upload e download ma evitando allora stesso tempo che chiunque possa accedere a file di proprietà altrui, garantendo quindi privacy e sicurezza anche in un ambiente anonimo privo di credenziali di accesso.