2003年12月16日

ProFTPd+mod_ratio+MySQL

ある日こんな相談を受ける
「FTPで利用者ごとにファイルを持っていける回数を制限したいんだけど、出来る?」
差し障りの無い辺りで要約すると、なんでもデータを提供するにあたってとりあえず、お試しで一定数持っていけるようにしたいらしい。
で、話がまとまればそのアカウントで、そのまま続けられる用にしたいらしい。

ProFTPd大好きなんでFTPdはとりあえず、ProFTPdで。
運用ツール作ることを考えるとmod_sqlははずせないとして、制限をかける手段はどうしようか・・・
最初SQLLogとSQLUserWhereClauseの組み合わせでいこうかなと思っていたら「制限超えてもログインはできるようにして欲しい」ですと(;´д`)ノ
まぁ、確かにリアルタイムデータなんで順調に増えるのを見せた方が良いんだろうけど・・・

さて、困って設定の一覧を見ていると

「SQLRetiosねぇ」

ちょっと調べてみるとクレジットが使えるっぽいんで、コレでいけそうかな。
(使用目的から考えて制限超えてもログインできるだろうし、アップロードは有効にさせるつもりが無いからユーザ側で勝手に枠増やせそうも無いし)

とりあえず、実装してみないとテストもできないので、実装してみることにしました。

で、まずモジュールの組み込みですがconfigureに次を追加します。

--with-modules=mod_sql:mod_sql_mysql:mod_ratio
次にmakeの際にオプションを渡します。
make CFLAGS="-DHAVE_OPENSSL -DMOD_MYSQL_RATIOS"
(上記はSQLのパスワードにOpenSSLを使う場合で、つかわないなら「-DHAVE_OPENSSL」は削除してください)

で、コンパイル手順の残りはこことかここ辺りを参考に。

で、それをインストールして無事動けば次にMySQLで認証用のテーブルを作成します。
基本的にはこっちでやった通りでいけますが、usersテーブルだけ下のSQL文で作成します。

CREATE TABLE users (
userid varchar(30) NOT NULL,
password varchar(30) NOT NULL,
uid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
homedir varchar(255) default NULL,
shell varchar(255) default '/bin/true',
fstor bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
fretr bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
bstor bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
bretr bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
frate bigint(20) UNSIGNED DEFAULT '1' NOT NULL,
fcred bigint(20) UNSIGNED DEFAULT '10' NOT NULL,
brate bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
bcred bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (userid)
);
今回のケースではファイル数だけを制限に用いるので制限をかけるために1ファイルアップロードしたらいくつ落とせるか決めるfrateに適当な数(1)を設定しました。
ちょっと気持ち悪いですが、まぁ、ユーザからのアップロードは全て禁止にしておりできないのでこれでいいでしょう。

次にfcredの10は「ユーザは何もアップロードしていなくても10ファイルまでダウンロードできる」ということです。

あと、バイト数でのレートを決めるbrateは0になってますが、0は無制限なのでこのままでokです。
(もちろんbcredは不要です)
ちなみに、fstorからの4つは実行中に勝手に加算される項目なので、何も値を入れないでください。

さて、これでMySQL側での準備が整いましたので、次はProFTPdの方に設定を加えます。

まず<Global>ディレクティブに以下を追加

<Global>
#SQL Auth Types [OpenSSL] [Crypt] [Backend] [Plaintext] [Empty]
SQLAuthTypes OpenSSL
SQLRatios on
SQLRatioStats on
</Global>
次にこっちで追加したconfの内容をserverconfか使用する<VirtualHost>に追加します。

そして同じディレクティブに下の内容を追加して終わりです。

CwdRatioMsg ""
FileRatioErrMsg "Sorry, You are not able to download it anymore."
LeechRatioMsg "Unlimited User"
Ratios on
これでProFTPdに再起動を書けて無事動作すれば作業完了と成ります。

うまくない場合はProFTPdをデバッグモード(proftpd -d3 -n)でどこで失敗しているのか確認してください。

Posted by Takuchan at 2003年12月16日 20:05 | トラックバック(0)