MySQL 8.0 リファレンスマニュアル


6.4.4.10 汎用キーリングキー管理関数

MySQL Server は、内部コンポーネントおよびプラグインが機密情報を安全に格納して後で取得できるようにするキーリングサービスをサポートしています。

MySQL Server には、キーリングキー管理用の SQL インタフェースも含まれており、内部キーリングサービスによって提供される関数にアクセスする一連の汎用ユーザー定義関数 (UDF) として実装されています。 キーリング UDF はプラグインライブラリファイルに含まれており、UDF を起動する前に有効にする必要がある keyring_udf プラグインも含まれています。 これらの UDF を使用するには、keyring_filekeyring_okv などのキーリングプラグインを有効にする必要があります。

ここで説明する UDF は一般的な目的であり、任意のキーリングプラグインでの使用を目的としています。 特定のキーリングプラグインには、そのプラグインでのみ使用することを目的とした独自の UDF がある場合があります。セクション6.4.4.11「プラグイン固有のキーリングキー管理関数」 を参照してください。

次の各セクションでは、UDF のキー設定のインストール手順を示し、それらの使用方法を示します。 UDF によって呼び出されるキーリングサービス関数の詳細は、セクション5.6.8.2「キーリングサービス」 を参照してください。 一般的な鍵リング情報については、セクション6.4.4「MySQL キーリング」 を参照してください。

汎用キーリング関数のインストールまたはアンインストール

このセクションでは、keyring_udf プラグインも含むプラグインライブラリファイルに実装されているキーリングユーザー定義関数 (UDF) をインストールまたはアンインストールする方法について説明します。 プラグインおよび UDF のインストールまたはアンインストールの一般情報は、セクション5.6.1「プラグインのインストールおよびアンインストール」 および セクション5.7.1「ユーザー定義関数のインストールおよびアンインストール」 を参照してください。

キーリング UDF を使用すると、キーリングキー管理操作が可能になりますが、UDF が正しく機能しないため、keyring_udf プラグインもインストールする必要があります。 keyring_udf プラグインなしで UDF を使用しようとすると、エラーが発生します。

サーバーで使用できるようにするには、プラグインライブラリファイルを MySQL プラグインディレクトリ (plugin_dir システム変数で指定されたディレクトリ) に配置する必要があります。 必要に応じて、サーバーの起動時に plugin_dir の値を設定してプラグインディレクトリの場所を構成します。

プラグインライブラリファイルのベース名は keyring_udf です。 ファイル名の接尾辞は、プラットフォームごとに異なります (たとえば、.so for Unix and Unix-like systems, .dll for Windows)。

keyring_udf プラグインおよび UDF をインストールするには、必要に応じてプラットフォームの .so 接尾辞を調整して、INSTALL PLUGIN および CREATE FUNCTION ステートメントを使用します:

INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_generate RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER
  SONAME 'keyring_udf.so';

プラグインと UDF がソースレプリケーションサーバーで使用されている場合は、レプリケーションの問題を回避するために、それらをすべてのレプリカにインストールします。

前述のようにインストールすると、プラグインと UDF はアンインストールされるまでインストールされたままになります。 これらを削除するには、UNINSTALL PLUGIN および DROP FUNCTION ステートメントを使用します:

UNINSTALL PLUGIN keyring_udf;
DROP FUNCTION keyring_key_generate;
DROP FUNCTION keyring_key_fetch;
DROP FUNCTION keyring_key_length_fetch;
DROP FUNCTION keyring_key_type_fetch;
DROP FUNCTION keyring_key_store;
DROP FUNCTION keyring_key_remove;
汎用キーリング関数の使用

キーリングユーザー定義関数 (UDF) を使用する前に、汎用キーリング関数のインストールまたはアンインストール の指示に従ってインストールします。

