Hosting Virtuale · 13 min read · Nov 24, 2025

Hosting Virtuale Con PureFTPd E MySQL (Incl. Gestione Quota E Larghezza Di Banda) Su OpenSUSE 13.2

Hosting Virtuale Con PureFTPd E MySQL (Incl. Gestione Quota E Larghezza Di Banda) Su OpenSUSE 13.2

Versione 1.0
Autore: Srijan Kishore
Segui howtoforge su Twitter
Ultima modifica 19/Nov/2014

Questo documento descrive come installare un server PureFTPd che utilizza utenti virtuali da un database MySQL invece di veri utenti di sistema. Questo è molto più performante e consente di avere migliaia di utenti ftp su una singola macchina. Inoltre, mostrerò l’uso di limiti di quota e di larghezza di banda in upload/download con questa configurazione. Le password saranno memorizzate in modo crittografato come stringhe MD5 nel database.

Per l’amministrazione del database MySQL puoi utilizzare strumenti basati sul web come phpMyAdmin che saranno anche installati in questo howto. phpMyAdmin è un’interfaccia grafica comoda che significa che non devi impazzire con la riga di comando.

Questo documento viene fornito senza alcuna garanzia! Voglio dire che questo non è l’unico modo per configurare un tale sistema. Ci sono molti modi per raggiungere questo obiettivo, ma questo è il modo che seguo.

1 Nota Preliminare

In questo tutorial utilizzo il nome host server1.example.com con l’indirizzo IP 192.168.0.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato. Devi avere un’installazione base di Open Suse prima di procedere come descritto in questo tutorial.

2 Installa MariaDB, Apache2 E phpMyAdmin

MariaDB, Apache e i moduli PHP necessari per phpMyAdmin possono essere installati come segue:

zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd
server1:~ # zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd  
Caricamento dei dati del repository...  
Lettura dei pacchetti installati...  
Risoluzione delle dipendenze dei pacchetti...
  
Problema: php5-mysql-5.6.1-4.1.x86_64 richiede php5 = 5.6.1, ma questo requisito non può essere fornito  
  fornitori disinstallabili: php5-5.6.1-1.1.x86_64[openSUSE-13.2-0]  
                   php5-5.6.1-1.1.i586[repo-oss]  
                   php5-5.6.1-1.1.x86_64[repo-oss]  
                   php5-5.6.1-4.1.i586[repo-update]  
                   php5-5.6.1-4.1.x86_64[repo-update]  
 Soluzione 1: Le seguenti azioni verranno eseguite:  
  non installare php5-mysql-5.6.1-4.1.x86_64  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
 Soluzione 2: Le seguenti azioni verranno eseguite:  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare apache2-mod_php5-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
  non installare php5-mbstring-5.6.1-4.1.x86_64  
  non installare php5-mysql-5.6.1-4.1.x86_64  
 Soluzione 3: Le seguenti azioni verranno eseguite:  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare apache2-mod_php5-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
  non installare php5-mbstring-5.6.1-4.1.x86_64  
 Soluzione 4: Le seguenti azioni verranno eseguite:  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare apache2-mod_php5-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
  non installare php5-mbstring-5.6.1-4.1.x86_64  
 Soluzione 5: Le seguenti azioni verranno eseguite:  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare apache2-mod_php5-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
  non installare php5-mbstring-5.6.1-4.1.x86_64  
 Soluzione 6: Le seguenti azioni verranno eseguite:  
  non installare php5-mcrypt-5.6.1-4.1.x86_64  
  non installare apache2-mod_php5-5.6.1-4.1.x86_64  
  non installare php5-gd-5.6.1-4.1.x86_64  
  non installare php5-mbstring-5.6.1-4.1.x86_64  
 Soluzione 7: disinstallazione di patterns-openSUSE-minimal_base-conflicts-20141007-2.1.x86_64  
 Soluzione 8: interrompere php5-mysql-5.6.1-4.1.x86_64 ignorando alcune delle sue dipendenze  
  
