GNU/Linux >> Znalost Linux >  >> Ubuntu

Virtuální hosting s Proftpd a MySQL (včetně kvóty) na Ubuntu 12.10

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 12.10.

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

quit;

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
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c [...] # Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c [...] # Install one of the previous SQL backends and decomment
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c [...]

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

6 Naplnění databáze a test

K naplnění databáze můžete použít shell MySQL:

mysql -u root -p
USE ftp;

Nejprve vytvoříme záznam v tabulce ftpgroup. Obsahuje název skupiny, ID skupiny a uživatelské jméno ftp skupiny/uživatele, které jsme vytvořili na konci druhého kroku (pokud použijete jiné než 2001, vhodně nahraďte groupid):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Nyní jsme hotovi s tabulkou ftpgroup. Zde již nemusíme vytvářet další záznamy. Kdykoli vytvoříte nového virtuálního ftp uživatele, uděláte to v tabulkách ftpquotalimits a ftpuser. Pojďme tedy vytvořit našeho prvního uživatelského příkladu s kvótou 15 MB a tajným heslem (stále jsme v prostředí MySQL):

INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

(Nezapomeňte vhodně nahradit groud- a userid 2001 v posledním příkazu INSERT, pokud používáte jiné hodnoty než v tomto tutoriálu!)

Nyní otevřete svůj FTP klientský program na vaší pracovní stanici (něco jako FileZilla, WS_FTP, SmartFTP nebo gFTP) a zkuste se připojit. Jako název hostitele použijete server1.example.com (nebo IP adresu systému), uživatelské jméno je exampleuser a heslo je tajné.

Pokud jste schopni se připojit - gratulujeme! Pokud ne, něco se pokazilo.

Nyní, pokud spustíte

ls -l /home/

měli byste vidět, že adresář /home/www.example.com (domovský adresář uživatele příkladu) byl automaticky vytvořen a je vlastněn ftpuser a ftpgroup (uživatel/skupina, kterou jsme vytvořili na konci druhého kroku):

[e-mail chráněný]:~# ls -l /home/
celkem 8
drwxr-xr-x 3 administrátor administrátor 4096 19. října 13:08 administrátor
drwx------ 2 ftpuser       ftpgroup      4096 18. dubna 18:13 www.example.com
[e-mail chráněn]:~#

7 Správa databáze

