back to top

Configurare proFTPD

Come abbiamo detto gli utenti che usufruiranno del servizio FTP saranno virtuali, ma ovviamente avremo bisogno anche di un utente di sistema che si occupi di interagire materialmente con il filesystem del nostro server. Questo utente "reale" sarà poi utilizzato in comune da tutti gli utenti virtuali.

Andiamo quindi a creare utente e gruppo esplicitando uid e gid (userID e groupID) che ci serviranno successivamente:

sudo groupadd -g 1500 ftpgroup
sudo useradd -u 1500 -s /bin/false -d /bin/null -c "utente proftpd" -g ftpgroup ftpuser

Terminate queste operazioni passiamo alla creazione del database necessario al nostro server FTP.

Configurare MySQL

Su MySQL andremo a creare il database (lo chiameremo ftp) e l’utente che verrà usato dal servizio proftpd per connettersi al database. Per prima cosa entriamo dentro la console di MySQL:

mysql -u root -p

Ora creiamo il database, dando all’utente di mysql proftpd i diritti di inserimento, modifica e cancellazione. Ricordiamoci di impostare anche la password desiderata per l’utente, sostituendo la ben poca fantasiosa parola password usata in questo esempio:

CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Effettuiamo ora l’accesso al database appena creato:

USE ftp;

e andiamo a creare, incollando il codice sottostante, le 4 tabelle necessarie all’organizzazione degli utenti virtuali: ftpgroup, ftpquotalimits, ftpquotatallies e ftpuser:

CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '1500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM;

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '1500',
gid smallint(6) NOT NULL default '1500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '1970-01-01 00:00:00',
modified datetime NOT NULL default '1970-01-01 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM;

Usciamo infine dalla console MySql:

quit;

Moduli e File di configurazione

Terminate le configurazioni sul database occupiamoci ora di quelle su proftpd. Per prima cosa andiamo ad abilitare i moduli necessari per l’integrazione con MySQL. Per farlo apriamo il file modules.conf:

sudo nano /etc/proftpd/modules.conf

e decommentiamo, rimuovendo il cancelletto di inizio riga, i tre seguenti moduli:

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab_sql.c

Salviamo e chiudiamo il file appena modificato.

Occupiamoci ora del file di configurazione principale di proftpd:

sudo nano /etc/proftpd/proftpd.conf

Ci sono alcuni parametri principali che possiamo modificare o lasciare con le impostazioni di default (ne vediamo qui alcuni, per l’elenco completo rimando alla lista della documentazione ufficiale):

  • ServerName: Possiamo specificare il nome del nostro server ftp che vedranno i client collegati.
  • ServerType: Specifica il tipo di server, che in fase di installazione abbiamo già indicato come standalone.
  • DeferWelcome: Se abilitato disattiva i messaggi di benvenuto per gli utenti non ancora identificati. Si tratta di una questione puramente di sicurezza, se non vogliamo dare alcun riferimento ad eventuali malintenzionati possiamo abilitare questa opzione altrimenti lasciamola off.
  • TimeoutNoTransfer: Imposta il timeout per le connessione senza trasferimento di dati (in secondi).
  • TimeoutStalled: Imposta il timeout per le connessione con trasferimento di dati bloccato (in secondi).
  • TimeoutIdle: Imposta il timeout per le connessione inattive (in secondi).
  • DisplayLogin: Indica il nome del file contenente il messaggio di benvenuto che apparirà al client al momento della connessione. È possibile indicare il percorso assoluto oppure relativo. Nel caso di un nome di file relativo, questo verrà cercato sulla directory dell’utente.

Un altra operazione che dobbiamo effettuare, consiste nel commentare le tre seguenti righe:

#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>

Identifichiamo poi la seguente sezione:

# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf

e incolliamoci sotto le seguenti istruzioni, dove andiamo a specificare l’utilizzo di MyAql con i relativi parametri per la gestione degli utenti:

DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups

# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost proftpd password

# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "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 FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off

Ovviamente dobbiamo sostituire password con la password specificata in precedenza per il nostro utente proftpd. A questo punto possiamo salvare, chiudere il file e riavviare il servizio:

sudo /etc/init.d/proftpd restart

Come possiamo vedere, abbiamo lasciato il parametro DisplayLogin settato con il nome relativo del file (welcome.msg). Questo vuol dire che ad ogni utente collegato verrà mostrato, se presente, il messaggio contenuto nel file welcome.msg all’interno della propria directory. Possiamo crearne uno noi oppure copiare quello di default /srv/ftp/welcome.msg nelle home directory degli utenti virtuali che andremo ora a creare.

Pubblicità