Використання Лялечки для видалення ключів SSH, явно не дозволених


12

Я використовую маріонетку для розповсюдження ключів SSH, наприклад:

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

Файл ~ / .ssh / pooblasti_keys закінчується вмістом суміші клавіш з декількох класів, що є бажаним результатом. Однак якщо ключ вручну буде додано до $ HOME / .ssh / санкціонований_кейс, Лялечка залишить його на місці. Чи є спосіб завжди видалити будь-який ключ, який не був чітко визначений в маніфесті?

У мене ляльковий варіант 2.7.1.


Я думав про використання експортованих ресурсів, щоб отримати копію всіх моїх авторизованих файлів у центральне місце. Тоді я міг запускати сценарії, щоб знайти незвичайні ключі, або додати їх до маріонеткових або додати ресурс для їх видалення.
Zoredache

Відповіді:



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'
}

При цьому методі користувач ніколи не матиме ключі, які не вказані явно в конфігурації ляльки. Ключовий рядок використовується в авторизованих_кейсах так само, як є, тому додавання параметрів та обмежень є тривіальним.

Я був би радий почути, якби інші успішно використовували цей метод!


3

Ви повинні зробити це за допомогою метатипу ресурсів . EG

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

Налаштування noop => true,перешкоджає видаленню. Натомість лялька повідомить про те, що буде видалено. Якщо це те, що ви хочете, видаліть оператор noop .

Ідеальний синтаксис для виконання операцій на некерованих ресурсів обговорюється .

EDIT: Як було сказано в коментарях, ця відповідь не працює.


Це звучить як те, що я шукаю. Коли я додаю цей рядок, маріонетка видає цю помилку: 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
Мені незрозуміло, чому це прийнята відповідь: згідно з Ляльковими лабораторіями, це не працює і не працює: Projects.puppetlabs.com/isissue/1917 . ОП, це працювало для вас?
Білл Вайс

1
Ні, я не пробував цього, я просто очікував, що він поводитиметься так, як це робиться для інших ресурсів (наприклад, хостів, типів nagios). Схоже , ви маєте рацію , і це не працює для ключів SSH yet- projects.puppetlabs.com/issues/1581
Sciurus

1

На Puppet Forge модуль був опублікований під ліцензією Apache, версія 2.0, яка пропонує цю можливість.

Хоча він покладається на ляльковий конмат, а не на шаблони.

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

Замість передачі масиву ключів у якості параметра ви визначаєте окремі записи для кожного ключа.

Інший підхід від Мікко, але той же чистий результат.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.