Î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:
- DNS – restricționare acces site-uri noroc ilegale
- Squid – acces pe baza de utilizator si parola
- Primii pasi in lumea FreeBSD-ului
- Au apărut
- Importanta cheilor primare in tabele MySql
- Logare mesaje server DHCP în baza de date MySQL
- ZTE ZXR 10 2609
- Instalare Apache, PHP si MySQL pe Fedora Core
- MySQL – schimbarea parolei uitate pentru root
- Orange Home Net prin fibră – dual stack IPv4/IPv6