FTP server a rsync

Marek Cikánek




Obsah:




Úvod

File Transfer Protocol (FTP) je standardním protokolem používaným pro přenos souborů. Slouží pro přenos souborů mezi serverem a klientem (a to v obou směrech). FTP je protokolem urceným čistě pro přenos souborů, v tom se odlišuje například od Network File System (NFS), což je protokol, který umožňuje po síti přimountovat vzdálený disk a pracovat s ním jako s lokálním diskem. Protokol FTP byl vytvořen v roce 1971 na M.I.T a je definován v několika RFC dokumentech. Poslední definice je RFC 959 z roku 1985, která je platná dodnes. Doplňující RFC 1579 (Firewall-Friendly FTP) a 2228 (FTP Security Extensions).

Obsah

Jak pracuje FTP

Použitý protokol je stavový. Klient naváže se serverem řídicí spojení, které je udržováno po celou dobu trvání sezení. Server klienta registruje a pamatuje si o něm řadu informací - ve kterém adresáři se momentálně nachází, jaký režim přenosu má nastaven a podobně. Řídicí spojení je jednoúčelové a slouží výlučně k výměně příkazů a odpovědí mezi oběma stranami. Veškeré informace, které jím procházejí, jsou textové, jak je v Internetu zvykem. Pro datové přenosy se navazují nová (datová) spojení. Jsou jednorázová. Okamžitě po přenesení souboru nebo výpisu adresáře se datové spojení uzavře. Konec seance (vyvolaný ve většině FTP klientů příkazem quit) vlastně znamená ukončení řídicího spojení a tím pádem zapomenutí veškerých stavových informací na straně serveru. Při příštím přihlášení začíná klient znovu s čistým stolem.

Používané porty:

Základní model FTP (standardní klient-server komunikace):

                                       -------------
                                       |/---------\|
                                       ||   User  ||    --------
                                       ||Interface|<--->| User |
                                       |\----^----/|    --------
             ----------                |     |     |
             |/------\|  FTP Commands  |/----V----\|
             ||Server|<---------------->|   User  ||
             ||  PI  ||   FTP Replies  ||    PI   ||
             |\--^---/|                |\----^----/|
             |   |    |                |     |     |
 --------    |/--V---\|      Data      |/----V----\|    --------
 | File |<--->|Server|<---------------->|  User   |<--->| File |
 |System|    || DTP  ||   Connection   ||   DTP   ||    |System|
 --------    |\------/|                |\---------/|    --------
             ----------                -------------
 
             Server-FTP                   USER-FTP
             

FXP (File eXchange Protocol) dovoluje kopírovat soubory z jednoho FTP serveru na druhý. Tento způsob přenosu však není podporován všemi FTP servery.

Model pro server-server komunikaci:


                  Control    ------------   Control
                  ---------->| User-FTP |<-----------
                  |          | User-PI  |           |
                  |          |   "C"    |           |
                  V          ------------           V
          --------------                        --------------
          | Server-FTP |   Data Connection      | Server-FTP |
          |    "A"     |<---------------------->|    "B"     |
          -------------- Port (A)      Port (B) --------------

Je dobré si uvědomovat, že příkazy FTP (které procházejí řídicím spojením) nejsou totožné s příkazy FTP klienta. Například příkaz pro výpis seznamu souborů v aktuálním adresáři vyvolá FTP příkaz LIST, avšak v průměrném klientovi se zadává uživatelským příkazem dir. Klientský program totiž obsahuje jakýsi vlastní interpret uživatelských příkazů.

Díky tomu si každý klient může definovat svou vlastní sadu příkazů, kterými bude komunikovat s uživatelem. Ty pak převádí na standardizované interní příkazy FTP.
Zde jsou uvedeny některé příkazy, které může klient užít při komunikaci se serverem:

    QUIT - ukončí spojení
    CWD - změní aktuální adresář
    PORT - specifikace datového portu
    TYPE - způsob reprezentace dat
    RETR/STOR - přenos dat
    ABOR - přerušení předchozího FTP příkazu
    DELE - smazání souboru na serveru
    MKD - vytvoření adresáře
    PWD - výpis aktuálního adresáře
    LIST - výpis obsahu adresáře
    SITE - spuštění dalších služeb (týkajících se FTP serveru)
    STAT - výpis stavových informací
    HELP - nápověda

