8.4.4.13 Функции управления ключами хранилища ключей общего назначения
Сервер MySQL поддерживает службу хранилища ключей, которая позволяет внутренним компонентам и плагинам безопасно хранить конфиденциальную информацию для последующего извлечения.
Сервер MySQL также включает SQL-интерфейс для управления ключами хранилища ключей, реализованный в виде набора функций общего назначения, которые обращаются к возможностям внутренней службы хранилища ключей. Функции хранилища ключей содержатся в файле библиотеки плагинов, который также содержит плагин keyring_udf, который должен быть включен перед вызовом функций. Для использования этих функций должен быть включён плагин хранилища ключей, такой как keyring_okv, или компонент хранилища ключей, такой как component_keyring_file или component_keyring_encrypted_file.
Функции, описанные здесь, являются универсальными и предназначены для использования с любым компонентом или плагином хранилища ключей. Данный компонент или плагин хранилища ключей также может предоставлять собственные функции, предназначенные только для использования с данным компонентом или плагином; см. Раздел 8.4.4.14, «Функции управления ключами хранилища ключей, специфичные для плагинов».
В следующих разделах приведены инструкции по установке функций хранилища ключей и показано, как их использовать. Для общей информации о хранилище ключей см. Раздел 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.11, «Поддерживаемые типы и длины ключей хранения ключей».
Чтобы создать новый случайный ключ и сохранить его в хранилище ключей, вызовите 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.11, «Поддерживаемые типы и длины ключей хранения ключей».
Чтобы иметь возможность проверять тип возвращаемого значения независимо от того, произошла ли ошибка, используйте 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 |
+----------------------------------+
Справочник по функциям кольца ключей общего назначения
В этом разделе описывается назначение, последовательность вызова и возвращаемое значение каждой функции кольца ключей общего назначения. Информация об условиях, при которых можно вызывать эти функции, приведена в разделе Использование функций кольца ключей общего назначения.
-
Получает заданный ID ключа, деобфусцирует и возвращает значение ключа.
Аргументы:
key_id: Строка, определяющая ID ключа.
Возвращаемое значение:
Возвращает значение ключа в виде строки в случае успеха,
NULL, если ключ не существует, илиNULLи ошибку в случае неудачи.ПримечаниеЗначения ключей, полученные с помощью
keyring_key_fetch(), подчиняются общим ограничениям функций кольца ключей, описанным в Разделе 8.4.4.11, «Поддерживаемые типы и длины ключей кольца ключей». Значение ключа большей длины может быть сохранено с помощью функции службы кольца ключей (см. Раздел 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)Создает новый случайный ключ с заданным ID, типом и длиной и сохраняет его в кольце ключей. Значения типа и длины должны соответствовать значениям, поддерживаемым базовым плагином кольца ключей. См. Раздел 8.4.4.11, «Поддерживаемые типы и длины ключей кольца ключей».
Аргументы:
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().
© 2025 Oracle
Licensed under the GPLv2 License.