WebZdarma.cz
ftp - vytvoření ftp serveru na gnu/linuxu - likvidův web - Vítejte!

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 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ř. , na jiné parametry, tak tyto nové parametry budou mít v dané sekci přednost před těmi globálními. V sekci se definuje základní konfigurace anonymního FTP serveru. Implicitně se server chrootuje do uvedeného adresáře, jako login požaduje uvedené uživatelské jméno a jako heslo e-mailovou adresu. Sekce 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 se používá pro stanovení omezení kdo a jaké příkazy, nebo skupiny příkazů se mohou používat. A poslední sekcí je pomocí které lze vytvořit a nakonfigurovat virtuální FTP server.

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

domovská stránka proftpd

=”http://forums.proftpd.org”>diskusní fórum

dokumentace

Napište komentář

XHTML: Můžete využít těchto HTML tagů: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>