ProFTPD のユーザー認証にリレーショナルデータベース(mod_sql_*)を用いる方法。
ProFTPD で複数のユーザー、グループを、
システムアカウントに依らず手軽に管理する方法を模索していた。
LDAP を使うには大げさだと思ったので、RDB を用いる認証モジュールを試してみる。
利用するRDBはMySQL。モジュールはmod_sqlとmod_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
コメント