- blogs:
- cles::blog

ProFTPdでquota

仕事用でサーバでホスティングをすることになったので、FTPサーバを作ることになりました。
幸いサーバにはProFTPdがインストールしてあったので、楽勝だと思っていたのですが、「ユーザーに容量を際限なく使われると困るのでなんとかquota*1をかけたい」といわれてしまったので、それを実現すべくいろいろと調べてみました。
† quota用のモジュールは2種類?
ProFTPdでquotaを実現するには、そのためのモジュールを組み込む必要があるようです。そのモジュールにはmod_quotaというものと、mod_quotatabというものがあるようです。
さて、どちらがいいのかわからなくて困ってしまったのですが、
LunaTear: ProFTPd1.2.9 mod_quotatab mysql
"調べてみると通常のquotaだけではなく、ダウンロード転送量制限や、総転送量制限、転送ファイル数制限なども掛けられるようでなんだかよさげだったのでこっちで実装してみることにしました。"
この文句に引かれてmod_quotatabを導入することにしました。
今回は設定はほぼ丸写しさせていただいて、構成も同一のmod_quotatab+MySQLにしてみました。ftpのユーザを追加するときに/etc/passwdをいじらなくていいので、なかなか気に入っています。
† インストール
※1.2.9以前のバージョンを使う場合には、モジュールを別途ダウンロードする必要があります。
モジュールのダウンロードはこちらから。
ProFTPdのtarを解凍したディレクトリで以下を実行
./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-libraries=/usr/lib/mysql --with-includes=/usr/include/mysql/
make
make install
† 設定
daemonの管理にはDJBのdaemontoolsとtcpserverを使うのでServerType inetdを指定しています。
/usr/local/etc/proftpd.confに以下を追加
ScoreboardFile /var/run/proftpd/proftpd.scoreboard
PidFile /var/run/proftpd/proftpd.pid
RootLogin off
UseReverseDNS off
UseFtpUsers off
IdentLookups off
TimesGMT off
ListOptions "-a"
ServerType inetd
SQLConnectInfo proftpd@localhost:3306 proftpd proftpd
SQLAuthTypes Plaintext
SQLUserInfo users userid password uid gid homedir shell
SQLGroupInfo groups groupname gid members
SQLAuthenticate users* groups*
AuthOrder mod_sql.c
QuotaEngine on
SQLNamedQuery get-quota-limit SELECT "userid, 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 users WHERE userid = '%{0}' AND \
quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "userid, quota_type, bytes_in_used, \
bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used \
FROM quotatallies WHERE userid = '%{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 userid = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
† MySQLの設定
ファイルサイズの指定はバイト単位なので、ちょっと設定しにくいかも。
mysql -u rootに続いて以下のSQLを実行
create database proftpd;
GRANT ALL PRIVILEGES ON proftpd.* TO proftpd@localhost IDENTIFIED BY 'proftpd';
use proftpd;
CREATE TABLE groups (
groupname VARCHAR(30) NOT NULL ,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 2000,
members varchar(255) default NULL,
PRIMARY KEY ( groupname ),
UNIQUE KEY gid (gid)
);
CREATE TABLE users (
userid VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
uid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 2000,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 2000,
homedir VARCHAR(255) DEFAULT NULL,
shell VARCHAR(255) DEFAULT '/bin/true',
quota_type ENUM("user") DEFAULT 'user' NOT NULL,
per_session ENUM("false", "true") DEFAULT 'true' NOT NULL,
limit_type ENUM("soft", "hard") DEFAULT 'hard' NOT NULL,
bytes_in_avail FLOAT DEFAULT '0' NOT NULL,
bytes_out_avail FLOAT DEFAULT '0' NOT NULL,
bytes_xfer_avail FLOAT DEFAULT '0' NOT NULL,
files_in_avail INT UNSIGNED DEFAULT '0' NOT NULL,
files_out_avail INT UNSIGNED DEFAULT '0' NOT NULL,
files_xfer_avail INT UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (userid)
);
CREATE TABLE quotatallies (
userid VARCHAR(30) NOT NULL,
quota_type ENUM("user", "group", "class", "all") DEFAULT 'user' NOT NULL,
bytes_in_used FLOAT DEFAULT '0' NOT NULL,
bytes_out_used FLOAT DEFAULT '0' NOT NULL,
bytes_xfer_used FLOAT DEFAULT '0' NOT NULL,
files_in_used INT UNSIGNED DEFAULT '0' NOT NULL,
files_out_used INT UNSIGNED DEFAULT '0' NOT NULL,
files_xfer_used INT UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (userid)
);
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/286
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
- crontab -r とやってしまった... (2)
- Jawbone Companion (beta) (1)
- GPS ロガーを自作 (1)
- MPC-HC で連続再生を行う(解... (1)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112928)
3 . 年次の人間ドックへ(112357)
4 . 2023 年分の確定申告完了!(1つめ)(111926)
5 . 三菱鉛筆がラミーを買収(111800)