ProFTPのインストール方法は良くWebで見かけるんですが、mod_ratio&mod_sqlとの組み合わせはなかなか載っていなく英語しかないんですね〜
しかもその英語もさっぱり解らんときたもんだ...
無い知恵を絞ってなんとかインストールできました。
えらく苦労したので忘れないうちにメモしときます。
(下記は基本的にRedHat7.3での例です。)
又、secureな環境を作るためSafeTPも導入してみました。
SafeTPは一種のProxyみたいな働きをしながらPasswodや通信経路を暗号化するものです。
なにが良いかと言うとクライアントを選ばないところでしょうね...
SSHは専用のクライアントが欲しいのですがSafeTPはWindowsのクライアント用のものも出ているので意図も簡単に今まで使っていたFTPクライアントソフトでsecureな環境ができます。
ソースコードの入手と展開
ProFTPはGNUのPublic Lisenceによって配布されているフリーウェアで、いろいろなFTPサイトからソースアーカイブを入手することができます。
アーカイブファイルを入手したら、下記のようにgzipを使って展開する。proftpd-1.2.9rc1というディレクトリができる。
その後、./configureだが、このコンパイルオプションがミソ!
SQLはMySQLを使用します。
(PostgreSQLは難しい...(^^;)
$tar xvzf proftpd-1.2.9rc1.tar.gz
$cd proftpd-1.2.5
ミソ→$CFLAGS='-fhosted' ./configure
--with-modules=mod_ratio:mod_ldap:mod_readme:mod_tls:mod_ifsession:mod_radius:mod_rewrite:mod_sql:mod_sql_mysql
--enable-shadow
--with-DMOD_MYSQLRATIOS
--with-includes=/usr/include
--with-libraries=/usr/lib/mysql
$make
#make install
(--withの間は上のようにあけないでね。#はrootです。)
この時に/usr/local/etcにproftpd.confが作成される。
このproftpd.confもミソ!(とりあえず後でね...)
これは自分でやってください。
そんなに難しくないはずですし、そもそもDefaultでインストールされてますから...(^^;
ちなみに私のVerは4.0.1でした。
もうひとつちなみに私はMySQLの操作はあまり詳しくはありません。(^^;
ProFTPとMySQLとをつなぐ為のデータベース’proftp’を作成します。
下記のデータベース作成はblackmarketの中のsql.txtにあります。(ちょっと違うけど...)
データベースを操作するユーザー(proftp)もWebmin上から行いました。
良く解らないのでproftpのデータベース権限は全てOn
(Linuxのユーザーではない)
○データベース、テーブルの作成
$mysql
mysql>CREATE DATABASE proftp;
mysql>connect proftp
mysql>CREATE TABLE groups (
groupname varchar(30) NOT NULL,
gid int(11) DEFAULT '0' NOT NULL,
members varchar(255),
UNIQUE KEY gid (gid)
PRIMARY KEY (groupname));
mysql>CREATE TABLE users (
userid varchar(30) NOT NULL,
passwd varchar(30) NOT NULL,
uid int(11),
gid int(11),
homedir varchar(255),
shell varchar(255) DEFAULT '/sbin/nologin' NOT NULL,
loginCount int(255) DEFAULT '1' NOT NULL,
maxLogins int(255) DEFAULT '0' NOT NULL,
creationTime timestamp(14),
expireTime timestamp(14),
admin varchar(255) NOT NULL,
accessLevel enum('0','1') DEFAULT '0' NOT NULL,
fstor bigint(64) DEFAULT '0' NOT NULL,
fretr bigint(64) DEFAULT '0' NOT NULL,
bstor bigint(64) DEFAULT '0' NOT NULL,
bretr bigint(64) DEFAULT '0' NOT NULL,
frate bigint(64) DEFAULT '0' NOT NULL,
fcred bigint(64) DEFAULT '0' NOT NULL,
brate bigint(64) DEFAULT '0' NOT NULL,
bcred bigint(64) DEFAULT '0' NOT NULL,
PRIMARY KEY (userid),
UNIQUE userid (userid));
mysql>INSERT INTO users VALUES ( 'Admin', 'adminpass', '0', '0',
'/dev/null','/sbin/nologin','1', '1000000000', '20020618010717',
'20220523091415','Admin','1','0','0','0','0','0','0','0','0');
mysql>INSERT INTO users VALUES ( 'user', 'tespass', '1', '1',
'/dev/null,'/sbin/nologin','1','100', '20020618161729',
'20030618155621', 'Admin','0','0','0','0','0','0','0','0');
mysql>quit
でとりあえずOK
proftp.orgを良く見ているとblackmarket(変な名前)へのLinkがあります。
http://sourceforge.net/projects/blackmarket/
これはMySQLのデータベースをWeb上から編集すると言う優れものです。
私はMySQLの操作は苦手ですし、管理が楽なので飛びつきました。(笑)
上記からblackMarket.tar.gzをダウンロードします。
Apacheのhtmlディレクトリの中に解凍します。
RedHat7.3のDefaultは/var/www/htmlですね
$tar xvzf blackMarket.tar.gz
$cd blackMarkeDistro
これで終わり。
だけど良くINSTALL.txtを見るともうちょっと編集しろと書いてある。
$cd inc
$vi sql.inc.php
で中身を編集します。
@mysql_pconnect("hostname","username","password");
mysql_select_db("databaseName");
となっているので私の場合...
@mysql_pconnect("127.0.0.1","proftp","データベースパスワード");
mysql_select_db("proftp");
としました。
これであとは...
http://192.168.0.254/blackMarketDistro/
とアクセスし、Default(さっき)で設定したAdminユーザーでLoginします。
AddUserというのがあるので随時userを追加します。
その追加したユーザーで実際にLoginする事になります。
ですのでLinux上のユーザーとは全く異なります。
Linux上でやたらめったかユーザーを増やすのは体に悪いので(?)これでsecureな環境になりましたね
(ユーザーのgidとグループのgidは同じになるように...)
基本的にはDefaultのconfファイルそのものでOKです。
随時修正してください。
ここで解説するよりももっと良いサイトがあるでしょう
で、mod_ratioとmod_sqlを使うためのディレクティブは...
<=ここから
RequireValidShell off
SQLConnectInfo proftp@127.0.0.1:3306 proftp データベースパスワード
SQLAuthTypes Backend Plaintext
SQLMinUserUID 1 ←ココに注意!
SQLMinUserGID 1 ←ココに注意!
SQLAuthenticate users* groups*
SQLUserInfo users userid passwd uid gid homedir shell
SQLGroupInfo groups groupname gid members
SQLUserWhereClause "expireTime > now() AND maxLogins >= loginCount"
SQLAuthenticate users groups usersetfast groupsetfast
SQLNamedQuery getcount SELECT "loginCount, userid from users
where userid='%u'"
SQLNamedQuery getmaxcount SELECT "maxLogins, userid from users
where userid='%u'"
SQLNamedQuery timeleft SELECT "expireTime, userid from users
where userid='%u'"
SQLNamedQuery updatecount UPDATE "loginCount=loginCount+1 WHERE
userid='%u'" users
SQLNamedQuery bytestor SELECT "bstor, userid from users where
userid='%u'"
SQLNamedQuery byteretr SELECT "bretr, userid from users where
userid='%u'"
SQLShowInfo PASS "230" "%u, account expires %{timeleft}.
( %{getcount} of %{getmaxcount} max logins) %{bytestor}Byte Uploaded. %{byteretr}Byte
Downloaded."
SQLLog PASS updatecount
SQLRatios on
SQLRatioStats on
Ratios on
SaveRatios on
CwdRatioMsg "Upload Firtst!"
FileRatioErrMsg "Come on you can send more files than that...."
ByteRatioErrMsg "This file is %i big, you know....You have to upload first!"
LeechRatioMsg "Access: Unlimited"
<=ここまで
上記をproftpd.confのどこでも良いので追加します。
<golobal>内でもOKだと思います。
クライアントのLogが下記のようになればOKです。
○Login時
230- foo, account expires 20100914045435. ( 1 of 1000000000 max logins)
0Byte Uploaded. 0Byte Downloaded.
230 Down: 0 Files (0mb) Up: 0 Files (0mb) 10,000,000:1 CR: LEECH
となっているのはクレジットをきかせていないからです。
上記データーベースで作成したfrate、fcred、brate、bcredにてレート、クレジットを設定します。
データーベース'proftp'内のusersをWebminからいじって設定しました。
うまく動作しないときはProFTPをtelnet経由でstandaloneで起動させます。
その時にデバッグオプションを付ければどこでどう間違っているかが解ります。
$/usr/local/sbin/proftpd -n -d3
で起動させればOKです。
現在行っている状況がズラズラと書かれるはずです。
それを見ながらデバッグしましょう。
SafeTP自体はhttp://safetp.cs.berkeley.edu/にあります。
Windows用とLinux用の2種類があります。
http://www.cs.berkeley.edu/~bonachea/safetp/form.htmlからダウンロードできますが面倒です。(^^;
で、ダウンロードしたsftpd.tar.gzを解凍します。
$tar xvzf sftpd.tar.gz
$cd sftpd-1.46
$./configure
$make
$make check
ここで通常はmake installと行きたいところですがinstall.txtによるとinstall-shを行えとあるので
$sh ./install-sh
これでインストールは完了
次はsafetpユーザー、グループの作成です。
/etc/groupに safetp:x:GID: を追加
/etc/passwdに safetp:x:UID:GID:SafeTP:/usr/local/bin/safetp:/bin/false
を追加
次にchownします。
chown -R safetp.safetp /usr/local/bin/safetp
暗号の鍵を作ります。
$cd /usr/local/bin/safetp
$./makekeys 0 1024
$Part of SafeTP's countermeasures against interception attacks
$....
$Enter an identifying string (80 chars maximum):
$hogehogehogehoge <=なんでも良いので適当に入れる
$....
$SafeTP will now generate your new security keys.
$....
$try moving the mouse or typing into another console window.
$Entropy progress: [.. ] <=ここが”.”でいっぱいになるまでキーボードを押します。が、かなり速い時間なので押す暇ないかも...
$creating DSA keys with 1024 bits...
$Time used to create DSA key: 0.0500 sec
$Verifying DSA keys
$server name: hogehogehogehoge
$Verified.
以上で終わり
鍵は./safetpの中のDSAフォルダ内に作られます。
鍵をtxtに変換するので
$./viewkey DSA/public.key > DSA/public.key.text
と行いtxtにします。
このpublic.key.txtをクライアントソフトで使うと言うわけですね
ProFTPもSafeTPもxinetdで動作させるのでここでちょっと工夫が欲しくなります。
まず、SafeTPは一種のProxyですのでProFTPのPortを変更します。
ここでのProFTPのPort変更は/etc/servicesで行います。
#vi /etc/services
で下記のように変更します。
ftp 21/tcp
raw-ftp 351/tcp
次にxinetdで設定しているProFTPの変更です。
# for ProFTPD Configureation
service ftp
{
flags = REUSE
log_on_success += HOST DURATION USERID PID
log_on_failure += HOST RECORD USERID
socket_type = stream
user = root
server = /usr/local/sbin/in.proftpd
server_args = -n -d5
wait = no
instances = 30
cps = 1 30
}
の中の”service ftp”を”service raw-ftp”に変更します。
次はSafeTP用のファイルを作成します。
# for SafeTP Configuration
service ftp
{
socket_type = stream
protocol = tcp
wait = no
user = safetp
server = /home/safetp/sftpd
server_args = -f351 -s -y/home/safetp
disable = no
}
とします。
ファイル名はなんでも良いでしょう。
とりあえずsafetpにしときます。
あとproftpd.confのServerTypeを”inetd”にしておきましょう
これでxnetdを再起動させればOKです。
SafeTPの起動オプションで”-c”を付ければクライアント側がSafeTPを入れていない場合はLoginできません。
又、”-r”オプションでPassiveモードでのPortの割り振りができます。
私の場合...
server_args = -f351 -s -c -r20000-20005 -y/home/safetp
としてあります。
これで全て終了です。
どうですか?うまくいきましたか?