それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MySQLのユーザーをPAM認証(/etc/shadow)をつかってパスワードログインする

MySQL でユーザー作るのが面倒

ユーザーつくっても、パスワード保護があるので、MySQLLinuxのユーザーのパスワードが一致したら嬉しいんですがね。

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/blog/2013/08/14/getting-percona-pam-to-work-with-percona-server-its-client-apps/

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