Installare Proftpd con supporto MySql
Questo articolo è più che altro un modo per ricordarmi come fare questa operazione che ieri al lavoro mi ha portato via l’intera giornata, nonostante su internet sia spiegato piuttosto bene come eseguirla.
Allora, innanzitutti l’obiettivo: installare un server ftp (Proftpd) i cui utenti siano registrati in un database (MySql) gestibile attraverso un comodo frontend (Phpmyadmin).
Tale operazione io l’ho effettuata su una debian etch modificata per essere esguita su un server Dell PowerEdge t105, ma sono quasi sicuro che anche su altri sistemi linux basati su debian dovrebbe andar bene.
cominciamo.
innanzitutto vanno installati mysql e phpmyadmin:
apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin
fin qui nulla di difficile.
va poi impostata una password per l’utente root di mysql:
mysqladmin -u root password yourrootsqlpassword
dove, ovviamente, yourrootpassword va sostituita con la password scelta per l’utente root.
a questo punto va installato il server proftpd con il supporto mysql:
apt-get install proftpd-mysql
da notare che installando il pacchetto proftpd-mysql apt installerà anche il pacchetto proftpd e che questo andrà installato come demone stand-alone (come per altro vi proporrà l’installer stesso).
ora impostiamo un utente e un gruppo che gli utenti virtuali useranno per collegarsi al server ftp:
innanzitutto ci accertiamo che il pid e l’uid 2001 siano liberi:
cat /etc/passwd | grep 2001
cat /etc/group | grep 2001
questi due comandi devono dare un output nullo, in caso contrario ne va impostato uno differente.
creiamo quindi utente e gruppo:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
qui ho usato il gruppo ftpgroup cpme nome per il gruppo e ftpuser come nome per l’utente, ma naturalmente si può utilizzare i nomi che si preferiscono a patto di modificare opportunemente le istruzioni successive.
creiamo quindi un database chiamato ftp e un utente da utilizzare per modificarlo:
mysql -u root -p
create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
anche qui ovviamente a password va sostituita la password scelta per l’utente proftpd.
ora siamo pronti per creare le tabelle che conterrano i dati degli utenti del server ftp:
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';
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 int(10) unsigned NOT NULL default '0',
bytes_out_avail int(10) unsigned NOT NULL default '0',
bytes_xfer_avail int(10) 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'
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used int(10) unsigned NOT NULL default '0',
bytes_out_used int(10) unsigned NOT NULL default '0',
bytes_xfer_used int(10) 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'
) TYPE=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 '5500',
gid smallint(6) NOT NULL default '5500',
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 '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';
quit;
con quit usciamo dall’interfaccia di mysql e torniamo alla shell…
ora vanno modificate le impostazione di proftpd. modifichiamo quindi il file /etc/proftd/proftpd.conf aggiungedovi, in fondo:
DefaultRoot ~
# 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
SQLHomedirOnDemand 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
sostituendo a password la password scelta per l’utente del database impostata prima.
volendo si può anche aggiungere il codice seguente, sempre al file proftpd.conf, per avvertire l’utente di quanto spazio ha ancora a disposizione:
SQLNamedQuery gettally SELECT "ROUND((bytes_in_used/1048576),2) FROM ftpquotatallies WHERE name='%u'"
SQLNamedQuery getlimit SELECT "ROUND((bytes_in_avail/1048576),2) FROM ftpquotalimits WHERE name='%u'"
SQLNamedQuery getfree SELECT "ROUND(((ftpquotalimits.bytes_in_avail-ftpquotatallies.bytes_in_used)/1048576),2) FROM ftpquotalimits,ftpquotatallies WHERE ftpquotalimits.name = '%u' AND ftpquotatallies.name = '%u'"
SQLShowInfo LIST "226" "Used %{gettally}MB from %{getlimit}MB. You have %{getfree}MB available space."
Se non si usa IPV6 ne va poi disabilitato il supporto (sempre in proftpd.cof):
UseIPv6 off
va poi diabilitato il modulo (basta commentarlo) per postgresql nel file modules.conf in /etc/proftd/
a questo punto riavviando il server ftp già dovrebbe cominciare a funzionare:
/etc/init.d/proftpd restart
ora è possibile aggiungere gli utenti del server ftp. Per fare questo la cosa migliore è utilizzare l’amato phpmyadmin.
le tabelle che vanno riempite sono solo due: ftpuser e ftpquotalimits.
le altre verranno riempite automaticamente.
tabella ftpuser:
userid: il nome dell’utente virtuale.
passwd: la password in chiaro (non criptata) dell’utente.
uid: l’userid dell’utente ftpuser (2001 nel mio caso).
gid: il groupiddel gruppo creato per l’utente ftpuser (sempre 2001).
homedir: la root directory dell’account ftp di questo utente (da notare che se si inserisce una cartella inesistente questa verrà creata, permessi permettendo).
shell: qui si può lasciare tranquillamente /sbin/nologin.
tabella ftpquotalimits:
name: il nome dell’utente virtuale (lo stesso inserito nella tabella precedente).
quota_type: user o group. In genere si puo lasciare user.
per_session: true o false. Lasciando true la quota vale solo per la singola sessione, selezionando false invece la quota vale in assoluto.
limit_type: hard o soft. Selezionando hard la quota non può mai essere superata, con soft invece è possibili eccederla temporaneamente.
bytes_in_avail:limite di upload in bytes. 0 = non limitata.
bytes_out_avail: limite di donwload in bytes. 0 = non limitata.
bytes_xfer_avail: limite di trasferimento in bytes. Rapprenta cioè la somma di upload e di download. 0 = non limitata.
files_in_avail: limite di numero di file in upload. 0 = non limitata.
files_out_avail: limite di numero di file in download. 0 = non limitata.
files_xfer_avail: limite di numero di file totale (upload+download). 0 = non limitata.
a questo punto il giuoco è fatto e tutto dovrebbe funzionare bene.
se qualcosa non va cercare una soluzione su:
howtoforge
da cui tra l’altro questa guida è tratta.
bb
