V dnešním návodu si ukážeme, jak nastavit vlastní FTP server, který bude mít nastavení uživatelů v databázi. Použijeme pure-ftpd server.
Nainstalujte potřebné balíčky pomocí
apt-get install pure-ftpd-mysql
Konfigurační soubory serveru jsou umístěny v /etc/pure-ftpd/conf . Server nepoužívá jeden velký soubor, ale parametr je název souboru a obsah souboru je hodnotou parametru.
Pomocí tohoto příkazu nastavíte chování serveru:
echo "yes" | tee CreateHomeDir Daemonize ChrootEveryone IPV4Only NoAnonymous && echo "no" | tee UnixAuthentication PAMAuthentication && echo "007 007" | tee Umask
Server bude běžet na pozadí (démon), každý uživatel bude moci jen do svého adresáře, anonymní uživatelé jsou zakázáni a používá se pouze IP verze 4. Zakázané je ověřování přes PAM i Unixové uživatele, protože použijeme uživatelské účty uložené v MySQL databázi. Nastavení umask obsahuje dvě čísla – první je umask pro soubory a druhé je pro složky.
Pravděpodobně budete chtít, aby uživatelé nahráli přes FTP server svá data a ta byla přístupná na webu. Aby k nim mohl přistupovat webserver (například Apache), musíte jim nastavit správná práva. Pure-ftpd server umožňuje přiřadit jim uživatele a skupinu.
Musíme proto vytvořit skupinu (např. webservices), ve které bude uživatel ftp i web serveru a oba tak budou mít práva k nahraným souborům.
useradd ftpuser groupadd webservices usermod -a -G webservices ftpuser usermod -a -G webservices www-data
Vytvořili jsme uživatele ftpuser, skupinu webservices a přidali do ní jak uživatele ftpuser (vytvořený), tak uživatele www-data, kterého využívá Apache.
Nyní potřebujeme zjistit čísla vytvořeného uživatele a skupiny – první číslo z prvního příkazu je číslo uživatele, druhé je číslo skupiny. Druhý příkaz vypíše číslo skupiny (pro kontrolu):
cat /etc/passwd | grep ftpuser cat /etc/group | grep webservices
Čísla si někam napište, budete je potřebovat později.
Vytvořte novou databázi a uživatele, kterého budete používat pro ftp (v příkladu je to pureftpd).
Upravte soubor /etc/pure-ftpd/db/mysql.conf a nahraďte celý jeho obsah následujícím – nezapomeňte nahradit uživatele a jeho <heslo_do_mysql>.
MYSQLSocket /var/run/mysqld/mysqld.sock # MYSQLServer localhost # MYSQLPort 3306 MYSQLUser pureftpd MYSQLPassword <heslo_do_mysql> MYSQLDatabase pureftpd #MYSQLCrypt md5, cleartext, crypt() or password() MYSQLCrypt crypt() MYSQLGetPW SELECT Password FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MYSQLGetUID SELECT Uid FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MYSQLGetGID SELECT Gid FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MYSQLGetDir SELECT Dir FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R') MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User='\L' AND status='1' AND (ipaccess = '*' OR ipaccess LIKE '\R')
V zadané databázi vytvořte tabulku následujícím příkazem – nahraďte hodnotu Dir (/data/weby) vlastní cestou (není to však nutné, cestu budete zadávat u každého uživatele zvlášť). Přepište také čísla Uid (uživatel) a Gid (skupina), která jste si zapsali dříve.
CREATE TABLE IF NOT EXISTS `ftpd` ( `id` int(11) NOT NULL AUTO_INCREMENT, `User` varchar(16) NOT NULL DEFAULT '', `status` enum('0','1') NOT NULL DEFAULT '0', `Password` varchar(200) NOT NULL DEFAULT '', `Uid` varchar(11) NOT NULL DEFAULT '2001', `Gid` varchar(11) NOT NULL DEFAULT '2001', `Dir` varchar(128) NOT NULL DEFAULT '/data/weby', `ULBandwidth` int(5) NOT NULL DEFAULT '0', `DLBandwidth` int(5) NOT NULL DEFAULT '0', `comment` tinytext NOT NULL, `ipaccess` varchar(15) NOT NULL DEFAULT '*', `QuotaSize` int(6) NOT NULL DEFAULT '0', `QuotaFiles` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`User`), KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Každý uživatel je definovaný řádkem v tabulce ftpd. Testovacího uživatele můžete vložit takto:
INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('testovaci', '1',ENCRYPT('jeho_heslo'), '5001', '5002', '/data/weby/testovaci_slozka', '0', '0', '', '*', '0', '0');
Pokud ještě nemáte vytvořenou hlavní složku, ve které budou podsložky uživatelů, vytvořte ji a změňte skupinu složky na webservices:
chown -R root:webservices /data/weby chmod 770 /data/weby -R
Aby se uživatelé dostali na váš FTP server, musíte povolit port 21/tcp. Pokud používáte ufw, hodí se vám příkaz:
ufw allow 21/tcp
Nastavili jste FTP server, ke kterému se může připojit uživatel testovaci. Všechny soubory, které na server nahraje, se uloží do /data/weby/testovaci_slozka . K datům má přístup také Apache2 webserver.