我需要使用puppet创建一个带密码的测试用户。
我读过木偶无法以通用的跨平台方式管理用户密码,这很可惜。 我正在为Red Hat Enterprise Linux Server 6.3版做这个。
我这样做:
user { 'test_user':
ensure => present,
password => sha1('hello'),
}
puppet更新用户的密码, 但Linux在我尝试登录时说login / pwd不正确。
如果我在Linux中使用sudo passwd test_user
手动设置密码,它可以(我可以登录),
然后查看/etc/shadow
并在puppet中对该值进行硬编码。类似的东西:
user { 'test_user':
ensure => present,
password => '$1$zi13KdCr$zJvdWm5h552P8b34AjxO11',
}
我也试过在$1$
前添加sha1('hello')
,
但它也不起作用(注意,$1$
代表sha1)。
如何修改第一个示例以使其工作(使用puppet文件中的明文密码)?
ps:我知道我应该使用LDAP或sshkeys或其他东西,而不是在puppet文件中硬编码用户密码。但是,我这样做只是为了运行puppet vagrant测试,所以可以硬编码用户密码。
答案 0 :(得分:35)
Linux用户将其密码存储为/ etc / shadow文件中的哈希。 Puppet传递/ etc / shadow文件中用户类型定义中提供的密码。
使用openssl命令生成哈希密码:
#openssl passwd -1
#Enter your password here
Password:
Verifying - Password:
$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM
上一个示例生成此哈希: $ 1 $ HTQUGYUGYUGwsxQxCp3F / nGc4DCYM /
将此哈希密码添加到您的类中,如图所示(不要忘记引号)
user { 'test_user':
ensure => present,
password => '$1$HTQUGYUGYUGwsxQxCp3F/nGc4DCYM/',
}
答案 1 :(得分:10)
如你所知,puppet中的sha1
函数不直接用于passwd条目。
我说设置哈希而不是密码是好习惯!你真的不应该能够恢复密码 - 你可以生成一次,或者你可以让木偶每次生成它 - 生成一次哈希应该足够恕我直言...
您可以在Debian / Ubuntu上生成密码,如下所示:
pwgen -s -1 | mkpasswd -m sha-512 -s
...在CentOS上你可以使用一些grub-crypt命令而不是mkpasswd ...
答案 2 :(得分:9)
I had success (gist)在Puppet解析器函数中使用ruby的String#crypt方法。
AFAICS使用crypt libc函数(参见:info crypt
),并使用相同的参数$n$[rounds=<m>$]salt
,其中n是散列函数(SHA-512为$ 6)和m是关键强化轮数(默认为5000)。
答案 3 :(得分:3)
您可以使用generate
函数让Puppet为您创建哈希:
$password = 'hello'
user { 'test_user':
ensure => 'present',
password => generate('/bin/sh', '-c', "mkpasswd -m sha-512 ${password} | tr -d '\n'"),
}
答案 4 :(得分:2)
如果你有python 2.6,我想出了一个不需要添加任何东西的方法。我在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),
}
sha标签在这里指定crypt
我们想要的哈希方法:
6是SHA-512的散列类型
thx davey和wiki_crypt
答案 5 :(得分:1)
在我的Vagrantfile中,我这样做了:
$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
在我的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 ],
}
答案 6 :(得分:0)
只需从grub-crypt --sha-512生成加密密码并粘贴