キーリング UDF には、次の制約があります:

  • 任意のキーリング UDF を使用するには、keyring_udf プラグインを有効にする必要があります。 それ以外の場合は、次のエラーが発生します:

    ERROR 1123 (HY000): Can't initialize function 'keyring_key_generate';
    This function requires keyring_udf plugin which is not installed.
    Please install

    keyring_udf プラグインをインストールするには、汎用キーリング関数のインストールまたはアンインストール を参照してください。

  • キーリング UDF は、キーリングサービス関数を呼び出します (セクション5.6.8.2「キーリングサービス」 を参照)。 次に、サービス関数はインストールされているキーリングプラグイン (keyring_filekeyring_okv など) を使用します。 したがって、任意のキーリング UDF を使用するには、基礎となるキーリングプラグインの一部を有効にする必要があります。 それ以外の場合は、次のエラーが発生します:

    ERROR 3188 (HY000): Function 'keyring_key_generate' failed because
    underlying keyring service returned an error. Please check if a
    keyring plugin is installed and that provided arguments are valid
    for the keyring you are using.

    キーリングプラグインをインストールするには、セクション6.4.4.1「キーリングプラグインのインストール」 を参照してください。

  • 任意のキーリング UDF を使用するには、ユーザーはグローバル EXECUTE 権限を持っている必要があります。 それ以外の場合は、次のエラーが発生します:

    ERROR 1123 (HY000): Can't initialize function 'keyring_key_generate';
    The user is not privileged to execute this function. User needs to
    have EXECUTE

    グローバル EXECUTE 権限をユーザーに付与するには、次のステートメントを使用します:

    GRANT EXECUTE ON *.* TO user;

    または、ユーザーに特定のキー管理操作へのアクセスを許可しながらグローバル EXECUTE 権限を付与しないようにする場合は、「ラッパー」ストアドプログラムを定義できます (このセクションの後半で説明します)。

  • 特定のユーザーがキーリングに格納したキーは、後で同じユーザーのみが操作できます。 つまり、キー操作時の CURRENT_USER() 関数の値は、キーリングにキーが格納されたときと同じ値である必要があります。 (この制約は、テーブルスペースの暗号化をサポートするために InnoDB によって作成されたキーなど、インスタンス全体のキーを操作するためのキーリング UDF の使用を除外します。)

    複数のユーザーが同じキーに対して操作を実行できるようにするには、「ラッパー」ストアドプログラムを定義します (このセクションの後半で説明します)。

  • キーリング UDF では、基礎となるキーリングプラグインでサポートされるキーのタイプと長さがサポートされます。 特定のキーリングプラグインに固有の鍵については、セクション6.4.4.8「サポートされているキーリングキーのタイプと長さ」 を参照してください。

新しいランダムキーを作成してキーリングに格納するには、キータイプ (暗号化メソッド) およびその長さ (バイト単位) とともに、keyring_key_generate() をコールしてキーの ID を渡します。 次のコールは、MyKey という名前の 2,048-bit DSA 暗号化キーを作成します:

mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);
+-------------------------------------------+
| keyring_key_generate('MyKey', 'DSA', 256) |
+-------------------------------------------+
|                                         1 |
+-------------------------------------------+

戻り値 1 は成功を示します。 キーを作成できない場合、戻り値は NULL であり、エラーが発生します。 これは、基礎となるキーリングプラグインが、指定された鍵タイプと鍵長の組み合わせをサポートしていないことが原因である可能性があります。セクション6.4.4.8「サポートされているキーリングキーのタイプと長さ」 を参照してください。

エラーが発生したかどうかに関係なく戻り型をチェックできるようにするには、SELECT ... INTO @var_name を使用して変数値をテストします:

mysql> SELECT keyring_key_generate('', '', -1) INTO @x;
ERROR 3188 (HY000): Function 'keyring_key_generate' failed because
underlying keyring service returned an error. Please check if a
keyring plugin is installed and that provided arguments are valid
for the keyring you are using.
mysql> SELECT @x;
+------+
| @x   |
+------+
| NULL |
+------+
mysql> SELECT keyring_key_generate('x', 'AES', 16) INTO @x;
mysql> SELECT @x;
+------+
| @x   |
+------+
|    1 |
+------+

この手法は、失敗した場合に値とエラーを返す他のキーリング UDF にも適用されます。

keyring_key_generate() に渡される ID は、後続の UDF コールでキーを参照する手段を提供します。 たとえば、キー ID を使用して、そのタイプを文字列またはバイト単位の長さとして整数として取得します:

mysql> SELECT keyring_key_type_fetch('MyKey');
+---------------------------------+
| keyring_key_type_fetch('MyKey') |
+---------------------------------+
| DSA                             |
+---------------------------------+
mysql> SELECT keyring_key_length_fetch('MyKey');
+-----------------------------------+
| keyring_key_length_fetch('MyKey') |
+-----------------------------------+
|                               256 |
+-----------------------------------+

キー値を取得するには、キー ID を keyring_key_fetch() に渡します。 次の例では、印刷できない文字が含まれている可能性があるため、HEX() を使用してキー値を表示します。 この例では、簡潔にするために短いキーも使用していますが、長いキーを使用するとセキュリティが向上することに注意してください:

mysql> SELECT keyring_key_generate('MyShortKey', 'DSA', 8);
+----------------------------------------------+
| keyring_key_generate('MyShortKey', 'DSA', 8) |
+----------------------------------------------+
|                                            1 |
+----------------------------------------------+
mysql> SELECT HEX(keyring_key_fetch('MyShortKey'));
+--------------------------------------+
| HEX(keyring_key_fetch('MyShortKey')) |
+--------------------------------------+
| 1DB3B0FC3328A24C                     |
+--------------------------------------+

