Spec-Zone.ru › MySQL 8.4

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 или которые могут не быть «владельцами» ключа, используйте следующий метод:

  1. Определите хранимые программы «обёртки», которые инкапсулируют необходимые операции с ключом и имеют значение DEFINER, равное владельцу ключа.

  2. Предоставьте право EXECUTE для определённых хранимых программ отдельным пользователям, которые должны иметь возможность их вызывать.

  3. Если операции, реализованные хранимыми программами-обёртками, не включают создание ключей, создайте необходимые ключи заранее, используя имя пользователя, указанное как 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                 |
+----------------------------------+
Справочник по функциям кольца ключей общего назначения

В этом разделе описывается назначение, последовательность вызова и возвращаемое значение каждой функции кольца ключей общего назначения. Для получения информации об условиях, при которых можно вызывать эти функции, см. Использование функций кольца ключей общего назначения.

  • keyring_key_fetch(key_id)

    Учитывая идентификатор ключа, дешифрует и возвращает значение ключа.

    Аргументы:

    • 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().

  • keyring_key_remove(key_id)

    Удаляет ключ с заданным идентификатором из кольца ключей.

    Аргументы:

    • 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/keyring-functions-general-purpose.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API