8.4.4.12 Функции управления ключами хранилища ключей общего назначения
Сервер MySQL поддерживает службу хранилища ключей, которая позволяет внутренним компонентам и плагинам безопасно хранить конфиденциальную информацию для последующего извлечения.
Сервер MySQL также включает SQL-интерфейс для управления ключами хранилища ключей, реализованный в виде набора функций общего назначения, которые обращаются к возможностям внутренней службы хранилища ключей. Функции хранилища ключей содержатся в файле библиотеки плагинов, который также содержит плагин keyring_udf, который должен быть активирован перед вызовом функций. Для использования этих функций должен быть активирован плагин хранилища ключей, например, keyring_okv, или компонент хранилища ключей, такой как component_keyring_file или component_keyring_encrypted_file.
Описанные здесь функции являются функциями общего назначения и предназначены для использования с любым компонентом или плагином хранилища ключей. Данный компонент или плагин хранилища ключей также может предоставлять собственные функции, предназначенные только для использования с этим компонентом или плагином; см. Раздел 8.4.4.13, «Функции управления ключами хранилища ключей, специфичные для плагинов».
В следующих разделах приводятся инструкции по установке функций хранилища ключей и демонстрируется их использование. Для общей информации о хранилище ключей см. Раздел 8.4.4, «Хранилище ключей MySQL».
Установка или удаление функций хранилища ключей общего назначения
В этом разделе описывается, как установить или удалить функции хранилища ключей, которые реализованы в файле библиотеки плагинов, который также содержит плагин keyring_udf. Для получения общей информации об установке или удалении плагинов и загружаемых функций см. Раздел 7.6.1, «Установка и удаление плагинов» и Раздел 7.7.1, «Установка и удаление загружаемых функций».
Функции хранилища ключей позволяют выполнять операции управления ключами хранилища ключей, но также должен быть установлен плагин keyring_udf, так как без него функции работают неправильно. Попытки использовать функции без плагина keyring_udf приводят к ошибке.
Для использования сервером файл библиотеки плагинов должен находиться в каталоге плагинов MySQL (каталог, указанный переменной системы plugin_dir). При необходимости, настройте расположение каталога плагинов, установив значение переменной plugin_dir при запуске сервера.
Базовое имя файла библиотеки плагинов — keyring_udf. Суффикс имени файла отличается в зависимости от платформы (например, .so для Unix и Unix-подобных систем, .dll для Windows).
Для установки плагина keyring_udf и функций хранилища ключей используйте инструкции INSTALL
PLUGIN и CREATE
FUNCTION, при необходимости подкорректировав суффикс .so для вашей платформы:
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';
Если плагин и функции используются на сервере репликации данных, установите их также на всех репликах, чтобы избежать проблем с репликацией.
После установки, как описано выше, плагин и функции остаются установленными до их удаления. Для их удаления используйте инструкции 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;
Использование функций универсального хранилища ключей
Перед использованием функций универсального хранилища ключей установите их в соответствии с инструкциями, приведенными в Установка или удаление функций универсального хранилища ключей.
Функции хранилища ключей подчиняются следующим ограничениям:
-
Для использования любой функции хранилища ключей должен быть включен плагин
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см. Установка или удаление функций универсального хранилища ключей. -
Функции хранилища ключей вызывают функции сервиса хранилища ключей (см. Раздел 7.6.9.2, «Сервис хранилища ключей»). Функции сервиса в свою очередь используют любой установленный плагин хранилища ключей (например,
keyring_okv). Поэтому для использования любой функции хранилища ключей должен быть активирован какой-либо плагин хранилища ключей. В противном случае произойдет ошибка: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.
Для установки плагина хранилища ключей см. Раздел 8.4.4.3, «Установка плагинов хранилища ключей».
-
Пользователь должен обладать глобальным правом
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для поддержки шифрования табличного пространства.)Чтобы несколько пользователей могли выполнять операции с одним и тем же ключом, можно определить хранимые программы «обёртки» (этот метод описан позже в этом разделе).
Функции хранилища ключей поддерживают типы и длины ключей, поддерживаемые плагином хранилища ключей. Сведения о ключах, специфичных для конкретного плагина хранилища ключей, см. в Раздел 8.4.4.10, «Поддерживаемые типы и длины ключей хранилища ключей».
Для создания нового случайного ключа и его сохранения в хранилище ключей вызовите keyring_key_generate(), передав ей идентификатор ключа, тип ключа (метод шифрования) и его длину в байтах. Следующий вызов создаёт 2048-битный ключ DSA с шифрованием, имеющий имя MyKey:
mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);
+-------------------------------------------+
| keyring_key_generate('MyKey', 'DSA', 256) |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
Возвращаемое значение 1 указывает на успешное выполнение. Если ключ создать не удаётся, возвращаемое значение равно NULL и произойдёт ошибка. Одна из причин этого может быть в том, что используемый плагин хранилища ключей не поддерживает указанную комбинацию типа и длины ключа; см. Раздел 8.4.4.10, «Поддерживаемые типы и длины ключей хранилища ключей».
Чтобы иметь возможность проверить тип возвращаемого значения независимо от возникновения ошибки, используйте 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 |
+------+
Этот метод также применим к другим функциям хранилища ключей, которые при ошибке возвращают значение и сообщение об ошибке.
Идентификатор, переданный функции keyring_key_generate(), служит для обращения к ключу в последующих вызовах функций. Например, используйте идентификатор ключа для получения его типа в виде строки или длины в байтах в виде целого числа:
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 |
+-----------------------------------+
Чтобы получить значение ключа, передайте идентификатор ключа функции 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 |
+--------------------------------------+
Функции хранилища ключей обрабатывают идентификаторы, типы и значения ключей как двоичные строки, поэтому сравнения чувствительны к регистру. Например, идентификаторы MyKey и mykey относятся к разным ключам.
Чтобы удалить ключ, передайте его идентификатор функции keyring_key_remove():
mysql> SELECT keyring_key_remove('MyKey');
+-----------------------------+
| keyring_key_remove('MyKey') |
+-----------------------------+
| 1 |
+-----------------------------+
Чтобы зашифровать и сохранить предоставленный вами ключ, передайте идентификатор, тип и значение ключа функции keyring_key_store():
mysql> SELECT keyring_key_store('AES_key', 'AES', 'Secret string');
+------------------------------------------------------+
| keyring_key_store('AES_key', 'AES', 'Secret string') |
+------------------------------------------------------+
| 1 |
+------------------------------------------------------+
Как уже отмечалось, пользователь должен обладать глобальным правом EXECUTE для вызова функций хранилища ключей, и пользователь, первоначально сохранивший ключ в хранилище, должен быть тем же пользователем, который выполняет последующие операции с ключом, как определяется значением функции CURRENT_USER() для каждого вызова функции. Для разрешения операций с ключами для пользователей, не обладающих глобальным правом EXECUTE или которые могут не быть «владельцами» ключа, используйте следующий метод:
Определите хранимые программы «обёртки», которые инкапсулируют необходимые операции с ключом и имеют значение
DEFINER, равное владельцу ключа.Предоставьте право
EXECUTEдля определённых хранимых программ отдельным пользователям, которые должны иметь возможность их вызывать.Если операции, реализованные хранимыми программами-обёртками, не включают создание ключей, создайте необходимые ключи заранее, используя имя пользователя, указанное как
DEFINERв определениях хранимых программ.
Этот метод позволяет ключам быть общими для нескольких пользователей и даёт администраторам баз данных более тонкую настройку доступа к ключам без предоставления глобальных прав.
В следующем примере показано, как настроить общий ключ с именем SharedKey, принадлежащий администратору базы данных, и хранимую функцию get_shared_key(), которая обеспечивает доступ к текущему значению ключа. Значение может быть получено любым пользователем с правом EXECUTE для этой функции, которая создана в схеме key_schema.
Из учётной записи администратора 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 |
+----------------------------------+
Справочник по функциям кольца ключей общего назначения
В этом разделе описывается назначение, последовательность вызова и возвращаемое значение каждой функции кольца ключей общего назначения. Для получения информации об условиях, при которых можно вызывать эти функции, см. Использование функций кольца ключей общего назначения.
-
Учитывая идентификатор ключа, дешифрует и возвращает значение ключа.
Аргументы:
key_id: Строка, которая указывает идентификатор ключа.
Возвращаемое значение:
Возвращает значение ключа в виде строки в случае успеха,
NULL, если ключ не существует, илиNULLи ошибку в случае сбоя.ПримечаниеЗначения ключей, полученные с помощью
keyring_key_fetch(), подчиняются общим ограничениям функций кольца ключей, описанным в Разделе 8.4.4.10, «Поддерживаемые типы и длины ключей кольца ключей». Значение ключа, длина которого больше этой длины, может быть сохранено с помощью функции службы кольца ключей (см. Раздел 7.6.9.2, «Служба кольца ключей»), но если оно извлекается с помощьюkeyring_key_fetch(), оно усекается до предела функции кольца ключей общего назначения.Пример:
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)Создает новый случайный ключ с заданным идентификатором, типом и длиной и сохраняет его в кольце ключей. Значения типа и длины должны соответствовать значениям, поддерживаемым базовым плагином кольца ключей. См. Раздел 8.4.4.10, «Поддерживаемые типы и длины ключей кольца ключей».
Аргументы:
key_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)Учитывая идентификатор ключа, возвращает длину ключа.
Аргументы:
key_id: Строка, которая указывает идентификатор ключа.
Возвращаемое значение:
Возвращает длину ключа в байтах в виде целого числа в случае успеха,
NULL, если ключ не существует, илиNULLи ошибку в случае сбоя.Пример:
См. описание
keyring_key_fetch(). -
Удаляет ключ с заданным идентификатором из кольца ключей.
Аргументы:
key_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: Строка, которая указывает идентификатор ключа.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)Учитывая идентификатор ключа, возвращает тип ключа.
Аргументы:
key_id: Строка, которая указывает идентификатор ключа.
Возвращаемое значение:
Возвращает тип ключа в виде строки в случае успеха,
NULL, если ключ не существует, илиNULLи ошибку в случае сбоя.Пример:
См. описание
keyring_key_fetch().
© 2025 Oracle
Licensed under the GPLv2 License.