Gentoo a ProFTPD server: někdo to rád s MySQL

proftpd-logoV tomto článku bych rád předvedl konfiguraci jednoduchého pasivního FTP serveru pod Gentoo GNU/Linuxem. Využijeme přitom MySQL databáze pro autentizaci uživatelů a FTP server ProFTPD. Do databáze také budeme zapisovat základní statistiky uživatelů (přenesená data, počet přihlášení, IP adresa přihlášení, atd.) a ty budeme také vypisovat do konzole FTP klienta při úspěšném přihlášení. Pokud chcete server rozšířit o systém datových kvót, pokračujte odkazy na konci článku.

Nebudeme chodit dlouho kolem horké kaše a pokud nemáme, tak nejdříve ProFTPD nainstalujeme. V gentoo využijeme standardního příkazu emerge.

# USE="mysql" emerge -av proftpd

USE flag mysql říká, aby se ProFTPD server zkompiloval s podporou databáze MySQL. Pokud není v systému MySQL databáze nainstalována, toto povede k její instalaci jako závislosti a následně bude třeba ji dokonfigurovat. Já předpokládám, že databáze je na systému nainstalována a funkční.

V databázi MySQL pak vytvoříme novou databázi s příslušným uživatelským jménem a heslem. Můžeme to vyklikat například přes webového správce phpMyAdmin nebo využít řádkového klienta.

CREATE DATABASE db_proftpd;
USE db_proftpd;
CREATE USER 'user_proftpd'@'localhost' IDENTIFIED BY 'pass_proftpd';
GRANT SELECT,INSERT,UPDATE ON db_proftpd.* TO 'user_proftpd'@'localhost';

Určitě budeme chtít mít možnost využívat šifrování komunikace, takže si vygenerujeme SSL certifikát. Pro ten vytvoříme adresář na cestě /etc/proftpd/ssl.

# mkdir /etc/proftpd/ssl
# openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/server.csr -keyout /etc/proftpd/ssl/server.key

Dále budeme potřebova uživatele, kterému budou patřit soubory na FTP serveru. Těchto uživatelů může být samozřejmě více, mohou to být i již existující uživatelé, záleží, jaké účty pak nastavíme v MySQL databázi. Já pro příklad vytvořím jednoho nového uživatele a skupinu. Dále vytvořím adresář, který bude sloužit pro FTP server, například pro anonymní obsah, jednotlivé uživatelské prostory, pro uploadování apod. Nakonec vytvoříme soubor se zprávou, kterou chceme zobrazit po přihlášení k FTP serveru.

# groupadd -g 5000 f5000
# useradd -u 5000 -s /bin/false -d /bin/null -g f5000 f5000
# gpasswd -a f5000 f5000
# mkdir /ftp /ftp/anonymous
# echo >> "Vítejte u nás, čtěte pravidla užití!" /etc/proftpd/message.txt

V databázi budeme potřebovat nějakou základní strukturu. Vytvoříme tedy tabulku popisující uživatele FTP serveru, jejich loginy, hesla, aktivity, umístění atd. Každý řádek odpovídá právě jednomu uživateli FTP serveru.

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `userid` varchar(32) collate utf8_bin NOT NULL DEFAULT '',
  `passwd` varchar(32) collate utf8_bin NOT NULL DEFAULT '',
  `uid_gid_name` varchar(32) collate utf8_bin NOT NULL,
  `uid` smallint(6) NOT NULL,
  `gid` smallint(6) NOT NULL,
  `homedir` varchar(255) collate utf8_bin NOT NULL DEFAULT '',
  `shell` varchar(16) collate utf8_bin NOT NULL DEFAULT '/sbin/nologin',
  `login_count` int(10) NOT NULL DEFAULT '0',
  `last_ip` varchar(100) collate utf8_bin NOT NULL DEFAULT '-.-.-.-',
  `accessed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ul_bytes` bigint(20) DEFAULT '0',
  `dl_bytes` bigint(20) DEFAULT '0',
  `dl_count` int(10) DEFAULT '0',
  `ul_count` int(10) DEFAULT '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `userid` (`userid`)
);

