FTP protokol
FTP je jeden z nejstarších server-klient protokolů. Dříve byl hojně používán pro komunikaci se servery, ale kvůli bezpečnosti a některým dalším nevýhodám se od něj postupně ustupuje a nahrazuje ho openssh nebo prosté webové rozhraní.
Protokol je postaven nad TCP/IP a pro komunikaci používá dvě otevřená spojení. První je na klasickém portu 21, kde server naslouchá požadavkům klienta. Číslo druhého portu, který se používá pro přenos samotných dat, již není tak jednoznačný.
U FTP se rozlišuje tzv. aktivní a pasivní režim. U aktivního režimu se klient připojí k serveru, vyžádá si třeba nějaké soubory, server se připojí na port 20 u klienta a data mu pošle. Pasivní režim funguje obráceně. Server vybere port větší jak 1024, ten pošle klientovi, ten se na něj připojí a server mu odešle data.
Na dnešní dobu jde o nevhodné řešení, protože díky němu má FTP problémy při průchodu NATem. Problémy ze strany klienta většinou vyřeší pasivní režim. Pokud je za NATem schovaný FTP server, je řešení složitější. Přesměrováním portu 21 na veřejnou adresu otevřeme pouze domlouvací kanál, ale data budou zablokována. Pokud přesměrujeme ještě port 20, tak by nám měl fungovat aktivní režim. Stále ale je tu problém s pasivním režimem. Proto musí NAT prohlížet vytvořená FTP spojení a přesměrovávat porty, na kterých se klient a server dohodli. V Linuxu se o to stará modul nf_conntrack_ftp.
Obrovskou výhodou FTP protokolu je jeho rychlost. Režie pro přenos je minimální, takže se na 100 mbit/s síti pohybuje rychlost kolem 11 MB/sec.
FTP protokol rozlišuje dva druhy dat, a to binární a textový (ASCII). Nikdy jsem nepotřeboval klientovi říct, který z nich má použít, vybral si vždy spolehlivě sám, nicméně je dobré vědět, že v něm něco takového existuje.
Pure-ftpd
Jednou z implementací FTP protokolu je Pure-ftpd. Jedná se o spolehlivý server, který klade důraz jak na bezpečnost, tak jednoduchost. Používám ho již mnoho let, ale poslední dobou pouze na lokální síti. Pro přenos přes Internet je pohodlnější openssh, které vyžaduje otevření pouze jednoho portu.
Pure-ftpd jsem na svoje stroje vybral, protože nepotřebuje složité konfigurační soubory a má velmi jednoduché přidávání virtuálních uživatelů. Admin také není ochuzený o výhody PAMu, LDAPu, unixový uživatelů nebo skladování informací o uživatelích v nějaké velké databázi a tudíž třeba i informačním systému. Pure-ftpd dokáže uživatelská jména a hesla s nadsázkou dostat prakticky z čehokoli, kde se nacházejí.
Konfigurace Pure-ftpd je stejně variabilní jako práce s uživateli. První možnost, která byla využita v jednom ze stabilních Debianů, bylo rozdělení konfigurace do adresářové struktury. Co volba, to jeden soubor. Název souboru byl klíč a obsah hodnota. Možná šlo o pekelně rychlý přístup, ale mně moc nevyhovoval. Jak to má Debian udělané teď, netuším. Pak jsem Pure-ftpd využíval na Archlinuxu. Je to také nějaký ten měsíc zpátky. Tam byla veškerá konfigurace uložena v jednom souboru. To pro mě byl sympatický přístup a měl jsem ho rád. Třetí možnost, jak nakonfigurovat Pure-ftpd, je použita na Gentoo. Pure-ftpd může z velké části být nastavené i pomocí parametrů a vývojáři Gentoo mají tuto možnost rádi nejen u Pure-ftpd. Takže ve velmi dobře okomentovaném souboru /etc/conf.d/pure-ftpd najdeme seznam parametrů, které můžeme předat FTP serveru při spuštění. Gentoo a Archlinux přístup vede díky přednastaveným hodnotám a velmi dobře připraveným konfiguračním souborům k nahození FTP serveru do několika minut. U Debianu jsem musel občas prolézat dokumentací. V adresářové struktuře se komentáře dělají špatně.
Instalace
Instalace není nějak obtížná. Na jednotlivých distribucích se liší většinou jen podle toho, co chceme použít. Debian měl rozdělené balíčky podle způsobu získávání informací o uživatelích s tím, že byla podporována vždy jedna velká databáze (mysql, pgsql) a k tomu unixoví uživatelé a PAM. V Gentoo stačí zaškrtnout USE flagy.
Takže si vybereme, co od Pure-ftpd očekáváme a podle toho použijeme nástroje našeho oblíbeného balíčkovacího nástroje.
Dejme tomu, že instalace proběhla bez komplikací a je tedy čas se podívat, jak je na tom konfigurace Pure-ftpd.
Konfigurace a správa uživatelů
Jak jsme si řekli. Jedna možnost, jak říci Pure-ftpd, co od něj potřebujeme, je předat mu to pomocí parametrů při spouštění. Jelikož se jedná o distribučně založenou věc, tak dále budeme pokračovat v duchu Gentoo a podíváme se na konfigurace pure-ftpd přes parametry.
V Gentoo se pro konfiguraci používá skript, ve kterém proměnným nastavíme hodnoty a ty se pak vloží do parametrů v init skriptu.
Teď je ta správná doba, kdy bychom si měli vybrat, jak se budeme k serveru přihlašovat. K dispozici máme následující způsoby:
- Unixoví uživatelé
- PAM
- PureDB
- MySQL
- Postgresql
- LDAP
- Daemon pure-authd
Všechny metody lze navzájem kombinovat. Takže se můžeme přihlašovat do normálních unixových uživatelů a zároveň mít virtuální uživatele třeba v Postgresql. Dokonce si můžeme určit prioritu ověřovacích mechanismů.
Níže si řekneme jak pracovat s prvními pěti, ale teď přejdeme k výčtu parametrů.
-0 --notruncate Zakáže přepisování souborů, nejdříve se nahraje
pod dočasným jménem soubor a nakonec se přejmenuje
na původní.
-1 --logpid Přidá PID do logů
-4 --ipv4only Naslouchání pouze na IPv4
-6 --ipv6only Naslouchání pouze na IPv6
-a --trustedgid Skupina uživatelů, která nemá být chrootována
-A --chrooteveryone Chrootovat každého kromě roota
-b --brokenclientscompatibility Zapnout háčky pro lepší kompatibilitu s
nestandardními klienty a firewally.
-B --daemonize Spustit server jako daemon
-c --maxclientsnumber Omezení počtu klientů
-C --maxclientsperip Omezení počtu klientů na IP adresu
-d --verboselog Zapne výpis ladících informací v logu
-D --displaydotfiles Zapne zobrazování skrytých souborů
-e --anonymousonly Povolí se přihlásit pouze anonymním uživatelům
-E --noanonymous Zakáže přihlášení anonymním uživatelům
-f --syslogfacility Nastaví facility pro syslog
-F --fortunesfile Zobrazit vtipnou hlášku po přihlášení k serveru
-g --pidfile Soubor s PID
-G --norename Zakázat přejmenování již nahraných souborů
-h --help Nápověda
-H --dontresolve Zakázat získávání domény k IP adresám klientů
-i --anonymouscantupload Zakázat upload anonymních uživatelů
-I --maxidletime Maximální timeout v minutách
-j --createhomedir Vytvořit domácí adresář uživatele, pokud neexistuje
-k --maxdiskusagepct Zakázat upload, pokud je disk naplněn na nastavené
procento
-K --keepallfiles Zakázat mazání souborů
-l --login Nastavení autentizačních metod (o tom níže)
-L --limitrecursion Limit pro výpis souborů a adresářů
-m --maxload Zakázat stahování anonymním uživatelům pokud je
server zatížen na nastavení load.
-M --anonymouscancreatedirs Povolit anonymním uživatelům vytvářet adresáře
-n --quota Nastavení quoty
-N --natmode Vynutit aktivní mód
-o --uploadscript Spustit nad každým uploadovaným souborem skript
-O --altlog Alternativní logovací soubor
-p --passiveportrange Rozsah portů pro pasivní režim
-P --forcepassiveip Nastavit IP pro pasivní klienty
-q --anonymousratio Nastavit poměr download:upload anonymních klientů
-Q --userratio Nastavit poměr download:upload pro všechny klienty
-r --autorename Nepřepisovat existující soubory, pouze vytvořit
automatický název
-R --nochmod Zakázat příkaz CHMOD
-s --antiwarez Zakázat uživatelům získat anonymně nahrané soubory
-S --bind Nastavit IP adresu a port kde má server naslouchat
-t --anonymousbandwidth Omezit rychlost anonymních klientů
-T --userbandwidth Omezit rychlost všech klientů
-u --minuid Zakázat přihlášení uživatelům s nižším UID, než je
nastavená
-U --umask Nastavit umask
-V --trustedip Nastavit, z jakých IP se mohou připojovat
neanonymní klienti
-w --allowuserfxp Povolit FXP protokol pro anonymní klienty
-W --allowanonymousfxp Povolit FXP pro všechny uživatele
-x --prohibitdotfileswrite Omezit práci se skrytými soubory
-X --prohibitdotfilesread Zakázat čtení skrytých souborů
-y --peruserlimits Nastavit limity pro každého uživatele
-Y --tls Zapnout TLS šifrování přenosu
-z --allowdotfiles Povolit anonymním uživatelům číst skryté soubory
-Z --customerproof Ochrana proti nastavení špatných práv atd.
Některé z voleb jsou důležitější než jiné, ale pro běžné použití jich stačí minimum. Nahození FTP serveru může vypadat třeba takto:
/usr/sbin/pure-ftpd -S 21 -c 30 -C 10 -B -k 95% -l unix -l pam -l pgsql:/etc/pure-ftpd/postgresql.conf -A -x -j -R -Z
Parametr -S říká, že má server běžet na 21. portu. Parametry -c a -C nastavují omezení pro maximální počet připojených klientů. Server přepneme do daemon režimu pomocí -B a přes -k nastavíme, že pokud bude disk zaplněn z 95 %, tak nedovolíme uživatelům nic nahrát. Teď začíná výběr autentizační metody. Metoda unix a pam je jasná. Pak tu máme ještě pgsql kde také určíme soubor, kde pure-ftpd najde informace pro připojení k databázi a SQL dotazy, které má použít pro získání důležitých dat. Pro MySQL je použití obdobné. Nakonec řekneme serveru, že každého uživatele má chrootovat do jeho domácího adresáře, zajistíme přístup ke skrytým souborům, vytvoření domácích adresářů, zakážeme CHMOD anonymním uživatelům a zapneme ochranu proti špatně nastaveným právům.
Správa uživatelů
Podařilo se nám spustit FTP server. Teď se podíváme, jak vytvořit virtuálního uživatele.
Jak jsme si řekli, uživatele můžeme ukládat skoro kamkoli. Pokud se rozhodneme pro PAM, tak ho stačí povolit parametrem, případně vytvořit konfigurační soubor PAMu a autentizaci upřesnit. Jednodušší je použít ověřování přes unixové uživatele. To také stačí pouze povolit. Teď se již dostáváme k samotným virtuálním uživatelům. Takový uživatel není zanesen do samotného systému, ale ví o něm jen náš FTP server, resp. naše databáze. Tento uživatel používá práva nějakého reálného uživatele.
Nejjednodušší způsob, jak vytvořit virtuálního uživatele, je pomocí PureDB. Je to databáze, která je součástí pure-ftpd a je připravená pro použití. Se záznamy se pracuje pomocí programu pure-pw. Pomocí něj vytvoříme passwd soubor a ten se pak převede na db soubor, který je již zpracován samotným FTP daemonem.
Začneme tím, že dáme vědět pure-ftpd, že existuje nějaká PureDB.
/usr/sbin/pure-ftpd -S 21 -c 30 -C 10 -B -k 95% -l unix -l puredb:/etc/pureftpd.pdb -A -x -j -R -Z
Necháváme povolené i přihlašování unixových uživatelů. Dále si vytvoříme soubor /etc/pureftpd.passwd
touch /etc/pureftpd.passwd
Teď máme otevřenou cestu k vytváření uživatelů po stylu pure-ftpd. Přidáme si tedy uživatele.
misha ~ # pure-pw useradd test -u cx -g cx -d /home/test
Password:
Enter it again:
Program se nás zeptá na heslo. Vytvořeného uživatele si můžeme ověřit pomocí:
misha ~ # pure-pw list
test /home/test/./
misha ~ # pure-pw show test
Login : test
Password : $1$eEYkXy90$jo6O2TjrLVTi02m6Uy.gN1
UID : 1000 (cx)
GID : 1000 (cx)
Directory : /home/test/./
Full name :
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 0 (unlimited)
Max size : 0 Mb (unlimited)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs :
Denied client IPs :
Time restrictions : 0000-0000 (unlimited)
Max sim sessions : 0 (unlimited)
Z výpisu lze usuzovat, že uživateli je možné nastavit mnohem více parametrů, než jsme si ukázali. Všechny najdete po spuštění programu pure-pw bez parametrů. Nápověda je na velmi dobré úrovni.
Pokud chceme aby pure-ftpd začal nové uživatele používat napíšeme „pure-pw mkdb“ ze souboru /etc/pureftpd.passwd se vytvoří /etc/pureftpd.db. Tím stvrzujeme změnu a je vše je připraveno k běhu.
Odstranění uživatele se dělá pomocí „pure-pw userdel test“ a nesmíme nakonec zapomenou opět zavolat mkdb.
Tahle forma přidávání uživatelů se hodí na malém systému, kde je třeba občas něco nasdílet nebo dát malé skupince lidí přístup. Často ale máme databázi plnou uživatelů, kteří by moc rádi měli přístup ke svým datům. V takovém případě se nám budou hodit moduly pro postgresql a mysql.
S obojím se pracuje víceméně stejně, jen se mění prefixy parametrů.
Pokud nemáte tabulku s uživateli, můžeme použít třeba tuhle:
CREATE TABLE ftps (
id integer NOT NULL,
"user" character varying(16),
"password" character varying(64),
uid integer,
gid integer,
dir character varying(128),
"comment" text
);
Mám na svých strojích postgresql, takže budu uvádět příklady pro něj. V tabulce máme uvedeno heslo, které ještě zpracujeme třeba pomocí crypt nebo md5. Dále v ní najdeme uid, gid, adresář, do kterého má uživatel přístup, komentář, identifikační číslo a samozřejmě jméno uživatele. Do databáze můžeme ukládat i informace o quotách, limitech a dalších parametech stejně jako do PureDB.
Manipulace uživateli je pak na administrátorovi a pure-ftpd v tomto nepomůže. Musíme mu ale říct, jakým SQL dotazem dostane parametry, které potřebuje z naší tabulky. To se zapisuje do konfiguračního souboru, která předáváme společně s parametrem „-l pgsql“. Spuštění serveru pak vypadá takto:
/usr/sbin/pure-ftpd -S 21 -c 30 -C 10 -B -k 95% -l unix -l pgsql:/etc/pure-ftpd/postgresql.conf -A -x -j -R -Z
Opět necháváme možnost přihlásit se unixovým uživatelům a přidáme navíc pgsql. Za dvojtečkou najdeme cestu k souboru s informací o tom, jak získat z SQL tabulky data. Na tomto souboru není nic složitého a příklad vydá za tisíc slov.
# Adresa server
PGSQLServer 127.0.0.1
# Port k databázovému serveru
PGSQLPort 5432
# Uživatel databáze
PGSQLUser eleanor
# Heslo k databázi
PGSQLPassword tajné_heslo
# Název databáze
PGSQLDatabase eleanor
# Zde si vybereme, v jakém formátu je uložené heslo ("cleartext", "crypt", "md5" a "any")
PGSQLCrypt crypt
# Východzí hodnota uid
PGSQLDefaultUID 1000
# Východzí hodnota gid
PGSQLDefaultGID 1000
# Získání hesla
PGSQLGetPW SELECT password FROM ftps WHERE "user"='\L'
# Získání uid
PGSQLGetUID SELECT uid FROM ftps WHERE "user"='\L'
# Získání gid
PGSQLGetGID SELECT gid FROM ftps WHERE "user"='\L'
# Získání adresáře
PGSQLGetDir SELECT dir FROM ftps WHERE "user"='\L'
Než se SQL dotaz odešle směrem k databázi, budou některé znaky nahrazeny reálnými hodnotami. Jsou to tyto znaky:
\L Jméno uživatele
\I IP adresa na kterou je klient připojen
\P Port pasivního režimu
\R IP adresa odkud je klient připojen
Nakonec nastartujeme pure-ftpd server a přihlašování přes uživatele v databázi by mělo fungovat.
Závěr
I když je FTP protokol pomalu na ústupu, ještě pořád má co nabídnout. Je rychlý, spolehlivý a jednoduchý na správu. Při jeho používání sice občas zaskřípeme zuby, ale data z jednoho místa na druhý většinou dostaneme. Veškeré informace včetně dokumentace lze najít na stránkách projektu.