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

Настройка аутентификации на виртуальной машине

Я создаю систему, похожую на поставщика облачных вычислений, с использованием привязок libvirt python.

Я хотел бы дать пользователям возможность указывать собственный образ виртуальной машины аналогично AWS.

Я хотел бы на лету сгенерировать пары ключей SSH и настроить виртуальную машину для аутентификации с открытым ключом.

Как лучше всего это сделать? Какие требования я должен наложить на указанный пользователем образ виртуальной машины, чтобы это работало?

Я думал о беспарольной учетной записи root, чтобы позволить моему программному обеспечению входить в систему и настраивать то, что необходимо, но это оставляет (короткий) промежуток времени, в течение которого каждый может войти в систему как root. Есть ли лучшие решения? Могу ли я отредактировать образ виртуальной машины перед ее запуском?

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

Редактировать:

Некоторые дополнительные детали:

  1. Я знаю про Eucalyptus, Cloudstack и Openstack. Эта реализация предназначена для очень специфической среды / требований (кластеры HPC, планирование пакетных заданий) и не позволяет их запускать.
  2. Мне на самом деле все равно (или, для целей этого вопроса, это не имеет значения), откуда берется пара ключей, я только хочу знать, как поставщик услуг может получить доступ к машине, требуя как можно меньше настроек на образе ВМ на пользовательской части; ErikA ответила на это, предложив пару ключей для конкретной услуги. Справедливо. Есть ли другие решения?
  3. Конечному пользователю не обязательно иметь доступ к новой виртуальной машине, он будет запускать на ней задания через SLURM (хотя он может получить к нему доступ, если захочет, мне все равно).
  4. Поставщик заботится о:
    1. Выделение и создание новых доменов (виртуальных машин)
    2. Создание демона SLURM (что не обязательно должно происходить при запуске, но в определенный момент времени, поэтому поставщику необходимо иметь доступ к машине)

Возможно, вам стоит попытаться не изобретать велосипед заново. Есть много фреймворков, которые сделают именно то, что вы хотите ... и даже бесплатных / с открытым исходным кодом. Попробуй посмотреть на облако или эвкалипт для двух таких сред.

Я решил это следующим образом:

Поскольку мне нужен был IP-адрес, назначенный виртуальной машине, и поскольку libvirt не предлагает средств для его получения (в отличие от VMWare, который предлагает набор инструментов VMWare для таких операций), я закончил настройку серийного номера (на гостевом компьютере). ) в канал tcp (на хосте) между виртуальной машиной и хостом, используя libvirt поддержка виртуальных устройств.

Затем простой сценарий оболочки на гостевой машине ожидает, пока IP-адрес не будет назначен данному интерфейсу, и записывает его на последовательное устройство. Когда TCP-сервер, находящийся на хосте, получает IP-адрес, он отправляет обратно его открытый ключ, который скрипт на гостевой машине считывает (опять же, из последовательного порта) и записывает обратно в правильный authorized_keys файл.

Это решение можно использовать без части обмена IP, при этом только гость будет читать ключ из последовательного порта при загрузке. Преимущества такого решения заключаются в том, что гостевую ОС не нужно настраивать с помощью заданного ключа (такие разные пары ключей можно использовать для разных «разделов» системы) и что она может определять, где его разместить; Обратной стороной является то, что гость должен быть настроен для запуска сценария.

Другое решение - смонтировать образ диска перед загрузкой виртуальной машины, используя что-то вроде libguestfs, скопируйте открытый ключ, размонтируйте его и загрузите гостя. Это решение предпочтительнее, чем TCP <-> SerialPort, но поскольку мне все равно нужен IP-адрес, я поступил наоборот.

Третье решение, предложенное ErikA в его первом комментарии, - позволить пользователю, создающему образ, выполнить всю настройку, предоставив ему ваш открытый ключ. Это, вероятно, лучшее (самое чистое и элегантное) решение для наиболее общего случая.