Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


6.3.8.4 SHA-256 認証プラグイン

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 パスワードのハッシュ化を使用するアカウントを設定するには、次の手順を使用します。

  1. アカウントを作成し、sha256_password プラグインを使用して認証するように指定します。

    CREATE USER 'sha256user'@'localhost' IDENTIFIED WITH sha256_password;
  2. 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_pathsha256_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 暗号化を有効にする方法について説明します。

  1. RSA の秘密鍵および公開鍵ファイルを作成します。MySQL サーバーを実行する際に使用されるシステムアカウントにログインしている間に、次のコマンドを実行します。これにより、ファイルはそのアカウントによって所有されます。

    openssl genrsa -out mykey.pem 1024
    openssl rsa -in mykey.pem -pubout -out mykey.pub

    これらのコマンドでは、1,024 ビットの鍵が作成されます。より強固な鍵を作成するには、2,048 のような大きな値を使用します。

  2. 鍵ファイルのアクセスモードを設定します。秘密鍵は、サーバーからのみ読み取り可能にするべきです。一方で、公開鍵は、クライアントユーザーに自由に配布できます。

    chmod 400 mykey.pem
    chmod 444 mykey.pub
  3. サーバーのオプションファイルで、鍵ファイルの名前を使用して適切なシステム変数を構成します。サーバーのデータディレクトリにファイルを配置する場合は、完全パス名を指定する必要がありません。

    [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
  4. サーバーを再起動してから、それに接続し、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' ステートメントを使用し、返された鍵値をファイル内に保存できます。


User Comments
Sign Up Login You must be logged in to post a comment.