MySQL 5.6.6 の時点で、MySQL では、ユーザーアカウントのパスワード用に SHA-256 ハッシュ化が実装された認証プラグインが提供されています。
sha256_password
プラグインで認証するアカウントを使用してサーバーに接続するには、このセクションの後半で説明するように、SSL
接続または、RSA
を使用してパスワードを暗号化する単純な接続を使用する必要があります。どちらの方法でも、sha256_password
プラグインを使用するには、SSL
の機能を使用して MySQL
を構築する必要があります。セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。
次の表に、サーバー側とクライアント側のプラグイン名を示します。
表 6.10 MySQL SHA-256 認証プラグイン
サーバー側のプラグイン名 | sha256_password |
クライアント側のプラグイン名 | sha256_password |
ライブラリオブジェクトファイル名 | なし (プラグインは組み込み済み) |
サーバー側の sha256_password
プラグインはサーバーに組み込まれているため、明示的にロードする必要はなく、アンロードしても無効にすることはできません。同様に、クライアントはクライアント側のプラグインの場所を指定する必要がありません。
SHA-256 パスワードのハッシュ化を使用するアカウントを設定するには、次の手順を使用します。
-
アカウントを作成し、
sha256_password
プラグインを使用して認証するように指定します。CREATE USER 'sha256user'@'localhost' IDENTIFIED WITH sha256_password;
-
PASSWORD ()
関数でパスワード文字列の SHA-256 ハッシュ化が使用されるように、old_passwords
システム変数を 2 に設定してから、アカウントのパスワードを設定します。SET old_passwords = 2; SET PASSWORD FOR 'sha256user'@'localhost' = PASSWORD('Sh@256Pa33');
または、sha256_password
に設定されたデフォルトの認証プラグインを使用して、サーバーを起動します。たとえば、サーバーのオプションファイルに次の行を挿入します。
[mysqld]
default-authentication-plugin=sha256_password
これにより、新しいアカウント用に
sha256_password
プラグインがデフォルトで使用され、old_passwords
が 2
に設定されます。その結果、アカウント作成時に
CREATE USER
ステートメントで IDENTIFIED BY
句を使用して、パスワードを設定できます。
mysql> CREATE USER 'sha256user2'@'localhost' IDENTIFIED BY 'Sh@256Pa33';
Query OK, 0 rows affected (0.06 sec)
この場合、サーバーは
sha256_password
プラグインをアカウントに割り当て、SHA-256
を使用してパスワードを暗号化します。(もう 1
つの結果として、sha256_password
とは異なる認証プラグインを使用するアカウントを作成するには、CREATE
USER
ステートメントで IDENTIFIED
BY
句を使用して、そのプラグインを指定し、プラグインに
old_passwords
を適切に設定してから、SET
PASSWORD
を使用してアカウントのパスワードを設定する必要があります。)
old_passwords
および
PASSWORD()
についての詳細は、セクション5.1.4「サーバーシステム変数」およびセクション12.13「暗号化関数と圧縮関数」を参照してください。
sha256_password
プラグインを使用して認証する任意のアカウントのパスワードを変更するには、SET
PASSWORD
を使用する前に、old_passwords
の値が 2
になっていることを確認します。old_passwords
の値が 2
以外になっている場合は、パスワードを設定しようとするとエラーが発生します。
mysql> SET old_passwords = 0;
mysql> SET PASSWORD FOR 'sha256user'@'localhost' = PASSWORD('NewSh@256Pa33');
ERROR 1827 (HY000): The password hash doesn't have the expected format.
Check if the correct password algorithm is being used with the
PASSWORD() function.
SHA-256 のパスワードを使用する
mysql.user
テーブル内のアカウントは、plugin
カラム内の 'sha256_password'
および
authentication_string
カラム内の SHA-256
パスワードハッシュを含む行として識別できます。
MySQL は yaSSL と OpenSSL
のいずれかを使用して構築でき、sha256_password
プラグインは、いずれかのパッケージを使用して構築された配布で動作します。デフォルトは、yaSSL
を使用する方法です。代わりに OpenSSL
を使用して MySQL が構築されている場合は、RSA
暗号化が使用可能であり、次のリストに示す追加の機能が
sha256_password
に実装されます。(これらの機能を有効にするには、このセクションの後半で示す
RSA の構成手順に従う必要もあります。)
あとで説明するように、クライアント接続プロセス中に RSA 暗号化を使用すると、クライアントがサーバーにパスワードを送信できます。
サーバーは
sha256_password_private_key_path
とsha256_password_public_key_path
の 2 つの追加のシステム変数を公開します。これは、サーバーの起動時にデータベース管理者が、これらを RSA 秘密鍵と公開鍵ファイルの名前に設定するために使用されます。サーバーは、RSA 公開鍵の値を示すステータス変数
Rsa_public_key
を公開します。mysql および mysqltest クライアントプログラムでは、RSA 公開鍵ファイルを明示的に指定するための
--server-public-key-path
オプションがサポートされています。(このオプションは、--server-public-key
という名前で MySQL 5.6.6 に追加されましたが、5.6.7 で--server-public-key-path
という名前に変更されました。)
sha256_password
プラグインを使用するクライアントでは、サーバーへの接続時にパスワードがクリアテキストとして公開されません。パスワードの送信がどのように発生するのかは、SSL
接続が使用されるのかどうか、および RSA
暗号化が使用可能であるかどうかによって異なります。
SSL 接続が使用される場合、パスワードはクリアテキストとして送信されますが、接続は SSL を使用して暗号化されるため、覗き見られる可能性はありません。
SSL 接続は使用されないが、RSA 暗号化が使用可能である場合、パスワードは暗号化されていない接続内に送信されます。ただし、パスワードは覗き見られないように RSA で暗号化されます。サーバーはパスワードを受信すると、それを復号化します。繰り返し攻撃を防ぐために、スクランブルが暗号化で使用されます。
SSL 接続が使用されず、RSA 暗号化が使用可能でない場合、パスワードはクリアテキストとして公開されずに送信できないため、
sha256_password
プラグインによる接続の試行に失敗します。
すでに説明したように、RSA のパスワード暗号化は、OpenSSL を使用して MySQL が構築された場合にのみ使用可能です。yaSSL を使用して MySQL 配布を構築したということは、クライアントが SSL 接続を使用してサーバーにアクセスする際にのみ、SHA-256 のパスワードを使用できることを意味します。SSL を使用したサーバーへの接続については、セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。
次の手順では、MySQL が OpenSSL を使用して構築されたと仮定して、クライアント接続プロセス中にパスワードの RSA 暗号化を有効にする方法について説明します。
-
RSA の秘密鍵および公開鍵ファイルを作成します。MySQL サーバーを実行する際に使用されるシステムアカウントにログインしている間に、次のコマンドを実行します。これにより、ファイルはそのアカウントによって所有されます。
openssl genrsa -out mykey.pem 1024 openssl rsa -in mykey.pem -pubout -out mykey.pub
これらのコマンドでは、1,024 ビットの鍵が作成されます。より強固な鍵を作成するには、2,048 のような大きな値を使用します。
-
鍵ファイルのアクセスモードを設定します。秘密鍵は、サーバーからのみ読み取り可能にするべきです。一方で、公開鍵は、クライアントユーザーに自由に配布できます。
chmod 400 mykey.pem chmod 444 mykey.pub
-
サーバーのオプションファイルで、鍵ファイルの名前を使用して適切なシステム変数を構成します。サーバーのデータディレクトリにファイルを配置する場合は、完全パス名を指定する必要がありません。
[mysqld] sha256_password_private_key_path=mykey.pem sha256_password_public_key_path=mykey.pub
ファイルがデータディレクトリ内にない場合や、システム変数の値でそれらの場所を明示的に指定する場合は、完全パス名を使用します。
[mysqld] sha256_password_private_key_path=/usr/local/mysql/mykey.pem sha256_password_public_key_path=/usr/local/mysql/mykey.pub
-
サーバーを再起動してから、それに接続し、
Rsa_public_key
ステータス変数の値をチェックします。値はここで示すものとは異なりますが、空以外を指定するようにしてください。mysql> SHOW STATUS LIKE 'Rsa_public_key'\G *************************** 1. row *************************** Variable_name: Rsa_public_key Value: -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6 MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ g8aV7EtKwyhHb0c30QIDAQAB -----END PUBLIC KEY-----
値が空の場合は、鍵ファイルに関するいくつかの問題がサーバーで見つかっています。エラーログをチェックして、診断情報を確認してください。
サーバーに RSA
鍵ファイルが構成されると、クライアントはそれらのファイルを使用して、sha256_password
プラグインで認証するアカウントを使用したサーバーに接続できます。すでに説明したように、このようなアカウントは
SSL 接続 (この場合、RSA
が使用されません)、または RSA
を使用してパスワードを暗号化する単純な接続を使用できます。次の説明は、SSL
が使用されないことが前提となっています。サーバーに接続するために、クライアント側で特別な準備をする必要はありません。例:
shell> mysql -u sha256user -p
Enter password: Sh@256Pa33
sha256user
によって接続を試みる場合、サーバーは
sha256_password
が適切な認証プラグインであると判断し、それを呼び出します。接続で
SSL が使用されないために、RSA
暗号化を使用してパスワードを送信する必要があることがプラグインによって検出されます。RSA
公開鍵がクライアントに送信され、この鍵を使用してパスワードが暗号化され、結果がサーバーに返されます。このプラグインは、サーバー側の
RSA
鍵を使用してパスワードを復号化し、パスワードが正しいかどうかに基づいて接続を承認または拒否します。
サーバーは必要に応じて公開鍵をクライアントに送信しますが、クライアントホスト上で RSA 公開鍵のコピーが使用可能である場合は、クライアントはその鍵を使用して、クライアント/サーバープロトコルにラウンドトリップを保存できます。
shell> mysql -u sha256user -p --server-public-key-path=file_name
--server-public-key-path
オプションで指定されたファイル内の公開鍵値は、sha256_password_public_key_path
システム変数で指定されたサーバー側のファイル内の鍵値と同じにするようにしてください。鍵ファイルに有効な公開鍵値が含まれているが、その値が正しくない場合は、アクセス拒否のエラーが発生します。鍵ファイルに有効な公開鍵が含まれていない場合は、その鍵をクライアントプログラムで使用できません。この場合、サーバーは
--server-public-key-path
オプションが指定された場合と同様に、クライアントに公開鍵を送信します。
クライアントユーザーは、次の 2 つの方法で RSA 公開鍵を取得できます。
データベース管理者は、公開鍵ファイルのコピーを提供できます。
その他の方法でサーバーに接続できるクライアントユーザーは、
SHOW STATUS LIKE 'Rsa_public_key'
ステートメントを使用し、返された鍵値をファイル内に保存できます。