6.4.4.8 Функции управления ключами хранилища ключей общего назначения
Сервер MySQL поддерживает службу хранилища ключей, которая позволяет внутренним компонентам сервера и плагинам безопасно хранить конфиденциальную информацию для последующего извлечения.
Начиная с MySQL 5.7.13, сервер MySQL включает SQL-интерфейс для управления ключами хранилища ключей, реализованный в виде набора функций общего назначения, которые обращаются к возможностям внутренней службы хранилища ключей. Функции хранилища ключей содержатся в файле библиотеки плагинов, который также содержит плагин keyring_udf, который должен быть включён перед вызовом функции. Для использования этих функций должен быть включён плагин хранилища ключей, такой как keyring_file или keyring_okv.
Описанные здесь функции предназначены для общего использования с любым компонентом или плагином хранилища ключей. Данный компонент или плагин может также предоставлять собственные функции, предназначенные только для использования с этим компонентом или плагином; см. Раздел 6.4.4.9, “Функции управления ключами хранилища ключей, специфичные для плагинов”.
В следующих разделах приведены инструкции по установке функций хранилища ключей и показано, как их использовать. Сведения о функциях службы хранилища ключей, вызываемых этими функциями, см. в Разделе 5.5.6.2, “Служба хранилища ключей”. Для общей информации о хранилище ключей см. Раздел 6.4.4, “Хранилище ключей MySQL”.
Установка или удаление функций хранилища ключей общего назначения
В этом разделе описывается, как установить или удалить функции хранилища ключей, которые реализованы в файле библиотеки плагинов, который также содержит плагин keyring_udf. Общую информацию об установке или удалении плагинов и загружаемых функций см. в Разделе 5.5.1, “Установка и удаление плагинов” и Разделе 5.6.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, см. Установка или удаление функций хранилища ключей общего назначения. -
Функции хранилища ключей вызывают функции службы хранилища ключей (см. Раздел 5.5.6.2, «Служба хранилища ключей»). Функции службы, в свою очередь, используют установленный плагин хранилища ключей (например,
keyring_fileили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.
Чтобы установить плагин хранилища ключей, см. Раздел 6.4.4.1, «Установка плагинов хранилища ключей».
-
Пользователь должен обладать глобальным
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для поддержки шифрования табличного пространства.)Чтобы разрешить нескольким пользователям выполнять операции с одним и тем же ключом, можно определить хранимые программы “обёртки” (методика описана далее в данном разделе).
Функции хранилища ключей поддерживают типы и длины ключей, поддерживаемые плагином хранилища ключей. Сведения о ключах, специфичных для конкретного плагина хранилища ключей, см. в Разделе 6.4.4.6, «Поддерживаемые типы и длины ключей хранилища ключей».
Чтобы создать новый случайный ключ и сохранить его в хранилище ключей, вызовите keyring_key_generate(), передав ей идентификатор ключа, тип ключа (метод шифрования) и его длину в байтах. Следующий вызов создаёт 2048-битный ключ DSA с шифрованием, имеющий имя MyKey:
mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);
+-------------------------------------------+
| keyring_key_generate('MyKey', 'DSA', 256) |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
Возвращаемое значение 1 указывает на успех. Если ключ не может быть создан, возвращаемое значение равно NULL и произойдёт ошибка. Одна из причин этого может быть в том, что установленный плагин хранилища ключей не поддерживает указанную комбинацию типа и длины ключа; см. Раздел 6.4.4.6, «Поддерживаемые типы и длины ключей хранилища ключей».
Чтобы иметь возможность проверить возвращаемый тип независимо от того, произошла ли ошибка, используйте 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(), подчиняются общим ограничениям функций кольца ключей, описанным в Разделе 6.4.4.6, «Поддерживаемые типы и длины ключей кольца ключей». Значение ключа, превышающее эту длину, может быть сохранено с помощью функции службы кольца ключей (см. Раздел 5.5.6.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)Создаёт новый случайный ключ с заданным идентификатором, типом и длиной и сохраняет его в кольце ключей. Значения типа и длины должны соответствовать значениям, поддерживаемым базовым плагином кольца ключей. См. Раздел 6.4.4.6, «Поддерживаемые типы и длины ключей кольца ключей».
Аргументы:
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.