J'ai besoin de créer un utilisateur test avec un mot de passe en utilisant puppet.
J'ai lu que puppet ne peut pas gérer les mots de passe des utilisateurs de manière générique sur plusieurs plates-formes, ce qui est dommage ... Je le fais pour la version 6.3 de Red Hat Enterprise Linux Server.
Je fais comme suit:
user { 'test_user':
ensure => present,
password => sha1('hello'),
}
puppet met à jour le mot de passe de l'utilisateur, mais Linux dit que login/pwd est incorrect lorsque j'essaie de me connecter.
cela fonctionne (je peux me connecter) si je configure manuellement le mot de passe sous Linux avec Sudo passwd test_user
, .__, puis regarde /etc/shadow
et code cette valeur dans puppet. quelque chose comme:
user { 'test_user':
ensure => present,
password => '$1$zi13KdCr$zJvdWm5h552P8b34AjxO11',
}
J'ai également essayé d'ajouter $1$
devant le sha1('hello')
, , Mais cela ne fonctionne pas non plus (note, $1$
signifie sha1).
comment modifier le premier exemple pour le faire fonctionner (en utilisant le mot de passe en texte clair dans le fichier de marionnettes)?
ps: Je suis conscient que je devrais utiliser LDAP, ou sshkeys, ou autre chose, au lieu de coder en dur les mots de passe des utilisateurs dans le fichier de marionnettes. Cependant, je ne le fais que pour exécuter un test de vagabond de marionnettes. Il est donc correct de coder en dur le mot de passe de l'utilisateur.
J'ai eu du succès (Gist) avec la méthode de cryptage String # de Ruby depuis une fonction d'analyse par Puppet.
AFAICS utilise les fonctions crypt libc (voir: info crypt
) et utilise les mêmes arguments $n$[rounds=<m>$]salt
, où n est la fonction de hachage ($ 6 pour SHA-512) et m le nombre de tours de renforcement clés (5000 par défaut).
Les utilisateurs de Linux ont leurs mots de passe stockés sous forme de hachage dans le fichier/etc/shadow. Puppet transmet le mot de passe fourni dans la définition du type d'utilisateur dans le fichier/etc/shadow.
Générez votre mot de passe de hachage à l'aide de la commande openssl:
#openssl passwd -1
#Enter your password here
Password:
Verifying - Password:
$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM
L'exemple précédent génère ce hachage: $ 1 $ HTQUGYUGYUGwsxQxCp3F/nGc4DCYM /
Ajoutez ce mot de passe de hachage à votre classe, comme indiqué (ne pas oublier les guillemets)
user { 'test_user':
ensure => present,
password => '$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/',
}
Le paquet stdlib de puppetlabs implémente une fonction pw_hash
similaire à la réponse acceptée.
Assurez-vous d'ajouter la bibliothèque à votre configuration. Si vous utilisez bibliothécaire , ajoutez simplement votre Puppetfile
mod 'puppetlabs-stdlib'
Ensuite, pour créer un utilisateur, il suffit de:
user { 'user':
ensure => present,
password => pw_hash('password', 'SHA-512', 'mysalt'),
}
La fonction sha1
de marionnette n'est pas directement destinée aux entrées passwd, comme vous l'avez compris ... Je dirais que définir le hachage plutôt que le mot de passe est une bonne pratique! De toute façon, vous n'êtes pas vraiment censé pouvoir récupérer un mot de passe - vous pouvez le générer une fois, ou vous pouvez le faire générer à chaque fois par marionnette - générant ainsi ce hachage devrait suffire IMHO .... Debian/Ubuntu aiment ça:
pwgen -s -1 | mkpasswd -m sha-512 -s
... sur CentOS, vous pouvez utiliser une commande grub-crypt à la place de mkpasswd ...
Vous pouvez utiliser la fonction generate
pour permettre à Puppet de créer le hachage pour vous:
$password = 'hello'
user { 'test_user':
ensure => 'present',
password => generate('/bin/sh', '-c', "mkpasswd -m sha-512 ${password} | tr -d '\n'"),
}
Je suis venu avec une méthode qui n'a besoin de rien à ajouter si vous avez Python 2.6. J'ai testé ceci sur puppet 3.6.2
sur CentOS 6.4
:
$pass="password"
$shatag="\$6\$"
$cmd="import crypt, base64, os, sys; sys.stdout.write(crypt.crypt('$pass', '$shatag' + base64.b64encode(os.urandom(16))[:8]))"
user { 'boop':
ensure => present,
password => generate ("/usr/bin/python", "-c", $cmd),
}
la balise sha est ici pour spécifier à crypt
la méthode de hachage que nous voulons: 6 est le type de hachage pour SHA-512
thx davey et wiki_crypt
sys.stdout.write is here
pour éviter '\n'
de print
base64.b64encode(os.urandom(16))[:8])
:
os.urandom(16)
crée une chaîne binaire de 16 bitsbase64.b64encode
encoder cette chaîne en base64[:8]
prend les 8 premiers caractères de cette chaîne (la longueur de l'encodage en base64 peut varier)generate
est une fonction de marionnette qui crée du texte lorsque vous vous trouvez sur puppet master. Vous ne pouvez pas utiliser cette fonction comme vous le souhaitez car elle est 'protégée' ê.é ( dernier message suggère une solution de contournement à cette protection ou autre)
hth
Dans mon Vagrantfile, j'ai fait ceci:
$newuserid = ENV["USERNAME"]
config.vm.provision :puppet do |puppet|
puppet.module_path = "modules"
puppet.manifests_path = "manifests"
puppet.manifest_file = "main.pp"
puppet.facter = {"newuserid" => $newuserid}
puppet.options = "--verbose"
end
Et dans mon fichier main.pp:
user { $newuserid :
ensure => present,
home => "/home/${newuserid}",
managehome => true,
gid => "mygid",
}
exec { 'set password':
command => "/bin/echo \"${newuserid}:${newuserid}\" | /usr/sbin/chpasswd",
require => User [ $newuserid ],
}
il suffit de générer un mot de passe crypté à partir de grub-crypt --sha-512 et de le coller