puppet - saber - listar usuarios linux
administrar una contraseña de usuario para linux en marioneta (8)
Necesito crear un usuario de prueba con una contraseña usando el uso de marionetas.
He leído que el títere no puede administrar las contraseñas de los usuarios de una manera genérica multiplataforma, lo cual es una lástima. Estoy haciendo esto para la versión 6.3 del Servidor Red Hat Enterprise Linux.
Yo hago lo siguiente:
user { ''test_user'':
ensure => present,
password => sha1(''hello''),
}
títere actualiza la contraseña del usuario, pero Linux dice login / pwd incorrecto cuando intento iniciar sesión.
funciona (puedo iniciar sesión) si establezco la contraseña manualmente en Linux con sudo passwd test_user
, y luego miro /etc/shadow
y sudo passwd test_user
ese valor en puppet. algo como:
user { ''test_user'':
ensure => present,
password => ''$1$zi13KdCr$zJvdWm5h552P8b34AjxO11'',
}
Lo intenté también agregando $1$
al frente del sha1(''hello'')
, pero tampoco funciona (nota, $1$
significa sha1).
cómo modificar el primer ejemplo para que funcione (usando la contraseña de texto claro en el archivo títere)?
ps: soy consciente de que debería usar LDAP, o sshkeys, o algo más, en lugar de codificar las contraseñas de los usuarios en el archivo títere. sin embargo, estoy haciendo esto solo para ejecutar una prueba de vagabundo de títeres, por lo que está bien codificar la contraseña de usuario.
Marioneta: usuario con una contraseña hash SHA 512
Se me ocurrió un método que no necesita agregar nada si tienes Python 2.6. Probé esto en puppet 3.6.2
en CentOS 6.4
:
$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
Explicaciones
la etiqueta sha está aquí para especificar
crypt
el método hash que queremos: 6 es el tipo de hash para SHA-512- $ 1 $ -> MD5
- $ 2a $ -> Blowfish (no en glibc principal, agregado en algunas distribuciones de Linux)
- $ 5 $ -> SHA-256 (desde glibc 2.7)
- $ 6 $ -> SHA-512 (desde glibc 2.7)
thx davey y wiki_crypt
sys.stdout.write is here
para evitar''/n''
deprint
base64.b64encode(os.urandom(16))[:8])
:-
os.urandom(16)
crea una cadena binaria larga de 16 bits -
base64.b64encode
codifica esta cadena en base64 -
[:8]
tome los primeros 8 caracteres de esta cadena (ya que la longitud de codificación base64 puede variar)
-
generate
es una función de títeres que crea texto cuando está en el titiritero . No puede usar esta función como desee porque está ''protegida'' ê.é (la última publicación sugiere una solución alternativa a esta protección o lo que sea )
hth
El paquete stdlib de puppetlabs implementa una función pw_hash
similar a la respuesta aceptada.
Asegúrese de agregar la biblioteca a su configuración. Si usa pw_hash , solo agregue su Puppetfile
mod ''puppetlabs-stdlib''
Entonces, para crear un usuario, simplemente:
user { ''user'':
ensure => present,
password => pw_hash(''password'', ''SHA-512'', ''mysalt''),
}
En mi Vagrantfile, hice esto:
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 ],
}
Y en mi archivo main.pp:
$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 función sha1
en el títere no está destinada directamente a las entradas de contraseña, como descubriste. Diría que configurar el hash en lugar de la contraseña es una buena práctica. Realmente no se supone que puedas recuperar una contraseña de todos modos - puedes generarla una vez, o puedes hacer que la marioneta la genere todo el tiempo - generar ese hash una vez debería ser suficiente en mi humilde opinión ... Puedes generar una contraseña en Debian / Ubuntu Me gusta esto:
pwgen -s -1 | mkpasswd -m sha-512 -s
... en CentOS puedes usar algún comando grub-crypt en lugar de mkpasswd ...
Los usuarios de Linux tienen sus contraseñas almacenadas como hash en el archivo / etc / shadow. Puppet transfiere la contraseña proporcionada en la definición de tipo de usuario en el archivo / etc / shadow.
Genere su contraseña de hash usando el comando openssl:
#openssl passwd -1
#Enter your password here
Password:
Verifying - Password:
$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM
El ejemplo anterior genera este hash: $ 1 $ HTQUGYUGYUGwsxQxCp3F / nGc4DCYM /
Agregue esta contraseña hash a su clase como se muestra (no olvide las comillas)
user { ''test_user'':
ensure => present,
password => ''$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/'',
}
Puede usar la función de generate
para que Puppet cree el hash por usted:
$password = ''hello''
user { ''test_user'':
ensure => ''present'',
password => generate(''/bin/sh'', ''-c'', "mkpasswd -m sha-512 ${password} | tr -d ''/n''"),
}
solo genere una contraseña encriptada de grub-crypt --sha-512 y péguelo
Tuve éxito (esencia) con el método String # crypt de ruby desde una función de analizador de Puppet.
AFAICS está usando las funciones crypt libc (ver: info crypt
), y toma los mismos argumentos $n$[rounds=<m>$]salt
, donde n es la función hash ($ 6 para SHA-512) y m es el número de rondas de fortalecimiento clave (5000 por defecto).