キーリング UDF では、キー ID、タイプおよび値がバイナリ文字列として扱われるため、比較では大/小文字が区別されます。 たとえば、MyKeymykey の ID は異なるキーを参照します。

キーを削除するには、キー ID を keyring_key_remove() に渡します:

mysql> SELECT keyring_key_remove('MyKey');
+-----------------------------+
| keyring_key_remove('MyKey') |
+-----------------------------+
|                           1 |
+-----------------------------+

指定したキーを不明瞭化して格納するには、キー ID、タイプおよび値を keyring_key_store() に渡します:

mysql> SELECT keyring_key_store('AES_key', 'AES', 'Secret string');
+------------------------------------------------------+
| keyring_key_store('AES_key', 'AES', 'Secret string') |
+------------------------------------------------------+
|                                                    1 |
+------------------------------------------------------+

前述のように、ユーザーはキーリング UDF をコールするためのグローバル EXECUTE 権限を持っている必要があり、キーリングにキーを最初に格納するユーザーは、UDF コールごとに有効な CURRENT_USER() 値から決定される、後でキーに対して後続の操作を実行するユーザーと同じである必要があります。 グローバル EXECUTE 権限を持たないユーザー、またはキー owner,ではないユーザーにキー操作を許可するには、次の方法を使用します:

  1. 必要なキー操作をカプセル化し、DEFINER 値がキー所有者と等しい「ラッパー」ストアドプログラムを定義します。

  2. 特定のストアドプログラムを起動できるようにする個々のユーザーに、それらのストアドプログラムに対する EXECUTE 権限を付与します。

  3. ラッパーストアドプログラムによって実装される操作にキー作成が含まれていない場合は、ストアドプログラム定義で DEFINER として指定されたアカウントを使用して、必要なキーを事前に作成します。

この手法を使用すると、キーをユーザー間で共有でき、グローバル権限を付与せずに、誰がキーを使用して何を実行できるかを DBA がよりきめ細かく制御できます。

次の例は、DBA が所有する SharedKey という名前の共有キーと、現在のキー値へのアクセスを提供する get_shared_key() ストアドファンクションの設定方法を示しています。 この値は、key_schema スキーマに作成された、その関数に対する EXECUTE 権限を持つすべてのユーザーが取得できます。

MySQL 管理アカウント (この例では'root'@'localhost') から、キーにアクセスするための管理スキーマおよびストアドファンクションを作成します:

mysql> CREATE SCHEMA key_schema;

mysql> CREATE DEFINER = 'root'@'localhost'
       FUNCTION key_schema.get_shared_key()
       RETURNS BLOB READS SQL DATA
       RETURN keyring_key_fetch('SharedKey');

管理アカウントから、共有キーが存在することを確認します:

mysql> SELECT keyring_key_generate('SharedKey', 'DSA', 8);
+---------------------------------------------+
| keyring_key_generate('SharedKey', 'DSA', 8) |
+---------------------------------------------+
|                                           1 |
+---------------------------------------------+

管理アカウントから、キーアクセス権を付与する通常のユーザーアカウントを作成します:

mysql> CREATE USER 'key_user'@'localhost'
       IDENTIFIED BY 'key_user_pwd';

key_user アカウントから、適切な EXECUTE 権限がない場合、新しいアカウントが共有キーにアクセスできないことを確認します:

mysql> SELECT HEX(key_schema.get_shared_key());
ERROR 1370 (42000): execute command denied to user 'key_user'@'localhost'
for routine 'key_schema.get_shared_key'

管理アカウントから、ストアドファンクションの EXECUTEkey_user に付与します:

mysql> GRANT EXECUTE ON FUNCTION key_schema.get_shared_key
       TO 'key_user'@'localhost';

key_user アカウントから、キーにアクセスできるようになったことを確認します:

mysql> SELECT HEX(key_schema.get_shared_key());
+----------------------------------+
| HEX(key_schema.get_shared_key()) |
+----------------------------------+
| 9BAFB9E75CEEB013                 |
+----------------------------------+
汎用キーリング関数リファレンス

