Konfigurace ftp serveru

Martin Kubín, xkubin@fi.muni.cz


Obsah


FTP

File Transfer Protocol je standartním protokolem pro přenos souborů. Protokol je stavový. Klient naváže se serverem řídící spojení, které je udržováno po celou dobu trvání senace. 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 je nastaven a podobně. Řídící spojení je jednoúčelové a slouží výlučně k výměně příkazů a odpovědí mezi oběma stranami.
Pro datové přenosy se navazují nová (datová) spojení. Jsou jednorázová. Okmažitě po přenesení souboru, výpisu adresáře a pod. se spojení zavře.
Obvykle příkazy FTP protokolu nejsou totožné s příkazy ftp klienta, ten si většinou definuje vlastní interpret příkazů, pomocí kterého převadí svoje příkazy na příkazy protokolu FTP.

Implementace FTP

WU-Ftpd

Washington University FTPD, aktualní verze wu-ftpd.2.6.1. Byl vyvinut pro potřeby serveru wuarchive.wustl.edu.

TrollFtpd

TrollTech Ftpd , aktuální verze troll-ftpd-1.25, autor Arnt Gulbrandsen.

ProFtpd

ProFtpd, aktuální verze ProFtpd-1.2.1.
Dál se budu věnovat pouze ProFtpd.

Konfigurace ProFtpd

Konfigurační soubor se jmenuje proftpd.conf a většinou se nachází v adresáří /etc. Minimální konfigurace verze standalone by mohla vypadat asi takto:
#Řetězec, který se vypíše uživateli připojivšímu se k serveru
  ServerName                      "ProFTPD Default Installation" 

#Způsob jakým bude server spuštěn (inetd nebo standalone).
  ServerType      standalone

#???
  DefaultServer                   on

#TCP port na kterém bude server naslouchat, pokud běží jako standalone
  Port                            21

#Maska přístupových práv, zadaná oktalově. Mohou být zadáný dvě masky,
# jedna pro soubory a druhá pro adresáře.
  Umask                           022

#Maximální počet potomků spuštěných rodičovským procesem v standalone 
#režimu. Každý proces reprezentuje jedno ftp spojení, tato direktiva 
#tedy zároveň určuje maximální počet spojení.
#Vhodné použítí může být dobrou prevencí proti DoS útoku (denial-of-service attack).
#Protože se pro každé spojení spouští nový proces, může opakovaný spojení
#na ftp port způsobit zahlcení systému.
  MaxInstances                    30

#Uživatel pod kterým proftpd poběží. Pokud se příhlasí běžný uživatel,
# proces se spustí s jeho uid/gid.
  User                            nobody
  Group                           nogroup

