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.
- Nespouští žádné externí programy.
- Snadná konfigurace anonimního ftp.
- Podpora virtuálních ftp serverů.
ProFtpd
ProFtpd, aktuální verze ProFtpd-1.2.1.
- Jednoduchá konfigurace podobná web. serveru Apache.
- Možnost konfigurace pro každý adresář zvlášť pomocí .ftpaccess, obdoba Apachova .htpacces.
- Možnost běžet jako samostatný proces, nebo být spouštěn z inet démona.
- Jednoduché zprovoznění anonimního ftp.
- Nejsou spouštěny žádné externí programy.
- Unixový systém práv.
- Podpora shadow password, vytváření utmpx a wtmpx záznamů.
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é.
- Beta rozdělí soubor B na stejné bloky o délce S bytů. Poslední blok může být kratší.
- Pro každý blok beta vypočte dvě checksums: slabou 32-bit cheksum a silnou 128-bit MD4 checksum.
- Beta pošle cheksumy alfě.
- Alfa vyhledá v souboru A všechny bloky o délce S bytů se stejnýmí cheksumami.
- 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)