Scegli tra le soluzioni sopra per numero o annulla [1/2/3/4/5/6/7/8/c] (c): <--7

Poi creiamo i collegamenti di avvio del sistema per MySQL (in modo che MySQL si avvii automaticamente ogni volta che il sistema si avvia) e avviamo il server MySQL:

systemctl enable mysql.service  
systemctl start mysql.service

Per proteggere l’installazione di MySQL, esegui:

mysql_secure_installation
server1:~ # mysql_secure_installation  
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found  
  
NOTA: È CONSIGLIATO ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT PER TUTTI I SERVER MariaDB  
      IN USO IN PRODUZIONE!  PER FAVORE LEGGI ATTENTAMENTE OGNI PASSO!  
  
Per accedere a MariaDB per proteggerlo, avremo bisogno della password attuale per l'utente root.  Se hai appena installato MariaDB e  
non hai ancora impostato la password di root, la password sarà vuota,  
quindi dovresti semplicemente premere invio qui.  
  
Inserisci la password attuale per root (premi invio per nessuna):   
OK, password utilizzata con successo, procedendo...  
  
Impostare la password di root garantisce che nessuno possa accedere all'utente root di MariaDB  
senza la corretta autorizzazione.  
  
Impostare la password di root? [Y/n] <--ENTER  
Nuova password: <--mariadbpassword  
Reinserisci la nuova password: <--mariadbpassword  
Password aggiornata con successo!  
Ricaricamento delle tabelle di privilegio..  
 ... Successo!  
  
Per impostazione predefinita, un'installazione di MariaDB ha un utente anonimo, che consente a chiunque  
di accedere a MariaDB senza dover avere un account utente creato per  
loro.  Questo è destinato solo per test e per rendere l'installazione  
più fluida.  Dovresti rimuoverli prima di passare a un  
ambiente di produzione.  
  
Rimuovere gli utenti anonimi? [Y/n] <--ENTER  
 ... Successo!  
  
Normalmente, l'utente root dovrebbe essere autorizzato a connettersi solo da 'localhost'.  Questo  
assicura che qualcuno non possa indovinare la password di root dalla rete.  
  
Negare l'accesso remoto all'utente root? [Y/n] <--ENTER  
 ... Successo!  
  
Per impostazione predefinita, MariaDB viene fornito con un database chiamato 'test' a cui chiunque può  
accedere.  Questo è anche destinato solo per test e dovrebbe essere rimosso  
prima di passare a un ambiente di produzione.  
  
Rimuovere il database di test e l'accesso ad esso? [Y/n] <--ENTER  
 - Eliminazione del database di test...  
 ... Successo!  
 - Rimozione dei privilegi sul database di test...  
 ... Successo!  
  
Ricaricare le tabelle di privilegio garantirà che tutte le modifiche apportate finora  
entreranno in vigore immediatamente.  
  
Ricaricare le tabelle di privilegio ora? [Y/n] <--ENTER  
 ... Successo!  
  
Pulizia...  
  
Tutto fatto!  Se hai completato tutti i passaggi sopra, la tua installazione di MariaDB  
dovrebbe ora essere sicura.  
  
Grazie per aver utilizzato MariaDB!  
server1:~ #

Ora la tua configurazione MySQL dovrebbe essere sicura.

Poi creiamo i collegamenti di avvio del sistema per Apache (in modo che si avvii automaticamente ogni volta che il sistema si avvia) e lo avviamo:

systemctl enable apache2.service  
systemctl start apache2.service

phpMyAdmin può essere installato come segue:

zypper install phpmyadmin

Per assicurarci di poter accedere a phpMyAdmin, modifica il file come segue:

vi /etc/apache2/conf.d/phpMyAdmin.conf

Aggiungi l’alias come segue:

Alias /phpMyAdmin /srv/www/htdocs/phpMyAdmin
Alias /phpmyadmin /srv/www/htdocs/phpMyAdmin
[...]

Prima di avviare apache, dobbiamo seguire il link e apportare modifiche in httpd.conf

vi /etc/apache2/httpd.conf

