GNU/Linux >> Linux Esercitazione >  >> Cent OS

Server FTP con PureFTPd, MariaDB e Utenti Virtuali (incl. Quota e Gestione Larghezza di Banda) su CentOS 7.2

Questo documento descrive come installare un server PureFTPd che utilizza utenti virtuali da un database MariaDB (compatibile con MySQL) anziché 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 e dei limiti di larghezza di banda di upload/download con questa configurazione. Le password verranno archiviate crittografate come stringhe MD5 nel database.

Per l'amministrazione del database di MariaDB, puoi utilizzare strumenti basati sul Web come phpMyAdmin che verranno installati anche in questo howto. phpMyAdmin è una comoda interfaccia grafica, il che significa che non devi scherzare con la riga di comando.

Questo tutorial è basato su CentOS 7.2. Dovresti già aver configurato un sistema CentOS 7.2 minimo di base.

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.

1 Nota preliminare

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

2 Installa MySQL e phpMyAdmin

Innanzitutto, abilitiamo il repository EPEL sul nostro sistema CentOS poiché alcuni pacchetti che installeremo nel corso di questo tutorial non sono disponibili nei repository CentOS 7.2 ufficiali:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Quindi abilitiamo il repository EPEL sul nostro sistema CentOS poiché molti dei pacchetti che installeremo nel corso di questo tutorial non sono disponibili nel repository CentOS 7 ufficiale:

yum -y install epel-release
yum -y install yum-priorities

Modifica /etc/yum.repos.d/epel.repo...

nano /etc/yum.repos.d/epel.repo

... e aggiungi la linea priority=10 alla sezione [epel]:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Quindi aggiorniamo i nostri pacchetti esistenti sul sistema:

yum update

Ora possiamo installare il server web Apache, PHP, MariaDB e phpMyAdmin come segue:

yum -y install mariadb mariadb-server phpmyadmin httpd php

Ora configuriamo phpMyAdmin. Modifichiamo la configurazione di Apache in modo che phpMyAdmin consenta connessioni non solo da localhost (commentando tutto nella stanza e aggiungendo la riga Require all allowed):

nano /etc/httpd/conf.d/phpMyAdmin.conf

in modo che il file assomigli a questo:

# phpMyAdmin - Web based MySQL browser written in php
#
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8 # <IfModule mod_authz_core.c> # # Apache 2.4 # <RequireAny> # Require ip 127.0.0.1 # Require ip ::1 # </RequireAny> # </IfModule> # <IfModule !mod_authz_core.c> # # Apache 2.2 # Order Deny,Allow # # Deny from All # Allow from 127.0.0.1 Options Indexes AllowOverride None Require all granted # Allow from ::1 # </IfModule> </Directory> <Directory /usr/share/phpMyAdmin/setup/> <IfModule mod_authz_core.c> # Apache 2.4 <RequireAny> Require ip 127.0.0.1 Require ip ::1 </RequireAny> </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 </IfModule> </Directory> # These directories do not require access over HTTP - taken from the original # phpMyAdmin upstream tarball # <Directory /usr/share/phpMyAdmin/libraries/> Order Deny,Allow Deny from All Allow from None </Directory> <Directory /usr/share/phpMyAdmin/setup/lib/> Order Deny,Allow Deny from All Allow from None </Directory> <Directory /usr/share/phpMyAdmin/setup/frames/> Order Deny,Allow Deny from All Allow from None </Directory> # This configuration prevents mod_security at phpMyAdmin directories from # filtering SQL etc. This may break your mod_security implementation. # #<IfModule mod_security.c> # <Directory /usr/share/phpMyAdmin/> # SecRuleInheritance Off # </Directory> #</IfModule>

Quindi creiamo i collegamenti di avvio del sistema per MySQL e Apache (in modo che entrambi si avviino automaticamente ogni volta che il sistema si avvia) e avviamo entrambi i servizi.

Apri le porte http e https quando il "firewalld" di CentOS Firewall è installato sul tuo server.

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Quindi avvia MariaDB e Aapche.

systemctl enable mariadb.service
systemctl start mariadb.service
systemctl enable httpd.service
systemctl start httpd.service

Crea una password per l'utente root MySQL (sostituisci yourmariadbpassword con la password che desideri utilizzare):

mysql_secure_installation

