Hlavní navigace

Pure-ftpd: FTP server snadno a rychle

2. 4. 2009
Doba čtení: 11 minut

Sdílet

Již dlouhá léta se pro sdílení dat na síti používá protokol FTP. Je starý, jednoduchý, spolehlivý a většina jeho implementací se umí hezky integrovat do unixového systému. Pure-ftpd není výjimkou a nahození serveru s ním je otázkou několika minut. V článku si ukážeme, jak Pure-ftpd nainstalovat a jak ho spravovat.

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:

CS24_early

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

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.