Использование 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 / авторизованный_ключ, Puppet оставит его на месте. Есть ли способ всегда удалять любой ключ, который не был явно определен в манифесте?

У меня есть версия куклы 2.7.1.

Дилан Тэк
источник
Я думал об использовании экспортированных ресурсов, чтобы получить копию всех моих авторизованных файлов в центральном месте. Затем я мог запустить сценарии, чтобы найти необычные ключи, и либо добавить их в Puppet, либо добавить ресурс для их удаления.
Зоредаче

Ответы:

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. Строка ключа используется в author_keys так же, как и сейчас, поэтому добавление опций и ограничений тривиально.

Я был бы рад услышать, если бы другие использовали этот метод успешно!

Микко
источник
3

Вы должны быть в состоянии сделать это, используя метатип ресурсов . НАПРИМЕР

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

Настройка noop => true,предотвращает удаление. Вместо этого марионетка сообщит, что будет удалено. Если это то, что вы хотите, удалите оператор noop .

Идеальный синтаксис для выполнения операций на неуправляемых ресурсах находится в стадии обсуждения .

РЕДАКТИРОВАТЬ: Как уже упоминалось в комментариях, этот ответ не работает.

Sciurus
источник
Это похоже на то, что я ищу. Когда я добавляю эту строку, 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
sciurus
1
Мне действительно непонятно, почему это принятый ответ: согласно Puppet Labs, это не работает и не имеет: projects.puppetlabs.com/issues/1917 . OP, это сработало для вас?
Билл Вайс
1
Нет, я не пробовал, я просто ожидал, что он будет вести себя так же, как и для других ресурсов (например, хосты, типы nagios). Похоже, что вы правы, и это еще не работает для ключей ssh
sciurus
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.
Родни