[[email protected] ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation:line 379:find_mysql_client:comando non trovato

NOTA:L'ESECUZIONE DI TUTTE LE PARTI DI QUESTO SCRIPT È CONSIGLIATA PER TUTTI MariaDB
      SERVER IN USO DI PRODUZIONE! SI PREGA DI LEGGERE ATTENTAMENTE OGNI PASSO!

Per poter accedere a MariaDB per proteggerlo, avremo bisogno della
password corrente 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.<--INVIO
Inserisci la password corrente per root (inserisci per none):<--ENTER
OK, password utilizzata con successo, vado avanti...

L'impostazione della password di root garantisce che nessuno possa accedere all'utente root di MariaDB
senza la corretta autorizzazione.

Impostare la password di root? [S/n]<--INVIO
Nuova password:<--yourmariadbpassword
Reinserire la nuova password:<--yourmariadbpassword
Password aggiornata correttamente!
Ricaricamento delle tabelle dei privilegi..
 ... Operazione riuscita!


Per impostazione predefinita, un'installazione di MariaDB ha un utente anonimo, che consente chiunque
per accedere a MariaDB senza dover creare un account utente per
loro. Questo è inteso solo per il test e per rendere l'installazione
un po' più agevole. È necessario rimuoverli prima di passare a un
ambiente di produzione.

Rimuovere utenti anonimi? [S/n]<--INVIO
 ... Successo!

Normalmente, root dovrebbe essere autorizzato a connettersi solo da 'localhost'. Questo
garantisce che qualcuno non possa indovinare la password di root dalla rete.

Disconsentire l'accesso root in remoto? [S/n]<--INVIO
 ... Successo!

Per impostazione predefinita, MariaDB viene fornito con un database denominato 'test' a cui chiunque può
accedere. Anche questo è inteso solo per il test e deve essere rimosso
prima di passare a un ambiente di produzione.

Rimuovere il database di test e accedervi? [S/n]<--INVIO
 - Eliminazione del database di test...
 ... Operazione riuscita!
 - Rimozione dei privilegi sul database di prova...
 ... Operazione riuscita!

Il ricaricamento delle tabelle dei privilegi garantirà che tutte le modifiche apportate finora
diventeranno effettive immediatamente.

Ricaricare le tabelle dei privilegi ora? [S/n]<--INVIO
 ... Successo!

Pulizia...

Fatto! Se hai completato tutti i passaggi precedenti, l'installazione di MariaDB
ora dovrebbe essere sicura.

Grazie per aver utilizzato MariaDB!
[[email protected] ~]#

3 Installa PureFTPd con supporto MySQL/MariaDB

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

yum -y install pure-ftpd

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 "pureftpd user" -g ftpgroup ftpuser

Il servizio ftp deve essere consentito dal firewall-cmd come segue:

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

4 Creare il database per PureFTPd

Ora creiamo un database chiamato pureftpd e un utente MariaDB chiamato 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 la password che desideri utilizzare per l'utente MySQL pureftpd. Sempre sulla 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;

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 di server FTP sia server1.example.com) puoi accedere a phpMyAdmin sotto http://server1.example.com/phpMyAdmin/ (puoi anche usare l'indirizzo IP invece di server1 .example.com) in un browser e accedi come utente pureftpd. Quindi puoi dare un'occhiata al database. Successivamente, 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, MySQLConfigFile e CreateHomeDir siano abilitate e assomiglino a questa:

nano /etc/pure-ftpd/pure-ftpd.conf
[...]
ChrootEveryone              yes
[...]
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDir               yes
[...]

L'impostazione ChrootEveryone renderà PureFTPd chroot ogni utente virtuale nella sua home directory in modo che non sarà in grado di sfogliare directory e file al di fuori della sua home directory. La riga CreateHomeDir farà in modo che PureFTPd crei la home directory di un utente quando l'utente effettua l'accesso e la home directory non esiste ancora.

Quindi modifichiamo /etc/pure-ftpd/pureftpd-mysql.conf. Dovrebbe assomigliare a questo:

cp /etc/pure-ftpd/pureftpd-mysql.conf /etc/pure-ftpd/pureftpd-mysql.conf_orig
cat /dev/null > /etc/pure-ftpd/pureftpd-mysql.conf
nano /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/mysql/mysql.sock
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLUser       pureftpd
MYSQLPassword   ftpdpass
MYSQLDatabase   pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
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 password reale per l'utente MySQL pureftpd nella riga MYSQLPassword! Tieni presente che utilizziamo md5 come metodo MYSQLCrypt, il che significa che memorizzeremo le password degli utenti come una stringa MD5 nel database che è molto più sicuro rispetto all'utilizzo di password in testo normale!

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

systemctl enable pure-ftpd.service
systemctl start pure-ftpd.service

6 Compila il database e testa il server

Per popolare il database puoi usare la shell MySQL:

mysql -u root -p
USE pureftpd;

