MySQL - один из поддерживаемых плагинов для механизма секретов баз данных. Этот плагин генерирует учётные данные базы данных динамически на основе настроенных ролей для базы данных MySQL, а также поддерживает статические роли.
Этот плагин имеет два экземпляра, встроенных в Stronghold, каждый из которых предназначен для немного разных драйверов MySQL. Единственное различие между этими плагинами заключается в длине имён пользователей, генерируемых плагином, так как разные версии mysql принимают разные длины. Доступны следующие плагины:
mysql-database-plugin— имена пользователей до 32 символов (MySQL 5.7.8 и новее, MariaDB);mysql-legacy-database-plugin— имена пользователей до 16 символов (MySQL 5.6 и старее).
Возможности
| Имя плагина | Изменение Root учётной записи | Динамические роли | Статические роли | Кастомизация имени пользователя |
|---|---|---|---|---|
| Может меняться | Да | Да | Да | Да |
Установка
- Включите механизм секретов базы данных, если он ещё не включён:
- Stronghold в DP
- Stronghold в Linux
$ d8 stronghold secrets enable database
Success! Enabled the database secrets engine at: database/$ stronghold secrets enable database
Success! Enabled the database secrets engine at: database/По умолчанию механизм секретов будет включаться на основе его имени.
Чтобы включить механизм секретов по другому пути, используйте аргумент -path.
- Настройте Stronghold с помощью соответствующего плагина и информации о подключении:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" allowed_roles="my-role" username="strongholduser" password="strongholdpass"stronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" allowed_roles="my-role" username="strongholduser" password="strongholdpass"- Настройте роль, которая сопоставляет имя в Stronghold с SQL запросом, выполняемым для создания учётной записи базы данных:
- Stronghold в DP
- Stronghold в Linux
$ d8 stronghold write database/roles/my-role db_name=my-mysql-database creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" default_ttl="1h" max_ttl="24h"
Success! Data written to: database/roles/my-role$ stronghold write database/roles/my-role db_name=my-mysql-database creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" default_ttl="1h" max_ttl="24h"
Success! Data written to: database/roles/my-roleИспользование
После того как механизм секретов настроен и у пользователя/машины есть токен Stronghold с соответствующими правами, он может генерировать учётные данные.
- Сгенерируйте новую учётную запись, используя
/credsи имя роли:
- Stronghold в DP
- Stronghold в Linux
$ d8 stronghold read database/creds/my-role
Key Value
--- -----
lease_id database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration 1h
lease_renewable true
password yY-57n3X5UQhxnmFRP3f
username v_strongholduser_my-role_crBWVqVh2Hc1$ stronghold read database/creds/my-role
Key Value
--- -----
lease_id database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration 1h
lease_renewable true
password yY-57n3X5UQhxnmFRP3f
username v_strongholduser_my-role_crBWVqVh2Hc1Проверка подлинности сертификата клиента x509
Этот плагин поддерживает использование MySQL’s x509 Client-side Certificate Authentication
Чтобы использовать этот механизм аутентификации, настройте плагин:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin allowed_roles="my-role" connection_url="user:password@tcp(localhost:3306)/test" tls_certificate_key=@/path/to/client.pem tls_ca=@/path/to/client.castronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin allowed_roles="my-role" connection_url="user:password@tcp(localhost:3306)/test" tls_certificate_key=@/path/to/client.pem tls_ca=@/path/to/client.caПримечание: tls_certificate_key и tls_ca соответствуют ssl-cert (combined with ssl-key)
и ssl-ca настройкам конфигурации из MySQL, за исключением того, что параметры
Stronghold - это содержимое этих файлов, а не имена файлов. Таким образом, эти два
параметра не зависят друг от друга. Подробнее — в разделе MySQL Connection Options
документации MySQL.
Примеры
Использование шаблонов в grant statements
MySQL поддерживает использование шаблонов в grant statements. Это иногда необходимо приложениям,
которые ожидают доступа к большому количеству баз данных внутри MySQL.
Это можно реализовать, используя шаблоны в grant statements. Например, если
вы хотите, чтобы пользователь, созданный Stronghold, имел доступ ко всем
базам данных, начинающимся с fooapp_, вы можете использовать следующий оператор создания:
CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON `fooapp\_%`.* TO '{{name}}'@'%';MySQL ожидает, что часть, в которой должны быть помещены шаблоны, будет находиться внутри кавычек. Если вы хотите добавить этот стейтмент создания в Stronghold через Stronghold CLI, вы не можете просто вставить вышеприведенный оператор в CLI, потому что shell интерпретирует текст между кавычками как нечто, что должно быть выполнено. Самый простой способ обойти это - закодировать стейтмент создания в Base64 и передать его в Stronghold. Например:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write database/roles/my-role db_name=mysql creation_statements="Q1JFQVRFIFVTRVIgJ3t7bmFtZX19J0AnJScgSURFTlRJRklFRCBCWSAne3twYXNzd29yZH19JzsgR1JBTlQgU0VMRUNUIE9OIGBmb29hcHBcXyVgLiogVE8gJ3t7bmFtZX19J0AnJSc7" default_ttl="1h" max_ttl="24h"stronghold write database/roles/my-role db_name=mysql creation_statements="Q1JFQVRFIFVTRVIgJ3t7bmFtZX19J0AnJScgSURFTlRJRklFRCBCWSAne3twYXNzd29yZH19JzsgR1JBTlQgU0VMRUNUIE9OIGBmb29hcHBcXyVgLiogVE8gJ3t7bmFtZX19J0AnJSc7" default_ttl="1h" max_ttl="24h"Изменение root учётных данных in MySQL 5.6
По умолчанию для MySQL используется синтаксис ALTER USER, присутствующий в MySQL 5.7 и выше.
Для MySQL 5.6, root_rotation_statements
должны быть настроены на использование старого синтаксиса SET PASSWORD.
Например:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" root_rotation_statements="SET PASSWORD = PASSWORD('{{password}}')" allowed_roles="my-role" username="root" password="mysql"stronghold write database/config/my-mysql-database plugin_name=mysql-database-plugin connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" root_rotation_statements="SET PASSWORD = PASSWORD('{{password}}')" allowed_roles="my-role" username="root" password="mysql"