mysql対応proftpdを作る
proftpdをただ入れるだけではつまらないんで、mysqlで認証させる機能もつけてコンパイルしてみた。
ゆくゆくはさらにpostfixもdovecot経由でユーザーを取って、このproftpdと同じユーザーにメール環境を提供するとを考えている。
とりあえず、このproftpdでは、実ユーザーで認証後、失敗すればmysqlに聞きに行く、という動作が目標である。
これをアパッチと連携させてこの実ユーザーでないユーザーにWEBスペース提供するのはapacheのAliasMachで簡単に実現できそう。
mysqlがprefix /usr/local/mysql 以下にインストールされているものとして話を進める。
mysqlにユーザDBを作る。
クエリはこんな感じ。
GRANT SELECT ON dbname.* TO dbuser IDENTIFIED BY ‘dbpassword’ ;
USE dbname;
CREATE TABLE groups (
groupname varchar(150) NOT NULL,
gid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
members varchar(255),
UNIQUE KEY gid (gid),
PRIMARY KEY (groupname)
);
CREATE TABLE users (
userid varchar(150) NOT NULL,
passwd varchar(30) NOT NULL,
uid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
gid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
homedir varchar(255),
shell varchar(255) DEFAULT ‘/bin/false’,
PRIMARY KEY (userid)
);
INSERT INTO USERS SET userid = “userid”,passwd = “password”,homedir =”homedir”;
↑てな感じでユーザーを追加
Mysqlの準備は終わり。
proftpdのコンパイル
mysql認証対応バイナリをコンパイル
せっかくsolarisということで、gccでなく、SunStudioを使用
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/sunf77
Sun Studio 12のコンパイラオプションは以下の通り。
export CFLAGS=” -fast -native -mt”
早く、ネイティブに、マルチスレッドに!(でも32ビット)
64ビットバイナリにすると後々別のバイナリからこのバイナリにリンクするときにややこしくなるので却下、64ビット化する場合は “-m64″を追加する。
コンフィグオプションは以下の感じで。
ちゃんとコンパイルできているかどうかは、
/usr/local/proftpd/sbin/proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_delay.c
mod_auth_pam.c
mod_sql.c
mod_sql_mysql.c
上の太字の部分を確認
デフォルトのFTPを止める
#svcadm disable svc:/network/ftp:default
#簡単にSMFのinetdに登録するには、
/etc/inetd.confに
ftp stream tcp nowait root /usr/local/proftp/sbin/in.proftpd proftpd
と書いた後、
inetconv と実行すればよい。
proftdpd.confの編集、特筆すべき部分だけを書くと以下のような感じ。
#mysql認証
<IfModule mod_sql_mysql.c>
SQLAuthenticate users
SQLConnectInfo dbname@localhost:3306 dbuser dbpassword
SQLAuthTypes Crypt
SQLUserInfo users userid password uid gid homedir shell
SQLGroupInfo groups groupname gid members
#実ユーザーで認証後にいなければmysqlに問い合わせ
AuthOrder mod_auth_unix.c mod_sql.c
</IfModule>
AllowOverwrite on
#wwwグループはホームより上に上がれない
DefaultRoot ~ www
#レジューム許可
AllowStoreRestart on
AllowRetrieveRestart on
#モード変更許可
<Limit SITE_CHMOD>
AllowAll
</Limit>