Spec-Zone.ru › MySQL 5.7

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

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

  • 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-5.7-en/keyring-functions-general-purpose.html

Spec-Zone.ru

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