FTP (File Transfer Protocol) je protokol pro přenos souborů. Prošel poměrně dlouhým vývojem. První návrh pro implementaci přenosu souborů pro M.I.T je popsán již v RFC114 z roku 1971. Významné je RFC765 z roku 1980, jehož motivací byl přechod ze sítě protokolu NCP na TCP. Je to jedna z prvních služeb TCP/IP sítí, spolu s elektronickou poštou. Soubory je možné přenášet nejen ze vzdáleného počítače na lokální (nebo naopak), ale i mezi dvěma vzdálenými počítači. Toto RFC bylo později (roku 1985) nahrazeno RFC959, které slouží jako oficiální specifikace FTP dodnes. Mimo jiné umožňuje vytvářet a mazat adresáře. Na něj navazují různá rozšíření, jako například RFC1579 (firewall-friendly FTP) nebo RFC2228 (FTP security extensions).
FTP pracuje nad TCP/IP a používá dva dobře známé porty: port 21 pro řízení spojení a port 20 pro datové spojení. FTP server poslouchá na portu 21, kde čeká na navázání řídícího spojení. Řídící spojení je tedy iniciováno klientem user-PI (uživatelův interpret protokolu). Jsou dohodnuty parametry spojení (datový port, možnosti systému souborů u klienta i u serveru, atd.) Datové spojení se vytváří až po navázání řídícího spojení, na obou stranách ho řídí DTP (data transfer proces). Podle toho, kdo datové spojení otvírá, rozeznáváme:
Klient může iniciovat FTP přenos mezi dvěma FTP servery tak, že s oběma ustanoví řídící spojení, které musí existovat po celou dobu přenosu. Datové spojení se ustanovuje na základě řídících parametrů jen mezi FTP servery.
Po navázání spojení čeká FTP server na zadání uživatelského jména a hesla. Přistupujeme-li na anonymní FTP server, používá se jako jméno uživatele obvykle "anonymous" nebo "ftp" a jako heslo se podle konvencí zadává emailová adresa. Takový server pak většinou umožňuje procházet pouze určitou část svého adresářového podstromu, do které se bezpečnostních důvodů FPT server chroot()uje.
ProFTPD je jeden z nejrozšířenějších FTP serverů. Byl vyvíjen jako patch pro WU-FTP, ze kterého se nakonec stal samostatný produkt. Je relativně bezpečnější než WU-FTPD a snadno se konfiguruje.
1.0.x - dřívější stabilní verze
1.1.x - vývojová verze
1.2.0rck - Release candidate code, verze těsně před prohláščením
za stabilní
1.2.x - stabilní verze, poslední číslo se zvyšuje díky vydávaným opravám
na chyvy oběvené po vydání release version 1.2.0
1.3.x - nová vývojová větev
operační systémy a platfory, o kterých je známo, že na nich byl proFTPD
úsměšně zkompilován a spuštěn:
Linux ,IRIX, Solaris, AIX, OpenBSD, FreeBSD, NetBSD, BSD/OS, DG/UX,
HP/UX, SunOS, MAC OS X, SCO, Linux for zSeries; S/390
ProFTPD lze naistalovat z balíků distribuce, kterou používáte, nebo je možné z domovské stránky http://www.proftpd.org stáhnout zdrojové soubory a ProFTPD zkompilovat. ProFTPD podobně jako Apache používá systém modulů. Implicitně se kompilují jen základní moduly, takže spoustu zajímavých modulů (např. sql podpora) si musíme přidat sami. Stačí jen v adresáři, do kterého jste stáhli a rozbalili zdrojové soubory, zadat:
./configure --with-module=mod_module1:mod_module2a pro kompilaci potom jen:
make make install.Kromě FTP démona se nainstalují programy:
Vlastní démon se potom nainstaluje do /usr/sbin/proftpd. Je možné jej spouštět z internet super-server démona pokaždé, když přijde požadavek na FTP spojení, nebo jako samostatného démona. Když ProFTPD běží jako samostatný démon a dostane signál SIGHUP, tak znovu přečte svůj konfigurační soubor. ProFTPD nikdy nespouští žádný externí program.
#jméno serveru ServerName "ProFTPD server" #typ serveru (inetd/standalone) ServerType standalone #defaultní FTP port Port 21 #standartní umaska, nové adresáře nebudou zapisovatelné pro group a others Umask 022 #nastevení timeoutu TimeoutLogin 120 TimeoutIdle 600 TimeoutNoTransfer 900 TimeoutStalled 3600 #maximální počet potomků (funguje jen ve stadnalone módu, v případě spouštění #přes internet super server je potřeba omezit počet instancí právě konfigurací #xinetd, případě tcpd wraperu u inetd) MaxInstances 30 #uživatel a skupina, pod kterými server běží User nobody Group nogroup #kořen ftp stromu DefaultRoot korenovy_adresar/ #kam se ukladají pid soubory, podle pidsouboru se dá pohodlně #zjistit s jakým PID server běží ScoreboardPath /var/run/proftpd #logovací soubor, pokud nechceme logovat do systémového logu TransferLog /var/spool/syslog/proftpd/xferlog.legacy #formát zapisu logu LogFormat default "%h %l %u %t \"%r\" %s %b" LogFormat auth "%v [%P] %h %t \"%r\" %s" LogFormat write "%h %l %u %t \"%r\" %s %b"Konfigurační blok <Global> </Global> vytváří množinu konfiguračních direktiv, které se aplikují na hlavní server a na všechny virtuální servery (konfigurace VirtualHost). Pokud je bloků Global více, berou se jako jeden spojený blok. Konfigurace v tomto konfiguračním bloku je překryta konfiguracemi pro jednotlivé virtuální servery.
<Global> DisplayLogin welcome.msg DisplayFirstChdir readme # Logging #zápis přístupu k souborům/adresářům ExtendedLog /var/spool/syslog/proftpd/access.log WRITE,READ write,read #zápis všech přihlášení ExtendedLog /var/spool/syslog/proftpd/auth.log AUTH auth #paranoidní logovani #ExtendedLog /var/spool/syslog/proftpd/paranoid.log ALL default </Global>Konfigurační klok <Directory adresář> </Directory> vytváří množinu konfiguračních direktiv, které se aplikují jen na zadadaný adresář a jeho podadresáře. Používá se algoritmus nejbližší shody, tedy takový konfigurační blok Directory, který nejvíce odpovídá danému adresáři v dotazu. Nastavení se dědí do podadresářů, dokud není překryto novým nastavením pro adresář, který je blíže našemu dotazu. Jdou nastavit přístupová práva, ale nejdou břebít přístupová práva k souborům a adresářům operačního systému. Příklad:
#ve všech adresařích je možné přepisovat soubory <Directory /*> AllowOverwrite on </Directory><Limit> </Limit> Tento konfigurační blok se používá k omezení přístupu pro jeden či více FTP příkazů. Nejdou břebít přístupová práva k souborům a adresářům operačního systému.
#není-li řečeno jinak, je všude zakázáno zapisovaní <Limit WRITE> DenyAll </Limit>
V sekci <Anonymous> se definuje základní konfigurace anonymního FTP serveru. Implicitně se server chroot()uje do uvedeného adresáře, jako login požaduje uvedené uživatelské jméno a jako heslo e-mailovou adresu.
#zakladní konfigurace anonymního FTP serveru s jedním upload adresářem <Anonymous korenovy_adresar/pub> #přihlasit se mnohou všichni <Limit LOGIN> AllowAll </Limit> #maximální počet klientů se zprávou MaxClients 5 "Sorry, max %m users -- try again later" #nový uživatel a skupina User ftp Group ftp #klienti se přihlašují jako "anonymous" nebo "ftp" UserAlias anonymous ftp #upload adresář který umožňuje jen zapisování souboru <Directory uploads/*> <Limit READ> DenyAll </Limit> <Limit STOR> AllowAll </Limit> </Directory> </Anonymous korenovy_adresar/pub>
Konfigurační blok <VirtualHost> se používá k vytvoření nezávislých množin konfiguračních direktiv, které náleží jistým hostům či IP adresám. Možné použití je sestavení více "virtuálních" serverů běžících na jediném fyzickém počítači. Je možné vytvořit virtuální server, který má stejnou adresu jako hlavní server, ale poslouchá na svém vlastním portu (tahle možnos je nekompatabilní s použitím internet super serveru inetd či xinetd). Virtuální server běží jako potomek hlavního serveru. Pomocí direktivy Bind se dá server či virtuální server svázat s jednou či více internetovou adresou. Ta může být IP adresou v tečkové notaci nebo plně kvalifikované doménové jméno. Příchozí spojení na adresu přidanou přes direktivu Bind je obslouženo v kontextu této direktivy (konfiguračního bloku).
#a příklad jednoho virtuálního FTP serveru </Anonymous> <VirtualHost ftp.jinde.cz> ServerAdmin ftp_admin@jinde.cz ServerName "Jinde FTP server" MaxLoginAttempts 2 RequireValidShell no TransferLog /var/spool/syslog/proftpd/xferlog.www MaxClients 50 DefaultServer on DefaultRoot jiny_koren/ #zde můžeme nastavit jiné časy TimeoutLogin 240 TimeoutIdle 900 TimeoutNoTransfer 1200 #můžeme zakázat přístup z vybraných domén <Limit ALL> Order Allow,Deny Allow .evil.net, .evil2.net Allow .dangerous.net Deny ALL </Limit> #private adresář <Directory jiny_koren/private> <Limit ALL> AllowUser kamarad1 AllowUser kamarad2 DenyAll </Limit> </Directory> </VirtualHost>Kromě této konfigurace v souboru /etc/proftpd.conf je také možné specifikovat, jak se má server chovat v jednotlivých adresářích pomocí souboru .ftpaccess v daném adresáři.
/etc/ftpusers - seznam uživatelů, kteří se nebudou moci přihlásit, typicky root
Mirror ja script v perlu, pužívá FTP protokol k duplikování souborů a adresářů ze vzdáleného počítače na lokální za pomoci regulárních výrazů perlu. Defaultně se přenášejí soubory, které lokálně chybí, změnila se jejich velikost nebo některý z časů (např. čas posledního přístupu) souboru. Může redukovat čas na stažení výpisu adresáře pomocí komprese, navíc stahovat jen denní rozdíly výpisů. Soubory mohou být komprimovány pomocí gzip, velké vzdálené soubory mohou být stahovány omezenou rychlostí.
Užitečný je mirrordir(1) který potřebuje méně paměti a rychleji kopírule stromy adresářů mezi lokálními počítači. Snaží se způsobit co nejméně změn, tedy zkopírovat linky, zařízení, pojmenované fronty, přístupová práva, vlastník, čas přístupu a modifikace. Je možné detajlní nastavení pro časové zálohy.
fmirror(1) - paměťově efektivní ftp mirror, používá kombinaci časových známek, velikostí souborů a přístupových práv a regulárních výrazů k určení soboru, které se budou kopírovat z ftp serveru.
ftpmirror(1) - také perlový script jako mirror, vyžaduje méně paměti.
Tento program je nástroj pro synchronizaci větších archivů v síti. Chová se podobně jako rcp, ale poskytuje mnohem více možností a je časově výhodnější a spolehlivější. K přenosu souborů rsync používá rsync remote-update protocol, který přenos značně urychluje. Pomocí tohoto protokolu je možné přenášet jen rozdíly mezi soubory (používá se výkonný checksum-search algoritmus). rsync používá stejný binární soubor pro spouštění démona (rsync serveru) i pro spouštění klienta přistupujícího k serveru. Program rsync se instaluje z balíku rsync (deb, rpm, tar), nebo ze zdrojových souborů dostupných na domovské stránce http://rsync.samba.org/
Spuštění serveru se provádí příkazem rsync --daemon a můžeme jej spouštět
jako samostatného démona nebo z internet super-server démona. V druhém případě
je potřeba do /etc/services přidat např. rsync 873/tcp, a do
/etc/inetd.conf přidat
rsync stream tcp nowait root
/usr/bin/rsync rsyncd --daemon.
Ke konfiguraci slouží soubor /etc/rsyncd.conf.
Tento konfigurační soubor má podobnou strukturu jako ini soubor systému MS-Windows. Skládá z modulů a parametrů. Modul začíná svým jménem zapsaným jako [module_name] a končí tam, kde začíná nový modul. Prametry se zapisují ve tvaru 'name = value'. Před definicemi modulů se uvádí některé parametry, které nastavují globální chování rsync serveru.
Příklad konfiguračního souboru:#kteří uživatelé a skupiny mohou kopírovat z a do modulu jako by daemon běžel #jako root uid = nobody gid = nogroup #nechroot()uje se use chroot = no #maximální počet otevřených spojení max connections = 4 #způsob logování syslog facility = local5 #kam s pid souborem, kde je zapsán PID běžícího rsyncd pid file = /etc/rsyncd.pid #moduly [ftp] path = /home/ftp comment = text, který se zbrazí při výpisu modulů
rsync modul - každý modul exportuje adresářový strom jako symbolické jméno, právě tyto adresářové stromy (moduly) jsou určené pro synchronizaci a je možné pro každý modul nastavit rozmanitá přístupová práva (přístup jen pro některé uživatele, jen z některých adres, počítačů, zda se má pro tyto doménu rsyncd chroot-ovat) viz man rsyncd.conf
seznam modulů se vypisuje rsync host::
výpis souborů v modulu rsync host::modul
Větší bezpečnosti lze dosáhnout použitím protokolu ssh:
rsync -e ssh host::modul/soubor .
drsync - v perlu, synchronizace local i remout adresářů
rsync - podpora pro kopírování linků, zařízení, vlastníků, skupin a
oprávnění, s přepínačem -S zachází efektivně s děravými soubory.
Pomocí rsync je možné opravit i poškozený binární obraz, například ISO obraz
CDčka, přenesou se jen potřebné části, tedy jestli server se zdrojem obrazu
podporuje rsync.
rsync rsync//ftp.domena/soubor.iso nášsoubor.iso