サーバー設定 · 4 min read · Jan 31, 2026

Ubuntu 14.04LTS における Proftpd と MySQL (クォータを含む) の仮想ホスティング

この文書では、実際のシステムユーザーの代わりに MySQL データベースからの仮想ユーザーを使用する Proftpd サーバーのインストール方法について説明します。これははるかにパフォーマンスが高く、単一のマシン上で数千の FTP ユーザーを持つことができます。それに加えて、このセットアップでのクォータの使用方法も示します。このチュートリアルは Ubuntu 14.04LTS に基づいています。

MySQL データベースの管理には、phpMyAdmin のようなウェブベースのツールを使用できます。これもこのハウツーでインストールされます。phpMyAdmin は快適なグラフィカルインターフェースであり、コマンドラインをいじる必要がありません。

このハウツーは実用的なガイドとして意図されています。理論的な背景はカバーしていません。それらはウェブ上の他の多くの文書で扱われています。

この文書は、いかなる種類の保証もありません!これはそのようなシステムを設定する唯一の方法ではないことを言いたいです。この目標を達成する方法はたくさんありますが、これが私が取る方法です。これがあなたにとって機能するという保証はありません!

1 予備ノート

このチュートリアルでは、ホスト名 server1.example.com と IP アドレス 192.168.0.100 を使用します。これらの設定はあなたの環境によって異なる場合があるため、適宜置き換えてください。

root としてログインしていることを確認してください:

sudo su

1.1 デフォルトシェルの変更

/bin/sh は /bin/dash へのシンボリックリンクですが、/bin/dash ではなく /bin/bash が必要です。したがって、次のようにします:

dpkg-reconfigure dash

Install dash as /bin/sh? <– いいえ

1.2 AppArmor の無効化

AppArmor は、拡張セキュリティを提供するセキュリティ拡張(SELinux に似ています)です。私の意見では、安全なシステムを構成するために必要ありませんし、通常は利点よりも問題を引き起こします(あるサービスが期待通りに動作しなかったために一週間トラブルシューティングを行った後、すべてが正常で、問題を引き起こしていたのは AppArmor だったことがわかることを考えてみてください)。したがって、私はそれを無効にします。

次のようにして無効にできます:

/etc/init.d/apparmor stop  
update-rc.d -f apparmor remove  
apt-get remove apparmor apparmor-utils

2 MySQL と phpMyAdmin のインストール

これらはすべて 1 つのコマンドでインストールできます:

apt-get install mysql-server mysql-client phpmyadmin apache2

MySQL root ユーザーのパスワードを提供するように求められます。このパスワードは、ユーザー root@localhost および [email protected] に対して有効ですので、後で手動で MySQL root パスワードを指定する必要はありません:

New password for the MySQL “root” user: <– yourrootsqlpassword
Repeat password for the MySQL “root” user: <– yourrootsqlpassword

これに加えて、次の質問が表示されます:

Web server to reconfigure automatically: <– apache2
Configure database for phpmyadmin with dbconfig-common? <– いいえ

3 MySQL サポート付き Proftpd のインストール

Ubuntu には、事前に構成された proftpd-mod-mysql パッケージが利用可能です。次のようにスタンドアロンデーモンとしてインストールします:

apt-get install proftpd-mod-mysql

次の質問が表示されます:

Run proftpd: <– standalone

次に、すべての仮想ユーザーがマッピングされる ftp グループ (ftpgroup) とユーザー (ftpuser) を作成します。グループ ID とユーザー ID 2001 を、システム上で空いている番号に置き換えてください:

groupadd -g 2001 ftpgroup  
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

4 Proftpd 用の MySQL データベースの作成

次に、ftp という名前のデータベースと、Proftpd デーモンが後で ftp データベースに接続するために使用する proftpd という名前の MySQL ユーザーを作成します:

mysql -u root -p
CREATE DATABASE ftp;  
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';  
FLUSH PRIVILEGES;

文字列 password を、MySQL ユーザー proftpd に使用する任意のパスワードに置き換えます。MySQL シェル上で、必要なデータベーステーブルを作成します:

USE ftp;

CREATE TABLE ftpgroup (  
groupname varchar(16) NOT NULL default '',  
gid smallint(6) NOT NULL default '5500',  
members varchar(16) NOT NULL default '',  
KEY groupname (groupname)  
) ENGINE=MyISAM COMMENT='ProFTP group table';

CREATE TABLE ftpquotalimits (  
name varchar(30) default NULL,  
quota_type enum('user','group','class','all') NOT NULL default 'user',  
per_session enum('false','true') NOT NULL default 'false',  
limit_type enum('soft','hard') NOT NULL default 'soft',  
bytes_in_avail bigint(20) unsigned NOT NULL default '0',  
bytes_out_avail bigint(20) unsigned NOT NULL default '0',  
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',  
files_in_avail int(10) unsigned NOT NULL default '0',  
files_out_avail int(10) unsigned NOT NULL default '0',  
files_xfer_avail int(10) unsigned NOT NULL default '0'  
) ENGINE=MyISAM;

CREATE TABLE ftpquotatallies (  
name varchar(30) NOT NULL default '',  
quota_type enum('user','group','class','all') NOT NULL default 'user',  
bytes_in_used bigint(20) unsigned NOT NULL default '0',  
bytes_out_used bigint(20) unsigned NOT NULL default '0',  
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',  
files_in_used int(10) unsigned NOT NULL default '0',  
files_out_used int(10) unsigned NOT NULL default '0',  
files_xfer_used int(10) unsigned NOT NULL default '0'  
) ENGINE=MyISAM;

CREATE TABLE ftpuser (  
id int(10) unsigned NOT NULL auto_increment,  
userid varchar(32) NOT NULL default '',  
passwd varchar(32) NOT NULL default '',  
uid smallint(6) NOT NULL default '5500',  
gid smallint(6) NOT NULL default '5500',  
homedir varchar(255) NOT NULL default '',  
shell varchar(16) NOT NULL default '/sbin/nologin',  
count int(11) NOT NULL default '0',  
accessed datetime NOT NULL default '0000-00-00 00:00:00',  
modified datetime NOT NULL default '0000-00-00 00:00:00',  
PRIMARY KEY (id),  
UNIQUE KEY userid (userid)  
) ENGINE=MyISAM COMMENT='ProFTP user table';

quit;

ご覧のとおり、quit; コマンドで MySQL シェルを終了し、Linux シェルに戻りました。

ちなみに、(あなたの FTP サーバーシステムのホスト名が server1.example.com であると仮定しています)ブラウザで http://server1.example.com/phpmyadmin/ にアクセスし、proftpd としてログインできます。これでデータベースを確認できます。後で phpMyAdmin を使用して Proftpd サーバーを管理できます。

5 Proftpd の設定

/etc/proftpd/modules.conf を開きます…

vi /etc/proftpd/modules.conf

… 次の 3 つのモジュールを有効にします:

| [...] # 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 [...] |

次に、/etc/proftpd/proftpd.conf を開き、次の行をコメントアウトします:

vi /etc/proftpd/proftpd.conf

| [...] # #QuotaEngine off # [...] |

ファイルの下部に、次の行を追加します:

| [...] # # 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 # databasename@host database_user user_password SQLConnectInfo ftp@localhost 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 [...] |

SQLConnectInfo の行で、MySQL ユーザー proftpd の実際のパスワードに文字列 password を置き換えることを忘れないでください!

次に、Proftpd を再起動します:

/etc/init.d/proftpd restart
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。