木偶:ssh – authorized_keys – 权限被拒绝

我们所有的〜/ .ssh / authorized_keys都是使用0400模式(用户,只读)创build的。 我们想用Puppetpipe理这些文件,所以我创build了以下内容:

class users { user { 'julia': home => '/home/julia', ensure => present, purge_ssh_keys => true, } } ssh_authorized_key { 'julia@dirty': ensure => present, user => 'julia', type => 'ssh-ed25519', key => 'AAAAC3NzaC1lvvvvvvxxxxxO1mXiiyj3Af17MviiiiiiiifffffzU5e//e/ffff/y', } 

但是,当我在节点上运行'puppet agent –test'时,出现以下错误:

 Error: Puppet::Util::FileType::FileTypeFlat could not write /home/julia/.ssh/authorized_keys: Permission denied - /home/julia/.ssh/authorized_keys Error: /Stage[main]/Profile::Base/Ssh_authorized_key[julia@dirty]: Could not evaluate: Puppet::Util::FileType::FileTypeFlat could not write /home/julia/.ssh/authorized_keys: Permission denied - /home/julia/.ssh/authorized_keys 

我可以用下面的方法“修补”这个问题:

 file { "/home/julia/.ssh/authorized_keys": ensure => present, mode => '0600', } 

我很惊讶,这是一个问题。 我认为这将适用于文件(0600或0400)上的任何有效模式。 我找不到有关有效模式或修改模式的伪造模块文档中的任何内容。 'file'参数是一个可以接受的解决方法,但是它不能像ssh_authorized_key'部分那样工作,所以不是我们想要的。 此外,我不知道如何为许多用户做到这一点。

你能提供一个更好的方法处理这个build议吗?

有几个post通过search提出这个问题,但没有好的解决scheme。 这是7年前的一个。 我不认为这个补丁曾经在代码库中做过: https : //projects.puppetlabs.com/issues/5395

我认为authorized_keys必须是0600. 0400是只读的,这意味着即使用户也不能写它!

“模式”在ssh_authorized_key资源中不起作用的ssh_authorized_key是该资源只添加一个条目,而不pipe理该文件。

在解决方法/pipe理大量用户方面,我会这样做(在Puppet 3中,但是我确定这在Puppet4 / 5中使用一些迭代更为简洁):

 define myuser ( $user, $key, ) { user { $user: home => "/home/${user}", ensure => present, purge_ssh_keys => true, } file { "/home/${user}/.ssh/authorized_keys": ensure => file, mode => "0600", require => User[$user], } ssh_authorized_key { "${user}@${host}": ensure => present, user => $user, type => 'ssh-ed25519', key => "${key}", } } 

然后您可以使用它:

 node default { myuser { "shearn89": user => "shearn89", key => "somelongasciistring", } } 

您也可以通过定义用户(可能在Hiera中)然后创build资源来做一些巧妙的事情。

或者,您可以考虑使用Ansible这样的工具来针对您的整个平台运行一个任务并修复该文件。 我发现Ansible在用于这种编排/一次性任务时很好地补充了Puppet。