連動用にFTPサーバを構築する必要があったんだけど、複数のFTPを共通のID/PASSで認証させる必要があった。
認証機構を別途用意するのは要件的に微妙だったので、ユーザ情報が入っているMySQLデータベースで認証させることにしました。
利用するFTPサーバはProFTPdです。
こちらは、モジュールとしてmod_sql, mod_sql_mysqlを組み合わせることでMySQLで認証することが出来ます。
CentOS6.9環境。
1 |
sudo yum install proftpd proftpd-mysql |
標準のリポジトリにあるので、prodftpd-mysqlパッケージを導入。
設定はproftpd.confにて・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
AuthOrder mod_sql.c mod_auth_unix.c LoadModule mod_sql.c LoadModule mod_sql_mysql.c CreateHome on dirmode 755 <IfModule mod_sql_mysql.c> SQLBackend mysql SQLEngine on SQLAuthenticate on SQLLogFile /var/log/proftpd-mysql.log SQLAuthTypes Plaintext SQLConnectInfo <<db>>@<<mysqlbalancer>>:3306 <<user>> <<password>> SQLUserInfo proftpuser userid passwd uid gid homedir shell SQLGroupInfo proftpgroup gruoupname gid members </IfModule> |
AuthOrderにてmod_sql.cを追加します。
LoadModuleでmod_sql.cとmod_sql_mysql.cを追加します。
CreateHomeはSQLとは関係ありませんが、今回はマルチサーバのため、Homeディレクトリが無いこともあり、自動生成させる動きのために記述。
SQLBackendでmysqlを選択。 PostgreSQLも使えます。
SQLEngineをOnに。
SQLAuthenticateはOn以外にユーザだけとかの指定が可能です。
SQLLogFileはSQL認証の進行状況がわかるので、設定を試すときには設定してtail -fしておくと良いでしょう。
SQLAuthTypesはSQLのパスワードの暗号タイプです。 今回のシステムではパスワードに相当する物が平文なのでPlaintextとしています。
SQLConnectInfoでSQLサーバの情報で、<<db>>はデータベース名、<<mysqlbalancer>>はホスト名でローカルならlocalhost、:ポート、MySQLユーザ名とMySQLパスワード。
SQLUserInfoはSQLで保管されているユーザテーブルの読み替えルールです。
テーブル名 ユーザ名 パスワード ユーザID グループID ホームディレクトリ シェル で、テーブル名以外はその値があるカラム名を指定します。
この場合は、proftpuserテーブルにuserid,passwd…と言うカラムで保存していると言う指定。
SQLGroupInfoも同様でグループ情報についてです。
テーブル名 グループ名 グループID メンバーのユーザ名カンマ区切 を指定します。
で、後はMySQL上にユーザテーブルを構築します。
今回は既存アプリケーションのユーザ情報を利用するため、ビューで作成しました。
1 2 |
CREATE VIEW proftpuser(userid, passwd, uid, gid, homedir, shell) as select name, token, id+1000, 1000, concat('/mnt/ftp/',name), '/bin/sh' from user; CREATE VIEW proftpgroup(groupname, gid, member group_concat(name)) as select 'defaultftpgroup', 1000 from user; |
proftpuserビューは、既存システムのuserテーブルからいじって持ってきて、ユーザ名はそのままname、パスワードはtoken、uidはオリジナルテーブルのidに1000加算、gidは1000固定、ホームディレクトリは/mnt/ftp/の下にユーザ名、シェルは/bin/sh固定。
proftpgroupビューはdefaultftpgroupと言う名前でgid1000で、全ユーザ名をメンバー一覧に列記して終わりです。
で、ftpサーバの前段にバランサーがあって、ftpサーバからMySQLサーバの間にもバランサーがあって、MySQLはXtraDB Clusterでクラスタリングされてます。 FTPサーバが転けてもFTPサーバ前段のバランサーで切り替わって、MySQLノードが転けてもMySQL前段バランサーで切り替わる、でバランサー自体はVRRPで切り替わるという動きにして冗長化しています。
設定時にうまく動かない場合は、SQLLogFileを眺めながら調整すると良いでしょう。
(868)