Як я маю захистити змінну пароля (у цьому випадку MySQL пароль) у Puppet?


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/.my.cnf, блокувати цей файл, а потім обмежувати доступ SSH на сервер бази даних.

Так, зберігання кореневого пароля на db-сервері в чистому тексті не є найбільш безпечним рішенням. Однак якщо ви запишете пароль root mysql у цей файл, захист кореневого облікового запису mysql, щоб дозволити входити лише з localhost, не дозволить зберегти пароль від лялькових, а також із psтаблиці списку процесів .

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


2
Використовуйте mysql_config_editor, якщо на mysql 5.6 і пізніших версіях. Тоді принаймні пароль не буде в простому тексті.
Кехау Турай

1

Хтось інший, можливо, може вказати на якийсь плагін або подібне, що мене виправляє, але загальний спосіб зробити це - зберігати зашифровані пароля, а не простого текстового пароля.

Однак я можу вам сказати прямо зараз, MySQL не дозволяє вам використовувати зашифрований пароль - інакше це БУДЬ пароль, а хеш дозволить вам увійти в будь-який час.

Навколо існує чимало «хакків», які дозволяють користуватися сторонніми утилітами, такими як Hiera та GPG . Очевидно, ви можете прокрутити свій власний, але навіть власний список розсилки лялечок пропонує цей метод .


1

Ви не вказали, від кого захищаєте цей пароль. Я припускаю, що це інші sysadmins або, можливо, розробники, які мають доступ до майстра ляльок та / або клієнтських скринь, але не потрібно знати корінний пароль.

Для початкового встановлення пароля ви можете використовувати цей синтаксис:

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

Що дозволить вам зберігати зашифрований пароль у вашій ляльковій конфігурації замість простого тексту.

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

Існує маса способів дозволу цих файлів, коли ви додаєте ляльку в суміш (наприклад, написання файлу exec (), який витягує файл від клієнтів), але це, здається, буде поліпшенням щодо зберігання пароля у файлі, доступному для читання у світі. Це буде складніше, якщо ви використовуєте систему версій для вашого лялькового конфігурації.


1
Але якщо хтось отримав зашифрований пароль, чи не могли вони просто використовувати зашифрований рядок для входу?
Андрій М.

@Redmumba Моє тестування, схоже, так вказує. Можливо, мені не вистачає чогось, про що міг би розробити Лададада.
Белмін Фернандес

3
Ні. Коли ви використовуєте IDENTIFIED BY PASSWORD '*HASH-HERE'замість IDENTIFIED BY 'PASSWORD-HERE'MySQL, вставляє хеш безпосередньо в userтаблицю. Тоді вам доведеться використовувати пароль, який створив цей хеш для входу. Ви можете побачити, як виглядатиме ваша команда видачі з хешем пароля, ввівшись у систему та ввівши її SHOW GRANTS;. Ви також можете перевірити інших користувачів зSHOW GRANTS FOR user@host;
Ladadadada

Так, я не можу використовувати хеш для входу, я бачу. Однак якщо у нього є клієнт, якому потрібно підключитися до бази даних - скажімо, його передній кінець - йому також знадобиться спосіб зберігання зашифрованого пароля, який є продуктом для роздумів.
Андрій М.

0

Це посилання пропонує два методи: використання змінних оточуючих середовищ та використання доподібної оболонки.

Я думаю, ви також можете створити просту обгортку навколо своєї команди mysqladminі передати їй свій зашифрований пароль. Потім ця обгортка розшифрує пароль та передасть його mysqladmin. Вам потрібно захистити свою обгортку, оскільки вона містить частину розшифровки.

Ви можете вибрати спосіб, яким ви вважаєте себе більш захищеним, залежно від вашого оточення та того, хто має доступ до вашої системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.