Pro většinu lidí je jednodušší, když mají grafický front-end k MySQL; proto můžete také použít phpMyAdmin (v tomto příkladu pod http://server1.example.com/phpmyadmin/) ke správě ftp databáze.

Kdykoli vytvoříte nového uživatele, musíte vytvořit pouze položky v tabulkách ftpquotalimits a ftpuser, takže zde vysvětlím sloupce těchto tabulek:

Tabulka ftpuser:

Důležité jsou tyto sloupce (ostatní zpracovává MySQL nebo Proftpd automaticky, takže je nevyplňujte ručně!):

  • userid:Jméno virtuálního uživatele Proftpd (např. exampleuser).
  • passwd:Nezašifrované (tj. nekódované) heslo uživatele.
  • uid:ID uživatele ftp, kterého jste vytvořili na konci druhého kroku (např. 2001).
  • gid:ID skupiny skupiny ftp, kterou jste vytvořili na konci druhého kroku (např. 2001).
  • homedir:Domovský adresář virtuálního uživatele Proftpd (např. /home/www.example.com). Pokud neexistuje, bude vytvořen při prvním přihlášení nového uživatele přes FTP. Virtuální uživatel bude uvězněn do tohoto domovského adresáře, tj. nebude mít přístup k jiným adresářům mimo svůj domovský adresář.
  • shell:Je v pořádku, pokud zde ve výchozím nastavení vyplníte /sbin/nologin.

Tabulka ftpquotalimits:

Důležité jsou tyto sloupce (ostatní zpracovává MySQL nebo Proftpd automaticky, takže je nevyplňujte ručně!):

  • jméno:Jméno virtuálního uživatele Proftpd (např. exampleuser).
  • typ_kvóty:uživatel nebo skupina. Obvykle zde používáme user.
  • per_session:true nebo false. true znamená, že limity kvóty jsou platné pouze pro relaci. Pokud má uživatel například kvótu 15 MB a během aktuální relace nahrál 15 MB, nemůže nahrát nic víc. Pokud se ale odhlásí a znovu přihlásí, má opět k dispozici 15 MB. false znamená, že uživatel má 15 MB, bez ohledu na to, zda se odhlásí a znovu přihlásí.
  • typ limitu:tvrdý nebo měkký. Pevný limit kvóty je limit, který nelze nikdy překročit, zatímco měkký limit může být dočasně překročen. Normálně zde používáte hard.
  • bytes_in_avail:Limit nahrávání v bajtech (např. 15728640 pro 15 MB). 0 znamená neomezené.
  • bytes_out_avail:Limit stahování v bajtech. 0 znamená neomezené.
  • bytes_xfer_avail:Limit přenosu v bajtech. Součet uploadů a downloadů, které může uživatel provést. 0 znamená neomezené.
  • files_in_avail:Limit nahrávání v souborech. 0 znamená neomezené.
  • files_out_avail:Limit stahování v souborech. 0 znamená neomezené.
  • files_xfer_avail:Limit přenosu souborů. 0 znamená neomezené.

Tabulku ftpquotatallies používá Proftpd interně ke správě kvót, takže tam nemusíte dělat záznamy!

8 anonymní FTP

Pokud si chcete vytvořit anonymní ftp účet (ftp účet, ke kterému se může přihlásit každý bez hesla), můžete to udělat takto:

Nejprve vytvoříme uživatele a skupinu s názvem anonymní_ftp. Uživatel má domovský adresář /home/anonymous_ftp:

groupadd -g 2002 anonymní_ftp
useradd -u 2002 -s /bin/false -d /home/anonymní_ftp -m -c "Anonymní uživatel FTP" -g anonymní_ftp anonymní_ftp

(Nahraďte 2002 skupinovým/uživatelským jménem, ​​které je ve vašem systému zdarma.)

Několik souborů začínajících na . byly vytvořeny posledním příkazem (useradd) v adresáři /home/anonymous_ftp. Nepotřebujeme je, takže je smažeme:

cd /home/anonymous_ftp
rm -f .bash_logout
rm -f .profile
rm -f .bashrc

Poté vytvoříme adresář /home/anonymous_ftp/incoming, který umožní anonymním uživatelům nahrávat soubory:

mkdir /home/anonymous_ftp/incoming
chown anonymní_ftp:nogroup /home/anonymous_ftp/incoming

A nakonec otevřete /etc/proftpd/proftpd.conf a připojte k němu následující direktivy:

vi /etc/proftpd/proftpd.conf
[...]
<Anonymous ~anonymous_ftp>
  User                                anonymous_ftp
  Group                               nogroup
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias                        anonymous anonymous_ftp
  # Cosmetic changes, all files belongs to ftp user
  DirFakeUser        on anonymous_ftp
  DirFakeGroup on anonymous_ftp

  RequireValidShell                off

  # Limit the maximum number of anonymous logins
  MaxClients                        10

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin                        welcome.msg
  DisplayChdir                        .message

  # Limit WRITE everywhere in the anonymous chroot
  <Directory *>
    <Limit WRITE SITE_CHMOD>
      DenyAll
    </Limit>
  </Directory>

  # Uncomment this if you're brave.
  <Directory incoming>
    # Umask 022 is a good standard umask to prevent new files and dirs
    # (second parm) from being group and world writable.
    Umask                                022  022
             <Limit READ WRITE SITE_CHMOD>
             DenyAll
             </Limit>
             <Limit STOR>
             AllowAll
             </Limit>
  </Directory>

</Anonymous>

Nakonec restartujte Proftpd:

/etc/init.d/proftpd restart

Nyní se mohou anonymní uživatelé přihlásit a mohou stahovat soubory z /home/anonymous_ftp, ale nahrávání je omezeno na /home/anonymous_ftp/incoming (a jakmile je soubor nahrán do /home/anonymous_ftp/incoming, nelze jej číst ani stahovat z tam; administrátor serveru jej musí nejprve přesunout do /home/anonymous_ftp, aby jej zpřístupnil ostatním).

(Upozornění:Můžete mít pouze jeden anonymní ftp účet na IP adresu!)

9 odkazů

Mandrake 10.1 – Proftpd + ověřování MySQL + Jak na to kvóty:http://www.khoosys.net/single.htm?ipg=848

  • Proftpd:http://www.proftpd.org/
  • MySQL:http://www.mysql.com/
  • phpMyAdmin:http://www.phpmyadmin.net/
  • Ubuntu:http://www.ubuntu.com/

Ubuntu
  1. Virtuální uživatelé a domény s Postfixem, Courier, MySQL a SquirrelMail (Ubuntu 14.04LTS)

  2. Virtuální hosting s Proftpd a MySQL (včetně kvóty) na Ubuntu 14.04LTS

  3. Virtuální uživatelé a domény s Postfixem, Courier, MySQL a SquirrelMail (Ubuntu 13.10)

  1. Virtuální hosting s PureFTPd a MySQL (včetně správy kvót a šířky pásma) na CentOS 7.0

  2. Virtuální hosting s PureFTPd a MySQL (včetně správy kvót a šířky pásma) na Ubuntu 7.10 (Gutsy Gibbon)

  3. Virtuální hosting s Proftpd a MySQL (včetně kvóty) na Ubuntu 8.04 LTS

  1. Virtuální hosting s PureFTPd a MySQL (včetně správy kvót a šířky pásma) na Ubuntu 8.10 (Intrepid Ibex)

  2. Virtuální hosting s Proftpd a MySQL (včetně kvóty) na Ubuntu 8.10

  3. Virtuální hosting s PureFTPd a MySQL (včetně správy kvót a šířky pásma) na Ubuntu 9.04 (Jaunty Jackalope)