Amazon RDS for MySQL 8.0のデフォルト認証プラグインはmysql_native_password

2018.11.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

MySQL 8.0 になって、デフォルトのユーザー認証方式が新規に導入された caching_sha2_password に変わりました。

クライアント(libmysqlclient)も caching_sha2_password に対応した 5.7.23 以降 または 8.0 系である必要があるため、接続エラーをきっかけにこの仕様変更を知り、デフォルトの認証方式を mysql_native_password に変更して乗り切っている方も多いようです。

一方で Amazon RDS for MySQL 8.0 のデフォルトのユーザー認証は mysql_native_password のままのため、特別な対応は不要です。

今回は

  • MySQL のデフォルトのユーザー認証方式の確認方法
  • caching_sha2_password での接続方法

を調べたので、共有します。

Amazon RDS for MySQL 8.0 のデフォルト認証プラグインはmysql_native_passwordのまま

Amazon RDS for MySQL 8.0 のデフォルトのパラメータグループ「default.mysql8.0」のパラメータ default_authentication_plugin を確認すると

  • mysql_native_password
  • Modifiable : false

となっていました。

つまり、デフォルトの認証方式はこれまでと同じ mysql_native_password のままで、デフォルト値を変えることもできません。

Amazon RDS for MySQL 8.0 を作成し、サーバーに接続して実際に確認します。

mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
+-------------------------------+-----------------------+
1 row in set (0.01 sec)

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| username         | %         | mysql_native_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| rdsadmin         | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

確かにデフォルトの認証プラグインは mysql_native_password で、初期ユーザーの認証プラグインも mysql_native_password です。

caching_sha2_password 認証してみる

認証プラグインに caching_sha2_password を利用するユーザーを作成し、認証してみます。

caching_sha2_password 認証のユーザーを作成

認証プラグインはユーザーごとに個別に設定可能です。

試しに caching_sha2_password 認証を利用するユーザーを作成します。 IDENTIFIED WITH caching_sha2_password を明示的に指定します。

mysql> CREATE USER caching_sha2 IDENTIFIED WITH caching_sha2_password by 'password';
Query OK, 0 rows affected (0.07 sec)

mysql> SELECT user, host, plugin FROM mysql.user where user = 'caching_sha2';
+--------------+------+-----------------------+
| user         | host | plugin                |
+--------------+------+-----------------------+
| caching_sha2 | %    | caching_sha2_password |
+--------------+------+-----------------------+
1 row in set (0.00 sec)

caching_sha2_password 認証の通信要件

caching_sha2_password 認証は、名前の通り、認証結果をキャッシュします。

初回接続時のようにキャッシュがない場合、 SSL 通信または RSA 暗号によるパスワードの交換が必要です。SSL 通信方式の方が推奨されています。

認証情報がいったんキャシュされると、チャレンジ・レスポンススタイルの高速な認証が行われます。

※図は「MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password」から

以下ではキャッシュがない前提での caching_sha2_password 認証を試します。

準備:MySQL クライアントのバージョンを上げる

caching_sha2_password 認証に絡むハンドシェイクのクライアント処理はライブラリ libmysqlclient が担っています。

MySQL 8.0 より古いクライアント(libmysqlclient)は caching_sha2_password に対応していないため、caching_sha2_password 認証を試みると、以下の様なエラーが発生します。

$ mysql -h HOST -u caching_sha2 -p
Enter password:
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

MySQL クライアントを

  • 5.7.23 以降
  • 8.0 系

にアップグレードしてください。

In MySQL 5.7, the default authentication plugin is mysql_native_password. As of MySQL 8.0, the default authentication plugin is changed to caching_sha2_password. To enable MySQL 5.7 clients to connect to 8.0 and higher servers using accounts that authenticate with caching_sha2_password, the MySQL 5.7 client library and client programs now support the caching_sha2_password client-side authentication plugin. This improves MySQL 5.7 client connect-capability compatibility with respect to MySQL 8.0 and higher servers, despite the differences in default authentication plugin. For more information, see Caching SHA-2 Pluggable Authentication.

https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-23.html#mysqld-5-7-23-security

5.7系でも対応していることをご指摘いただきました。

SSL 通信を試す

mysql コマンドは、デフォルトで SSL 通信を試し、 RDS インスタンスも SSL 通信に対応しています。