このセクションでは、汎用キーリングユーザー定義関数 (UDF) ごとに、その目的、コール順序および戻り値について説明します。 これらの UDF を起動できる条件の詳細は、汎用キーリング関数の使用 を参照してください。

  • keyring_key_fetch(key_id)

    キー ID を指定すると、キー値を不明瞭化して戻します。

    引数:

    • key_id: キー ID を指定する文字列。

    戻り値:

    成功した場合は文字列、キーが存在しない場合は NULL、失敗した場合は NULL およびエラーとしてキー値を返します。

    注記

    keyring_key_fetch() を使用して取得されたキー値は、セクション6.4.4.8「サポートされているキーリングキーのタイプと長さ」 で説明されている一般的なキーリング UDF 制限の対象となります。 その長さより長いキー値は、キーリングサービス関数 (セクション5.6.8.2「キーリングサービス」 を参照) を使用して格納できますが、keyring_key_fetch() を使用して取得されたキー値は、一般的なキーリング UDF 制限に切り捨てられます。

    例:

    mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 16);
    +--------------------------------------------+
    | keyring_key_generate('RSA_key', 'RSA', 16) |
    +--------------------------------------------+
    |                                          1 |
    +--------------------------------------------+
    mysql> SELECT HEX(keyring_key_fetch('RSA_key'));
    +-----------------------------------+
    | HEX(keyring_key_fetch('RSA_key')) |
    +-----------------------------------+
    | 91C2253B696064D3556984B6630F891A  |
    +-----------------------------------+
    mysql> SELECT keyring_key_type_fetch('RSA_key');
    +-----------------------------------+
    | keyring_key_type_fetch('RSA_key') |
    +-----------------------------------+
    | RSA                               |
    +-----------------------------------+
    mysql> SELECT keyring_key_length_fetch('RSA_key');
    +-------------------------------------+
    | keyring_key_length_fetch('RSA_key') |
    +-------------------------------------+
    |                                  16 |
    +-------------------------------------+

    この例では、印刷できない文字が含まれている可能性があるため、HEX() を使用してキー値を表示します。 この例では、簡潔にするために短いキーも使用していますが、長いキーを使用するとセキュリティが向上することに注意してください。

  • keyring_key_generate(key_id, key_type, key_length)

    指定された ID、タイプおよび長さの新しいランダムキーを生成し、キーリングに格納します。 型と長さの値は、基礎となるキーリングプラグインでサポートされている値と一致している必要があります。 セクション6.4.4.8「サポートされているキーリングキーのタイプと長さ」を参照してください。

    引数:

    • key_id: キー ID を指定する文字列。

    • key_type: キータイプを指定する文字列。

    • key_length: キーの長さをバイト単位で指定する整数。

    戻り値:

    成功した場合は 1、失敗した場合は NULL およびエラーを返します。

    例:

    mysql> SELECT keyring_key_generate('RSA_key', 'RSA', 384);
    +---------------------------------------------+
    | keyring_key_generate('RSA_key', 'RSA', 384) |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
  • keyring_key_length_fetch(key_id)

    キー ID を指定すると、キーの長さを返します。

    引数:

    • key_id: キー ID を指定する文字列。

    戻り値:

    成功した場合はキーの長さをバイト単位で返し、キーが存在しない場合は NULL、失敗した場合は NULL およびエラーを返します。

    例:

    keyring_key_fetch() の説明を参照してください。

  • keyring_key_remove(key_id)

    指定された ID のキーをキーリングから削除します。

    引数:

    • key_id: キー ID を指定する文字列。

    戻り値:

    成功の場合は 1 を返し、失敗の場合は NULL を返します。

    例:

    mysql> SELECT keyring_key_remove('AES_key');
    +-------------------------------+
    | keyring_key_remove('AES_key') |
    +-------------------------------+
    |                             1 |
    +-------------------------------+
  • keyring_key_store(key_id, key_type, key)

    キーリングにキーを不明瞭化して格納します。

    引数:

    • key_id: キー ID を指定する文字列。

    • key_type: キータイプを指定する文字列。

    • key: キー値を指定する文字列。

    戻り値:

    成功した場合は 1、失敗した場合は NULL およびエラーを返します。

    例:

    mysql> SELECT keyring_key_store('new key', 'DSA', 'My key value');
    +-----------------------------------------------------+
    | keyring_key_store('new key', 'DSA', 'My key value') |
    +-----------------------------------------------------+
    |                                                   1 |
    +-----------------------------------------------------+
  • keyring_key_type_fetch(key_id)

    キー ID を指定すると、キータイプを返します。

    引数:

    • key_id: キー ID を指定する文字列。

    戻り値:

    成功した場合は文字列、キーが存在しない場合は NULL、失敗した場合は NULL およびエラーとしてキータイプを返します。

    例:

    keyring_key_fetch() の説明を参照してください。


関連キーワード:  key, keyring, キー, 関数, インストール, fetch, ユーザー, generate, アカウント, 参照