Как я могу создать гостевую виртуальную машину KVM на 100% в качестве пользователя без прав администратора?

Вопрос или проблема

На хосте Debian с многими пользователями я хочу позволить различным пользователям создавать свои собственные виртуальные машины (ВМ), полностью независимые друг от друга.

Наиболее близкий подход (не root) из увиденных мной в руководствах заключается в подключении к гипервизору qemu:///system. Это системный гипервизор, который разделяется всеми пользователями. Более того, файл образа диска будет принадлежать пользователю root (или kvm), что означает, что весь путь к файлу образа диска должен быть читаемым для всех пользователей.

По вышеуказанным и другим причинам я хочу запускать свои ВМ исключительно и полностью от имени непользователя. То есть как qemu:///session. Главный вопрос: как мне это сделать? Есть ли какие-либо руководства, которые я мог бы использовать?

Я доходил до того, что пытался создать новый виртуальный интерфейс моста, но, хотя я и являюсь членом группы netdev, я получаю ошибки “access denied” (доступ запрещен), когда выполняю следующее:

 virsh -c qemu:///session net-create /etc/libvirt/qemu/networks/mynet.xml

Обратите внимание, что mynet.xml такой же, как и сеть по умолчанию, но в другом подсети.

То, что вы используете, — это не KVM напрямую, а управленческая библиотека под названием libvirt.

Вы можете указать пользователя, который будет иметь доступ к настройкам libvirt (и, следовательно, создавать ВМ и фактически выполнять команды virsh), добавив пользователей в группы libvirtd и kvm на хосте.

Вы также можете использовать policykit для управления доступом, процедура описана на вики libvirt: SSHPolicyKitSetup | Libvirt Wiki

Для KVM вам нужен доступ к устройству /dev/kvm. Если пользователь может читать/записывать в это устройство, то он может запускать виртуальные машины на базе KVM без прав root.

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

Что касается ответа от @Pjotr: Когда я пытался, мне нужно было быть добавленным в группу libvirt, а не kvm.

/home/peter# usermod --append --groups libvirt peter

/home/peter# groups peter
peter : peter libvirt

Ответ или решение

Создание виртуальных машин (VM) в среде KVM (Kernel-based Virtual Machine) под управлением пользователя, не обладающего правами root, может показаться сложной задачей, однако это возможно. В этой статье я подробно расскажу о том, как это сделать на хосте Debian для разных пользователей, чтобы каждый из них мог инициировать и управлять своими виртуальными машинами независимо.

1. Установка необходимых пакетов

Для начала убедитесь, что у вас установлены все необходимые пакеты. Для этого выполните следующую команду:

sudo apt update
sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system

2. Настройка групп пользователей

Доступ к устройствам KVM и управления виртуальными машинами осуществляется через группы. Вам необходимо добавить пользователей в соответствующие группы, чтобы они могли использовать libvirt и KVM. В качестве примера добавим пользователя "username" в группы kvm и libvirt:

sudo usermod -aG kvm username
sudo usermod -aG libvirt username

Проверьте, что пользователь был успешно добавлен в группы:

groups username

3. Разрешения на доступ к устройствам

Убедитесь, что у пользователя есть доступ к устройству /dev/kvm. Обычно, добавление в группу kvm предоставляет необходимые разрешения, однако вы можете проверить это, выполнив:

ls -l /dev/kvm

Проверьте, что группа владельца устройства установлена на kvm.

4. Использование qemu:///session

Теперь, чтобы создать виртуальную машину без прав root, используйте virsh с подключением к сессии текущего пользователя. Это позволит вам управлять виртуальными машинами, не требуя глобальных привилегий:

virsh -c qemu:///session list --all

На данном этапе вы можете создавать виртуальные машины непосредственно в своей сессии пользователя.

5. Создание сети

Чтобы создать собственную сеть, требуемую для виртуальных машин, вам нужно будет использовать конфигурационный файл, подобный тому, который вы упомянули (например, mynet.xml). Однако для обеспечения доступа к созданию сети в virsh под сессией пользователя вы столкнетесь с ограничениями.

Для создания сети, вам, возможно, потребуется использовать конфигурирование с помощью PolicyKit. Для более подробной информации по этому вопросу, ознакомьтесь с официальной документацией libvirt: PolicyKitSetup.

6. Настройка PolicyKit

Чтобы пользователи могли управлять своим сетевым окружением, необходимо убедиться, что у них есть соответствующие разрешения в PolicyKit. Для этого вы можете создать файл конфигурации в /etc/polkit-1/localauthority/50-local.d, назовем его libvirt-session.pkla.

Внутри этого файла добавьте следующее:

[Allow non-root access]
Identity=unix-group:libvirt
Action=org.libvirt.unix.manage
ResultAny=no
ResultInactive=no
ResultActive=yes

Этот файл даст пользователям из группы libvirt разрешение на выполнение команд управления виртуальными машинами и сетями через virsh.

7. Проверка доступа

После того как вы выполнили описанные выше шаги, перезагрузите систему или выйдите и снова войдите в свою учетную запись. Теперь проверьте, можете ли вы создать новую сеть, используя:

virsh -c qemu:///session net-create /path/to/mynet.xml

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

Заключение

Создание KVM-гостя в среде Debian без использования прав администратора — это задача, которую можно решить путем правильной настройки групп пользователей, прав на доступ к устройствам и конфигурации PolicyKit. Следуя данным инструкциям, вы сможете дать вашим пользователям возможность работать с виртуальными машинами в безопасной и независимой среде.

Оцените материал
Добавить комментарий

Капча загружается...