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

Марионетка: ssh - authorized_keys - в доступе отказано

Все наши ~ / .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, когда используется для такого рода оркестровки / разовых задач.