web-dev-qa-db-ja.com

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はそのキーをそのまま残します。マニフェストで明示的に定義されていないキーを常に削除する方法はありますか?

パペットバージョン2.7.1を持っています。

12
Dylan Tack

Puppet 3.6以降、userタイプを介して 管理されていないSSH認証済みキーを削除する が可能になりました。例えば、

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

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でそのまま使用されるため、オプションと制限を追加するのは簡単です。

他の人がこの方法をうまく利用できたら嬉しいです!

13
Mikko

resourcesメタタイプを使用してこれを実行できるはずです。例えば。

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

設定noop => true,削除が行われないようにします。代わりに、人形は削除されるものを報告します。必要な場合は、noopステートメントを削除します。

アンマネージリソースで操作を実行するための理想的な構文は 議論中 です。

編集:コメントで述べたように、この答えは機能しません。

3
sciurus

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

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

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

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

Mikkoのアプローチとは異なりますが、最終結果は同じです。

1
Rodney