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


12

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

ssh_authorized_key { "alice@foo.com":
   ensure => present,
   key => 'xxxx',
   type => 'ssh-rsa',
   user => 'deploy',
}

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

我有木偶版本2.7.1。


我当时正在考虑使用导出的资源将我所有的authenticated_keys文件的副本复制到一个中央位置。然后,我可以运行脚本来查找不寻常的键,然后将它们添加到puppet或添加资源以将其删除。
Zoredache

Answers:



13

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 mikko@domain.tld',
        'ssh-rsa XXXXXXZZZZZZZZZHHHHHHHHH mikko@other-host.tld',
    ],
}

有条件地添加SSH密钥(例如在不同的类中)也很容易,这要归功于Puppet的+>运算符:

Authorized_keys <| title == 'mikko' |> {
    sshkeys +> 'ssh-rsa ASDFASDFASDFASDF mikko@somewhere-else.tld'
}

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

我很高兴听到别人是否成功使用了此方法!


3

您应该能够使用资源元类型来执行此操作。例如

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

设置noop => true,可防止删除操作。相反,p将报告将被删除的内容。如果这是您想要的,请删除noop语句。

正在讨论在非托管资源上执行操作的理想语法。

编辑:如评论中所述,此答案不起作用。


听起来就像我在寻找什么。当我添加此行时,puppet会产生此错误: puppet-agent[9895]: (/Stage[main]//Resources[ssh_authorized_key]) Failed to generate additional resources using 'generate': Attribute 'user' or 'target' is mandatory. 我尝试添加用户,然后显示Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter user 。有任何想法吗?
Dylan Tack

我不确定。可能值得在groups.google.com/group/puppet-users上
sciurus

1
我真的不清楚为什么这是公认的答案:根据Puppet Labs,这行不通,并且没有:projects.puppetlabs.com/issues/1917。OP,对您有用吗?
比尔·韦斯

1
不,我没有尝试过,我只是希望它的行为像其他资源(例如主机,nagios类型)一样。看起来你是正确的,它确实为SSH密钥yet-不工作projects.puppetlabs.com/issues/1581
松鼠

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.