proftpdでMySQL認証

 連動用にFTPサーバを構築する必要があったんだけど、複数のFTPを共通のID/PASSで認証させる必要があった。
 認証機構を別途用意するのは要件的に微妙だったので、ユーザ情報が入っているMySQLデータベースで認証させることにしました。

 利用するFTPサーバはProFTPdです。
 こちらは、モジュールとしてmod_sql, mod_sql_mysqlを組み合わせることでMySQLで認証することが出来ます。
 CentOS6.9環境。

 標準のリポジトリにあるので、prodftpd-mysqlパッケージを導入。

 設定はproftpd.confにて・・・

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上にユーザテーブルを構築します。
 今回は既存アプリケーションのユーザ情報を利用するため、ビューで作成しました。

 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を眺めながら調整すると良いでしょう。

(805)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP]   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です