Piero V.

Parte VII muletto: installare un server FTP

Questa penso sia la parte più facile.

Questa guida serve per mettere su un server FTP con utenti virtuali presi dal database MySQL.

Tuttavia non ha integrazione con gli utenti della posta (almeno al momento). Se la vorreste penso che dovreste usare LDAP o gli account UNIX direttamente.

Come nelle guide precedenti ci troviamo su Debian e vi consiglio di avere phpMyAdmin.

Ho unito la guida su come usare SQL su ProFTPd e quella su come usare le quote con sql sul suo sito.

Per completezza ho inserito anche le quote che però di default sono a 0, cioè illimitate.

La prima cosa da fare è installare il server FTP:

apt-get install proftpd-mod-mysql

Quindi configuriamo il server.

Spostiamoci nella cartella /etc/proftpd.

Il primo file che modificheremo è proftpd.conf:

#Linea 14:
ServerName                      "Tuoserver"
# Linea 33, decommentiamo le righe:
DefaultRoot                     ~
RequireValidShell               off

Ora modifichiamo modules.conf:

# Linea 19, decommentiamo:
LoadModule mod_sql.c
# Linea 31, decommentiamo:
LoadModule mod_sql_mysql.c
# Linea 44, decommentiamo
LoadModule mod_quotatab_sql.c

Ora rimane solo un file da modificare che riporto per intero: sql.conf:

#
# Proftpd sample configuration for SQL-based authentication.
#
# (This is not to be used if you prefer a PAM-based SQL authentication)
#

<IfModule mod_sql.c>
#
# Choose a SQL backend among MySQL or PostgreSQL.
# Both modules are loaded in default configuration, so you have to specify the backend
# or comment out the unused module in /etc/proftpd/modules.conf.
# Use 'mysql' or 'postgres' as possible values.
#
SQLBackend	mysql
#
SQLEngine on
SQLAuthenticate on
#
# Use both a crypted or plaintext password
SQLAuthTypes Crypt
#
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection
SQLConnectInfo proftpd@localhost proftpd password
#
# Describes both users/groups tables
#
SQLUserInfo users userid passwd uid gid homedir shell
SQLGroupInfo groups groupname gid members
#

# Quota
QuotaEngine 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 quotalimits \
  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 quotatallies \
  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}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLock /var/run/ftpd/tally.lock
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
</IfModule>

Breve spiegazione: istruisce il server sulle tabelle che deve interrogare.

Le password sono criptate, potete criptarle con ENCRYPT(’pass’) su MySQL.

A riga 26 modificate le vostre credenziali d’accesso.

È giunto il momento di creare le tabelle, per la popolazione del database lascio a voi il lavoro.

Andiamo su phpMyAdmin, facciamo il login come root, quindi andiamo su privilegi e creiamo l’user proftpd e gli creiamo un database dove ha tutti i permessi (tranne GRANT) - basta selezionare un checkbox.

Quindi selezioniamo il database proftpd, andiamo su SQL e eseguiamo la query:

CREATE TABLE IF NOT EXISTS `groups` (
  `groupname` varchar(30) NOT NULL,
  `gid` int(11) NOT NULL,
  `members` varchar(255) DEFAULT NULL
);
CREATE TABLE IF NOT EXISTS `quotalimits` (
  `name` varchar(30) DEFAULT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `per_session` enum('false','true') NOT NULL,
  `limit_type` enum('soft','hard') NOT NULL,
  `bytes_in_avail` float NOT NULL DEFAULT '0',
  `bytes_out_avail` float NOT NULL DEFAULT '0',
  `bytes_xfer_avail` float 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'
);
CREATE TABLE IF NOT EXISTS `quotatallies` (
  `name` varchar(30) NOT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `bytes_in_used` float NOT NULL,
  `bytes_out_used` float NOT NULL,
  `bytes_xfer_used` float NOT NULL,
  `files_in_used` int(10) unsigned NOT NULL,
  `files_out_used` int(10) unsigned NOT NULL,
  `files_xfer_used` int(10) unsigned NOT NULL
);
CREATE TABLE IF NOT EXISTS `users` (
  `userid` varchar(30) NOT NULL,
  `passwd` varchar(80) NOT NULL,
  `uid` int(11) DEFAULT NULL,
  `gid` int(11) DEFAULT NULL,
  `homedir` varchar(255) DEFAULT NULL,
  `shell` varchar(255) DEFAULT '/bin/false',
  UNIQUE KEY `userid` (`userid`),
  UNIQUE KEY `uid` (`uid`)
);

Finito.