Obsah

Způsoby navázání spojení

Rozlišujeme dva typy způsobu navázání spojení - aktivní a pasivní.

V obou variantách se nejdříve klient připojí na FTP server na port 21, tím se ustanoví řídící spojení. Nyní je však třeba ještě navázat datové spojení, toto spojení lze vytvořit dvěma způsoby:

Po navázání spojení čeká FTP server na zadání uživatelského jména a hesla (pomocí příkazů USER a PASS). Přistupujeme-li na anonymní FTP server, takový server pak většinou umožňuje procházet pouze určitou část svého adresářového stromu, do které se z bezpečnostních důvodů FTP server chroot()uje. Tento strom zpravidla obsahuje adresáře /bin, /etc a /lib. Soubory ke stažení se většinou nalézají v adresáři /pub. Důvodem, proč zde existují tyto adresáře, je to, že FTP démon spouští pro různé příkazy různé externí programy, které ovšem musí být přístupné a proto musí být umístěny někde v chrootovaném stromu. Do adresáře /bin lze umístit také další programy, které pak může uživatel spouštět pomocí přikazu SITE ze svého FTP klienta. (např.: FTP RedHatu mívají příkaz RPM, který dovoluje uživatelům dotazovat se na RPM balíčky umístěné na daném serveru.) Některé FTP servery pracují mírně odlišně. Například dovolují vytvářet uživatelské účty nezávislé na ostatních systémových účtech - tedy účty určené čistě pro FTP. Jiné servery (např.: ProFTPD a NcFTPd) zase mají vestavěné příkazy pro výpis obsahu adresáře a nepotřebují tedy specialní chrootovanou stromovou strukturu. Pokročilejší FTP servery (např.: ProFTPd) podporují provozováních takzvaných virtuálních FTP serverů, což nám dovoluje mít na jednom počítači zřízeno několik různých FTP serverů.

Obsah

Anonymní FTP

Uživatelské FTP bylo původně zamýšleno jako služba pro řádné uživatele. Mělo jim dát možnost přenášet například datové soubory z počítače, na kterém byly vytvořeny, na jiný počítač, kde dojde k jejich dalšímu zpracování. Proto je přístup ke službě FTP chráněn uživatelským jménem a heslem. V případě Unixu se heslo bere ze standardní systémové databáze /etc/passwd a je tudíž totožné s běžným přístupovým heslem. Postupem času se přišlo na to, že některé informace by mohly být vystaveny zcela veřejně a zpřístupněny komukoli. Objevilo se anonymní FTP.

Anonymní FTP server nabízí kromě standardních "plnohodnotných" uživatelů (chráněných heslem) navíc ještě uživatele anonymního, umožňujícího přístup k veřejné části archivu. Zažilo se používat pro něj jméno anonymous nebo ftp. Některé systémy pro tohoto uživatele nepožadují žádné heslo, u ostatních může být v podstatě libovolné. Opět dle konvence slouží jako heslo elektronická adresa přihlásivšího se uživatele. Z anonymního FTP se stal standardní nástroj pro distribuci volně šiřitelných informací v Internetu.

Několik rad při zprovozňování anonymního ftp:

Doporučuje se, aby byl anonymní FTP server umístěn v samostatné diskové oblasti (nebo na samostatném disku).

Umístění FTP serveru v samostatné oblasti přináší dvě důležité výhody:

Pakliže používáme FTP server, který spouští pro vykonávání FTP příkazů externí programy, měli bychom dbát na to, aby žádný spustitelný program (kopie programu ls, tar, gzip, apod.), který musí být uložen v adresáři ftp-chroot: /bin nebyl vlastněný ani zapisovatelný pro anonymního uživatele.

Obsah

Bezpečnost

FTP a bezpečnost jsou dva pojmy, které nejdou moc dohromady. FTP protokol není bezpečný a neměl by se používat na nic jiného než na anonymní přístup. Bohužel realita je jiná a FTP se stále v hojné míře používá k autorizovaným přístupům.

Proč je FTP nebezpečné? Je to dáno dobou, ve které protokol vznikl. V roce 1971 byla síť Internet (tehdy ARPANET) relativně bezpečná, byla to akademická/vojenská síť, kde si všichni uživatelé navzájem mohli důvěřovat, proto se při návrhu FTP protokolu hledělo spíše k efektivnosti než k bezpečnosti. Na druhou stranu má FTP unikátní vlastnosti, které u nových protokolů nenajdeme.

