我们所有的 ~/.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。