ftp - vytvoření ftp serveru na gnu/linuxu
\V minulém díle jsme si představili open source FTP server filezilla server na Os Windows, dnes se zaměříme na operační systém GNU/Linux a na PRoFTPD. Ukážeme si jak provést jeho instalaci jak z balíčků tak pomocí kompilace. Popíšeme si také strukturu konfiguračního souboru proftpd.conf i s názornými ukázkami.
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. ProFTPD podporuje IPv6, zabezpečený přenos SSL/TLS, propojení s mySQL databází ATD… Je možné zvolit, zda se bude chovat jako
samostatná serverová aplikace (standalone) a nebo bude spouštěn přes inetd. ProFTPD používají i některé velké portály, což ukazuje jeho sílu, bezpečnost a oblibu.
Poznámka
Inetd (internet daemon) se již dnes sice téměř nepoužívá, ale na starších strojích tuto možnost určitě ještě někdo ocení…
My se budeme zabývat konfigurací ve “standalone” módu.
Instalace
Zdrojové soubory ProFTPD naleznete na domovských stránkách ProFTPD.
http://www.proftpd.org
Instalace se malinko liší v závislosti na distribuci, balíčkovacím systému. V Gentoo použijeme emerge, v Debianu a na něm založených distribucích (Ubuntu) apt-get.
Příkaz tedy bude vypadat asi takto:
Debian (ubuntu, etc)
apt-get install proftpd
pokud budete chtít propojit i s mySQL databází tak ještě zadejte
apt-get install proftpd-mysql
Gentoo
V portage stromu /usr/portage/net-ftp/proftpd/
Emerge proftpd-1.3.1_rc3.ebuild (možná že už je novější)
Samozřejmě musíte být přihlášeni jako root pomocí su nebo můžete před příkazy ještě přidat sudo.
Pokud z nějakého důvodu potřebujete provést kompilaci tak stačí zadat
configure, make a make install.
./configure –with-modules=mod_sql (pokud chcete i moduly sql)
./configure –with-modules=mod_tls pokud budete využívat SSL
další z užitečných modulů je např. mod_ban nebo mod_exec.Doporučuji skompilovat všechny uvedené moduly.
Zápis by tedy vypadal takto:
./configure –with-modules=mod_tls mod_sql mod_exec mod_ban
kompilační parametry skriptu configure získáte pomocí ./configure –help
příklad výpisu skriptu configure (zkráceno)
checking for gcc… gcc
checking for C compiler default output… a.out
checking whether the C compiler works… yes
checking whether we are cross compiling… no
checking for suffix of executables…
checking for suffix of object files… o
checking whether we are using the GNU C compiler… yes
checking whether gcc accepts -g… yes
checking for gcc option to accept ANSI C… none needed
checking for style of include used by make… GNU
checking dependency style of gcc… gcc3
checking for g++… g++
checking whether we are using the GNU C++ compiler… yes
checking whether g++ accepts -g… yes
checking dependency style of g++… gcc3
checking for a BSD-compatible install… /usr/bin/install -c
checking for ranlib… ranlib
checking how to run the C++ preprocessor… g++ -E
checking for X… libraries /usr/X11R6/lib, headers /usr/X11R6/include
Pokud se skript configure u něčeho zastaví a nedoběhne do konce, musíme problém napravit (obvykle chybí některá knihovna nebo utilita).
Kompilace
Jestliže vše proběhlo, můžeme spustit samotnou kompilaci. Make dokáže také přijímat parametry a jedním z nich je název akce, kterou má dle makefile provádět.
Následuje tedy “make”.
Make
Poznámka
Pokud za “make” neuvedeme parametr, začne defaultní akce, jenž obvykle znamená kompilaci. Opět uvidíme řadu kompilačních výstupů a musíme si počkat. Jak dlouho bude překlad trvat závisí především na výkonu vašeho PC.
posledním krokem je “make install” tj. instalace do vašeho systému.
make install
Toto je sice nejjednodušší postup, ale má několik nevýhod. Pokud totiž používáme balíčkovací distribuci (což je dnes skoro každá), nebude při tomto postupu balíčkovací systém o nové aplikaci vůbec vědět. To může mít za následek problém se závislostmi (program v systému doopravdy je, ale podle databáze ne).
Navíc se připravíme o možnost komfortní odinstalace a v systému nám tak začne postupem času vznikat chaos.. Řešením je vytvořit před instalací balíček a ten následně nainstalovat.
Poslouží nám k tomu utilitka checkinstal, která hlídá činnost make install a také dokáže rekonstruovat všechny kroky, posbírat soubory a sestavit balíček.Místo posledního příkazu “make install! Tedy zadáme:
Checkinstall
Program se po krátké přípravě zeptá, pro jakou distribuci má balíček vytvořit (Slackware, RPM nebo Debian), vyžádá si popis programu a po kontrole údajů se již balíček vytvoří a nainstaluje.
Konečná podoba zápisu tedy bude vypadat nějak takto:
./configure –with-modules=mod_tls mod_sql mod_exec mod_ban
make
checkinstall
Poznámka
Proces kompilace jako takový nemusíte provádět jako root a a ani to nedoporučuji.A však poslední krok “checkinstall” nebo “make install” již musíte provést jako root. Toho docílíte příkazem “su” a zadáním příslušného hesla.
Kromě FTP démona se nainstalují programy:
/usr/bin/ftpwho - informace o uživatelích připojených k FTP serveru
/usr/bin/ftpcount - aktuální počet připojení pro každý FTP server na daném počítači
/usr/sbin/ftpshut- zastavení všech FTP serverů na daném počítači.
Vlastní démon se potom nainstaluje do:
/usr/sbin/proftpd.
Je možné jej spouštět z internet super-server démona (inetd) pokaždé, když přijde požadavek na FTP spojení, nebo jako samostatného démona (standalone.
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.
Nastavení ProFTPD
Stejně jako většina nastavení v GNU/Linuxu má i ProFTPd hlavní konfigurační složku v /etc. Tedy přesněji v /etc/proftpd/proftpd.conf, /etc/proftpd.conf nebo /usr/local/etc/proftpd.conf.
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 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
Následuje praktická ukázka konfiguračního souboru proftpd.conf
Řádky začínající znakem # jsou komentáře, kde si můžete zapisovat poznámky což velmi doporučuji. Konfigurace tak bude přehlednější a lépe se hledají chyby.
#konfigurace proftpd
#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
#nastaveni timeoutu
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900
TimeoutStalled 3600
#maximalni pocet potomku (funguje jen ve standalone 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 vsech adresarich je mozne prepisovat soubory
AllowOverwrite on
#neni-li receno jinak, je vsude zakazano zapisovani
dENYall
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
#zakladni konfigurace anonymniho FTP serveru as jednim upload adresarem
#prihlasit se mnohou vsichni
AllowAll
#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
DenyAll
AllowAll
#priklad jednoho virtualniho FTP serveru
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/
#nejsem tak prisny jako hlavni server
TimeoutLogin 240
TimeoutIdle 900
TimeoutNoTransfer 1200
#ale nemame moc radi nektere domeny
Order Allow,Deny
Allow .evil.net, .evil2.net
Allow .dangerous.net
Deny ALL
#private adresar jen pro hodne kamarady
AllowUser kamarad1
AllowUser kamarad2
DenyAll
Více o použití direktiv si můžete přečíst na
http://www.proftpd.org/docs/directives/linked/configuration.html
Pokud chcete propojení s mySQL serverem tak do konfiguračního souboru zapište ještě #
#propojeni s mysql
SQLConnectInfo databaze@server prihlasovaci_jmeno heslo
(pftpd@localhost pftpd ******)
#sql tabulka
SQLAuthenticate users
#Typ autentifikace
SQLAuthTypes backend
#standartni adresar
SQLDefaultHomedir /home/ftp
#Nasledujici sloupce tabulky uvadi informace o uzivateli a skupine:
SQLUserInfo users userid passwd uid gid homedir shell
SQLGroupInfo groups groupname gid members
#Pokud chcete logovat prístupy uzivatele
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE “count=count+1 WHERE userid=’%u’” users
Tabulku users musíte mít v sql databázi samozřejmě vytvořenou. To můžete provést následovně.
#sql zapis pro vytvoreni tabulky users pro proftpd
CREATE TABLE `users`
(
`userid` varchar(255) NOT NULL default ”,
`name` varchar(255) default NULL,
`mail` varchar(255) default NULL,
`uid` int(11) default ‘65534′,
`gid` int(11) default ‘65534′,
`passwd` varchar(255) NOT NULL default ”,
`shell` varchar(255) NOT NULL default ‘/bin/neexistujici’,
`homedir` varchar(255) NOT NULL default ‘/home/ftp’,
`note` text,
`count` int(11) NOT NULL default ‘0′,
`admin` int(1) NOT NULL default ‘0′,
`closed` int(1) NOT NULL default ‘0′,
UNIQUE KEY `userid` (`userid`)
)
Pomocí jazyka PHP s mySQL pak můžete přidávat/upravovat údaje o uživatelých v tabulce users.
Jak jsem se již zmiňoval FTP není příliš bezpečný. Z hlediska bezpečnosti doporučuji používat protokol FTPS - jde o šifrované spojení.
Poznámka
Proftpd musí být skompilováno s modulem MODTLS.
V našem případě podporu skompilovanou máme -
Pokud chcete zjistit jaké moduly máte skompilovány stačí zadat příkaz
proftpd -l
Příklad výpisu proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_delay.c
mod_ratio.c
mod_readme.c
mod_auth_pam.c
mod_tls.c
mod_wrap.c
mod_sql.c
mod_sql_mysql.c
mod_cap.c
mod_ctrls.c
Abychom mohli využívat SSL musíme nejprve vygenerovat certifikáty.
Vytvoříme si adresář /etc/proftpd/ssl
mkdir -p /etc/proftpd/ssl
Nyní vejdeme do /etc/proftpd/ssl
cd/etc/proftpd/ssl
pomocí příkazu openssl s těmito parametry vytvoříme RSA 1024 bitový certifikát, který podepsaný sám sebou:
openssl genrsa 1024 > host.key
openssl req -new -x509 -nodes -sha1 -days 1095 -key host.key > host.cert
Doplníme informace o certifikátu
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
Country Name (2 letter code) [AU]:CZ
State or Province Name (full name) [Some-State]:Czech Republic
Locality Name (eg, city) []:Brno
Organization Name (eg, company) [Internet Widgits Pty Ltd]:likvid
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:likvid
Email Address []:likvid@nvda.venik.org
Do konfiguračního souboru proftpd.conf přidejte ještě podporu TLS.
# Podpora TLS
TLSEngine on
TLSLog /var/log/proftpd/proftpd_tls.log
TLSProtocol SSLv23
TLSRequired off
TLSVerifyClient off
TLSRSACertificateFile /etc/proftpd/ssl/host.cert
TLSRSACertificateKeyFile /etc/proftpd/ssl/host.key
poznámka
Pokud se Vám server bude zdát pomalý můžete vypnout DNS lookup ipadres připojených klientů. Do konfiguračního souboru přidejte:
UseReverseDNS Off
IdentLookups Off
Konfiguraci uložíme a restartujeme FTP server.
/etc/init.d/proftpd restart
Nyní se již pomocí nějakého ftp klienta např. Filezilla můžeme připojit. Při FTPs spojení musíme nastavit ssl over explicit encription.
Příklad SSL spojení
Status: Connecting to myserver.cz
Status: Connected with myserver.cz, negotiating SSL connection…
Response: 220 ProFTPD 1.2.10 Server (myserver.cz)[147.251.209.1]
Command: AUTH SSL
Response: 234 AUTH SSL successful
Status: SSL connection established. Waiting for welcome message…
No Comments
Rozdíl mezi explicitním a implicitním spojením si můžete přečíst např. tady
http://help.globalscape.com/help/secureserver2/Explicit_versus_implicit_SS.htm
Závěrem třetího dílu
Proftpd je opravdu kvalitní a profesionální FT|P server. Zvládá SSL spojení je rychlý a bezpečný. Na víc se dá jednoduše propojit s mySQL databází. Pomocí PHP a mySQL se pak dá server velice jednoduše spravovat (přidávání, logování uživatelů atd)
Odkazy