8.4.4.8 Использование плагина 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.12 «Функции управления ключами 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.10 «Поддерживаемые типы ключей 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 | Нет |
| ID роли AppRole | keyring_hashicorp_role_id | Да |
| 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 HashiCorp, все API-маршруты имеют префикс версии протокола (который вы можете увидеть в предыдущем примере как /v1/ в значениях keyring_hashicorp_store_path и keyring_hashicorp_auth_path). Если HashiCorp разработает новые версии протокола, возможно, потребуется изменить /v1/ в вашей конфигурации.
MySQL Server аутентифицируется с HashiCorp Vault с помощью аутентификации AppRole. Для успешной аутентификации необходимо предоставить Vault два секрета: ID роли и ID секрета, которые по концепции аналогичны имени пользователя и паролю. Используемые значения ID роли и ID секрета получены во время предварительной процедуры настройки 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.16 «Системные переменные Keyring» и разделе 8.4.4.13 «Функции управления ключами Keyring, специфичные для плагина».
© 2025 Oracle
Licensed under the GPLv2 License.