クライアントが MySQL
サーバーに接続すると、サーバーはクライアントおよびクライアントホストで提供されたユーザー名を使用して、mysql.user
テーブルから適切なアカウント行を選択します。そのあと、サーバーは認証プラグインでクライアントに適用されるアカウント行から決定することで、クライアントを認証します。
アカウント行にプラグインが指定されている場合、サーバーはそれを呼び出すことで、ユーザーを認証します。サーバーがプラグインを検出できない場合は、エラーが発生します。
アカウント行にプラグイン名が指定されていない場合、
Password
カラム内のパスワードハッシュ値でネイティブのハッシュ化方式と、4.1 よりも前の古いハッシュ化方式のどちらが使用されているのかに応じて、サーバーはmysql_native_password
とmysql_old_password
のいずれかのプラグインを使用してアカウントを認証します。クライアントは、アカウント行のPassword
カラム内のパスワードと一致する必要があります。
ユーザーが接続を許可されているかどうかを示すステータスがプラグインからサーバーに返されます。
プラガブル認証を使用すると、次の 2 つの重要な機能が有効になります。
外部認証: プラガブル認証を使用すると、
mysql.user
テーブルに格納されているパスワードに基づいたネイティブ認証以外の認証方式に適した証明書を使用して、クライアントが MySQL サーバーに接続できます。たとえば、PAM、Windows のログイン ID、LDAP、Kerberos などの外部認証方式を使用するプラグインを作成できます。プロキシユーザー: ユーザーが接続を許可されている場合、接続中のユーザーが別のユーザーのプロキシであることを示すために、認証プラグインは接続中のユーザーの名前と異なるユーザー名をサーバーに返すことができます。接続が存続している間は、アクセス制御のために、プロキシユーザーは別のユーザーの権限を持っているものとして処理されます。実際に、あるユーザーは別のユーザーを偽装します。詳細については、セクション6.3.9「プロキシユーザー」を参照してください。
MySQL では、複数の認証プラグインが使用可能です。
アカウント行の
Password
カラムと照合してパスワードを一致させるネイティブ認証を実行するプラグイン。mysql_native_password
プラグインには、ネイティブのパスワードハッシュ化方式に基づいた認証が実装されています。mysql_old_password
プラグインには、古い (4.1 よりも前の) パスワードハッシュ化方式 (現在は非推奨です) に基づいたネイティブ認証が実装されています。セクション6.3.8.1「ネイティブ認証プラグイン」およびセクション6.3.8.2「古いネイティブ認証プラグイン」を参照してください。サーバーの起動時に--default-authentication-plugin
オプションが設定されている場合を除き、mysql_native_password
を使用したネイティブ認証が新しいアカウントのデフォルトです。SHA-256 のパスワードハッシュ化を使用して認証を実行するプラグイン。このプラグインは、アカウント行の
authentication_string
カラムと照合してパスワードを一致させます。これは、ネイティブ認証で実現できるよりも強力な暗号化です。セクション6.3.8.4「SHA-256 認証プラグイン」を参照してください。PAM (Pluggable Authentication Module) と照合して外部認証を実行するプラグイン。これを使用すると、MySQL サーバーが PAM を使用して MySQL ユーザーを認証できます。このプラグインでは、プロキシユーザーもサポートされています。セクション6.3.8.5「PAM 認証プラグイン」を参照してください。
Windows で外部認証を実行するプラグイン。これを使用すると、MySQL サーバーがネイティブの Windows サービスを使用して、クライアント接続を認証できます。Windows にログインしたユーザーは、追加のパスワードを指定せずに、自分の環境内の情報に基づいて MySQL クライアントプログラムからサーバーに接続できます。このプラグインでは、プロキシユーザーもサポートされています。セクション6.3.8.6「Windows ネイティブ認証プラグイン」を参照してください。
ハッシュ化または暗号化を行わずに、サーバーにパスワードを送信するクライアント側のプラグイン。このプラグインは、クライアントユーザーから提供されたものとまったく同じパスワードにアクセスする必要があるサーバー側のプラグインで使用できます。セクション6.3.8.7「クライアント側のクリアテキスト認証プラグイン」を参照してください。
Unix ソケットファイルを使用してローカルホストから接続するクライアントを認証するプラグイン。セクション6.3.8.8「ソケットピア証明書認証プラグイン」を参照してください。
MySQL のネイティブ認証を使用して認証するテストプラグイン。このプラグインは、テストおよび開発のために、認証プラグインを作成する方法を示す例として使用されます。セクション6.3.8.9「テスト認証プラグイン」を参照してください。
プラガブル認証の使用に対する現在の制約 (どのコネクタがどのプラグインをサポートしているのかなど) については、セクションD.9「プラガブルな認証の制約」を参照してください。
サードパーティー製コネクタの開発者は、コネクタがプラガブル認証機能を活用できる範囲と、より準拠させるために実行する手順を確認するために、そのセクションを読むべきです。
独自の認証プラグインを作成することに関心がある場合は、セクション24.2.4.9「認証プラグインの作成」を参照してください。
認証プラグインの使用手順
このセクションでは、認証プラグインをインストールおよび使用するための一般的な手順を示します。
通常、プラガブル認証では、サーバー側とクライアント側で対応するプラグインが使用されます。そのため、次のような特定の認証方式を使用します。
サーバーホストでは、必要に応じて、適切なサーバープラグインを含むライブラリをインストールします。これにより、サーバーはこれを使用して、クライアント接続を認証できます。同様に、各クライアントホストでは、クライアントプログラムで使用される適切なクライアントプラグインを含むライブラリをインストールします。
認証用のプラグインの使用を指定する MySQL アカウントを作成します。
クライアントが接続すると、サーバープラグインからクライアントプログラムに、認証に使用されるクライアントプラグインが指示されます。
ここで示す指示では、MySQL 配布に含まれるサンプルの認証プラグインが使用されています (セクション6.3.8.9「テスト認証プラグイン」を参照してください)。この手順は、その他の認証プラグインに似ています。適切なプラグインとファイル名に置き換えてください。
サンプルの認証プラグインには、次のような特性があります。
サーバー側のプラグイン名は
test_plugin_server
です。クライアント側のプラグイン名は
auth_test_plugin
です。どちらのプラグインも、プラグインディレクトリ (
plugin_dir
システム変数で指定されたディレクトリ) 内のauth_test_plugin.so
という名前の共有ライブラリオブジェクトファイルに配置されています。ファイル名のサフィクスは、システムによって異なる場合があります。
次のように、サンプルの認証プラグインをインストールして使用します。
サーバーホストおよびクライアントホスト上に、プラグインライブラリがインストールされていることを確認します。
-
サーバーの起動時または実行時に、サーバー側のテストプラグインをインストールします。
-
起動時にプラグインをインストールするには、
--plugin-load
オプションを使用します。このプラグインのロード方式では、サーバーを起動するたびにオプションを指定する必要があります。たとえば、my.cnf
オプションファイル内で次の行を使用します。[mysqld] plugin-load=test_plugin_server=auth_test_plugin.so
-
実行時にプラグインをインストールするには、
INSTALL PLUGIN
ステートメントを使用します。mysql> INSTALL PLUGIN test_plugin_server SONAME 'auth_test_plugin.so';
これにより、プラグインが永続的にインストールされるため、1 回しか実行する必要がありません。
-
-
プラグインがインストールされていることを確認します。たとえば、
SHOW PLUGINS
を使用します。mysql> SHOW PLUGINS\G ... *************************** 21. row *************************** Name: test_plugin_server Status: ACTIVE Type: AUTHENTICATION Library: auth_test_plugin.so License: GPL
プラグインをチェックするためのその他の方法については、セクション5.1.8.2「サーバープラグイン情報の取得」を参照してください。
-
特定のサーバープラグインを使用して MySQL ユーザーを認証する必要があることを指定するには、ユーザーを作成する
CREATE USER
ステートメントのIDENTIFIED WITH
句にプラグインの名前を指定します。CREATE USER 'testuser'@'localhost' IDENTIFIED WITH test_plugin_server;
-
クライアントプログラムを使用して、サーバーに接続します。テストプラグインは、ネイティブの MySQL 認証と同じ方法で認証を実行します。したがって、サーバーに接続する際に一般的に使用される通常の
--user
および--password
オプションを指定します。例:shell> mysql --user=your_name --password=your_pass
testuser
による接続の場合、サーバーはtest_plugin_server
という名前のサーバー側のプラグインを使用してアカウントを認証する必要があることを認識し、クライアント側のプラグイン (この場合、auth_test_plugin
) を使用する必要のあるクライアントプログラムと通信します。アカウントがサーバープログラムとクライアントプログラムの両方のデフォルトである認証方式を使用する場合、サーバーはプラグインを使用するクライアントと通信する必要がなく、クライアントとサーバーのネゴシエーションでラウンドトリップが発生することを回避できます。現在、これはネイティブの MySQL 認証 (
mysql_native_password
) を使用するアカウントに適用されます。mysql コマンド行で
--default-auth=
オプションを指定すると、プログラムで使用するように要求できるクライアント側のプラグインを明示的に作成できます。ただし、ユーザーアカウントが別のプラグインを要求した場合、これはサーバーによってオーバーライドされます。plugin_name
クライアントプログラムでプラグインが見つからない場合は、プラグインが配置されている場所を示す
--plugin-dir=
オプションを指定します。dir_name
--skip-grant-tables
オプションを付けてサーバーを起動した場合、サーバーはクライアント認証を実行せず、任意のクライアントが接続することを許可するため、認証プラグインはロードされたとしても使用されません。これはセキュアではないため、リモートクライアントによる接続を回避するために、--skip-networking
と組み合わせて
--skip-grant-tables
を使用する必要がある場合もあります。