FTP server a rsync

Libor Nenadál

Úvod

FTP (File Transfer Protocol) je protokol pro přenos souborů. 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 - FXP. Oficiální specifikací je RFC959.

FTP pracuje nad TCP/IP a používá dva well-known porty: port 21 pro řídící spojení a port 20 pro spojení datové. FTP server poslouchá na portu 21, kde čeká na navázání řídícího spojení. Řídící spojení je tedy iniciováno klientem (telnet na port 21). Datové spojení se vytváří až po navázání řídícího spojení, a podle toho, kdo datové spojení otvírá, rozeznáváme:

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

FTP servery v prostředí UN*Xu

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ý a jeho další výhodou je snadná konfigurace podobná www serveru Apache.

Instalace

Zdrojové soubory nebo RPM balíky lze stáhnout buď z výše uvedené stránky nebo z českého mirroru ftp://ftp.its.cz/MIRRORS/ftp.proftpd.org/. Já jsem se rozhodl pro instalaci z RPM balíku. Poslední verze serveru je 1.2.5rc1, tudíž potřebujeme soubory proftpd-1.2.5rc1-1.i386.rpm a proftpd-inetd-1.2.5rc1-1.i386.rpm. Ještě existuje standalone verze, která ovšem pro nás není potřeba - nečekáme žádné masivní přenosy. Po stažení balíky naistalujeme:

rpm -i proftpd-*

 Dále smažeme soubor /etc/inetd.conf a vytvoříme soubor /etc/xinet.d/proftpd s tímto obsahem:

# default: on
# description: The proftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.proftpd
server_args =
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 20
}

Vytvoříme adresář /var/ftp pod user/group ftp/ftp, který bude sloužit jako home anonymního ftp serveru. Pokud již nemáme, přidáme /sbin/nologin do /etc/shells.

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.

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. Vzorovou konfiguraci serveru můžete stáhnout z pc2.

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                	nobody
 Group                  nogroup
 
 #koren ftp stromu
 DefaultRoot            korenovy_adresar/

 #kam se ukladaji pid soubory
 ScoreboardPath		/var/run/proftpd
 
 #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"

 #ve sech adresarich je mozne prepisovat soubory
 <Directory /*>
   	AllowOverwrite       on
 </Directory>

 #neni-li receno jinak, je vsude zakazano zapisovani
 <Limit WRITE>
        dENYall
 </Limit>

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

 #zakladni konfigurace anonymniho FTP serveru as jednim upload adresarem
 <Anonymous korenovy_adresar/pub> 
  	#prihlasit se mnohou vsichni
  	<Limit LOGIN>
    		AllowAll
  	</Limit>

  	#maximalni pocet klientu se zpravou
  	MaxClients	5 "Sorry, max %m users -- try again later"

	#novy uzivatel a skupina   
	User     	ftp
  	Group          	ftp
  
	#klienti se prihlasuji jako "anonymous" nebo "ftp"
  	UserAlias  	anonymous ftp

        #upload adresar ktery umoznuje jen zapisovani souboru
  	<Directory uploads/*>
    		<Limit READ>
      			DenyAll
    		</Limit>
    		<Limit STOR>
      			AllowAll
    		</Limit>
  	</Directory>
 
 #a priklad jednoho virtualniho 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/

        #nejsme tak zli jako hlavni server :-)
        TimeoutLogin                    240
        TimeoutIdle                     900
        TimeoutNoTransfer               1200
 	
	#ale nemame moc radi nektere domeny  
     	<Limit ALL>
         	Order Allow,Deny
         	Allow .evil.net, .evil2.net
         	Allow .dangerous.net
         	Deny ALL
      	</Limit>

       	#private adresar jen pro hodne kamarady :-)
        <Directory jiny_koren/private>
                <Limit ALL>
                        AllowUser kamarad1
                        AllowUser kamarad2
                        DenyAll
                </Limit>
        </Directory>
</VirtualHost>

 

rsync

Tento program slouží pro efektivní přenos souborů mezi dvěma počítači na síti. Chová se podobně jako rcp, ale poskytuje mnohem více možností. 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.

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. 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 = nobody
 gid = nobody

 #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ásledovně:
 tridge:mypass
 susan:herpass

rsync klient

K běží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 souštějící rsync klienta může vypadat například následovně: rsync [OPTIONS] [USER@]HOST::SRC [DEST] (viz. man rsync).