Назад | Перейти на главную страницу

Использование Puppet для удаления ключей SSH явно не разрешено

Я использую марионетку для распространения ключей 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.

Вместо того, чтобы использовать 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's +> оператор:

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

С помощью этого метода у пользователя никогда не будет ключей, которые явно не указаны в конфигурации Puppet. Строка ключа используется в authorized_keys в неизменном виде, поэтому добавление параметров и ограничений тривиально.

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

Начиная с Puppet 3.6, теперь можно очистить неуправляемые авторизованные ключи SSH через user тип. Например,

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

Вы можете сделать это с помощью Ресурсы метатип. НАПРИМЕР.

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

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

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

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

В Puppet Forge был опубликован модуль под лицензией Apache версии 2.0, которая предлагает эту возможность.

Однако вместо шаблонов он использует Puppet concat.

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

Вместо того, чтобы передавать массив ключей в качестве параметра, вы определяете отдельные записи для каждого ключа.

Отличный от Микко подход, но тот же результат.