Ora creiamo l'utente esempioutente con lo stato 1 (il che significa che il suo account ftp è attivo), la password segreta (che verrà archiviata crittografata utilizzando la funzione MD5 di MySQL), l'UID e il GID 2001 (usa l'id utente e l'id di gruppo dell'utente/ gruppo che hai creato alla fine del secondo passaggio!), la home directory /home/www.example.com, una larghezza di banda di 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 stazione di lavoro (qualcosa come FileZilla 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):

[[email protected] ~]# ls -l /home
total 0
drwx------. 2 administrator administrator 59 Jun 21 16:13 administrator
drwxr-xr-x. 2 ftpuser ftpgroup 22 Jul 4 18:30 www.example.com
[[email protected] ~]#

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 pureftpd.

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

Tabella FTPD:

  • Utente:il nome dell'utente virtuale PureFTPd (ad es. utente di esempio).
  • stato: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 MD5 stringa:
  • 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 secondo passaggio (ad es. 2001).
  • Dir:la directory home dell'utente virtuale PureFTPd (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.
  • ULBandwidth:carica la larghezza di banda dell'utente virtuale in KB/sec. (kilobyte al secondo). 0 significa illimitato.
  • DLBandwidth:scarica la larghezza di banda dell'utente virtuale in KB/sec. (kilobyte al secondo). 0 significa illimitato.
  • commento:puoi inserire qualsiasi commento qui (ad es. per la tua amministrazione interna) qui. Normalmente lasci questo campo vuoto.
  • ipaccess:inserisci qui gli indirizzi IP che possono connettersi a questo account FTP. * significa che qualsiasi indirizzo IP può connettersi.
  • QuotaSize:spazio di archiviazione in MB (non KB, come in ULBandwidth e DLBandwidth!) che l'utente virtuale può utilizzare sul server FTP. 0 significa illimitato.
  • QuotaFiles:quantità di file che l'utente virtuale può salvare sul server FTP. 0 significa illimitato.

8 FTP anonimo

Se vuoi creare un account ftp anonimo (un account ftp a cui tutti possono accedere senza password), hai bisogno di un utente e di un gruppo chiamato ftp. Entrambi sono stati creati automaticamente quando hai installato il pacchetto pure-ftpd, quindi non è necessario crearli manualmente. Tuttavia, la directory home di ftp è /var/ftp per impostazione predefinita, ma vorrei creare la directory ftp anonima in /home/ftp (anche le directory ftp degli utenti normali sono in /home, ad esempio /home/www.example. com). Ma ovviamente puoi usare la directory /var/ftp per l'ftp anonimo, se preferisci.

Se vuoi usare /home/ftp, apri /etc/passwd e cambia la homedir dell'utente ftp da /var/ftp a /home/ftp (non farlo se vuoi usare /var/ftp):

nano /etc/passwd
[...]
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ftp:x:14:50:FTP User:/home/ftp:/sbin/nologin
[...]

Quindi sposta /var/ftp in /home (non farlo se vuoi usare /var/ftp):

mv /var/ftp /home

Quindi creiamo la directory /home/ftp/incoming che consentirà agli utenti anonimi di caricare file. Daremo alla directory /home/ftp/incoming i permessi di 311 in modo che gli utenti possano caricare, ma non vedere o scaricare alcun file in quella directory. La directory /home/ftp avrà i 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 invece vuoi usare /var/ftp, sostituisci /home/ftp con /var/ftp nei comandi precedenti.)

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

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

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

(L'impostazione AnonymousBandwidth è facoltativa:ti consente di limitare le larghezze di banda di upload e download per utenti anonimi. 8 significa 8 KB/sec. Usa qualsiasi valore che ti piace o commenta la riga se non vuoi limitare le larghezze di banda.)

Infine, riavviamo PureFTPd:

systemctl restart pure-ftpd.service

9 Scarica questo server CentOS 7.2 come macchina virtuale

Questa configurazione è disponibile come download della macchina virtuale in formato ova/ovf (compatibile con VMWare e Virtualbox) per gli abbonati howtoforge.

Dettagli di accesso per la VM

  • La password di root è:howtoforge
  • La password dell'utente "amministratore" è:howtoforge

Modifica entrambe le password al primo accesso.

  • L'indirizzo IP della VM è 192.168.1.100

  • PureFTPd:http://www.pureftpd.org/
  • MySQL:http://www.mysql.com/
  • phpMyAdmin:http://www.phpmyadmin.net/
  • CentOS:http://centos.org/

Cent OS
  1. Come configurare il server FTP con VSFTPD su CentOS 7

  2. Mailserver con utenti e domini virtuali che utilizzano Postfix e Dovecot su CentOS 6 VPS

  3. Come installare Varnish e phpMyAdmin su un VPS CentOS 7 con Nginx, MariaDB e PHP-FPM

  4. Installa Zenario con Apache, PHP e MariaDB su CentOS 7

  5. Configura un server di posta con PostfixAdmin e MariaDB su CentOS 7

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

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

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

Monitoraggio del server con munin e monit su CentOS 5.2

Monitoraggio del server con Munin e Monit su CentOS 7

Monitoraggio del server con Munin e Monit su CentOS 7.2