Назад | Перейти на главную страницу

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

Я использую 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. Вам необходимо защитить свою оболочку, поскольку она содержит часть для дешифрования.

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