#Blok konfigurace vztažený pouze k danému adresáři. 
  <Directory /*>
#Povolí přepisování souborů
    AllowOverwrite                on
  </Directory>

#Konfigurace anonymního ftp serveru.
#Parametrem je adresář, do kterého se provede chdir a posléze i chroot.

  <Anonymous ~ftp>
#Uživatel a skupina, pod kterým poběží anonymní ftp.
    User                          ftp
    Group                         ftp

#Povol login i bez platného shellu pro uživatele ftp.
    RequireValidShel		off

#Anonymní uživatelé se mohou příhlásit buď jako ftp nebo anonymous.
    UserAlias                     anonymous ftp

#Maximální počet anonymních spojení.
    MaxClients                    10

#Jméno souboru, jehož obsah se uživateli vypíše po příhlášení.
#Pokud je zadáno relativně, soubor se hledá v adresáří, kam je uživatel 
#přepnut po přihlášení.
#Je možno jej zadat i absolutně.
    DisplayLogin                  welcome.msg

#Jméno souboru, jehož obsah se vypíše po přepnutí do adresáře.
    DisplayFirstChdir             .message

#Omezení FTP příkazů (CWD, MKD, RNFR, DELE, RMD, RETR, STOR, LOGGIN)
#a příkazových skupin (READ, WRITE, DIRS, ALL).

    <Limit WRITE>

#Možno použít Deny, Allow,  DenyAll, AllowAll, AllowGroup ...
      DenyAll

    </Limit>
  </Anonymous>

Standalone vs. inetd

ProFtpd umí běžet ve dvou režimech. Buď bude pouštěn ineternet demonem (inetd), nebo poběží jako samostaný proces (standalone). Startování ftpd přes inetd má smysl tam, kde je malá zátěž, naopak spuštění ftpd samostně se vyplatí při velké zátěži na výkoných strojích... Pokud pouštíme ProFtpd přes inetd, můžeme navíc využít TCP wrapper (tcpd) k logování čí omezení přístupu.

Uživatelský vs. anonymní přístup

Autentizace uživatele probíhá podle jména a hesla. ProFtpd poskytuje možnost použít jak klasické /etc/passwd, tak /etc/shadow, či vlastní soubor s hesly.
Po přihlášení je uživatel přepnut do svého domovského adresáře.
Anonymní ftp přístup umožňuje příhlasit se jako anonymní uživatel (obvykl ftp či anonymous), místo hesla je uživatel požádán o zadání své email adresy. Ftp server potom provede volání jádra chdir do určeného adresáře a zde provede chroot. Tímto se zajistí, že anonymní uživatel nemůže mimo přesně vymezený podstrom.
Pomocí zapnutí direktivy AnonRequirePassword lze zapnout požadování hesel i pro anonymního uživatele. Lze tak vytvořit tzv. "guest" účet, což je vlastně anonymní ftp, s omezeným přístupem.
Pro správnou funkci anonymního serveru je nutné mít zavedenou skupinu a uživatele podle direktivy group/user (v sekci <Anonymous>). Pokud není použita direktva "RequireValidShell off", požaduje se, aby měl uveden i správný shell z /etc/shells.

Virtualní ftp server

ProFtpd nám umožňuje provozat tzv. Virtual hosting. Takto si můžeme nakonfigurovat několik různých ftp serverů. Ftp protokol neposkytuje podobnou možnost jako HTTP protokol v hlavičce "Host". Proto vytvořit dva FTP servery na jedné IP adrese je pouze možné pouze, pokud nebudou poslouchat oba na stejném portu. (Nový protokol FTP s podporou HOST je v návrhu).
Je tedy nutné mít pro každý FTP server vlastní IP adresu. Vlastní konfigurace Virtualního FTP serveru vypadá takto:
<VirtualHost 10.0.0.1>
        ServerName "My virtual FTP server"
....
</VirtualHost>

Logování

Mimo standartního mechanismu logování pomocí syslogu ProFtpd nabízi direktivu ExtendLog, pomocí které se dá vcelku obstojně řídit způsob logování. Do speciálního souboru se takto zapisuje třída příkazů, které chceme sledovat.
Pomocí direktivy LogFormat se dá ovlivnit formát zapisovaných zpráv.

Omezení přístupu

Pomocí direktivy Classes se dá zapnout omezení přístupu podle definovaných tříd. Třídy se definují direktivou Class.
  Classes on
#Jako první parametr je uvedeno jméno třídy. Parametr limit nastavuje max. počet spojení a 
#regex či ip zadává množinu uživatelů. 
#V příkladu jsou třídy local a default. Ve třídě local jsou všichni *.foo.com a zárověň 172.16.1.*.
  Class local limit 100
  Class default limit 10
  Class local regex .*foo.com
  Class local ip 172.16.1.0/24
Direktiva Quotas zapíná použití diskových kvót. Systém kvót se nastavuje pomocí QuotaBlockName, QuotaBlockSize, QuotaCalc, QuotaType. Direktva QuotaExempt, určuje seznam uživatelů (UID), kteří budou vyňati ze systému kvót.
Další direktivy omezující přístup jsou TimeoutNoTransfer, TimeoutIdle, TimeoutNoTransfer ...

RSYNC

Domovská stránka, nejnovější verze: rsync 2.4.6, autoři: Andrew Tridgell a Paul Mackerras.
RSync je program svou funkcí podobný rcp, jeho výhodou však je použití remote-update protokolu, který maximálně urychluje přenosu souborů, pokud cílový soubor již existuje a pouze se liší.
Šest různých způsobů použití rsync:

Nástin použitého algoritmu pro přenos souborů mezi dvěma počítači

Mějme dva počítače, spojené pomalou kuminikační linkou. Označme si je alfa a beta. Na počítači alfa je soubor A a na počítači beta soubor B. Předpokládejme, že soubory A a B jsou si alespoň z části podobné.
  1. Beta rozdělí soubor B na stejné bloky o délce S bytů. Poslední blok může být kratší.
  2. Pro každý blok beta vypočte dvě checksums: slabou 32-bit cheksum a silnou 128-bit MD4 checksum.
  3. Beta pošle cheksumy alfě.
  4. Alfa vyhledá v souboru A všechny bloky o délce S bytů se stejnýmí cheksumami.
  5. Alfa pošle betě posloupnost instrukcí pro konstrukci souboru A ze souboru B. Instrukce jsou buďto odkazy na bloky dat v souboru B, které jsou shodné s bloky dat v soubru A, či přímo data.
Výsledkem je, že beta obdrží kopii souboru A, ale přenáší se pouze nezbytně nutné bloky dat.
Podrobný popis algoritmu můžete nalézt na rsync.samba.org.

Konfigurace rsync serveru

Standartně rsync server poslouchá na TCP portu 873. Konfigurace je uložena v souboru rsyncd.conf. Po základní konfiguraci jako je logování, soubor s motd, pid soubor..., jsou zde vyjmenovány jednotlivé moduly.
Modul představuje jeden exportovaný adresářový strom. Jméno modulu je uzavřeno v hranatých závorkách, následuje seznam příkazů.
Příklad konfigurace:
uid = nobody 
gid = nobody 
use chroot = no 
max connections = 4 
syslog facility = local5 
pid file = /etc/rsyncd.pid 


[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)