GNU/Linux >> Linux Esercitazione >  >> Debian

Hosting virtuale con Proftpd e MySQL (quota inclusa) su Debian Lenny

Questo documento descrive come installare un server Proftpd che utilizza utenti virtuali da un database MySQL invece di utenti del sistema reale. Questo è molto più performante e permette di avere migliaia di utenti ftp su una singola macchina. In aggiunta a ciò mostrerò l'uso della quota con questa configurazione.

Per l'amministrazione del database MySQL è possibile utilizzare strumenti web based come phpMyAdmin che verranno installati anche in questo howto. phpMyAdmin è una comoda interfaccia grafica che significa che non devi scherzare con la riga di comando.

Questo tutorial è basato su Debian Lenny (Debian 5.0). Dovresti già aver configurato un sistema Debian Lenny di base, come descritto nei primi sette capitoli di questo tutorial:https://www.howtoforge.com/perfect-server-debian-lenny-ispconfig2

Questo howto vuole essere una guida pratica; non copre le basi teoriche. Sono trattati in molti altri documenti nel Web.

Questo documento viene fornito senza garanzie di alcun tipo! Voglio dire che questo non è l'unico modo per creare un sistema del genere. Ci sono molti modi per raggiungere questo obiettivo, ma questo è il modo in cui prendo. Non garantisco che questo funzionerà per te!

1 Nota preliminare

In questo tutorial utilizzo l'hostname server1.example.com con l'indirizzo IP 192.168.0.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato.

2 Installa MySQL e phpMyAdmin

Tutto questo può essere installato con un solo comando:

aptitude install mysql-server mysql-client phpmyadmin apache2

Ti verrà chiesto di fornire una password per l'utente root di MySQL:questa password è valida per l'utente [protetto tramite posta elettronica] e [protetto tramite posta elettronica], quindi non è necessario specificare manualmente una password di root MySQL in seguito:

Nuova password per l'utente "root" di MySQL:<-- yourrootsqlpassword
Ripeti la password per l'utente "root" di MySQL:<-- yourrootsqlpassword

Oltre a questo, vedrai la seguente domanda:

Server Web da riconfigurare automaticamente:<-- apache2

3 Installa Proftpd con il supporto MySQL

Per Debian è disponibile un pacchetto proftpd-mysql preconfigurato. Installalo come demone autonomo in questo modo:

aptitude install proftpd-mod-mysql

Ti verrà posta la seguente domanda:

Esegui proftpd:<-- autonomo

Quindi creiamo un gruppo ftp (ftpgroup) e un utente (ftpuser) a cui verranno mappati tutti i nostri utenti virtuali. Sostituisci il gruppo e l'ID utente 2001 con un numero gratuito sul tuo sistema:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

4 Creare il database MySQL per Proftpd

Ora creiamo un database chiamato ftp e un utente MySQL chiamato proftpd che il demone proftpd utilizzerà in seguito per connettersi al database ftp:

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;

Sostituisci la stringa password con la password che desideri utilizzare per l'utente MySQL proftpd. Sempre sulla shell MySQL, creiamo le tabelle del database di cui abbiamo bisogno:

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 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 '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;

Come avrai notato, con l'abbandono; comando abbiamo lasciato la shell MySQL e siamo tornati sulla shell Linux.

A proposito, (suppongo che il nome host del tuo sistema server ftp sia server1.example.com) puoi accedere a phpMyAdmin sotto http://server1.example.com/phpmyadmin/ (puoi usare l'indirizzo IP invece di server1. example.com) in un browser e accedi come proftpd. Quindi puoi dare un'occhiata al database. Successivamente potrai utilizzare phpMyAdmin per gestire il tuo server Proftpd.

5 Configura Proftpd

Apri /etc/proftpd/modules.conf...

vi /etc/proftpd/modules.conf

... e abilita i seguenti tre moduli:

[...]
# 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
[...]

Quindi apri /etc/proftpd/proftpd.conf; commenta la sezione delle quote e decommenta la riga Include /etc/proftpd/sql.conf:

