使用 Puppet 删除未明确允许的 SSH 密钥

使用 Puppet 删除未明确允许的 SSH 密钥

我正在使用 puppet 来分发 SSH 密钥,如下所示:

ssh_authorized_key { "[email protected]":
   ensure => present,
   key => 'xxxx',
   type => 'ssh-rsa',
   user => 'deploy',
}

~/.ssh/authorized_keys 文件最终包含来自多个类的密钥混合,这是期望的结果。但是,如果手动将密钥添加到 $HOME/.ssh/authorized_keys,Puppet 会将其保留在原处。有没有办法始终删除清单中未明确定义的任何密钥?

我有 Puppet 版本 2.7.1。

答案1

从 Puppet 3.6 开始,现在可以清除非托管 SSH 授权密钥通过user类型。例如,

user { 'nick':
  ensure         => present,
  purge_ssh_keys => true,
}

答案2

ssh_authorized_key我决定不使用资源,而是定义一个authorized_keys资源,该资源获取单个用户的所有 SSH 密钥的列表。定义如下:

define authorized_keys ($sshkeys, $ensure = "present", $home = '') {
    # This line allows default homedir based on $title variable.
    # If $home is empty, the default is used.
    $homedir = $home ? {'' => "/home/${title}", default => $home}
    file {
        "${homedir}/.ssh":
            ensure  => "directory",
            owner   => $title,
            group   => $title,
            mode    => 700,
            require => User[$title];
        "${homedir}/.ssh/authorized_keys":
            ensure  => $ensure,
            owner   => $ensure ? {'present' => $title, default => undef },
            group   => $ensure ? {'present' => $title, default => undef },
            mode    => 600,
            require => File["${homedir}/.ssh"],
            content => template("authorized_keys.erb");
    }
}

$ssh_keys参数将所有必要的键作为列表。authorized_keys.erb模板如下所示:

# NOTICE: This file is autogenerated by Puppet and should not be modified
<% sshkeys.each do |key| -%>
<%= key %>
<% end -%>

用法

user {'mikko':
    ...
}
authorized_keys {'mikko':
    sshkeys => [
        'ssh-rsa XXXXXXYYYYYYYYYZZZZZZZZZ [email protected]',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH [email protected]',
    ],
}

由于 Puppet 的操作符,有条件地添加 SSH 密钥(例如在不同的类中)也很容易+>

Authorized_keys <| title == 'mikko' |> {
    sshkeys +> 'ssh-rsa ASDFASDFASDFASDF [email protected]'
}

使用这种方法,用户将永远不会拥有未在 Puppet 配置中明确指定的密钥。密钥字符串在 authorized_keys 中按原样使用,因此添加选项和限制很简单。

如果其他人成功使用了这种方法我会很高兴!

答案3

你应该能够使用资源元类型。例如

resources { 'ssh_authorized_key': noop => true, purge => true, }

设置noop => true,阻止删除。相反,puppet 将报告将被删除的内容。如果这是您想要的,请删除无操作陈述。

对非托管资源执行操作的理想语法是正在讨论中

编辑:正如评论中提到的,这个答案不起作用。

答案4

在 Puppet Forge 上,已经发布了一个根据 Apache 许可证 2.0 版提供此功能的模块。

但是它依赖于 Puppet concat,而不是模板。

https://github.com/nightfly19/puppet-ssh_keys/tree/master/manifests

您不需要将键数组作为参数传递,而需要为每个键定义单独的条目。

与 Mikko 的方法不同,但最终结果相同。

相关内容