В Puppet, как мне защитить переменную пароля (в данном случае пароль MySQL)?

13

Я использую 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.

Я предполагаю, что другие сталкивались с подобной ситуацией, так что, возможно, есть лучшая практика.

Бельмин Фернандес
источник

Ответы:

3

При работе с Puppet и MySQL я стараюсь поместить пароль root в /root/.my.cnf, заблокировать этот файл, а затем ограничить доступ SSH к серверу базы данных.

Да, хранение пароля root на сервере БД в виде открытого текста - не самое безопасное решение. Однако, если вы введете пароль root mysql в этот файл, защита учетной записи root mysql, разрешающая вход в систему только с локального хоста, не позволит ввести пароль из кукол, а также из psтаблицы списка процессов .

Кроме того, если у кого-то есть права суперпользователя для чтения файла в /root/.my.cnf, то он, вероятно, также имеет доступ для остановки локального демона MySQL и перезапуска демона без таблицы пользователей, чтобы получить немедленный root-доступ к базе данных.

robbyt
источник
2
Используйте mysql_config_editor, если на mysql 5.6 и позже. Тогда хотя бы пароль не будет в текстовом виде.
Kejau Touray
1

Кто-то другой, вероятно, может указать на какой-нибудь плагин или подобное, что исправляет меня, но общий способ сделать это - сохранить зашифрованный пароль, а не простой текстовый пароль.

Тем не менее, я могу сказать вам прямо сейчас, MySQL не позволяет вам использовать зашифрованный пароль - в противном случае, это был бы пароль, и хеш позволил бы вам войти в любом случае.

Существует множество «хаков», которые позволяют использовать сторонние утилиты, такие как Hiera и GPG . Очевидно, вы можете свернуть свои собственные, но даже собственные списки рассылки Puppet предлагают этот метод .

Андрей М.
источник
1

Вы не указали, от кого вы защищаете этот пароль. Я собираюсь предположить, что это другие системные администраторы или, возможно, разработчики, которые имеют доступ к хозяину puppet и / или клиентским окнам, но не должны знать пароль пользователя root.

Для первоначальной установки пароля вы можете использовать этот синтаксис:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

Что позволит вам хранить зашифрованный пароль в конфигурации марионетки вместо открытого текста.

Для использования mysqladminи mysqlклиента в командной строке лучшее, что я могу придумать, - это добавить .my.cnfфайл в конфигурацию вашего марионетки, который будет развернут в домашнем каталоге соответствующего пользователя. Файл как в мастере puppet, так и на клиентах должен иметь соответствующие ограничительные права доступа к файлу.

Существует множество способов обойти эти права доступа к файлам, когда вы добавляете puppet в смесь (например, написание exec (), который извлекает файл из клиентов), но это может показаться улучшением по сравнению с хранением пароля в общедоступном файле. Это будет сложнее, если вы используете систему управления версиями для вашего марионеточного конфига.

Ladadadada
источник
1
Но если кто-то извлечет зашифрованный пароль, они не могут просто использовать зашифрованную строку для входа?
Андрей М.
@ Redmumba Все мои тесты, кажется, указывают на это. Возможно, я упускаю что-то, что Ладададада мог бы уточнить.
Бельмин Фернандес
3
Нет. Когда вы используете IDENTIFIED BY PASSWORD '*HASH-HERE'вместо IDENTIFIED BY 'PASSWORD-HERE'MySQL, вставляет хеш непосредственно в userтаблицу. Затем вы должны использовать пароль, который сгенерировал этот хеш для входа в систему. Чтобы увидеть, как будет выглядеть ваша команда предоставления с хешем пароля, войдите в систему и введите его SHOW GRANTS;. Вы также можете проверить других пользователейSHOW GRANTS FOR user@host;
Ladadadada
Ах, вы не можете использовать сам хеш для входа в систему, я вижу. Однако, если у него есть клиент, которому необходимо подключиться к базе данных, скажем, его клиентской части, ему также понадобится способ хранения зашифрованного пароля, который является пищей для размышлений.
Андрей М.
0

Эта ссылка предлагает два метода: использование переменных среды и использование subshell.

Я думаю, что вы также можете создать простую оболочку вокруг вашей команды mysqladminи передать ей зашифрованный пароль. Эта обёртка расшифровывает пароль и передает его mysqladmin. Вы должны защитить свою оболочку, так как она содержит часть расшифровки.

Вы можете выбрать способ, которым вы чувствуете, что это более безопасно, в зависимости от вашей среды и того, кто имеет доступ к вашей системе.

Халед
источник