Bezpečnostní problémy lze rozdělit do následujících kategorii, viz. níže:

Obsah

FTP servery pro UNIX


Obsah

ProFTPD

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. Oproti WU-FTPD je bezpečnější (alespoň co se týče počtu security-patchů) a jeho další výhodou je snadná konfigurace podobná www serveru Apache.

Základní vlastnosti:

Obsah

Instalace

ProFTPD lze provozovat ve dvou režimech a to buď jako samostatný server nebo jako proces spouštěný z internet super-server démona pokaždé, když přijde požadavek na FTP spojení. My si zde ukážeme instalaci pro variantu samostatného serveru. Verze pro samostatný server je distribuována v balíčku s názvem např.: proftpd-1.2.9-7.i386.rpm pro ProFTPD verze 1.2.9-7. Po stažení balík nainstalujeme:

rpm -i proftpd-1.2.9-7.i386.rpm

Kromě FTP démona se nainstalují i tyto programy:

Vlastní démon se potom nainstaluje do /usr/sbin/proftpd. Pakliže ProFTPD běží jako samostatný démon a dostane signál SIGHUP, načte znovu svůj konfigurační soubor. ProFTPD nikdy nespouští žádný externí program.

Obsah

Konfigurace

ProFTPD čte svou konfiguraci ze souboru /etc/proftpd.conf, který je svou strukturou podobný configuračnímu souboru www serveru Apache. Kromě této "globální" konfigurace je také možné specifikovat, jak se má server chovat v jednotlivých adresářích pomocí souboru .ftpaccess v daném adresáři. V souboru /etc/proftpd.conf se konfigurace nastavuje pomocí direktiv. Nejprve se nastavují základní vlastnosti serveru a potom můžeme pomocí různých sekcí nastavovat chování serveru ve speciálních případech.

V sekci <Global> lze dodefinovat některé základní vlastnosti celého FTP serveru. Jestliže direktivy uvedené v této sekci přepíšeme v jiné sekci, např. <Anonymous>, na jiné parametry, tak tyto nové parametry budou mít v dané sekci přednost před těmi globálními.

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.

Sekce <Directory> slouží pro definování specifických vlastností uvedeného adresáře. Lze nastavovat čtení, zapisování do adresáře, přístupová práva k souborům, atd.

Sekce <Limit> se používá pro stanovení omezení kdo a jaké příkazy, nebo skupiny příkazů se mohou používat.

A poslední sekcí je <VirtualHost> pomocí které lze vytvořit a nakonfigurovat virtuální FTP server.

Příklad konfiguračního souboru:
 #jmeno serveru
 ServerName              "My ProFTPD server"

 #typ serveru (inetd/standalone)
 ServerType              standalone

 #defaultni FTP port
 Port                    21

 #standartni umaska, tak aby nove adresare nebyly zapisovatelne pro group a others
 Umask                   022

 #nasteveni timeoutu
 TimeoutLogin            120
 TimeoutIdle             600
 TimeoutNoTransfer       900
 TimeoutStalled          3600

 #maximalni pocet potomku (funguje jen ve stadnalone modu) 
 MaxInstances            30

 #uzivatel a skupina, pod kterymi server bezi  
 User                    ftp
 Group                   ftp

 #logovaci soubor
 TransferLog             /var/spool/syslog/proftpd/xferlog.legacy

 #format 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"

 <Global>
         DisplayLogin            welcome.msg
         DisplayFirstChdir       readme
        
         # Logging
         #zapis pristupu k souborum/adresarum
         ExtendedLog             /var/spool/syslog/proftpd/access.log read, write
        
         #zapis vsech prihlaseni 
         ExtendedLog             /var/spool/syslog/proftpd/auth.log AUTH auth
        
         #paranoidni logovani
         #ExtendedLog            /var/spool/syslog/proftpd/paranoid.log ALL default
  </Global>

 #max. pocet klientu
 MaxClients              20
 #max. pocet pokusu o prihlazeni 
 MaxLoginAttempts        2

 #povoleni klasifikace podle trid
 Classes on
 Class erigona limit 1
 Class erigona ip 10.0.0.1/24
 Class local limit 2
 Class local ip 10.0.20.2/16

 #povoleni prihlasovani pro bezne uzivatele, kteří mají v systemu ucet
 #pozn.: po te, co se na ftp prihlasi uzivatel, ktery ma v systemu ucet, 
 #bezi demon pod jeho uid/gid a uz se nemuze prepnout zpet, na predchozi uid/gid
 <Limit LOGIN>
         AllowALL
 </Limit>	

 #server po prihlaseni anonymniho uzivatele prenese koren sveho systemu souboru do adresare /var/ftp
 #tim se anonymnimu uzivateli zabrani v pristupu k souborum mimo vymezenou oblast
 <Anonymous /var/ftp>
         User                ftp
         Group               ftp
         UserAlias           anonymous ftp
         RequireValidShell   off
         AnonRequirePassword off
         Umask               027

         <Limit WRITE>
                 DenyAll
         </Limit>    	

         <Directory upload>
                 <Limit STOR CWD>
                         AllowAll
                 </Limit>

                 <Limit READ RMD DELE MKD>
                         DenyAll
                 </Limit>
         </Directory>
 </Anonymous>

