Puppet:ssh-authorized_keys-权限被拒绝

Puppet:ssh-authorized_keys-权限被拒绝

我们所有的 ~/.ssh/authorized_keys 都是以模式 0400(用户,只读)创建的。我们想用 Puppet 管理这些文件,因此我创建了以下内容:

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)。我在 forge 模块文档中找不到有关有效模式或修改模式的任何内容。'file' 参数是一种可接受的解决方法,但它不能像嵌套在 'ssh_authorized_key' 部分中那样工作,因此不像我们希望的那样简洁。此外,我不确定如何为许多用户做到这一点。

您能提供一些更好的处理方法的建议吗?

通过搜索,有几篇帖子问了同样的问题,但没有好的解决办法。这是 7 年前的一篇。我认为这个补丁从未出现在代码库中:https://projects.puppetlabs.com/issues/5395

答案1

我认为authorized_keys应该是 0600。0400 是只读的,这意味着用户甚至无法写入它!

“模式”在资源中不起作用的原因ssh_authorized_key是该资源仅添加了一个条目,它不管理文件。

在解决方法/管理大量用户方面,我会这样做(在 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 中)来做一些巧妙的事情,然后创建资源

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

相关内容