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があります。


エクスポートされたリソースを使用して、すべてのauthorized_keysファイルのコピーを中央の場所に取得することを考えていました。次に、スクリプトを実行して異常なキーを見つけ、それらをパペットに追加するか、リソースを追加して削除します。
ゾレダチェ

回答:



13

ssh_authorized_keyリソースを使用する代わりにauthorized_keys、1人のユーザーのすべての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',
    ],
}

Puppetのおかげで、条件付きで(たとえば、異なるクラスで)SSHキーを追加するのも簡単です +>オペレーターのです。

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,すると、削除が行われなくなります。代わりに、パペットは削除されるものを報告します。必要な場合は、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 。何か案は?
ディランタック

よく分かりません。これはおそらく、上尋ねる価値がgroups.google.com/group/puppet-users
リス属

1
これが受け入れられた答えは、なぜ私は実際には不明だ:人形Labsの通り、これは動作しないとされていません:projects.puppetlabs.com/issues/1917を。OP、あなたのために働きましたか?
ビルヴァイス

1
いいえ、試していませんでした。他のリソース(ホスト、nagiosタイプなど)のように動作することを期待していました。あなたのように見えている権利と、それは、SSHキーの作業yet-ないprojects.puppetlabs.com/issues/1581
リス属

1

Puppet Forgeでは、この機能を提供するモジュールがApacheライセンスバージョン2.0で公開されています。

ただし、テンプレートではなくPuppet concatに依存しています。

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

パラメータとしてキーの配列を渡す代わりに、キーごとに個別のエントリを定義します。

ミッコとは異なるアプローチですが、最終的な結果は同じです。


forge.puppetlabs.com/nightfly/ssh_keys はPuppet Forgeリンクです。
ロドニー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.