web-dev-qa-db-fra.com

gérer un mot de passe utilisateur pour linux dans puppet

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.

33
David Portabella

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).

9
Paul Schyska

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/',
}
34
Avinash Singh

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'),
}
13
mperrin

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 ...

10
bryn

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'"),
}
3
Behrang

Marionnette: utilisateur avec un SHA 512 mot de passe haché

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),
}

Des explications

  1. 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

    • $ 1 $ -> MD5
    • $ 2a $ -> Blowfish (pas dans la glibc principale; ajouté dans certaines distributions Linux)
    • $ 5 $ -> SHA-256 (depuis la glibc 2.7)
    • $ 6 $ -> SHA-512 (depuis la version 2.7 de la glibc)

thx davey et wiki_crypt

  1. sys.stdout.write is here pour éviter '\n' de print

  2. base64.b64encode(os.urandom(16))[:8])

    • os.urandom(16) crée une chaîne binaire de 16 bits
    • base64.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)
  3. 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

2
Boop

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 ],
}
1
Lyle Z

il suffit de générer un mot de passe crypté à partir de grub-crypt --sha-512 et de le coller

0
Creek