このページは機械翻訳したものです。
MySQL Server は、内部コンポーネントおよびプラグインが機密情報を安全に格納して後で取得できるようにするキーリングサービスをサポートしています。
MySQL Server には、キーリングキー管理用の SQL インタフェースも含まれており、内部キーリングサービスによって提供される関数にアクセスする一連の汎用ユーザー定義関数 (UDF) として実装されています。 キーリング UDF はプラグインライブラリファイルに含まれており、UDF を起動する前に有効にする必要がある keyring_udf
プラグインも含まれています。 これらの UDF を使用するには、keyring_file
や keyring_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_file
やkeyring_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、タイプおよび値がバイナリ文字列として扱われるため、比較では大/小文字が区別されます。 たとえば、MyKey
と mykey
の 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,」ではないユーザーにキー操作を許可するには、次の方法を使用します:
必要なキー操作をカプセル化し、
DEFINER
値がキー所有者と等しい「「ラッパー」」ストアドプログラムを定義します。特定のストアドプログラムを起動できるようにする個々のユーザーに、それらのストアドプログラムに対する
EXECUTE
権限を付与します。ラッパーストアドプログラムによって実装される操作にキー作成が含まれていない場合は、ストアドプログラム定義で
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'
管理アカウントから、ストアドファンクションの EXECUTE
を key_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 を起動できる条件の詳細は、汎用キーリング関数の使用 を参照してください。
-
キー 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()
の説明を参照してください。 -
指定された 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()
の説明を参照してください。