このセクションでは、パスワード検証サーバープラグインを作成する方法について説明します。この手順は、MySQL ソース配布の plugin/password_validation
ディレクトリにあるソースコードに基づいています。そのディレクトリ内にある validate_password.cc
ソースファイルは、validate_password
という名前のプラグインを実装します。
パスワード検証プラグインを作成するには、プラグインのソースファイルに次のヘッダーファイルをインクルードします。プラグインの機能および要件によっては、ほかの MySQL のヘッダーファイルまたは一般的なヘッダーファイルが必要になることもあります。
#include <mysql/plugin_validate_password.h>
plugin_validate_password.h
は plugin.h
をインクルードするため、後者のファイルを明示的にインクルードする必要はありません。plugin.h
は MYSQL_VALIDATE_PASSWORD_PLUGIN
サーバープラグインタイプとプラグインを宣言するために必要なデータ構造体を定義します。plugin_validate_password.h
は、パスワード検証プラグインに固有のデータ構造体を定義します。
パスワード検証プラグインには、ほかの MySQL サーバープラグインと同じように一般プラグインディスクリプタがあります (セクション24.2.4.2.1「サーバープラグインライブラリおよびプラグインディスクリプタ」を参照してください)。validate_password.cc
では、一般ディスクリプタは次のようになります。
mysql_declare_plugin(validate_password)
{
MYSQL_VALIDATE_PASSWORD_PLUGIN, /* type */
&validate_password_descriptor, /* descriptor */
"validate_password", /* name */
"Oracle Corporation", /* author */
"check password strength", /* description */
PLUGIN_LICENSE_GPL,
validate_password_init, /* init function (when loaded) */
validate_password_deinit, /* deinit function (when unloaded) */
0x0100, /* version */
NULL,
validate_password_system_variables, /* system variables */
NULL,
0,
}
mysql_declare_plugin_end;
name
メンバー (validate_password
) は、INSTALL PLUGIN
、UNINSTALL PLUGIN
などのステートメントでプラグインを参照するために使用する名前を指定します。これは INFORMATION_SCHEMA.PLUGINS
または SHOW PLUGINS
によって表示される名前でもあります。
一般ディスクリプタは、SHOW VARIABLES
ステートメントに対してさまざまなステータス変数を公開する構造体である validate_password_system_variables
も参照します。
static struct st_mysql_sys_var* validate_password_system_variables[]= {
MYSQL_SYSVAR(length),
MYSQL_SYSVAR(number_count),
MYSQL_SYSVAR(mixed_case_count),
MYSQL_SYSVAR(special_char_count),
MYSQL_SYSVAR(policy),
MYSQL_SYSVAR(dictionary_file),
NULL
};
validate_password_init
初期化関数は辞書ファイルを読み取り (指定されている場合)、validate_password_deinit
関数はそのファイルに関連付けられているデータ構造体を解放します。
一般ディスクリプタの validate_password_descriptor
値はタイプ固有のディスクリプタを指しています。パスワード検証プラグインの場合、このディスクリプタの構造体は次のようになります。
struct st_mysql_validate_password
{
int interface_version;
/*
This function returns TRUE for passwords which satisfy the password
policy (as chosen by plugin variable) and FALSE for all other
password
*/
int (*validate_password)(mysql_string_handle password);
/*
This function returns the password strength (0-100) depending
upon the policies
*/
int (*get_password_strength)(mysql_string_handle password);
};
タイプ固有のディスクリプタには次のメンバーがあります。
interface_version
: 規則により、タイプ固有のプラグインディスクリプタは、特定のプラグインタイプのインタフェースバージョンで始まります。サーバーはプラグインをロードするときにinterface_version
を検査し、プラグインと互換性があるかどうかを確認します。パスワード検証プラグインの場合、interface_version
メンバーの値はMYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION
(plugin_validate_password.h
で定義されます) です。validate_password
: パスワードが現在のパスワードポリシーを満たしているかどうかをテストするためにサーバーが呼び出す関数。パスワードが妥当な場合は 1 を返し、そうでない場合は 0 を返します。引数はパスワードであり、mysql_string_handle
値として渡されます。このデータ型はmysql_string
サーバーサービスによって実装されます。詳細は、sql
ディレクトリ内のstring_service.h
およびstring_service.cc
のソースファイルを参照してください。get_password_strength
: パスワードの強さを評価するためにサーバーが呼び出す関数。これは 0 (弱い) から 100 (強い) までの値を返します。引数はパスワードであり、mysql_string_handle
値として渡されます。
validate_password
プラグインの場合、タイプ固有のディスクリプタは次のようになります。
static struct st_mysql_validate_password validate_password_descriptor=
{
MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION,
validate_password, /* validate function */
get_password_strength /* validate strength function */
};
プラグインライブラリのオブジェクトファイルをコンパイルおよびインストールするには、セクション24.2.4.3「プラグインライブラリのコンパイルおよびインストール」の手順を使用します。ライブラリファイルを使用するには、ライブラリファイルがプラグインディレクトリ (plugin_dir
システム変数で指定されているディレクトリ) にインストールされている必要があります。validate_password
プラグインの場合、MySQL をソースからビルドするときにコンパイルおよびインストールされます。これはバイナリ配布にも含められます。ビルド処理では、validate_password.so
という名前の共有オブジェクトライブラリが生成されます (拡張子はプラットフォームによって異なる場合があります)。
プラグインを実行時に登録するには、次のステートメントを使用します (必要に応じて拡張子を変更します)。
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
プラグインのロードについての追加情報は、セクション5.1.8.1「プラグインのインストールおよびアンインストール」を参照してください。
プラグインのインストールを検証するには、INFORMATION_SCHEMA.PLUGINS
テーブルを調査するか、SHOW PLUGINS
ステートメントを使用します。
validate_password
プラグインがインストールされている間、プラグインはパスワード検査パラメータを示すシステム変数を公開します。
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+--------------------------------------+--------+
これらの変数の説明については、セクション6.1.2.6.2「パスワード検証プラグインのオプションおよび変数」を参照してください。
プラグインをテスト後に無効にするには、次のステートメントを使用してプラグインをアンロードします。
mysql> UNINSTALL PLUGIN validate_password;