vi /etc/proftpd/proftpd.conf
[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
Include /etc/proftpd/sql.conf
[...]

Quindi apri /etc/proftpd/sql.conf e fallo apparire come segue:

vi /etc/proftpd/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 Plaintext
#
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection
#SQLConnectInfo [email protected] 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
# [email protected] database_user user_password
SQLConnectInfo  [email protected] 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>

Assicurati di sostituire la stringa password con la password reale per l'utente MySQL proftpd nella riga SQLConnectInfo!

Quindi riavvia Proftpd:

/etc/init.d/proftpd restart

6 Compila il database e verifica

Per popolare il database puoi usare la shell MySQL:

mysql -u root -p
USE ftp;

Per prima cosa creiamo una voce nella tabella ftpgroup. Contiene il nome del gruppo, il groupid e il nome utente del gruppo/utente ftp che abbiamo creato alla fine del secondo passaggio (sostituisci il groupid in modo appropriato se ne usi un altro rispetto al 2001):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Ora abbiamo finito con la tabella ftpgroup. Non è necessario creare ulteriori voci qui. Ogni volta che crei un nuovo utente ftp virtuale, lo fai nelle tabelle ftpquotalimits e ftpuser. Creiamo quindi il nostro primo utente esempioutente con una quota di 15 MB e la password segreta (siamo ancora nella shell MySQL):

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 ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

(Non dimenticare di sostituire groud- e userid 2001 in modo appropriato nell'ultima istruzione INSERT se stai utilizzando valori diversi da quelli di questo tutorial!)

Ora apri il tuo programma client FTP sulla tua stazione di lavoro (qualcosa come WS_FTP o SmartFTP se sei su un sistema Windows o gFTP su un desktop Linux) e prova a connetterti. Come nome host utilizzi server1.example.com (o l'indirizzo IP del sistema), il nome utente è esempioutente e la password è segreta.

Se riesci a connetterti, congratulazioni! In caso contrario, qualcosa è andato storto.

Ora, se corri

ls -l /home/

dovresti vedere che la directory /home/www.example.com (home directory dell'utente esempio) è stata creata automaticamente ed è di proprietà di ftpuser e ftpgroup (l'utente/gruppo che abbiamo creato alla fine del secondo passaggio):

server1:~# ls -l /home/
total 12
drwxr-xr-x 2 administrator administrator 4096 2009-02-16 13:18 administrator
drwxr-xr-x 2 ftp           nogroup       4096 2009-06-09 17:37 ftp
drwx------ 2 ftpuser       ftpgroup      4096 2009-06-09 17:59 www.example.com
server1:~#

7 Amministrazione del database

Per la maggior parte delle persone è più facile se hanno un front-end grafico per MySQL; quindi puoi anche usare phpMyAdmin (in questo esempio sotto http://server1.example.com/phpmyadmin/) per amministrare il database ftp.

Ogni volta che crei un nuovo utente, devi solo creare voci nelle tabelle ftpquotalimits e ftpuser, quindi spiegherò le colonne di queste tabelle qui:

Tabella ftpuser:

Le colonne importanti sono queste (le altre sono gestite automaticamente da MySQL o Proftpd, quindi non riempirle manualmente!):

  • id utente:il nome dell'utente Proftpd virtuale (ad es. utente di esempio).
  • passwd:la password non crittografata (cioè in chiaro) dell'utente.
  • uid:l'ID utente dell'utente ftp che hai creato alla fine del passaggio due (ad es. 2001).
  • gid:il groupid del gruppo ftp che hai creato alla fine del passaggio due (ad es. 2001).
  • homedir:la directory home dell'utente virtuale Proftpd (ad es. /home/www.example.com). Se non esiste, verrà creato quando il nuovo utente accede per la prima volta tramite FTP. L'utente virtuale verrà imprigionato in questa home directory, ovvero non potrà accedere ad altre directory al di fuori della sua home directory.
  • shell:va bene se inserisci /sbin/nologin qui per impostazione predefinita.

Tabella ftpquotalimits:

Le colonne importanti sono queste (le altre sono gestite automaticamente da MySQL o Proftpd, quindi non riempirle manualmente!):

  • name:il nome dell'utente virtuale Proftpd (ad es. exampleuser).
  • tipo_quota:utente o gruppo. Normalmente, utilizziamo user qui.
  • per_sessione:vero o falso. true significa che i limiti di quota sono validi solo per una sessione. Ad esempio, se l'utente ha una quota di 15 MB e ha caricato 15 MB durante la sessione corrente, non può caricare nient'altro. Ma se si disconnette e si riconnette, ha di nuovo 15 MB disponibili. false significa che l'utente ha 15 MB, indipendentemente dal fatto che si disconnetta e si ricolleghi.
  • tipo_limite:hard o soft. Un limite di quota rigida è un limite da non superare, mentre una quota soft può essere temporaneamente superata. Normalmente usi duro qui.
  • bytes_in_avail:limite di caricamento in byte (ad es. 15728640 per 15 MB). 0 significa illimitato.
  • bytes_out_avail:limite di download in byte. 0 significa illimitato.
  • bytes_xfer_avail:limite di trasferimento in byte. La somma dei caricamenti e dei download che un utente può fare. 0 significa illimitato.
  • files_in_avail:limite di caricamento nei file. 0 significa illimitato.
  • files_out_avail:limite di download nei file. 0 significa illimitato.
  • files_xfer_avail:limite di trasferimento nei file. 0 significa illimitato.

La tabella ftpquotallies viene utilizzata internamente da Proftpd per gestire le quote, quindi non devi inserire voci lì!

8 FTP anonimo

Se vuoi creare un account ftp anonimo (un account ftp a cui tutti possono accedere senza password), puoi farlo in questo modo:

Per prima cosa creiamo un utente e un gruppo con il nome anonymous_ftp. L'utente ha la directory home /home/anonymous_ftp:

groupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Anonymous FTP User" -g anonymous_ftp anonymous_ftp

(Sostituisci 2002 con un gruppo/ID utente gratuito sul tuo sistema.)

Quindi creiamo la directory /home/anonymous_ftp/incoming che consentirà agli utenti anonimi di caricare file:

mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming

E infine, apri /etc/proftpd/proftpd.conf e aggiungi le seguenti direttive:

vi /etc/proftpd/proftpd.conf
[...]
<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>
      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>
             DenyAll
             </Limit>
             <Limit STOR>
             AllowAll
             </Limit>
  </Directory>

</Anonymous>

Infine riavvia Proftpd:

/etc/init.d/proftpd restart

Ora gli utenti anonimi possono accedere e possono scaricare file da /home/anonymous_ftp, ma i caricamenti sono limitati a /home/anonymous_ftp/incoming (e una volta che un file viene caricato in /home/anonymous_ftp/incoming, non può essere letto né scaricato da lì; l'amministratore del server deve prima spostarlo in /home/anonymous_ftp per renderlo disponibile ad altri).

(Nota:puoi avere un solo account ftp anonimo per indirizzo IP!)

9 Riferimenti

Mandrake 10.1 - Proftpd + Autenticazione MySQL + Quote Howto:http://www.khoosys.net/single.htm?ipg=848

  • Proftpd:http://www.proftpd.org
  • MySQL:http://www.mysql.com
  • phpMyAdmin:http://www.phpmyadmin.net
  • Debian:http://www.debian.org

Debian
  1. Hosting virtuale con Proftpd e MySQL (quota inclusa) su Ubuntu 14.04LTS

  2. Come configurare contenitori virtuali con LXC e supporto per le quote su Debian 8

  3. Hosting virtuale con PureFTPd e MySQL (incl. Gestione di quote e larghezza di banda) su CentOS 7.0

  4. Hosting virtuale con PureFTPd e MySQL (incl. Gestione della quota e della larghezza di banda) su Ubuntu 7.10 (Gutsy Gibbon)

  5. Hosting virtuale con Proftpd e MySQL (quota inclusa) su Ubuntu 8.04 LTS

Hosting virtuale con PureFTPd e MySQL (incl. Quota e gestione della larghezza di banda) su Ubuntu 12.10

Hosting virtuale con Proftpd e MySQL (quota inclusa) su Ubuntu 12.10

Hosting virtuale con PureFTPd e MySQL (incl. quota e gestione della larghezza di banda) su Ubuntu 14.04LTS

Installazione di Lighttpd con PHP5 e supporto MySQL su Debian Lenny

Hosting virtuale con Proftpd e MySQL (quota inclusa) su Debian Lenny

Hosting virtuale con vsftpd e MySQL su Debian Squeeze