ProFTP&mod_ratio&mod_sql&SafeTPのインストール


ProFTPのインストール方法は良くWebで見かけるんですが、mod_ratio&mod_sqlとの組み合わせはなかなか載っていなく英語しかないんですね〜
しかもその英語もさっぱり解らんときたもんだ...
無い知恵を絞ってなんとかインストールできました。
えらく苦労したので忘れないうちにメモしときます。
(下記は基本的にRedHat7.3での例です。)

又、secureな環境を作るためSafeTPも導入してみました。
SafeTPは一種のProxyみたいな働きをしながらPasswodや通信経路を暗号化するものです。
なにが良いかと言うとクライアントを選ばないところでしょうね...
SSHは専用のクライアントが欲しいのですがSafeTPはWindowsのクライアント用のものも出ているので意図も簡単に今まで使っていたFTPクライアントソフトでsecureな環境ができます。


ProFTPの入手とインストール


ソースコードの入手と展開

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もミソ!(とりあえず後でね...)


MySQLのインストール

これは自分でやってください。
そんなに難しくないはずですし、そもそもDefaultでインストールされてますから...(^^;
ちなみに私のVerは4.0.1でした。
もうひとつちなみに私はMySQLの操作はあまり詳しくはありません。(^^;


データベース'proftp'の作成


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


blackmarketのインストール


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は同じになるように...)


proftp.confの設定

基本的には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

クライアントの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
となっているのはクレジットをきかせていないからです。
上記データーベースで作成したfratefcredbratebcredにてレート、クレジットを設定します。
データーベース'proftp'内のusersをWebminからいじって設定しました。


うまく動作しないとき...

うまく動作しないときはProFTPをtelnet経由でstandaloneで起動させます。
その時にデバッグオプションを付ければどこでどう間違っているかが解ります。

$/usr/local/sbin/proftpd -n -d3
で起動させればOKです。
現在行っている状況がズラズラと書かれるはずです。
それを見ながらデバッグしましょう。


SafeTPのインストール


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
としてあります。

これで全て終了です。
どうですか?うまくいきましたか?