gestion d'un mot de passe utilisateur pour linux dans puppet
je dois 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 utilisateurs d'une manière générique multiplateformes, ce qui est dommage. Je le fais pour Red Hat Enterprise Linux Server release 6.3.
je fais comme suit:
user { 'test_user':
ensure => present,
password => sha1('hello'),
}
marionnette à jour le mot de passe de l'utilisateur, mais Linux dit que login / pwd est incorrect quand j'essaie de me connecter.
cela fonctionne (je peux me connecter) si je mets le mot de passe manuellement dans Linux sudo passwd test_user
,
et puis regardez /etc/shadow
et coder en dur la valeur de la marionnette. quelque chose comme:
user { 'test_user':
ensure => present,
password => '$zi13KdCr$zJvdWm5h552P8b34AjxO11',
}
j'ai essayé aussi en ajoutant $
devant sha1('hello')
,
mais il ne fonctionne pas non plus (remarque, $
signifie sha1).
comment modifier le premier exemple pour le faire fonctionner (en utilisant le mot de passe en clair dans le fichier puppet)?
ps: je suis conscient que je devrais utiliser LDAP, ou sshkeys, ou autre chose, au lieu de coder les mots de passe de l'utilisateur dans le dossier de marionnettes. cependant, je ne le fais que pour exécuter un test de vagabondage puppet, donc il est correct de hardcode le mot de passe de l'utilisateur.
8 réponses
j'ai eu du succès (gist) avec la méthode String#crypt de ruby à partir d'une fonction D'analyseur de marionnettes.
AFAICS il utilise les fonctions libc de crypt (voir: info crypt
), et prend les mêmes arguments $n$[rounds=<m>$]salt
, où n est la fonction de hachage ($6 pour SHA-512) et m est le nombre de tours de renforcement de 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 passe le mot de passe fourni dans la définition du type d'utilisateur dans le fichier /etc/shadow.
générer votre mot de passe de hachage en utilisant la commande openssl:
#openssl passwd -1
#Enter your password here
Password:
Verifying - Password:
$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM
l'exemple précédent générer ce hachage: $1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/
ajouter ce mot de passe de hachage à votre classe comme montré (n'oubliez pas les guillemets)
user { 'test_user':
ensure => present,
password => '$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/',
}
le paquet stdlib de puppetlabs implémente un pw_hash
fonction de la réponse acceptée.
assurez-vous d'ajouter la bibliothèque à votre configuration. Si vous utilisez bibliothécaire, ajoutez juste votre Puppetfile
mod 'puppetlabs-stdlib'
Ensuite créer un utilisateur, il suffit de :
user { 'user':
ensure => present,
password => pw_hash('password', 'SHA-512', 'mysalt'),
}
sha1
la fonction puppet n'est pas directement destinée aux entrées passwd, comme vous l'avez compris.
Je dirais que configurer le hachage plutôt que le mot de passe est une bonne pratique! Vous n'êtes pas vraiment censé être en mesure de récupérer un mot de passe de toute façon - vous pouvez le générer une fois, ou vous pouvez avoir puppet le générer à chaque fois - générer ce hachage une fois devrait être assez IMHO...
Vous pouvez générer un mot de passe sur Debian/Ubuntu comme ceci:
pwgen -s -1 | mkpasswd -m sha-512 -s
...sur CentOS vous pouvez utiliser un peu de grub-crypt commande au lieu de mkpasswd...
Marionnette: l'utilisateur avec un SHA 512 hachage de mot de passe
j'ai trouvé une méthode qui n'a pas besoin d'ajouter quoi que ce soit si vous avez python 2.6. J'ai testé cela sur puppet 3.6.2
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),
}
Explications
la balise sha est ici pour spécifier
crypt
la méthode de hachage que nous voulons: 6 est le type de hash pour SHA-512- $1$ - > MD5
- $2a$ -> Blowfish (pas dans la canalisation principale de la glibc; ajout dans certains Linux les distributions)
- $5$ -> SHA-256 (depuis la glibc 2.7)
- $6$ -> SHA-512 (depuis la glibc 2.7)
thx davey et wiki_crypt
sys.stdout.write is here
à éviter'\n'
print
base64.b64encode(os.urandom(16))[:8])
:os.urandom(16)
créer un 16 bits de longueur de chaîne binairebase64.b64encode
encoder cette chaîne dans base64[:8]
prenez les 8 premiers caractères de cette chaîne (La longueur d'encodage de base64 peut varier)
generate
est une fonction de marionnette qui crée du texte sur le puppet master. Vous ne pouvez pas utiliser cette fonction comme vous le voulez parce qu'elle est 'protégée' ê.é (dernier message suggérez une solutionprotection-ou-quoi)
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 ma main.pp fichier:
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 coller