MySQL には、ユーザーアカウントパスワードの SHA-256 ハッシングを実装する次の 2 つの認証プラグインが用意されています:
sha256_password
: 基本 SHA-256 認証を実装します。caching_sha2_password
: SHA-256 認証 (sha256_password
など) を実装しますが、パフォーマンスを向上させるためにサーバー側でキャッシュを使用し、適用性を高めるための追加機能を備えています。
このセクションでは、元の非キャッシュ SHA-2 認証プラグインについて説明します。 キャッシングプラグインの詳細は、セクション6.4.1.2「SHA-2 プラガブル認証のキャッシュ」 を参照してください。
MySQL 8.0 では、caching_sha2_password
が mysql_native_password
ではなくデフォルトの認証プラグインです。 サーバー操作に対するこの変更の影響、およびサーバーとクライアントおよびコネクタとの互換性の詳細は、優先認証プラグインとしての caching_sha2_password を参照してください。
caching_sha2_password
は MySQL 8.0 のデフォルトの認証プラグインであり、sha256_password
認証プラグインの機能のスーパーセットを提供するため、sha256_password
は非推奨になりました。将来のバージョンの MySQL で削除される予定です。 sha256_password
を使用して認証する MySQL アカウントは、かわりに caching_sha2_password
を使用するように移行する必要があります。
sha256_password
プラグインで認証されるアカウントを使用してサーバーに接続するには、このセクションで後述するように、RSA キーペアを使用したパスワード交換をサポートする TLS 接続または暗号化されていない接続を使用する必要があります。 どちらの方法でも、sha256_password
プラグインは MySQL 暗号化機能を使用します。 セクション6.3「暗号化された接続の使用」を参照してください。
sha256_password
という名前の 「sha256」 は、プラグインが暗号化に使用する 256 ビットのダイジェスト長を表します。 caching_sha2_password
という名前では、「sha2」 はより一般的に暗号化アルゴリズムの SHA-2 クラスを指し、256 ビット暗号化は 1 つのインスタンスです。 後者の名前を選択すると、プラグイン名を変更せずに、可能性のあるダイジェスト長を将来拡張するための領域が残されます。
次の表に、サーバー側とクライアント側のプラグイン名を示します。
表 6.14 SHA-256 認証用のプラグインおよびライブラリ名
プラグインまたはファイル | プラグインまたはファイル名 |
---|---|
サーバー側プラグイン | sha256_password |
クライアント側プラグイン | sha256_password |
ライブラリファイル | なし (プラグインは組み込み済み) |
次の各セクションでは、SHA-256 プラガブル認証に固有のインストールおよび使用方法について説明します:
MySQL のプラガブル認証に関する一般的な情報については、セクション6.2.17「プラガブル認証」を参照してください。
sha256_password
プラグインは、サーバーおよびクライアントフォームに存在します:
サーバー側のプラグインはサーバーに組み込まれているため、明示的にロードする必要はなく、アンロードしても無効にすることができません。
クライアント側プラグインは
libmysqlclient
クライアントライブラリに組み込まれており、libmysqlclient
に対してリンクされているすべてのプログラムで使用できます。
SHA-256 パスワードハッシュ用の sha256_password
プラグインを使用するアカウントを設定するには、次のステートメントを使用します。ここで、password
は目的のアカウントパスワードです:
CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password BY 'password';
サーバーは sha256_password
プラグインをアカウントに割り当て、それを使用して SHA-256 を使用してパスワードを暗号化し、mysql.user
システムテーブルの plugin
および authentication_string
カラムにそれらの値を格納します。
前述の手順では、sha256_password
がデフォルトの認証プラグインであると想定していません。 sha256_password
がデフォルトの認証プラグインである場合は、より単純な CREATE USER
構文を使用できます。
デフォルトの認証プラグインを sha256_password
に設定してサーバーを起動するには、サーバーオプションファイルに次の行を入力します:
[mysqld]
default_authentication_plugin=sha256_password
これにより、sha256_password
プラグインが新しいアカウントにデフォルトで使用されます。 その結果、プラグインに明示的に名前を付けずに、アカウントを作成してそのパスワードを設定できます:
CREATE USER 'sha256user'@'localhost' IDENTIFIED BY 'password';
default_authentication_plugin
を sha256_password
に設定した場合の別の結果は、アカウントの作成に他のプラグインを使用するには、そのプラグインを明示的に指定する必要があることです。 たとえば、mysql_native_password
プラグインを使用するには、次のステートメントを使用します:
CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';
sha256_password
は、セキュアなトランスポートを介した接続をサポートしています。sha256_password
では、MySQL が OpenSSL を使用してコンパイルされ、接続先の MySQL サーバーが RSA をサポートするように構成されている場合 (このセクションの後半で説明する RSA 構成手順を使用)、RSA over unencrypted 接続を使用した暗号化パスワード交換もサポートされます。
RSA サポートには、次の特性があります:
サーバー側では、RSA 秘密キーペアファイルと公開キーペアファイルに 2 つのシステム変数が指定されます:
sha256_password_private_key_path
およびsha256_password_public_key_path
。 使用するキーファイルの名前がシステム変数のデフォルト値と異なる場合、データベース管理者はサーバーの起動時にこれらの変数を設定する必要があります。サーバーは、
sha256_password_auto_generate_rsa_keys
システム変数を使用して RSA キーペアファイルを自動的に生成するかどうかを決定します。 セクション6.3.3「SSL および RSA 証明書とキーの作成」を参照してください。Rsa_public_key
ステータス変数には、sha256_password
認証プラグインで使用される RSA 公開キーの値が表示されます。RSA 公開鍵を所有しているクライアントは、あとで説明するように、接続プロセス中にサーバーと RSA 鍵ペアベースのパスワード交換を実行できます。
-
sha256_password
および RSA 公開キーペアベースのパスワード交換で認証されるアカウントによる接続の場合、サーバーは必要に応じて RSA 公開キーをクライアントに送信します。 ただし、公開鍵のコピーがクライアントホストで使用可能な場合、クライアントはそれを使用してラウンドトリップをクライアント/サーバープロトコルに保存できます:これらのコマンドラインクライアントでは、
--server-public-key-path
オプションを使用して RSA 公開キーファイルを指定: mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, mysqltest, mysql_upgrade。C API を使用するプログラムの場合は、
mysql_options()
をコールし、MYSQL_SERVER_PUBLIC_KEY
オプションとファイル名を渡して RSA 公開キーファイルを指定します。レプリカの場合は、
SOURCE_PUBLIC_KEY_PATH
|MASTER_PUBLIC_KEY_PATH
オプションを指定して (MySQL 8.0.23 の)CHANGE REPLICATION SOURCE TO
ステートメントまたは (MySQL 8.0.23 の前の)CHANGE MASTER TO
ステートメントを使用し、RSA 公開キーファイルを指定します。 Group Replication の場合、group_replication_recovery_get_public_key
システム変数は同じ目的で機能します。
sha256_password
プラグインを使用するクライアントでは、サーバーへの接続時にパスワードがクリアテキストとして公開されません。 パスワード転送の方法は、セキュアな接続と RSA 暗号化のどちらを使用するかによって異なります:
-
接続がセキュアな場合、RSA キーペアは不要であり、使用されません。 これは TLS を使用して暗号化された接続に適用されます。 パスワードはクリアテキストとして送信されますが、接続がセキュアであるためスヌープできません。
注記caching_sha2_password
とは異なり、共有メモリートランスポートはデフォルトでセキュアですが、sha256_password
プラグインは共有メモリー接続をセキュアとして扱いません。 接続がセキュアでなく、RSA キーペアが使用可能な場合、接続は暗号化されません。 これは TLS を使用して暗号化されていない接続に適用されます。 RSA は、パスワードのスヌーピングを防ぐために、クライアントとサーバー間のパスワード交換にのみ使用されます。 サーバーは、暗号化されたパスワードを受信すると復号化します。 繰り返し攻撃を防ぐために、スクランブルが暗号化で使用されます。
セキュアな接続が使用されておらず、RSA 暗号化が使用できない場合、クリアテキストとして公開されていないとパスワードを送信できないため、接続の試行は失敗します。
RSA パスワード暗号化を sha256_password
で使用するには、クライアントとサーバーの両方が、いずれか一方のみでなく、OpenSSL を使用してコンパイルされている必要があります。
MySQL が OpenSSL を使用してコンパイルされている場合は、次の手順を使用して、クライアント接続プロセス中にパスワード交換に RSA キーペアを使用できるようにします:
セクション6.3.3「SSL および RSA 証明書とキーの作成」 の手順を使用して RSA 秘密キーと公開キーのペアのファイルを作成します。
-
秘密キーファイルと公開キーファイルがデータディレクトリにあり、
private_key.pem
およびpublic_key.pem
(sha256_password_private_key_path
およびsha256_password_public_key_path
システム変数のデフォルト値) という名前である場合、サーバーはそれらを起動時に自動的に使用します。それ以外の場合、キーファイルに明示的に名前を付けるには、システム変数をサーバーオプションファイルのキーファイル名に設定します。 ファイルがサーバーデータディレクトリにある場合、ファイルのフルパス名を指定する必要はありません:
[mysqld] sha256_password_private_key_path=myprivkey.pem sha256_password_public_key_path=mypubkey.pem
キーファイルがデータディレクトリに配置されていない場合、またはキーファイルの場所をシステム変数値で明示的にする場合は、フルパス名を使用します:
[mysqld] sha256_password_private_key_path=/usr/local/mysql/myprivkey.pem sha256_password_public_key_path=/usr/local/mysql/mypubkey.pem
-
サーバーを再起動してから、それに接続し、
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
プラグインで認証されるアカウントには、これらのキーファイルを使用してサーバーに接続するオプションがあります。 前述のように、このようなアカウントでは、セキュアな接続 (RSA が使用されない場合) または RSA を使用してパスワード交換を実行する暗号化されていない接続のいずれかを使用できます。 暗号化されていない接続が使用されるとします。 例:
shell> mysql --ssl-mode=DISABLED -u sha256user -p
Enter password: password
sha256user
によるこの接続試行の場合、サーバーは sha256_password
が適切な認証プラグインであると判断し、それを呼び出します (CREATE USER
時に指定されたプラグインであるため)。 プラグインは、接続が暗号化されていないことを検出したため、RSA 暗号化を使用してパスワードを送信する必要があります。 この場合、プラグインは RSA 公開鍵をクライアントに送信し、クライアントはこの鍵を使用してパスワードを暗号化し、その結果をサーバーに返します。 プラグインは、サーバー側で RSA 秘密キーを使用してパスワードを復号化し、パスワードが正しいかどうかに基づいて接続を受け入れるか拒否します。
サーバーは、必要に応じて RSA 公開鍵をクライアントに送信します。 ただし、サーバーで必要な RSA 公開キーのローカルコピーを含むファイルがクライアントにある場合は、--server-public-key-path
オプションを使用してファイルを指定できます:
shell> mysql --ssl-mode=DISABLED -u sha256user -p --server-public-key-path=file_name
Enter password: password
--server-public-key-path
オプションで指定されたファイル内の公開鍵値は、sha256_password_public_key_path
システム変数で指定されたサーバー側のファイル内の鍵値と同じにするようにしてください。 鍵ファイルに有効な公開鍵値が含まれているが、その値が正しくない場合は、アクセス拒否のエラーが発生します。 鍵ファイルに有効な公開鍵が含まれていない場合は、その鍵をクライアントプログラムで使用できません。 この場合、sha256_password
プラグインは、--server-public-key-path
オプションが指定されていないかのように公開鍵をクライアントに送信します。
クライアントユーザーは、次の 2 つの方法で RSA 公開キーを取得できます:
データベース管理者は、公開鍵ファイルのコピーを提供できます。
その他の方法でサーバーに接続できるクライアントユーザーは、
SHOW STATUS LIKE 'Rsa_public_key'
ステートメントを使用し、返された鍵値をファイル内に保存できます。