8.4.4.9 Использование плагина HashiCorp Vault Keyring
Плагин keyring_hashicorp — это расширение, включенное в MySQL Enterprise Edition, коммерческий продукт. Чтобы узнать больше о коммерческих продуктах, посетите https://www.mysql.com/products/.
Плагин keyring keyring_hashicorp взаимодействует с HashiCorp Vault для хранения данных на бэкенде. Плагин поддерживает аутентификацию HashiCorp Vault AppRole. Никакая информация о ключах не хранится постоянно в локальном хранилище сервера MySQL. (Можно использовать необязательный кэш ключей в памяти в качестве промежуточного хранилища.) Генерация случайных ключей выполняется на стороне сервера MySQL, а затем ключи сохраняются в HashiCorp Vault.
Плагин keyring_hashicorp поддерживает функции, составляющие стандартный интерфейс службы MySQL Keyring. К операциям keyring, выполняемым этими функциями, можно получить доступ на двух уровнях:
Интерфейс SQL: в SQL-запросах вызывайте функции, описанные в разделе 8.4.4.13 «Общие функции управления ключами keyring».
Интерфейс C: в коде на языке C вызывайте функции службы keyring, описанные в разделе 7.6.9.2 «Служба Keyring».
Пример (используя интерфейс SQL):
SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');
Дополнительную информацию о характеристиках разрешенных значений ключей, поддерживаемых keyring_hashicorp, см. в разделе 8.4.4.11 «Поддерживаемые типы ключей и длины keyring».
Чтобы установить keyring_hashicorp, используйте общие инструкции, приведенные в разделе 8.4.4.3 «Установка плагина keyring», вместе с конфигурационной информацией, специфичной для keyring_hashicorp, приведенной здесь. Конфигурация, специфичная для плагина, включает подготовку сертификата и файлов ключей, необходимых для подключения к HashiCorp Vault, а также конфигурацию самого HashiCorp Vault. Следующие разделы содержат необходимые инструкции.
Подготовка сертификатов и ключей
Плагин keyring_hashicorp требует безопасного подключения к серверу HashiCorp Vault, используя протокол HTTPS. Типичная настройка включает набор файлов сертификата и ключа:
company.crt: Специальный сертификат CA, принадлежащий организации. Этот файл используется как сервером HashiCorp Vault, так и плагиномkeyring_hashicorp.vault.key: Приватный ключ экземпляра сервера HashiCorp Vault. Этот файл используется сервером HashiCorp Vault.vault.crt: Сертификат экземпляра сервера HashiCorp Vault. Этот файл должен быть подписан сертификатом CA организации.
Следующие инструкции описывают, как создать файлы сертификата и ключа с использованием OpenSSL. (Если у вас уже есть эти файлы, перейдите к Настройке HashiCorp Vault.) Приведенные инструкции относятся к платформам Linux и могут потребовать корректировки для других платформ.
Сертификаты, сгенерированные по этим инструкциям, являются самоподписанными, что может быть небезопасно. После приобретения опыта работы с такими файлами, рассмотрите возможность получения сертификата/ключа от аккредитованного сертификационного центра.
-
Подготовьте ключи компании и сервера HashiCorp Vault.
Используйте следующие команды для генерации файлов ключей:
openssl genrsa -aes256 -out company.key 4096 openssl genrsa -aes256 -out vault.key 2048
Команды генерируют файлы с приватным ключом компании (
company.key) и приватным ключом сервера Vault (vault.key). Ключи представляют собой случайные RSA-ключи 4096 и 2048 бит соответственно.Каждая команда запрашивает пароль. Для целей тестирования пароль не требуется. Чтобы отключить его, опустите аргумент
-aes256.Файлы ключей содержат конфиденциальную информацию и должны храниться в безопасном месте. Пароль (также конфиденциальный) понадобится позже, поэтому запишите его и храните в безопасном месте.
(Необязательно) Для проверки содержимого и валидности файлов ключей используйте следующие команды:
openssl rsa -in company.key -check openssl rsa -in vault.key -check
-
Создайте сертификат CA компании.
Используйте следующую команду для создания файла сертификата CA компании с именем
company.crt, действительного в течение 365 дней (введите команду в одной строке):openssl req -x509 -new -nodes -key company.key -sha256 -days 365 -out company.crt
Если вы использовали аргумент
-aes256для шифрования ключа во время генерации ключа, вам будет предложено ввести пароль к ключу компании во время создания сертификата CA. Вам также будет предложено указать информацию о держателе сертификата (то есть, вас или вашу компанию), как показано здесь:Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []:
Ответьте на запросы соответствующими значениями.
-
Создайте запрос на подпись сертификата.
Для создания сертификата сервера HashiCorp Vault необходимо подготовить запрос на подпись сертификата (CSR) для недавно созданного ключа сервера. Создайте конфигурационный файл с именем
request.conf, содержащий следующие строки. Если сервер HashiCorp Vault не работает на локальном хосте, замените соответствующие значения CN и IP, а также внесите другие необходимые изменения.[req] distinguished_name = vault x509_entensions = v3_req prompt = no [vault] C = US ST = CA L = RWC O = Company CN = 127.0.0.1 [v3_req] subjectAltName = @alternatives authorityKeyIdentifier = keyid,issuer basicConstraints = CA:TRUE [alternatives] IP = 127.0.0.1
Используйте эту команду для создания запроса на подпись:
openssl req -new -key vault.key -config request.conf -out request.csr
Файл вывода (
request.csr) — это промежуточный файл, который служит входными данными для создания сертификата сервера. -
Создайте сертификат сервера HashiCorp Vault.
Подпишите объединённую информацию из ключа сервера HashiCorp Vault (
vault.key) и CSR (request.csr) с помощью сертификата компании (company.crt) для создания сертификата сервера HashiCorp Vault (vault.crt). Используйте следующую команду (введите команду в одной строке):openssl x509 -req -in request.csr -CA company.crt -CAkey company.key -CAcreateserial -out vault.crt -days 365 -sha256
Чтобы сделать сертификат сервера
vault.crtполезным, добавьте содержимое сертификата компанииcompany.crtк нему. Это необходимо, чтобы сертификат компании передавался вместе с сертификатом сервера в запросах.cat company.crt >> vault.crt
Если отобразить содержимое файла
vault.crt, оно должно выглядеть так:-----BEGIN CERTIFICATE----- ...
content of HashiCorp Vault server certificate... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ...content of company certificate... -----END CERTIFICATE-----
Настройка HashiCorp Vault
Следующие инструкции описывают, как создать настройку HashiCorp Vault, которая облегчит тестирование плагина keyring_hashicorp.
Тестовая настройка похожа на рабочую, но при использовании HashiCorp Vault в рабочей среде необходимо учитывать дополнительные соображения безопасности, такие как использование несамозаверяемых сертификатов и хранение корпоративного сертификата в системном хранилище доверенных сертификатов. Вы должны реализовать все необходимые дополнительные шаги по обеспечению безопасности, чтобы удовлетворить свои операционные требования.
Эти инструкции предполагают доступность файлов сертификата и ключа, созданных в разделе Подготовка сертификата и ключа. Обратитесь к этому разделу, если у вас нет этих файлов.
-
Получите двоичный файл HashiCorp Vault.
Загрузите двоичный файл HashiCorp Vault, соответствующий вашей платформе, с сайта https://www.vaultproject.io/downloads.html.
Извлеките содержимое архива, чтобы получить исполняемую команду vault, используемую для выполнения операций HashiCorp Vault. При необходимости добавьте директорию, в которой вы установили команду, в системную переменную среды PATH.
(Необязательно) HashiCorp Vault поддерживает опции автодополнения, что облегчает использование. Дополнительную информацию см. на странице https://learn.hashicorp.com/vault/getting-started/install#command-completion.
-
Создайте конфигурационный файл сервера HashiCorp Vault.
Подготовьте конфигурационный файл с именем
config.hclсо следующим содержимым. Для значенийtls_cert_file,tls_key_fileиpathзамените пути, соответствующие вашей системе.listener "tcp" { address="127.0.0.1:8200" tls_cert_file="/home/username/certificates/vault.crt" tls_key_file="/home/username/certificates/vault.key" } storage "file" { path = "/home/username/vaultstorage/storage" } ui = true -
Запустите сервер HashiCorp Vault.
Для запуска сервера Vault используйте следующую команду, где параметр
-configуказывает путь к только что созданному конфигурационному файлу:vault server -config=config.hcl
На этом шаге вам может потребоваться ввести пароль для закрытого ключа сервера Vault, хранящегося в файле
vault.key.Сервер должен запуститься, выведя некоторую информацию на консоль (IP, порт и так далее).
Чтобы вы могли ввести оставшиеся команды, запустите команду vault server в фоновом режиме или откройте другой терминал, прежде чем продолжить.
-
Инициализируйте сервер HashiCorp Vault.
ПримечаниеОперации, описанные на этом шаге, требуются только при первом запуске Vault для получения ключа разгерметизации и корневого токена. При последующих перезапусках экземпляра Vault потребуется только разгерметизация с использованием ключа разгерметизации.
Выполните следующие команды (предполагается синтаксис оболочки Bourne):
export VAULT_SKIP_VERIFY=1 vault operator init -n 1 -t 1
Первая команда позволяет команде vault временно игнорировать тот факт, что к системному хранилищу доверенных сертификатов не добавлен корпоративный сертификат. Это компенсирует тот факт, что наш самозаверяемый CA не добавлен в это хранилище. (Для использования в рабочей среде такой сертификат должен быть добавлен.)
Вторая команда создает единственный ключ разгерметизации с требованием наличия одного ключа разгерметизации для разгерметизации. (В рабочей среде экземпляр будет иметь несколько ключей разгерметизации, причем для его разгерметизации потребуется ввести до такого количества ключей. Ключи разгерметизации должны быть переданы хранителям ключей в компании. Использование одного ключа может быть сочтено проблемой безопасности, так как это позволит одному хранителю ключей разгерметизировать хранилище.)
Vault должен ответить информацией о ключе разгерметизации и корневом токене, а также некоторым дополнительным текстом (фактические значения ключа разгерметизации и корневого токена отличаются от показанных здесь):
... Unseal Key 1: I2xwcFQc892O0Nt2pBiRNlnkHzTUrWS+JybL39BjcOE= Initial Root Token: s.vTvXeo3tPEYehfcd9WH7oUKz ...
Храните ключ разгерметизации и корневой токен в защищенном месте.
-
Разгерметизируйте сервер HashiCorp Vault.
Используйте эту команду для разгерметизации сервера Vault:
vault operator unseal
При запросе ввода ключа разгерметизации используйте ключ, полученный ранее во время инициализации Vault.
Vault должен вывести информацию, свидетельствующую о завершении настройки и разгерметизации хранилища.
-
Войдите в сервер HashiCorp Vault и проверьте его состояние.
Подготовьте переменные среды, необходимые для входа как root:
vault login s.vTvXeo3tPEYehfcd9WH7oUKz
Для значения токена в этой команде подставьте содержимое корневого токена, полученного ранее во время инициализации Vault.
Проверьте состояние сервера Vault:
vault status
Вывод должен содержать эти строки (среди других):
... Initialized true Sealed false ...
-
Настройте аутентификацию и хранение HashiCorp Vault.
ПримечаниеОписанные на этом шаге операции необходимы только при первом запуске экземпляра Vault. Повторять их не нужно.
Включите метод аутентификации AppRole и убедитесь, что он присутствует в списке методов аутентификации:
vault auth enable approle vault auth list
Включите хранилище Vault KeyValue:
vault secrets enable -version=1 kv
Создайте и настройте роль для использования с плагином
keyring_hashicorp(введите команду в одной строке):vault write auth/approle/role/mysql token_num_uses=0 token_ttl=20m token_max_ttl=30m secret_id_num_uses=0
-
Добавьте политику безопасности AppRole.
ПримечаниеОписанные на этом шаге операции необходимы только при первом запуске экземпляра Vault. Повторять их не нужно.
Подготовьте политику, разрешающую ранее созданной роли доступ к соответствующим секретам. Создайте новый файл с именем
mysql.hclсо следующим содержимым:path "kv/mysql/*" { capabilities = ["create", "read", "update", "delete", "list"] }Примечаниеkv/mysql/в этом примере, возможно, потребует корректировки в соответствии с местными политиками установки и требованиями безопасности. В таком случае внесите те же корректировки повсюду, гдеkv/mysql/появляется в этих инструкциях.Импортируйте файл политики на сервер Vault, чтобы создать политику с именем
mysql-policy, а затем назначьте политику новой роли:vault policy write mysql-policy mysql.hcl vault write auth/approle/role/mysql policies=mysql-policy
Получите идентификатор только что созданной роли и сохраните его в защищенном месте:
vault read auth/approle/role/mysql/role-id
Сгенерируйте идентификатор секрета для роли и сохраните его в защищенном месте:
vault write -f auth/approle/role/mysql/secret-id
После генерации этих учетных данных AppRole (ID роли и ID секрета) они, как ожидается, будут действительны неопределенно долго. Их не нужно генерировать повторно, и плагин
keyring_hashicorpможет быть настроен с ними для использования на постоянной основе. Дополнительную информацию об аутентификации AuthRole см. на странице https://www.vaultproject.io/docs/auth/approle.html.
Настройка плагина keyring_hashicorp
В файле библиотеки плагинов содержится плагин keyring_hashicorp и загружаемая функция keyring_hashicorp_update_config(). При инициализации и завершении работы плагин автоматически загружает и разгружает функцию. Нет необходимости загружать и разгружать функцию вручную.
Плагин keyring_hashicorp поддерживает параметры конфигурации, показанные в следующей таблице. Для указания этих параметров назначьте значения соответствующим системным переменным.
| Параметр конфигурации | Системная переменная | Обязательно |
|---|---|---|
| URL сервера HashiCorp | keyring_hashicorp_server_url | Нет |
| Идентификатор роли AppRole | keyring_hashicorp_role_id | Да |
| Идентификатор секрета AppRole | keyring_hashicorp_secret_id | Да |
| Путь к хранилищу | keyring_hashicorp_store_path | Да |
| Путь авторизации | keyring_hashicorp_auth_path | Нет |
| Путь к файлу сертификата CA | keyring_hashicorp_ca_path | Нет |
| Управление кэшем | keyring_hashicorp_caching | Нет |
Для использования во время процесса запуска сервера, keyring_hashicorp необходимо загрузить с помощью параметра --early-plugin-load. Как указано в таблице выше, необходимо также установить несколько системных переменных, связанных с плагином. Например, используйте эти строки в файле сервера my.cnf, скорректировав .so суффикс и расположение файлов для вашей платформы, при необходимости:
[mysqld]
early-plugin-load=keyring_hashicorp.so
keyring_hashicorp_role_id='ee3b495c-d0c9-11e9-8881-8444c71c32aa'
keyring_hashicorp_secret_id='0512af29-d0ca-11e9-95ee-0010e00dd718'
keyring_hashicorp_store_path='/v1/kv/mysql'
keyring_hashicorp_auth_path='/v1/auth/approle/login'
Согласно документации HashiCorp, все API маршруты имеют префикс с версией протокола (который вы можете увидеть в предыдущем примере как /v1/ в значениях keyring_hashicorp_store_path и keyring_hashicorp_auth_path). Если HashiCorp разработает новые версии протоколов, может потребоваться изменить /v1/ на что-то другое в вашей конфигурации.
MySQL Server аутентифицируется с HashiCorp Vault с использованием аутентификации AppRole. Для успешной аутентификации необходимо предоставить Vault два секрета: идентификатор роли и идентификатор секрета, которые аналогичны понятию имени пользователя и пароля. Используемые значения идентификатора роли и идентификатора секрета получены в ходе предварительно выполненной процедуры настройки HashiCorp Vault. Чтобы указать два идентификатора, назначьте их соответствующие значения системным переменным keyring_hashicorp_role_id и keyring_hashicorp_secret_id. Процедура настройки также приводит к пути к хранилищу /v1/kv/mysql, которое является значением, присваиваемым keyring_hashicorp_commit_store_path.
При инициализации плагина keyring_hashicorp пытается подключиться к серверу HashiCorp Vault с использованием значений конфигурации. Если подключение успешно, плагин сохраняет значения в соответствующих системных переменных, которые содержат _commit_ в их имени. Например, при успешном подключении плагин сохраняет значения keyring_hashicorp_role_id и keyring_hashicorp_store_path в keyring_hashicorp_commit_role_id и keyring_hashicorp_commit_store_path.
Переконфигурацию во время выполнения можно выполнить с помощью функции keyring_hashicorp_update_config():
Используйте операторы
SET, чтобы назначить желаемые новые значения системным переменным конфигурации, показанным в предыдущей таблице. Эти назначения сами по себе не влияют на текущую работу плагина.Вызовите
keyring_hashicorp_update_config(), чтобы заставить плагин переконфигурироваться и повторно подключиться к серверу HashiCorp Vault с использованием новых значений переменных.Если подключение успешно, плагин сохраняет обновленные значения конфигурации в соответствующих системных переменных, содержащих
_commit_в своём имени.
Например, если вы переконфигурировали HashiCorp Vault для прослушивания на порту 8201 вместо стандартного 8200, переконфигурируйте keyring_hashicorp так:
mysql> SET GLOBAL keyring_hashicorp_server_url = 'https://127.0.0.1:8201';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT keyring_hashicorp_update_config();
+--------------------------------------+
| keyring_hashicorp_update_config() |
+--------------------------------------+
| Configuration update was successful. |
+--------------------------------------+
1 row in set (0.03 sec)
Если плагин не может подключиться к HashiCorp Vault во время инициализации или переконфигурации и не было существующего подключения, системные переменные _commit_ устанавливаются в 'Not committed' для строковых переменных и в OFF для логических переменных. Если плагин не может подключиться, но было существующее подключение, это подключение остаётся активным, и переменные _commit_ отражают используемые для него значения.
Если вы не установите обязательные системные переменные при запуске сервера или произойдёт какая-либо другая ошибка инициализации плагина, инициализация завершится неудачно. В этом случае вы можете использовать процедуру переконфигурации во время выполнения, чтобы инициализировать плагин без перезапуска сервера.
Дополнительную информацию о системных переменных и функциях плагина keyring_hashicorp см. в разделе 8.4.4.17 «Системные переменные keyring» и разделе 8.4.4.14 «Функции управления ключами keyring, специфичные для плагинов».
© 2025 Oracle
Licensed under the GPLv2 License.