38

我需要使用 puppet 创建一个带有密码的测试用户。

我读过 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 测试,所以可以硬编码用户密码。

4

8 回答 8

38

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/',
}
于 2014-08-12T10:03:10.197 回答
17

puppetlabs 的 stdlib 包实现了pw_hash接受答案的类似功能。

请务必将库添加到您的配置中。如果您使用图书管理员,只需添加您的Puppetfile

mod 'puppetlabs-stdlib'

然后创建一个用户,只需:

user { 'user':
  ensure => present,
  password => pw_hash('password', 'SHA-512', 'mysalt'),
}
于 2015-08-16T11:50:43.630 回答
12

sha1如您所见,puppet 中的函数并不直接用于 passwd 条目。我会说设置哈希而不是密码是一种好习惯!无论如何,您实际上不应该能够恢复密码 - 您可以生成一次,或者您可以让 puppet 每次都生成它 - 生成一次哈希应该足够恕我直言......您可以在 Debian/Ubuntu 上生成密码像这样:

pwgen -s -1 | mkpasswd -m sha-512 -s

...在 CentOS 上,您可以使用一些 grub-crypt 命令代替 mkpasswd ...

于 2013-11-06T14:54:11.317 回答
10

我在 Puppet 解析器函数中使用 ruby​​ 的 String#crypt 方法取得了成功(要点) 。

AFAICS 它使用 crypt libc 函数(参见:)info crypt,并采用相同的参数$n$[rounds=<m>$]salt,其中 n 是散列函数(SHA-512 为 6 美元),m 是密钥强化轮数(默认为 5000)。

于 2014-07-22T09:09:32.340 回答
3

您可以使用该generate函数让 Puppet 为您创建哈希:

$password = 'hello'

user { 'test_user':
    ensure   => 'present',
    password => generate('/bin/sh', '-c', "mkpasswd -m sha-512 ${password} | tr -d '\n'"),
}
于 2014-10-14T11:09:19.217 回答
2

Puppet:具有 SHA 512 哈希密码的用户

如果你有 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),
}

解释

  1. sha 标签在这里指定crypt我们想要的散列方法:6 是 SHA-512 的散列类型

    • $1$ -> MD5
    • $2a$ -> Blowfish(不在主线 glibc 中;在某些 Linux 发行版中添加)
    • $5$ -> SHA-256(从 glibc 2.7 开始)
    • $6$ -> SHA-512(从 glibc 2.7 开始)

谢谢戴维和wiki_crypt

  1. sys.stdout.write is here避免'\n'_print

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

    • os.urandom(16)创建一个 16 位长的二进制字符串
    • base64.b64encode用 base64 编码这个字符串
    • [:8]取该字符串的前 8 个字符(因为 base64 编码长度可能会有所不同)
  3. generate是在puppet master上创建文本的 puppet 函数。你不能像你想要的那样使用这个功能,因为它是“受保护的” ê.é最后一篇文章建议了这个保护或任何东西的解决方法)

hth

于 2015-01-29T18:17:22.750 回答
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 ],
}
于 2014-11-06T16:45:54.753 回答
0

只需从 grub-crypt --sha-512 生成加密密码并粘贴

于 2015-08-16T23:32:31.397 回答