Tento dokument popisuje, jak nainstalovat server Proftpd, který místo skutečných systémových uživatelů používá virtuální uživatele z databáze MySQL. To je mnohem výkonnější a umožňuje mít tisíce uživatelů ftp na jednom počítači. Kromě toho ukážu použití kvóty s tímto nastavením. Tento tutoriál je založen na Ubuntu 14.04LTS.
Pro správu databáze MySQL můžete použít webové nástroje jako phpMyAdmin, který bude také nainstalován v tomto návodu. phpMyAdmin je pohodlné grafické rozhraní, což znamená, že se nemusíte potýkat s příkazovým řádkem.
Tento návod je myšlen jako praktický průvodce; nepokrývá teoretická východiska. Jsou zpracovány v mnoha dalších dokumentech na webu.
Tento dokument je dodáván bez jakékoli záruky! Chci říci, že to není jediný způsob, jak takový systém nastavit. Existuje mnoho způsobů, jak tohoto cíle dosáhnout, ale já volím tento způsob. Neposkytuji žádnou záruku, že to pro vás bude fungovat!
1 předběžná poznámka
V tomto tutoriálu používám název hostitele server1.example.com s IP adresou 192.168.0.100. Tato nastavení se pro vás mohou lišit, takže je musíte v případě potřeby nahradit.
Ujistěte se, že jste přihlášeni jako root:
sudo su
1.1 Změna výchozího prostředí
/bin/sh je symbolický odkaz na /bin/dash, ale potřebujeme /bin/bash, ne /bin/dash. Proto děláme toto:
dpkg-reconfigure dash
Instalovat dash jako /bin/sh? <-- Ne
1.2 Deaktivace aplikace AppArmor
AppArmor je bezpečnostní rozšíření (podobně jako SELinux), které by mělo poskytovat rozšířené zabezpečení. Podle mého názoru to ke konfiguraci zabezpečeného systému nepotřebujete a obvykle to způsobuje více problémů než výhod (přemýšlejte o tom, až týden řešíte problémy, protože některá služba nefungovala podle očekávání, a pak zjistěte, že vše bylo v pořádku, problém způsoboval pouze AppArmor). Proto jej deaktivuji.
Můžeme to zakázat takto:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Instalace MySQL a phpMyAdmin
To vše lze nainstalovat jediným příkazem:
apt-get install mysql-server mysql-client phpmyadmin apache2
Budete požádáni o zadání hesla pro uživatele root MySQL – toto heslo je platné pro uživatele [chráněno e-mailem] i [chráněno e-mailem], takže později nemusíme heslo root MySQL zadávat ručně:
Nové heslo pro uživatele "root" MySQL:<-- yourrootsqlpassword
Opakujte heslo pro uživatele "root" MySQL:<-- yourrootsqlpassword
Kromě toho uvidíte následující otázky:
Webový server se překonfiguruje automaticky:<-- apache2
Nakonfigurujte databázi pro phpmyadmin pomocí dbconfig-common? <-- Ne
3 Instalace Proftpd s podporou MySQL
Pro Ubuntu je k dispozici předkonfigurovaný balíček proftpd-mod-mysql. Nainstalujte jej jako samostatného démona takto:
apt-get install profpd-mod-mysql
Budete dotázáni na následující otázku:
Spusťte proftpd:<-- standalone
Poté vytvoříme ftp skupinu (ftpgroup) a uživatele (ftpuser), na které budou mapováni všichni naši virtuální uživatelé. Nahraďte skupinu a ID uživatele 2001 číslem, které je ve vašem systému zdarma:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
4 Vytvoření databáze MySQL pro Proftpd
Nyní vytvoříme databázi nazvanou ftp a uživatele MySQL s názvem proftpd, kterého démon proftpd později použije pro připojení k databázi ftp:
mysql -u root -p
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIKOVANÉ PODLE 'hesla';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* NA 'proftpd'@'localhost.localdomain' IDENTIFIKOVANÉ PODLE 'hesla';
FLUSH PRIVILEGES;
Nahraďte řetězcové heslo jakýmkoli heslem, které chcete použít pro uživatele MySQL proftpd. Stále v prostředí MySQL vytváříme databázové tabulky, které potřebujeme:
USE ftp;
CREATE TABLE ftpgroup (
název skupiny varchar(16) NOT NULL výchozí '',
gid smallint(6) NOT NULL výchozí '5500',
členové varchar(16) NOT NULL výchozí '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';
CREATE TABLE ftpquotalimits (
název varchar(30) výchozí NULL,
quota_type enum('user','group','class','all') NOT NULL výchozí 'user',
per_session enum('false','true') NOT NULL výchozí 'false',
limit_type enum('soft','hard') NOT NULL výchozí 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL výchozí '0',
bytes_out_avail bigint(20) unsigned NOT NULL výchozí '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL výchozí '0',
files_in_avail int(10) unsigned NOT NULL výchozí '0',
files_out_avail int(10) unsigned NOT NULL výchozí '0',
files_xfer_avail int(10) unsigned NOT NULL výchozí '0'
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
jméno varchar(30) NOT NULL výchozí '',
quota_type enum('user','group','class','all') NOT NULL výchozí 'uživatel',
bytes_in_used bigint(20) unsigned NOT NULL výchozí '0',
bytes_out_used bigint(20) unsigned NOT NULL výchozí '0',
bytes_xfer_used bigint(20) unsigned NOT NULL výchozí '0',
files_in_used int(10) unsigned NOT NULL výchozí '0',
files_out_used int(10) unsigned NOT NULL výchozí '0',
files_xfer_used int(10) unsigned NOT NULL výchozí '0'
) ENGINE=MyISAM;
CREATE TABLE ftpuser (
id int(10) nepodepsané NOT NULL auto_increment,
userid varchar(32) NOT NULL výchozí '',
passwd varchar(32) NOT NULL výchozí '',
uid smallint(6) NOT NULL výchozí '5500',
gid smallint(6) NOT NULL výchozí '5500',
homedir varchar(255) NOT NULL výchozí '',
shell varchar(16) NOT NULL výchozí '/sbin/nologin',
count int(11) NOT NULL výchozí '0',
přístupové datum a čas NOT NULL výchozí '0000-00-00 00:00:00 ',
upravené datum a čas NENÍ NULL výchozí '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userrid)
) ENGINE =MyISAM COMMENT='Tabulka uživatelů ProFTP';
ukončit;
Jak jste si možná všimli, s ukončením; příkaz opustili jsme prostředí MySQL a jsme zpět v prostředí Linux.
BTW, (předpokládám, že název hostitele vašeho systému ftp serveru je server1.example.com) můžete přistupovat k phpMyAdmin pod http://server1.example.com/phpmyadmin/ (můžete použít IP adresu místo server1. example.com) v prohlížeči a přihlaste se jako proftpd. Pak se můžete podívat do databáze. Později můžete použít phpMyAdmin ke správě vašeho serveru Proftpd.
5 Konfigurace Proftpd
Otevřete /etc/proftpd/modules.conf...
vi /etc/proftpd/modules.conf
... a povolte následující tři moduly:
[...] # Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other |
Poté otevřete /etc/proftpd/proftpd.conf a zakomentujte následující řádky:
vi /etc/proftpd/proftpd.conf
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] |
Dále do souboru přidejte následující řádky:
[...] # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # [email protected] database_user user_password SQLConnectInfo [email protected] proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist CreateHome on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |
Ujistěte se, že jste nahradili řetězcové heslo skutečným heslem pro uživatele MySQL proftpd v řádku SQLConnectInfo!
Poté restartujte Proftpd:
/etc/init.d/proftpd restart