Все наши ~ / .ssh / authorized_keys были созданы с режимом 0400 (пользовательский, только для чтения). Мы хотим управлять этими файлами с помощью Puppet, поэтому я создал следующее:
class users {
user { 'julia':
home => '/home/julia',
ensure => present,
purge_ssh_keys => true,
}
}
ssh_authorized_key { 'julia@dirty':
ensure => present,
user => 'julia',
type => 'ssh-ed25519',
key => 'AAAAC3NzaC1lvvvvvvxxxxxO1mXiiyj3Af17MviiiiiiiifffffzU5e//e/ffff/y',
}
Однако, когда я запускаю 'puppet agent --test' на узле, я получаю следующую ошибку:
Error: Puppet::Util::FileType::FileTypeFlat could not write /home/julia/.ssh/authorized_keys: Permission denied - /home/julia/.ssh/authorized_keys
Error: /Stage[main]/Profile::Base/Ssh_authorized_key[julia@dirty]: Could not evaluate: Puppet::Util::FileType::FileTypeFlat could not write /home/julia/.ssh/authorized_keys: Permission denied - /home/julia/.ssh/authorized_keys
Я могу «исправить» файл проблема со следующим:
file { "/home/julia/.ssh/authorized_keys":
ensure => present,
mode => '0600',
}
Я удивлен, что это проблема. Я думал, что это будет работать с любым допустимым режимом файла (0600 или 0400). Я не могу найти в документации по модулю Forge ничего о допустимых режимах или изменении режимов. Параметр 'file' - приемлемый обходной путь, но он не работает как вложенный в раздел 'ssh_authorized_key', поэтому не так аккуратно, как хотелось бы. Кроме того, я не знаю, как это сделать для многих пользователей.
Не могли бы вы предложить способ решения этой проблемы лучше?
В поиске есть несколько сообщений, в которых задается та же проблема, но нет хороших решений. Вот один, сделанный 7 лет назад. Я не думаю, что патч когда-либо делал это в базе кода: https://projects.puppetlabs.com/issues/5395
Я думаю, что authorized_keys
должен быть 0600. 0400 доступен только для чтения, что означает, что даже пользователь не может его записать!
Причина "режима" не работает в ресурсе ssh_authorized_key
, потому что этот ресурс только добавляет запись, он не управляет файлом.
С точки зрения обходного пути / управления большим количеством пользователей, я бы сделал это как это (в Puppet 3, но я уверен, что в Puppet4 / 5 это более аккуратно, используя некоторую итерацию?):
define myuser (
$user,
$key,
) {
user { $user:
home => "/home/${user}",
ensure => present,
purge_ssh_keys => true,
}
file { "/home/${user}/.ssh/authorized_keys":
ensure => file,
mode => "0600",
require => User[$user],
}
ssh_authorized_key { "${user}@${host}":
ensure => present,
user => $user,
type => 'ssh-ed25519',
key => "${key}",
}
}
, которое вы затем можете использовать с:
node default {
myuser { "shearn89":
user => "shearn89",
key => "somelongasciistring",
}
}
Вы также можете сделать некоторые умные вещи с определением пользователей (возможно, в Hiera), а затем создание ресурсов .
Или вы можете рассмотреть возможность использования такого инструмента, как Ansible, для запуска задачи на всей вашей платформе и исправления файла. Я обнаружил, что Ansible прекрасно дополняет Puppet, когда используется для такого рода оркестровки / разовых задач.