首页 文章

在puppet中管理linux的用户密码

提问于
浏览
32

我需要使用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',
}

我也试过在 sha1('hello') 前添加 $1$ ,但它也不起作用(注意, $1$ 代表sha1) .

如何修改第一个例子使其工作(使用puppet文件中的明文密码)?

ps:我知道我应该使用LDAP或sshkeys或其他东西,而不是在puppet文件中硬编码用户密码 . 但是,我这样做只是为了运行puppet vagrant测试,所以可以硬编码用户密码 .

8 回答

  • 2

    I had success (gist)使用来自Puppet解析器函数的ruby的String#crypt方法 .

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

  • 10

    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

    puppetlabs的stdlib包实现了一个类似的接受答案的函数pw_hash函数 .

    请务必将库添加到您的配置中 . 如果您使用librarian,只需添加 Puppetfile

    mod 'puppetlabs-stdlib'
    

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

    user { 'user':
      ensure => present,
      password => pw_hash('password', 'SHA-512', 'mysalt'),
    }
    
  • 12

    正如你所知,puppet中的 sha1 函数不直接用于passwd条目 . 我会说设置哈希而不是密码是好习惯!你不是真的应该能够恢复密码 - 你可以生成一次,或者你可以让puppet每次都生成它 - 生成一次哈希应该足够喔......你可以在Debian / Ubuntu上生成密码像这样:

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

    ...在CentOS上你可以使用一些grub-crypt命令而不是mkpasswd ...

  • 3

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

    $password = 'hello'
    
    user { 'test_user':
        ensure   => 'present',
        password => generate('/bin/sh', '-c', "mkpasswd -m sha-512 ${password} | tr -d '\n'"),
    }
    
  • 0

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

    如果你有python 2.6,我想出了一个不需要添加任何东西的方法 . 我在 CentOS 6.4 上的 puppet 3.6.2 测试了这个:

    $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的哈希类型

    • $ 1 $ - > MD5

    • $ 2a $ - > Blowfish(不在主线glibc中;在某些Linux发行版中添加)

    • $ 5 $ - > SHA-256(自glibc 2.7起)

    • $ 6 $ - > SHA-512(自glibc 2.7起)

    thx daveywiki_crypt

    • sys.stdout.write is here 以避免 '\n'print

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

    • os.urandom(16) 创建一个16位长的二进制字符串

    • base64.b64encode 在base64中对此字符串进行编码

    • [:8] 取此字符串的前8个字符(因为base64编码长度可能会有所不同)

    • generate 是一个在 puppet master 上创建文本的木偶函数 . 你可以't use this function like you want because it is '保护'ê.élast post建议解决这个保护或其他方法)

    心连心

  • 35

    在我的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 ],
    }
    
  • 9

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

相关问题