MySQL でユーザー作るのが面倒
ユーザーつくっても、パスワード保護があるので、MySQLとLinuxのユーザーのパスワードが一致したら嬉しいんですがね。
sambaやpostfixならできるのに、mysqlでは出来ないのかな。
プラグインで可能じゃないか
MySQLの公式プラグインだと、有料を買えって書いてあるけど、そこはGPLのコードだから、ソースを探してNEETな方法で解決できないかと探りました。
percona PAM プラグインが提供されてました。
コレを使うことで、PAM認証をMySQLのユーザー認証に使えるようです。
http://www.percona.com/doc/percona-pam-for-mysql/installation.html#compiling-from-source
注意:LinuxへのログインをMySQLのデータベースで行うPAMではありません。MySQLへのユーザー認証をPAM(/etc/shadwoやLDAP)に委譲します。LinuxのパスワードをMySQLで使える機能を提供するプラグインです。
導入は簡単
導入は簡単、プラグインを自分でコンパイルして、 pam 設定するだけ。
インストール
ビルドに必要なモジュールを追加した。
aptitude install build-essential autoconf # 殆どの開発環境にはすでに入れてる。 aptitude install checkinstall # あとでインストールに使う
aptitude install bzr libtool libmysqld-dev libpam-dev
bzr branch lp:percona-pam-for-mysql cd percona-pam-for-mysql/
インストール開始
./bootstrap
./configure make
sudo checkinstall
make install よりも今回はdebianなのでcheckinstall を選びました。checkinstall を使うときは apt install checkinstall
checkinstall を使わなくてもいけます。
checkinstall を使うときは version は自分で決めておく、name は percona-pam-for-mysql にした
インストールの確認
ls -lt $(mysql_config --plugindir) | /bin/grep pam -rwxr-xr-x 1 root root 935 3月 11 15:20 auth_pam.la -rwxr-xr-x 1 root root 12552 3月 11 15:20 auth_pam.so -rwxr-xr-x 1 root root 977 3月 11 15:20 auth_pam_compat.la -rwxr-xr-x 1 root root 12296 3月 11 15:20 auth_pam_compat.so -rwxr-xr-x 1 root root 1001 3月 11 15:20 test_auth_pam_client.la -rwxr-xr-x 1 root root 6880 3月 11 15:20 test_auth_pam_client.so
mysql のプラグインディレクトリに、auth_pam が入っていたらOK
mysql が pamプラグインを使うようにロードする
mysql -p -u root
mysqlのroot でログインして、
INSTALL PLUGIN auth_pam SONAME 'auth_pam.so'; INSTALL PLUGIN auth_pam_compat SONAME 'auth_pam_compat.so';
の2つをロードする
ロード結果の確認。
プラグインをロードした結果の確認。
mysql >show plugins; +--------------------------+----------+--------------------+--------------------+---------+ | Name | Status | Type | Library | License | +--------------------------+----------+--------------------+--------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | auth_pam | ACTIVE | AUTHENTICATION | auth_pam.so | GPL | | auth_pam_compat | ACTIVE | AUTHENTICATION | auth_pam_compat.so | GPL | +--------------------------+----------+--------------------+--------------------+---------+ 25 rows in set (0.00 sec)
インストールはここで終わり。
mysql が PAMで認証できるように設定
PAMを使って、MYSQLにログインする認証時に、/etc/shadow を使うことにした。
LDAPならまた別だろうけど、こんかいは/etc/passwd,shadow を使ってユーザー認証させる。
なので、/etc/shadow へのアクセス権を設定する
> sudo usermod -aG shadow mysql > id mysql uid=116(mysql) gid=125(mysql) groups=125(mysql),42(shadow)
mysql が shadow グループに入ってることを確認。
つぎに、shadowファイルが読み取り可能か、グループのパーミッションをカクニン。
ls -l /etc/shadow -rw-r----- 1 root shadow 2196 3月 15 22:36 /etc/shadow
PAM 設定を書く
/etc/pam.d/mysqld
@include common-auth
pamd.dに mysqldファイルを作っていっぱんてきなauth で済むように設定。
最後に、PAM認証連携挿せるユーザを作る
mysql -u root -p mysql> use mysql mysql > CREATE USER 'takuya'@'%' IDENTIFIED WITH auth_pam; mysql> flush privileges;
追加されたことを確認
mysql> use mysql mysql > select host, User, Password,plugin from user; +-----------+------------------+-------------------------------------------+----------+ | host | User | Password | plugin | +-----------+------------------+-------------------------------------------+----------+ | % | takuya | | auth_pam | +-----------+------------------+-------------------------------------------+----------+
ここまでで準備おっけ
最後に、ユーザを認証する実験をする。
$> id takuya uid=1000(takuya) gid=1000(takuya) groups=1000(takuya)
takuya ユーザがすでにいるので、同じパスで認証してみる。
$ > mysql -p -u takuya Enter password: mysql>
これで、MYSQLのユーザテーブルから、パスワードの依存関係を排除することが出来た。
これで、shadowパスワードとmysqlのパスワードを連携させることが出来てパスワードの管理だけは楽になった。
出来なかったこと。
それでも、全部のユーザをまとめてPAM経由で、MySQLを利用させることが出来ない。
毎回毎回、このユーザを初期作成が必要になるのは面倒だった。。。このへんもなんとかなれば嬉しいんですけど、
イイ方法ないんですかね。
2015-12-26 追加
auth_pam_compat について
The Percona PAM plugin authentication plugin has 2 types of plugins. The first is auth_pam plugin which is a full-featured implementation of the PAM plugin that uses the dialog plugin. The other is auth_pam_compat which uses mysql_clear_password plugin which Oracle provides.
Percona PAM は auth_pam / auth_pam_compact の2種類のプラグインを提供しているらしい。 auth_pam がフル機能、auth_pam_compact は mysql_clear_passwordへまるなげするだけ。
OSX や 他の linux ディストリのmysql から接続するには クライアントにも auth_pam が必要らしい。困った
https://www.percona.com/doc/percona-server/5.5/management/pam_plugin.html
2016-06-14 若干修正
comapt / compact をtypo してたアタリを修正
2016/10/02 修正
bzr の結果がちょっと変わったのでcd 先を変更 依存モジュールを新規インスト向けに変えた
参考資料
http://www.heitorlessa.com/mysql-pam-and-active-directory-authentication/
http://www.percona.com/doc/percona-pam-for-mysql/manual.html#creating-a-user
http://dev.mysql.com/doc/refman/5.5/en/pam-authentication-plugin.html