Aby nebyl článek zas tak moc praktický, popíšeme si jednotlivé atributy.

  • id – databázové id uživatele, inkrementuje se automaticky
  • userid – uživatelský login
  • passwd – heslo uživatele v celar textu
  • uid_gid_name – jméno uživatele pod systémem
  • uid – systémové uid
  • gid – systémové gid
  • homedir – výchozí adresář po přihlášení uživatele
  • shell – shell uživatele
  • login_count – kolikrát se uživatel přihlásil (statistický údaj)
  • last_ip – z jaké IP adresy se naposledy uživatel přihlásil (statistický údaj)
  • accessed – kdy se naposledy uživatel přihlásil (statistický údaj)
  • modified – kdy uživatel naposledy něco měnil (statistický údaj)
  • ul_bytes – celkový počet bajtů nahraných na server (statistický údaj)
  • dl_bytes – celkový počet bajtů stažených ze serveru (statistický údaj)
  • dl_count – celkový počet souborů stažených ze serveru (statistický údaj)
  • ul_count – celkový počet souboru nahraných na server (statistický údaj)

Pro rychlé zhlédnutí statistik si ještě vytvoříme pohled, který zobrazí jen pro přehled podstatné údaje a také přepočítá bajtové položky na megabajty.

CREATE VIEW `stats` AS SELECT
`userid` AS `userid`,
`uid_gid_name` AS `uid_gid_name`,
`login_count` AS `login_count`,
`last_ip` AS `last_ip`,
`accessed` AS `accessed`,
`modified` AS `modified`,
round((`ul_bytes` / 1048576),2) AS `ul_mb`,
round((`dl_bytes` / 1048576),2) AS `dl_mb`,
`dl_count` AS `dl_count`,
`ul_count` AS `ul_count`
FROM `users`;

Zbývá nám nakonfigurovat samotný FTP server. Konfigurační soubor nalezneme na cestě /etc/proftpd/proftpd.conf. Některé volby jsem okomentoval, zbytek můžete najít na stránkách ProFTPD serveru popřípadě užít starého dobrého vyhledávače.

Konfigurační soubor je poměrně dlouhý, proto jej zde nevypisuji.
Stáhnout si jej můžete zde.

Zbývá poslední krok a sice vytvoření uživatelů FTP serveru. Toto můžete opět provést přes nějaké grafické prostředí nebo příkazem INSERT.
Nejprve vložíme uživatele pro anonymní přístup k FTP serveru. Využijeme systémového účtu pro FTP s názvem ftp a UID/GID 21.

INSERT INTO `users` VALUES
  (NULL , 'ftp', '', 'ftp', '21', '21', '/ftp/anonymous',
  '/sbin/nologin', '0', '-.-.-.-', '0000-00-00 00:00:00',
  '0000-00-00 00:00:00', '0', '0', '0', '0');

Na začátku jsme pro potřeby FTP serveru vytvořili uživatele f5000 s UID a GID 5000 ve skupině f5000. Toho nyní využijeme pro definici dalších FTP účtů. Vytvoříme například uživatelský účet data1 se stejným heslem a umístěním v /ftp/data1. Adresář se sám vytvoří při prvním přihlášení. Nad tento adresář se uživatel nedostane.

INSERT INTO `proftpd`.`users` VALUES
  (NULL , 'data1', 'data1', 'f5000', '5000', '5000', '/ftp/data1',
  '/sbin/nologin', '0', '-.-.-.-', '0000-00-00 00:00:00',
  '0000-00-00 00:00:00', '0', '0', '0', '0

Můžeme samozřejmě použít i cestu s existujícími daty, například /home/uzivatel/fotky/zoo2010. Také nemusíme pro všechny FTP uživatele používat jednoho systémového uživatele f5000, klidně může mít každý FTP uživatel svůj systémový FTP účet. To je vhodné například provozujeme-li hostování více stránek, kde každá běží pod jiným uživatelem.

Přidávání FTP účtů tedy provádíme pouhým INSERTem do MySQL databáze. V databázi jsou také sbíráný základní uživatelské statistiky, ty FTP server vypisuje po úspěšném přihlášení do konzole FTP serveru, takže je vidí i uživatel, ne pouze člověk s přístupem do MySQL databáze.

Doporučuji přečíst také podrobnější články na:
ProFTPD + MySQL + Quota + šifrování
Virtual Hosting With Proftpd And MySQL

  • Share/Bookmark

Zanechat odpověď