FreeBSD–Server FTP cu SSL/TLS si utilizatori virtuali

În mod normal folosesc SCP pentru transferul fișierelor pe serverele mele, sau, foarte rar, activez pentru o scurta perioada de timp ftpd din /etc/inetd.conf.
Se întâmplă să fie necesar să asigurăm pe mașina respectivă accesul prin protocolul FTP pentru mai mulți utilizatori, fiecare cu acces în directorul propriu. Doar pentru acest lucru nu are nici un rost să adăugăm utilizatori pe sistem ci putem folosi utilizatori virtuali. Bineînțeles că dorim ca aceștia să realizeze o conexiune sigură, fără riscul de a li intercepta datele (în special cele de autentificare) pe traseul dintre PC-ul lor și server. Pentru asta vom folosi SSL/TLS.
Am testat și am în producție o soluție care răspunde cerințelor de mai sus folosind ca și server FTP software-ul pureftpd, instalat pe freeBSD, din porturi.
Începem:

cd /usr/ports/ftp/pure-ftpd/
make && make install && make clean

Opțiunile de compilare le alegeți în funcție de necesități, eu am mers pe varianta fără suport LDAP, PostgreeSQL dar  cu suport MySQL, PAM, TLS.
După instalare, urmează partea frumoasă, de configurare. Pornim de la fișierul exemplu pe care îl adaptăm necesităților:

cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
chmod 644 /usr/local/etc/pure-ftpd.conf

Fișierul meu arată în modul următor:

ChrootEveryone              yes
BrokenClientsCompatibility  no
MaxClientsNumber            10
Daemonize                   yes
MaxClientsPerIP             5
VerboseLog                  no
DisplayDotFiles             yes
AnonymousOnly               no
NoAnonymous                 yes
SyslogFacility              ftp
DontResolve                 yes
MaxIdleTime                 15
MySQLConfigFile               /usr/local/etc/pureftpd-mysql.conf
AnonymousCanCreateDirs      no
Umask                       133:022
MinUID                      100
AllowUserFXP                no
AllowAnonymousFXP           no
ProhibitDotFilesWrite       no
ProhibitDotFilesRead        no
AutoRename                  no
AnonymousCantUpload         no
CreateHomeDir               no
MaxDiskUsage               99
TLS                      2

După cum se observa din fișierul de configurare vom stoca datele despre utilizatori într-o bază de date MySQL și vom permite conectarea acestora doar daca folosesc SSL/TLS.
Următorul pas este să generăm certificatele pentru conexiunea securizată:
mkdir –p /etc/ssl/private
openssl req –x509 –nodes –newkey rsa:1024 –keyout /etc/ssl/private/pure-ftpd.pem –out /etc/ssl/private/pure-ftpd.pem
chmod 600 /etc/ssl/private/*.pem
Avem nevoie în continuare de o baza de date în care să stocăm informațiile despre utilizatorii virtuali. Vom crea baza de date ftpdb și un utilzator mysql ftpdbuser cu parola ftpdbpass, care se poate conecta de pe localhost și are drepturi depline la această bază de date:
mysql –u root –p
CREATE DATABASE ftpdb;
GRANT ALL PRIVILEGES ON ftpdb.* to
ftpdbuser’@’localhost IDENTIFIED BY ‘ftpdbpass’;
FLUSH PRIVILEGES;
quit;
Pentru stocarea datelor avem nevoie de un tabel, pe care îl creem cu structura de mai jos:
mysql –u root –p
USE ftpdb;
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;

Atentie, daca folosiți o versiune mai veche a serverului MySQL va fi cazul să înlocuiți ENGINE cu TYPE.
Ținând cont că utilizatorii noștri sunt virtuali, trebuie să definim un grup și un utilizator de sistem pentru a putea aloca drepturi de scriere în sistemul de fișiere, rulând următoarele comenzi în terminal/consolă:
pw groupadd ftpgroup
pw useradd ftpusers –c “Virtual FTP Users” –g ftpgroup –d /dev/null –s /sbin/nologin
Verificăm ce UID și GID au fost alocate de către sistem utilizatorului ftpusers și grupului ftpgroup consultând fișierele /etc/group și /etc/passwd sau, mai simplu, folosind comanda id:
id ftpusers
care a returnat în cazul meu:
uid=1002(ftpusers) gid=1001(ftpgroup) groups=1001(ftpgroup)
Vom introduce în baza de date informațiile despre utilizatori, de exemplu:
mysql –u root –p
use ftpdb;
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES (‘utilizatortest’, ’1′, MD5(‘parolatest’), ’1001′, ’1002′, ‘/data/director_utilizator’, ’400′, ’800′, ”, ‘*’, ’150′, ’0′);
quit;

Avem acum utilizatorul utilizatortest cu parola parolatest, status 1, ce semnifica faptul că este activ contul, UID 1001 și GID 1002 (atentie, trebuie să fie cele obținute mai sus), cu directorul radacina /data/director_utilizator, viteza maxima de upload 400KB/sec (kilo-octeti pe secunda) si viteza maxima de download 800KB/s. Spatiul maxim pe care il pot ocupa toate fișierele pe care le pune pe server este de 150MB.
Ce a mai rămas? Păi trebuie să configurăm în continuare serviciul pureftpd pentru folosirea informațiilor din baza de date. Fișierul meu arată în felul următor:
MYSQLServer     127.0.0.1
MYSQLPort       3306
MYSQLUser      ftpdbuser
MYSQLPassword   ftpdbpass
MYSQLDatabase   ftpdb
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")
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")
Vom crea directorul /data/director_utilizator și îi vom da permisiunile necesare pentru a putea fi folosit:
mkidr /data/director_utilizator
chown ftpusers:ftpgroup /data/director_utilizator
Scriem în fișierul /etc/rc.conf următoarea linie:
pureftpd_enable="YES"
și pornim serviciul:
/usr/local/etc/rc.d/pure-ftpd start
Acum ar trebui să avetm totul funcțional. NU uitați să activați opțiunea SSL în clientul de FTP, altfel nu va puteți conecta.

Articole asemanatoare:

Bogdan Turcanu

Bogdan Turcanu

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.