Nota: se i valori del file sono diversi, cambia il valore come segue:

Commenta queste righe e aggiungi queste righe

#  
#    Options None  
#    AllowOverride None  
#    Order deny,allow  
#   Deny from all  
#  
  
  
Options None  
AllowOverride None  
Require all denied  

Successivamente dobbiamo creare il file di configurazione per phpmyadmin come

cd /srv/www/htdocs/phpMyAdmin  
cp config.sample.inc.php config.inc.php

Nel file di configurazione, puoi vedere che phpmyadmin si aspetta un database chiamato “phpmyadmin” che contiene le tabelle pma:

[...]  
$cfg['Servers'][$i]['pmadb']               = 'phpmyadmin';  
[...]  

Quindi ne creiamo uno:

echo "create database phpmyadmin;" | mysql -u root -p 'mariadbpassword'

e carichiamo le tabelle dalla documentazione di phpmyadmin.

mysql -u root -p 'mariadbpassword' < /usr/share/doc/packages/phpMyAdmin/examples/create_tables.sql

Ora avvia il servizio Apache

systemctl enable apache2.service  
systemctl restart apache2.service

Ora possiamo accedere a phpmyadmin su http://192.168.0.100/phpmyadmin O su http://server1.example.com

3 Installa PureFTPd Con Supporto MySQL

Il pacchetto PureFTPd di OpenSUSE supporta vari backend, come MySQL, PostgreSQL, LDAP, ecc. Pertanto, tutto ciò che dobbiamo fare è installare il normale pacchetto PureFTPd:

 zypper install pure-ftpd

Poi creiamo un gruppo ftp (ftpgroup) e un utente (ftpuser) a cui tutti i nostri utenti virtuali saranno mappati. Sostituisci il gruppo e l’ID utente 2001 con un numero che è libero sul tuo sistema:

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

4 Crea Il Database MySQL Per PureFTPd

Ora creiamo un database chiamato pureftpd e un utente MySQL di nome pureftpd che il demone PureFTPd utilizzerà in seguito per connettersi al database pureftpd:

mysql -u root -p
CREATE DATABASE pureftpd;  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';  
FLUSH PRIVILEGES;

Sostituisci la stringa ftpdpass con qualsiasi password tu voglia utilizzare per l’utente MySQL pureftpd. Ancora nella shell MySQL, creiamo la tabella del database di cui abbiamo bisogno (sì, c’è solo una tabella!):

USE pureftpd;
CREATE TABLE `ftpd` (  
User varchar(16) NOT NULL default '',  
status enum('0','1') NOT NULL default '0',  
Password varchar(64) NOT NULL default '',  
Uid varchar(11) NOT NULL default '-1',  
Gid varchar(11) NOT NULL default '-1',  
Dir varchar(128) NOT NULL default '',  
ULBandwidth smallint(5) NOT NULL default '0',  
DLBandwidth smallint(5) NOT NULL default '0',  
comment tinytext NOT NULL,  
ipaccess varchar(15) NOT NULL default '*',  
QuotaSize smallint(5) NOT NULL default '0',  
QuotaFiles int(11) NOT NULL default 0,  
PRIMARY KEY (User),  
UNIQUE KEY User (User)  
)  ENGINE=MyISAM;
quit;

Ora puoi accedere a phpMyAdmin su http://server1.example.com/phpMyAdmin/ (puoi anche utilizzare l’indirizzo IP invece di server1.example.com) in un browser e accedere come utente pureftpd. Poi puoi dare un’occhiata al database. In seguito puoi utilizzare phpMyAdmin per amministrare il tuo server PureFTPd.

5 Configura PureFTPd

Modifica /etc/pure-ftpd/pure-ftpd.conf e assicurati che le righe ChrootEveryone, AnonymousOnly, MySQLConfigFile e CreateHomeDir siano abilitate e appaiano così:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
ChrootEveryone              yes  
[...]  
AnonymousOnly               no  
[...]  
MySQLConfigFile              /etc/pure-ftpd/pureftpd-mysql.conf  
[...]  
CreateHomeDir               yes  
[...]  

