Dans Puppet, comment sécuriser une variable de mot de passe (dans ce cas un mot de passe MySQL)?

13

J'utilise Puppet pour provisionner MySQL avec une classe paramétrée:

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'],
        }
}

Comment puis-je me protéger $password? Actuellement, j'ai supprimé l'autorisation lisible par défaut du monde du fichier de définition de nœud et donné explicitement l' puppetautorisation de lecture via ACL.

Je suppose que d'autres ont rencontré une situation similaire, alors il y a peut-être une meilleure pratique.

Belmin Fernandez
la source

Réponses:

3

Lorsque je travaille avec Puppet et MySQL, j'ai tendance à mettre le mot de passe root dans /root/.my.cnf, à verrouiller ce fichier, puis à restreindre l'accès SSH au serveur de base de données.

Oui, le stockage du mot de passe root sur le serveur db en texte clair n'est pas la solution la plus sécurisée. Cependant, si vous écrivez le mot de passe racine mysql dans ce fichier, la sécurisation du compte racine mysql pour autoriser les connexions depuis localhost uniquement gardera le mot de passe hors de la marionnette, et également dans la pstable de liste des processus .

De plus, si quelqu'un a un accès root pour lire le fichier à /root/.my.cnf, alors il a probablement aussi accès pour arrêter le démon MySQL local et redémarrer le démon sans la table utilisateurs pour obtenir un accès root immédiat à la base de données.

robbyt
la source
2
Utilisez mysql_config_editor si sur mysql 5.6 et versions ultérieures. Ensuite, au moins, le mot de passe ne sera pas en texte brut.
Kejau Touray
1

Quelqu'un d'autre peut probablement signaler un plug-in ou similaire qui me corrige, mais la façon générale de procéder consiste à stocker le mot de passe crypté , pas le mot de passe en texte brut.

Cependant, je peux vous dire maintenant, MySQL ne vous permet pas d'utiliser un mot de passe crypté - sinon, ce SERAIT le mot de passe, et le hachage vous permettrait de vous connecter de toute façon.

Il existe de nombreux "hacks" qui vous permettent d'utiliser des utilitaires tiers tels que Hiera et GPG . Évidemment, vous pouvez lancer la vôtre - mais même les listes de diffusion de Puppet suggèrent cette méthode .

Andrew M.
la source
1

Vous n'avez pas spécifié de qui vous protégez ce mot de passe. Je vais supposer que ce sont d'autres administrateurs système ou éventuellement des développeurs qui ont accès au maître de marionnettes et / ou aux boîtes client mais qui n'ont pas besoin de connaître le mot de passe root.

Pour définir le mot de passe initialement, vous pouvez utiliser cette syntaxe:

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

Ce qui vous permettrait de stocker un mot de passe crypté dans votre configuration de marionnette au lieu d'un texte en clair.

Pour utiliser mysqladminet le mysqlclient sur la ligne de commande, le mieux que je puisse penser est d'ajouter un .my.cnffichier à votre configuration de marionnettes qui sera déployé dans le répertoire personnel d'un utilisateur approprié. Le fichier dans le maître de marionnettes et sur les clients doit disposer d'autorisations de fichier restrictives appropriées.

Il existe de nombreuses façons de contourner ces autorisations de fichier lorsque vous ajoutez une marionnette dans le mélange (comme l'écriture d'un exec () qui extrait le fichier des clients), mais cela semblerait être une amélioration par rapport au stockage du mot de passe dans un fichier lisible dans le monde. Ce serait plus difficile si vous utilisez un système de versioning pour votre configuration de marionnettes.

Ladadadada
la source
1
Mais si quelqu'un a récupéré le mot de passe crypté, ne pourrait-il pas simplement utiliser la chaîne cryptée pour se connecter?
Andrew M.
@Redmumba Tous mes tests semblent l'indiquer. Peut-être que je manque quelque chose que Ladadadada pourrait développer.
Belmin Fernandez
3
Non. Lorsque vous utilisez IDENTIFIED BY PASSWORD '*HASH-HERE'au lieu de IDENTIFIED BY 'PASSWORD-HERE'MySQL insère le hachage directement dans la usertable. Vous devez ensuite utiliser le mot de passe qui a généré ce hachage pour vous connecter. Vous pouvez voir à quoi ressemblerait votre commande grant avec le hachage de mot de passe en vous connectant normalement et en tapant SHOW GRANTS;. Vous pouvez également consulter d'autres utilisateurs avecSHOW GRANTS FOR user@host;
Ladadadada
Ah, donc vous ne pouvez pas utiliser le hachage lui-même pour vous connecter, je vois. Cependant, s'il a un client qui doit se connecter à la base de données - disons, son frontal - il aurait également besoin d'un moyen de stocker le mot de passe crypté, ce qui est matière à réflexion.
Andrew M.
0

Ce lien propose deux méthodes: l'utilisation de variables d'environnement et l'utilisation de sous-shell.

Je pense que vous pouvez également créer un simple wrapper autour de votre commande mysqladminet lui passer votre mot de passe crypté. Ce wrapper décryptera ensuite le mot de passe et le transmettra à mysqladmin. Vous devez protéger votre wrapper car il contient la partie de décryptage.

Vous pouvez choisir la façon dont vous vous sentez plus sûr en fonction de votre environnement et des personnes qui ont accès à votre système.

Khaled
la source