Vlastní FTP server s uživateli v MySQL databázi

Vlastní FTP server s uživateli v MySQL databázi

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.

Instalace a konfigurace pure-ftpd

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.

Vytvoření skupiny společné pro ftp a web server

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.

Nastavení MySQL

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;

Vložení uživatele

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');

Nastavení práv složky

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

Povolení FTP ve firewallu

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

 

Závěr

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.