L’impostazione ChrootEveryone farà sì che PureFTPd chroot ogni utente virtuale nella sua home directory in modo che non possa navigare in directory e file al di fuori della sua home directory. La riga CreateHomeDir farà sì che PureFTPd crei la home directory di un utente quando l’utente accede e la home directory non esiste ancora. AnonymousOnly deve essere impostato su no perché altrimenti saranno consentite solo sessioni FTP anonime.

Poi creiamo /edit /etc/pure-ftpd/pureftpd-mysql.conf. Dovrebbe apparire così:

vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/run/mysql/mysql.sock  
#MYSQLServer     localhost  
#MYSQLPort       3306  
MYSQLUser       pureftpd  
MYSQLPassword   ftpdpass  
MYSQLDatabase   pureftpd  
#MYSQLCrypt md5, cleartext, crypt() o password() - md5 è MOLTO RACCOMANDATO rispetto al testo normale  
MYSQLCrypt      md5  
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

Assicurati di sostituire la stringa ftpdpass con la vera password per l’utente MySQL pureftpd nella riga MYSQLPassword! Si prega di notare che utilizziamo md5 come metodo MYSQLCrypt, il che significa che memorizzeremo le password degli utenti come una stringa MD5 nel database, che è molto più sicura rispetto all’uso di password in chiaro!

Ora creiamo i collegamenti di avvio del sistema per PureFTPd e lo avviamo:

systemctl enable pure-ftpd  
systemctl start pure-ftpd

6 Popola Il Database E Testa

Per popolare il database puoi utilizzare la shell MySQL:

mysql -u root -p
USE pureftpd;

