ProFTPD のユーザー認証にリレーショナルデータベース(mod_sql_*)を用いる方法。

ProFTPD で複数のユーザー、グループを、
システムアカウントに依らず手軽に管理する方法を模索していた。
LDAP を使うには大げさだと思ったので、RDB を用いる認証モジュールを試してみる。

利用するRDBはMySQL。モジュールはmod_sqlmod_sql_mysqlの構成。

まずは、MySQL をインストールする。
パッケージで導入する場合は、mod_sql_mysql コンパイル時にライブラリ等が必要になるので、
開発パッケージ(mysql-develなど)も導入すること。

ProFTPD にmod_sql と、mod_sql_mysql を組み込むため、
configure に次のオプションを設定してmakeする。

$ ./configure --with-modules=mod_tls:mod_sql:mod_sql_mysql \
--with-includes=/usr/local/ssl/include:/usr/local/mysql/include \
--with-libraries=/usr/local/mysql/lib:/usr/local/ssl/lib

TLS したいので、ついでにmod_tls なんかも組み込んでいます。
MySQL は/usr/local/mysql に入れています。

./proftpd -l
<snip>
  mod_tls.c
  mod_sql.c
  mod_sql_mysql.c

必要そうなテーブルは、設定のSQLUserInfoから読み解く。
ドキュメントによると、"users userid passwd uid gid homedir shell"らしいので、
このとおりにCREATE TABLE してあげる。

CREATE TABLE users (
  userid VARCHAR(30) NOT NULL UNIQUE,
  passwd VARCHAR(80) NOT NULL,
  uid INTEGER PRIMARY KEY,
  gid INTEGER NOT NULL,
  homedir VARCHAR(255),
  shell VARCHAR(255),
  CONSTRAINT FK_USERS_GID FOREIGN KEY (gid) REFERENCES groups (gid)
)

CREATE TABLE groups (
  groupid VARCHAR(30) NOT NULL UNIQUE,
  gid INTEGER PRIMARY KEY,
  members VARCHAR(255)
)

PKはUID/GIDを指定。
変なGID を指定できないように、念のため制約を張っておく。

passwd に入力するパスワードは、事前にMD5 でハッシュしてBase64 エンコードしておく。

$ echo "パスワード" | perl -MDigest::MD5 -MMIME::Base64 -nle 'print "{md5}",encode_base64 Digest::MD5::md5 $_'

ここで作成した{md5}から始まる文字列をpasswdに設定してINSERT する。

INSERT INTO users (userid,passwd,uid,gid,home,shell)
 VALUES ('user','{md5}dqIXO+Y5MlTnL/pNbfEDCg==',1000,1000,'/bin/sh');
INSERT INTO groups (name,gid,members)
 VALUES ('group',1000,'user');

ProFTPD のmod_sql の設定。

<IfModule mod_sql_mysql.c>
        SQLAuthenticate         users
        SQLAuthTypes            OpenSSL
        SQLConnectInfo          proftpd@localhost:3306 proftpd passwd
        SQLDefaultGID           3306
        SQLUserInfo                users userid passwd uid gid home shell
        SQLGroupInfo             groups groupname gid members
</IfModule>

詳細は公式を参照。
ProFTPD mini-HOWTO - SQL and mod_sql - http://www.proftpd.org/docs/howto/SQL.html