FTP server, mirror, rsync

Libor Nesvadba <xnesvadb@fi.muni.cz>


Obsah


Úvod

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.

zpět na obsah


FTP servery a klienti

servery, popsány hlavní vlastnosti:
anonftpd - Rychlý a malý read-only anonymní ftp server
ftpd-BSD - Linuxový port OpenBSD serveru
proftpd - podpora virtual hosts, hidden directories
tftpd - trivial ftp RFC783, vlastní port, možnost spouštět přes inetd
wu-ftpd - Běžně používaný, jednoduché ovládání, zajímavé funkce, méně bezpečný
vsftpd - "the very secure", lightweight, pro Linux
twoftpd - nelze spustit externí program, autorizační front end, transfer back end
lukemftpd - z NetBSD muddleftpd - snaha o efektivní konfiguraci, nemusí běžet jako root
atftpd - advanced TFTP server, jen pod inetd, thready zavírá po 5 min. bez aktivity
oftpd - jen anonymní, snaží se být bezpečný, pracuje s thready
pyftpd - napsaný v pythonu, více threadový, nemusí běžet jako root, GUI
FTP4ALL - ftp server, pro spuštění nepotřebuje práva suberuživatele, může jej používat každý uživatel Unixu

klienti:
Juggle - ftp klient projavu
KBear - jednoduchý ftp klient pro KDE2
DSP-FTP - klient pro GNOME
IglooFTP - grafický klient, >0.6.1 www.littleigloo.org

zpět na obsah


ProFTPD - Professional File Transfer Protocol Server

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.

schéma verzí:

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

zpět na obsah


Kompilace, instalace

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_module2
a 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.

zpět na obsah


Konfigurace:

ProFTPD čte svou konfiguraci ze souboru /etc/proftpd.conf, který je svou strukturou podobný configuračnímu souboru www serveru Apache. Je složen z konfiguračních bloků, které sdružují konfigurační direktivy. Příklad začátku konfiguračního souboru:
 #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

zpět na obsah


Mirror

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.

zpět na obsah


rsync

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/

rsync server

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

jak se to používá

rsync [OPTIONS] [USER@]HOST::SRC [DEST]

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.

typická záloha vypadá takto:
rsync -az -e ssh --delete zdroj cíl

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


Odkazy

zpět na obsah