Ora creiamo l’utente exampleuser con lo stato 1 (il che significa che il suo account ftp è attivo), la password secret (che sarà memorizzata in modo crittografato utilizzando la funzione MD5 di MySQL), l’UID e il GID 2001 (usa l’ID utente e l’ID gruppo dell’utente/gruppo che hai creato alla fine del secondo passaggio!), la home directory /home/www.example.com, una larghezza di banda in upload e download di 100 KB/sec. (kilobyte al secondo) e una quota di 50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Ora apri il tuo programma client FTP sulla tua workstation (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 è exampleuser e la password è secret.

Se riesci a connetterti - congratulazioni! Se no, qualcosa è andato storto.

Ora, se esegui

ls -l /home/
server1:~ # ls -l /home/  
total 0  
drwxr-xr-x 1 administrator users    128 Nov  7 14:30 administrator  
drwxr-xr-x 1 ftpuser       ftpgroup  18 Nov 19 14:32 www.example.com  
server1:~ #

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

7 Amministrazione Del Database

Per la maggior parte delle persone è più facile avere un’interfaccia grafica per MySQL; quindi puoi anche utilizzare phpMyAdmin (in questo esempio sotto http://server1.example.com/phpMyAdmin/ o http://192.168.0.100/phpMyAdmin/) per amministrare il database pureftpd.

Ogni volta che vuoi creare un nuovo utente, devi creare un’entrata nella tabella ftpd, quindi spiegherò qui le colonne di questa tabella:

Tabella ftpd:

  • User: Il nome dell’utente virtuale PureFTPd (ad es. exampleuser).

  • status: 0 o 1. 0 significa che l’account è disabilitato, l’utente non può accedere.

  • Password: La password dell’utente virtuale. Assicurati di utilizzare la funzione MD5 di MySQL per salvare la password crittografata come una stringa MD5:


  • UID: L’ID utente dell’utente ftp che hai creato alla fine del secondo passaggio (ad es. 2001).

  • GID: L’ID gruppo del gruppo ftp che hai creato alla fine del secondo passaggio (ad es. 2001).

  • Dir: La home directory dell’utente virtuale PureFTPd (ad es. /home/www.example.com). Se non esiste, verrà creata quando il nuovo utente accede per la prima volta tramite FTP. L’utente virtuale sarà rinchiuso in questa home directory, cioè non può accedere ad altre directory al di fuori della sua home directory.

  • ULBandwidth: Larghezza di banda in upload dell’utente virtuale in KB/sec. (kilobyte al secondo). 0 significa illimitato.

  • DLBandwidth: Larghezza di banda in download dell’utente virtuale in KB/sec. (kilobyte al secondo). 0 significa illimitato.

  • comment: Puoi inserire qui qualsiasi commento (ad es. per la tua amministrazione interna). Normalmente lasci questo campo vuoto.

  • ipaccess: Inserisci qui gli indirizzi IP che sono autorizzati a connettersi a questo account FTP. * significa che qualsiasi indirizzo IP è autorizzato a connettersi.

  • QuotaSize: Spazio di archiviazione in MB (non KB, come in ULBandwidth e DLBandwidth!) che l’utente virtuale è autorizzato a utilizzare sul server FTP. 0 significa illimitato.

  • QuotaFiles: numero di file che l’utente virtuale è autorizzato a salvare sul server FTP. 0 significa illimitato.

8 FTP Anonimo

Se vuoi creare un account ftp anonimo (un account ftp a cui chiunque può accedere senza una password), hai bisogno di un utente e di un gruppo chiamati ftp. Entrambi sono stati creati automaticamente quando hai installato il pacchetto pure-ftpd, quindi non è necessario crearli manualmente. Tuttavia, la home directory di ftp è /srv/ftp per impostazione predefinita, ma mi piacerebbe creare la directory ftp anonima in /home/ftp (le normali directory ftp degli utenti sono anche in /home, ad es. /home/www.example.com). Ma naturalmente, puoi utilizzare la directory /srv/ftp per ftp anonimo, se lo preferisci.

Se vuoi utilizzare /home/ftp, apri /etc/passwd e cambia la home directory dell’utente ftp da /srv/ftp a /home/ftp (non farlo se vuoi utilizzare /srv/ftp):

vi /etc/passwd
[...]  
#ftp:x:40:49:FTP account:/srv/ftp:/bin/bash  
ftp:x:40:49:FTP account:/home/ftp:/bin/bash  
[...]  

Poi sposta /srv/ftp in /home (non farlo se vuoi utilizzare /srv/ftp):

mv /srv/ftp /home

Poi creiamo la directory /home/ftp/incoming che consentirà agli utenti anonimi di caricare file. Daremo alla directory /home/ftp/incoming permessi di 311 in modo che gli utenti possano caricare, ma non vedere o scaricare file in quella directory. La directory /home/ftp avrà permessi di 555 che consentono di vedere e scaricare file:

chown ftp:nobody /home/ftp  
cd /home/ftp  
mkdir incoming  
chown ftp:nobody incoming/  
chmod 311 incoming/  
cd ../  
chmod 555 ftp/

(Se vuoi utilizzare /srv/ftp invece, sostituisci /home/ftp con /srv/ftp nei comandi sopra.)

Gli utenti anonimi potranno accedere, e saranno autorizzati a scaricare file da /home/ftp, ma i caricamenti saranno limitati a /home/ftp/incoming (e una volta che un file è caricato in /home/ftp/incoming, non può essere letto né scaricato da lì; l’amministratore del server deve spostarlo in /home/ftp prima di renderlo disponibile agli altri).

Ora dobbiamo configurare PureFTPd per ftp anonimo. Apri /etc/pure-ftpd/pure-ftpd.conf e assicurati di avere le seguenti impostazioni:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
NoAnonymous                 no  
[...]  
AnonymousBandwidth            8  
[...]  
AnonymousCantUpload         no  
[...]  

(L’impostazione AnonymousBandwidth è facoltativa - ti consente di limitare le larghezze di banda in upload e download per gli utenti anonimi. 8 significa 8 KB/sec. Usa qualsiasi valore tu voglia, o commenta la riga se non vuoi limitare le larghezze di banda.)

Infine, riavviamo PureFTPd:

systemctl restart pure-ftpd.service

9 Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.