Я использую Puppet для предоставления MySQL параметризованного класса:
class mysql::server( $password ) {
package { 'mysql-server': ensure => installed }
package { 'mysql': ensure => installed }
service { 'mysqld':
enable => true,
ensure => running,
require => Package['mysql-server'],
}
exec { 'set-mysql-password':
unless => "mysqladmin -uroot -p$password status",
path => ['/bin', '/usr/bin'],
command => "mysqladmin -uroot password $password",
require => Service['mysqld'],
}
}
Как я могу защитить $password
? В настоящее время я удалил доступное для чтения в мире разрешение по умолчанию из файла определения узла и явно дал puppet
разрешение на чтение через ACL.
Я предполагаю, что другие сталкивались с подобной ситуацией, так что, возможно, есть лучшая практика.
При работе с Puppet и MySQL я обычно помещаю пароль root в /root/.my.cnf, блокирую этот файл, а затем ограничиваю SSH-доступ к серверу базы данных.
Да, хранение пароля root на сервере db в виде открытого текста - не самое безопасное решение. Однако, если вы напишете пароль root mysql в этом файле, защита учетной записи root mysql, чтобы разрешить вход только с localhost, сохранит пароль вне марионетки, а также из списка процессов. ps
стол.
Кроме того, если у кого-то есть root-доступ для чтения файла в /root/.my.cnf, то он, вероятно, также имеет доступ для остановки локального демона MySQL и перезапуска демона без таблицы пользователей, чтобы получить немедленный root-доступ к базе данных.
Вы не указали, от кого вы защищаете этот пароль. Я предполагаю, что это другие системные администраторы или, возможно, разработчики, у которых есть доступ к мастеру марионеток и / или клиентским ящикам, но которым не нужно знать пароль root.
Для первоначальной установки пароля вы можете использовать следующий синтаксис:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;
Это позволит вам хранить зашифрованный пароль в конфигурации марионетки вместо обычного текста.
Для использования mysqladmin
и mysql
client в командной строке, лучшее, что я могу придумать, - это добавить .my.cnf
в конфигурацию марионетки, которая развертывается в домашний каталог соответствующего пользователя. Файл как на мастере марионетки, так и на клиентах должен иметь соответствующие ограничительные права доступа.
Есть много способов обойти эти права доступа к файлам при добавлении марионетки в микс (например, написать exec (), который извлекает файл из клиентов), но, похоже, это улучшение по сравнению с хранением пароля в файле, доступном для чтения во всем мире. Это будет сложнее, если вы используете систему управления версиями для конфигурации марионетки.
Кто-то другой, вероятно, может указать на какой-то подключаемый модуль или аналогичный, который меня исправляет, но общий способ сделать это - сохранить зашифрованный пароль, а не простой текстовый пароль.
Однако я могу сказать вам прямо сейчас, MySQL не позволяет вам использовать зашифрованный пароль - в противном случае это БУДЕТ пароль, а хеш в любом случае позволит вам войти в систему.
Существует множество «уловок», позволяющих использовать сторонние утилиты, такие как Хиера и GPG. Очевидно, вы можете свернуть свою собственную, но даже собственные списки рассылки Puppet предлагают этот метод.
Эта ссылка предлагает два метода: с использованием переменных среды и с помощью подоболочки.
Я думаю, вы также можете создать простую оболочку вокруг своей команды mysqladmin
и передайте ему свой зашифрованный пароль. Затем эта оболочка расшифрует пароль и передаст его mysqladmin
. Вам необходимо защитить свою оболочку, поскольку она содержит часть для дешифрования.
Вы можете выбрать более безопасный способ защиты в зависимости от вашей среды и того, кто имеет доступ к вашей системе.