そのため、特別なオプションを与えることなく接続しても、 caching_sha2_password 認証できます。

$ mysql -h $HOST -u caching_sha2 -p
Enter password:
...
mysql>

非 SSL 通信を試す

SSL 通信しないオプションを渡し(--ssl-mode=DISABLED)、サーバーに接続してみます。

$ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p
Enter password:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

"Authentication requires secure connection." というエラーが発生しました。

非 SSL 通信で RSA 暗号を試す

非 SSL 通信であっても、RSA 暗号方式でセキュアにパスワード交換すれば caching_sha2_password 認証できます。

RDS for MySQL はこの方式にも対応しています。

  1. サーバー接続時に公開鍵を要求
  2. サーバー接続時に公開鍵を送信

の2方式があります。

1. サーバーに公開鍵を要求

サーバー接続時に --get-server-public-key オプションを渡すと、RSA 暗号用の公開鍵をサーバーに要求できます。 オンデマンドで取得した公開鍵を利用して RSA 暗号します。

$ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p \
  --get-server-public-key
Enter password:
...
mysql>

2. クライアントから公開鍵を送信

RSA 暗号用の公開鍵をクライアントに事前配布可能な場合、サーバー接続時にその公開鍵を渡す事もできます。

RDS for MySQL では、公開鍵は STATUS コマンド結果から確認できます。

mysql> SHOW GLOBAL STATUS LIKE '%RSA%' \G
*************************** 1. row ***************************
Variable_name: Caching_sha2_password_rsa_public_key
        Value: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS
BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M
xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6
2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C
Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH
9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z
UwIDAQAB
-----END PUBLIC KEY-----

*************************** 2. row ***************************
Variable_name: Rsa_public_key
        Value: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS
BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M
xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6
2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C
Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH
9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z
UwIDAQAB
-----END PUBLIC KEY-----

2 rows in set (0.00 sec)
  • Caching_sha2_password_rsa_public_keycaching_sha2_password 認証
  • Rsa_public_keysha256_password 認証

で利用される公開鍵です。

この公開鍵を引数 --server-public-key-path で渡して接続します。

$ cat Caching_sha2_password_rsa_public_key.pub
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXFdHu/ESnkK27hfRoKS
BL0NDwC22AYE8UIHGXc02rB+5/F9uBbCxHnN7gRzZSa3AXHRIMHFSZUspBZhU+8M
xDrq7TIjXchloRVSMJSIl2RMN/dDGPZqDfrmGlqvqlRoQEXLn6VcUG3Gm9gO2iq6
2lv40jhFfKhAJPgHnojqoycaSx4mI4FC4LS7NZY3+IXUL+rliICgf9B4xps4WJ4C
Skhv75pjY/eNfDt9cBGQh0XjtpyhjmxJ1uDInwIvhxkA6SK+1oEXDnYjOp662TzH
9XUKaAb/40qhsV/jrBsrT0CHQ1XKeXoQK5HoIQvLrbg1Ae+7OIS/eV+rDMK59t3Z
UwIDAQAB
-----END PUBLIC KEY-----

$ mysql --ssl-mode=DISABLED -h $HOST -u caching_sha2 -p \
  --server-public-key-path=Caching_sha2_password_rsa_public_key.pub
...
mysql>

無事接続できました。

認証プラグインを変更する

ユーザーの認証プラグインを変更することもできます。

次の SQL 文は、ユーザー「user」の認証プラグインを「caching_sha2_password」に変更し、そのパスワードを「password」に変更します。

mysql> ALTER USER user IDENTIFIED WITH caching_sha2_password BY 'password';

認証方式によってソルトの管理が異なったりするため、認証方式だけでなく、パスワードも忘れずに指定してください。

最後に

MySQL 8.0 からデフォルトの認証プラグインが caching_sha2_password に変更されました。 caching_sha2_password は 8.0 で新規に導入された認証方式であり、この認証を利用するには、サーバーとクライアントの双方が対応している必要があります。 レプリケーションも例外ではありません。

一方で Amazon RDS for MySQL 8.0 のデフォルトの認証プラグインは従来どおり mysql_native_password のため、5.* 系と同様に運用できます。

自前運用 MySQL 8.0 を RDS へ移行する際には、認証プラグインのデフォルト方式の違いにご注意ください。

それでは。

参考