在puppet中管理linux的用户密码

时间:2013-10-01 10:52:47

标签: 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测试,所以可以硬编码用户密码。

7 个答案:

答案 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)

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 $ - &gt; MD5
    • $ 2a $ - &gt; Blowfish(不在主线glibc中;在某些Linux发行版中添加)
    • $ 5 $ - &gt; SHA-256(自glibc 2.7起)
    • $ 6 $ - &gt; SHA-512(自glibc 2.7起)
  2. thx daveywiki_crypt

    1. sys.stdout.write is here以避免'\n'的{​​{1}}

    2. print

      • base64.b64encode(os.urandom(16))[:8])创建一个16位长的二进制字符串
      • os.urandom(16)在base64
      • 中对此字符串进行编码
      • base64.b64encode取此字符串的前8个字符(因为base64编码长度可能不同)
    3. [:8]是一个木偶函数,可以在木偶大师上创建文本。 您无法按照自己的意愿使用此功能,因为它受到了保护。 ê.élast post建议对此保护或其他)的解决方法

    4. HTH

答案 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生成加密密码并粘贴