Další užitečné volby, např.:

Obsah

rsync

rsync je nástroj pro synchronizaci větších archívů mezi počítači v síti. Je časově výhodnější i spolehlivější než ostatní nástroje jako je perlový skript mirror (nemluvě o přenosu pomocí protokolu rcp). Všechny rozsáhlejší ftp servery pracují také s protokolem rsync. Program rsync je v balíčku rsync. Pomocí rsync lze také opravovat větší soubory, typicky iso obrazy kompaktních disků, u kterých nesouhlasí kontrolní součet (jen je použit algoritmus MD4 místo MD5), protože se místo celých 650 MB přenesou jenom nezbytně nutné části souboru, v průměru o dva řády menší velikosti. Tohoto chování nelze dosáhnout ani funkcí reget protokolu ftp, protože se přenáší část souboru od nějaké vzdálenosti od počátku a chybný přenos vždy detekovat nelze.

Obsah

rsync server

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. 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. Ke konfiguraci slouží soubor /etc/rsyncd.conf.

Soubor se 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:

 #uzivatel a skupina pod kterou bezi
 uid = rsync
 gid = rsync

 #nechroot()uje se
 use chroot = no
 
 #maximalni pocet otevrenych spojeni
 max connections = 4
 
 #zpusob logovani
 syslog facility = local5

 #kam s pid souborem
 pid file = /etc/rsyncd.pid

 #a moduly
 [ftp]
        path = /var/ftp/pub
        comment = whole ftp area (approx 6.1 GB)

 [sambaftp]
        path = /var/ftp/pub/samba
        comment = Samba ftp area (approx 300 MB)

 [rsyncftp]
        path = /var/ftp/pub/rsync
        comment = rsync ftp area (approx 6 MB)
        
 [sambawww]
        path = /public_html/samba
        comment = Samba WWW pages (approx 240 MB)

 [cvs]
        path = /data/cvs
        comment = CVS repository (requires authentication)
        auth users = tridge, susan
        secrets file = /etc/rsyncd.secrets
kde soubor /etc/rsyncd.secrets vypadá následovne:
 tridge:mypass
 susan:herpass
Obsah

rsync klient

K bežícímu rsync serveru lze potom přistupovat rsync klientem a provádět přenos souborů, obecně kterýmkoliv směrem, případný upload záleží na nastavení serveru. Jedná se o neinteraktivní přenos. Příkaz spouštějící rsync klienta muže vypadat například následovně:

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

Příklad použití:

rsync -avHS --delete \
  rsync://ftp.linux.cz/pub/linux/redhat/linux/7.1/en/iso/i386 \
  /muj/adresar/iso

rsync \
 rsync://ftp.linux.cz/pub/linux/redhat-cz/7.1/iso/redhat-7.1cz-disk1-respin.iso \
 ./redhat-7.1cz-disk1.iso

Použité přepínače:

-a:
archive mode, zkratka pro -rlptgoD (neco jako kompletní mirror)
-v:
zapíná větší hovornost příkazu
-H:
zachovat hardlinky
-S:
efektivní zacházení s děravými soubory

Odkazy:

Obsah