Installare un server FTP con utenti virtuali su MySQL: differenze tra le versioni
Riga 117: | Riga 117: | ||
Apriamo il file | Apriamo il file | ||
<pre> | <pre> | ||
vi /etc/proftpd/proftpd.conf | # vi /etc/proftpd/proftpd.conf | ||
</pre> | </pre> | ||
e decommentiamo la linea <code>Include /etc/proftpd/sql.conf</code>: | e decommentiamo la linea <code>Include /etc/proftpd/sql.conf</code>: | ||
Riga 132: | Riga 132: | ||
Include /etc/proftpd/sql.conf | Include /etc/proftpd/sql.conf | ||
[...] | [...] | ||
</pre> | |||
=== /etc/proftpd/sql.conf === | |||
Di questo file, in particolare, notiamo la riga <code>SQLConnectInfo</code> (in cui vanno inseriti i parametri di connessione al database)che, se utilizziamo un database MySQL configurato come descritto in precedenza, va scritta così: | |||
<pre> | |||
SQLConnectInfo proftpd@localhost proftpd password | |||
</pre> | |||
Apriamo quindi il file: | |||
<pre> | |||
# vi /etc/proftpd/sql.conf | |||
</pre> | |||
e modifichiamolo come segue: | |||
<pre> | |||
# | |||
# 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 Plaintext | |||
# | |||
# Use a backend-crypted or a crypted password | |||
#SQLAuthTypes Backend Crypt | |||
# | |||
# Connection | |||
#SQLConnectInfo proftpd@sql.example.com proftpd_user proftpd_password | |||
# | |||
# Describes both users/groups tables | |||
# | |||
#SQLUserInfo users userid passwd uid gid homedir shell | |||
#SQLGroupInfo groups groupname gid members | |||
# | |||
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 | |||
SQLConnectInfo proftpd@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 | |||
</IfModule> | |||
</pre> | </pre> |
Versione delle 16:10, 8 nov 2010
Introduzione
Dopo aver installato Apache (Installare un ambiente LAMP: Linux, Apache2, SSL, MySQL, PHP5) e configurato i Virtual Host (Apache e Virtual Hosts: configurare Apache2 per ospitare più siti web) abbiamo adesso bisogno di permettere ai proprietari dei domini ospitati sui Virtual Host di accedere al loro spazio web via FTP senza causare danni agli altri Virtual Host e senza avere la possibilità di gironzolare per il nostro server.
Supponiamo quindi di avere una situazione del genere:
- /var/www/www.esempio.it
- /var/www/www.esempio.org
e di voler creare due utenti virtuali, senza accesso alla console:
- esempio-it
- esempio-org
che possano accedere via FTP solo alle directory del loro sito web.
Installazione di ProFTPD
La scelta sul server FTP da utilizzare è caduta su ProFTPD, che ora dobbiamo configurare in modo opportuno per avere due utenti distinti che gestiscano i due siti. Per fare ciò creeremo due siti FTP virtuali, con l’ausilio di un database dedicato su MySQL.
Installiamo innanzitutto ProFTPD con il supporto per MySQL:
# apt-get install proftpd proftpd-mod-mysql
Ora creiamo un utente e un gruppo di sistema, che useremo per mappare tutti gli utenti virtuali che saranno utilizzati da ProFTPD:
# groupadd -g 2001 ftpgroup # useradd -u 2001 -s /bin/false -d /bin/null -c "Utente ProFTPD" -g ftpgroup ftpuser
Sostituite ovviamente i numeri UID e GID con due valori che siano liberi sul vostro server.
Ora dobbiamo creare il database per ProFTPD, entrando in MySQL col comando:
$ mysql -u root -p
Creeremo un database chiamato proftpd
e un utente MySQL chiamato proftpd
, che sarà in seguito utilizzato da ProFTPD per connettersi al database server:
CREATE DATABASE proftpd; GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
Ovviamente sostituite la stringa password
con la password che volete assegnare al vostro utente MySQL.
Già che siamo collegati alla shell di MySQL ne approfittiamo per creare anche tutte le tabelle che ci servono:
USE proftpd; CREATE TABLE ftpgroup ( groupname varchar(16) NOT NULL default '', gid smallint(6) NOT NULL default '2001', 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 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' ) 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 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' ) 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 '2001', gid smallint(6) NOT NULL default '2001', 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;
A questo punto dovremmo essere ritornati alla shell del nostro server.
Configurazione di ProFTPD
La configurazione di ProFTPD per utilizzare MySQL come backend comporta la modifica di alcuni file:
/etc/proftpd/modules.conf
Apriamo il file
# vi /etc/proftpd/modules.conf
e abilitiamo i moduli seguenti:
[...] # Install proftpd-mod-mysql or proftpd-mod-pgsql to use this LoadModule mod_sql.c [...] # Install proftpd-mod-mysql to use this LoadModule mod_sql_mysql.c [...] # Install proftpd-mod-pgsql or proftpd-mod-mysql to use this LoadModule mod_quotatab_sql.c [...]
/etc/proftpd/proftpd.conf
Apriamo il file
# vi /etc/proftpd/proftpd.conf
e decommentiamo la linea Include /etc/proftpd/sql.conf
:
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf Include /etc/proftpd/sql.conf [...]
/etc/proftpd/sql.conf
Di questo file, in particolare, notiamo la riga SQLConnectInfo
(in cui vanno inseriti i parametri di connessione al database)che, se utilizziamo un database MySQL configurato come descritto in precedenza, va scritta così:
SQLConnectInfo proftpd@localhost proftpd password
Apriamo quindi il file:
# vi /etc/proftpd/sql.conf
e modifichiamolo come segue:
# # 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 Plaintext # # Use a backend-crypted or a crypted password #SQLAuthTypes Backend Crypt # # Connection #SQLConnectInfo proftpd@sql.example.com proftpd_user proftpd_password # # Describes both users/groups tables # #SQLUserInfo users userid passwd uid gid homedir shell #SQLGroupInfo groups groupname gid members # 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 SQLConnectInfo proftpd@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 </IfModule>