14.12. Система управления доступом
14.12.1. Введение
Система виртуализации МСВСфера ОС предоставляет гибкий механизм управления
доступом основанный на политиках polkit
для локальных и удалённых подключений
к гипервизору, а также на основе политик D-Bus
для управления правами доступа
через веб-интерфейс системы управления Cockpit
.
Внимание: функция управления доступом на основе политик поддерживается только для гипервизора, работающего в режиме «14.3.3. Системный режим».
14.12.2. Управление политиками доступа polkit
14.12.2.1. Включение драйвера контроля доступа polkit
За функцию контроля доступа к тем или иным API вызовам гипервизора libvirt
отвечают подключаемые модули — драйверы.
В конфигурации по умолчанию используется драйвер-заглушка, который фактически не выполняет каких-либо проверок контроля доступа. Соответственно, любой пользователь, успешно прошедший аутентификацию, получает полный доступ ко всем функциям гипервизора без каких-либо ограничений.
При таких настройках использование гипервизора в системном режиме доступно следующим пользователям:
root
— глобальный администратор системы, ввод пароля не требуется.любой пользователь, добавленный в системную группу
libvirt
, ввод пароля не требуется.любой пользователь с правами администратора (группа
wheel
в конфигурации системы по умолчанию), при этом требуется ввод пароля.
В состав системы виртуализации входит драйвер контроля доступа на основе
политик polkit
, который позволяет администратору выполнить детализированную
настройку правил доступа на основе встроенных в libvirt
объектов и разрешений (см. «14.12.3. Объекты и разрешения libvirt»).
Для включения драйвера контроля доступа polkit
раскомментируйте строку
#access_drivers = [ "polkit" ]
в следующих конфигурационных файлах:
/etc/libvirt/virtqemud.conf
/etc/libvirt/virtinterfaced.conf
/etc/libvirt/virtnetworkd.conf
/etc/libvirt/virtnodedevd.conf
/etc/libvirt/virtnwfilterd.conf
/etc/libvirt/virtsecretd.conf
/etc/libvirt/virtstoraged.conf
/etc/libvirt/libvirtd.conf
/etc/libvirt/virtproxyd.conf
Изменения можно выполнить как вручную, так и с помощью следующей команды:
$ sudo find /etc/libvirt -name '*virt*d.conf' \
-exec sed -i 's/#access_drivers = \[ "polkit" \]/access_drivers = \[ "polkit" \]/g' {} +
Для активации драйвера контроля доступа polkit
перезапустите соответствующие
сервисы:
$ sudo systemctl restart virtqemud
$ sudo systemctl restart virtinterfaced
$ sudo systemctl restart virtnetworkd
$ sudo systemctl restart virtnodedevd
$ sudo systemctl restart virtnwfilterd
$ sudo systemctl restart virtsecretd
$ sudo systemctl restart virtstoraged
Если вы по каким-то причинам используете virtproxyd
, то перезапустите так же
этот сервис:
$ sudo systemctl restart virtproxyd
14.12.2.2. Разрешения для объектов libvirt
Объекты и разрешения libvirt (см. «14.12.3. Объекты и разрешения libvirt») преобразуются в названия действий (actions) polkit по следующей схеме:
org.libvirt.api.$object.$permission
где:
$object
— название объекта в API libvirt;$permission
— название разрешения к API вызовам заданного объекта.
14.12.2.3. Дополнительные атрибуты объектов libvirt
Чтобы сделать возможным описание правил контроля доступа для отдельных
экземпляров объектов libvirt
предоставляет для объектов следующие
дополнительные атрибуты:
connect
(virConnectPtr
):connect_driver
— название драйвера подключенияlibvirt
.
domain
(virDomainPtr
):connect_driver
— название драйвера подключенияlibvirt
.domain_name
— название виртуальной машины, уникальное в пределах данного узла гипервизора.domain_uuid
— уникальный идентификатор (UUID) виртуальной машины, уникальный для всего кластераlibvirt
.
interface` (``virInterfacePtr`
):connect_driver
— название драйвера подключенияlibvirt
.interface_name
— название сетевого интерфейса, уникальное в пределах данного узла гипервизора.interface_macaddr
- MAC адрес сетевого интерфейса.
network
(virNetworkPtr
):connect_driver
— название драйвера подключенияlibvirt
.network_name
— название сети, уникальное в пределах данного узла гипервизора.network_uuid
— уникальный идентификатор (UUID) сетевого интерфейса, уникальный для всего кластераlibvirt
.
node-device
(virNodeDevicePtr
):connect_driver
— название драйвера подключенияlibvirt
.node_device_name
— название аппаратного устройства, уникальное в пределах данного узла гипервизора.
nwfilter
(virNWFilterPtr
):connect_driver
— название драйвера подключенияlibvirt
.nwfilter_name
— название сетевого фильтра, уникальной в пределах данного узла гипервизора.nwfilter_uuid
— уникальный идентификатор (UUID) сетевого фильтра, уникальный для всего кластераlibvirt
.
secret
(virSecretPtr
):connect_driver
— название драйвера подключенияlibvirt
.secret_uuid
— уникальный идентификатор приватного ключа, уникальный для всего кластераlibvirt
.secret_usage_volume
— название тома, к которому привязан данный приватный ключ, если такая привязка существует.secret_usage_ceph
— название Ceph сервера, к которому привязан данный приватный ключ, если такая привязка существует.secret_usage_target
— название iSCSI-таргета, к которому привязан данный приватный ключ, если такая привязка существует.secret_usage_name
— название TLS-ключа, к которому привязан данный приватный ключ, если такая привязка существует.
storage-pool
(virStoragePoolPtr
):connect_driver
— название драйвера подключенияlibvirt
.pool_name
— название пула хранения, уникальное в пределах данного узла гипервизора.pool_uuid
— уникальный идентификатор (UUID) пула хранения, уникальный для всего кластераlibvirt
.
storage-vol
(virStorageVolPtr
):connect_driver
— название драйвера подключенияlibvirt
.pool_name
— название пула хранения, в котором расположен данный том, уникальное в пределах данного узла гипервизора.pool_uuid
— уникальный идентификатор (UUID) пула хранения, в котором расположен данный том, уникальный для всего кластераlibvirt
.vol_name
— название тома хранения, уникальное в пределах пула хранения.vol_key
— ключ тома, уникальный для всего кластераlibvirt
.
14.12.2.4. Создание политик контроля доступа polkit
По умолчанию libvirt не предоставляет каких-либо правил для polkit
кроме
следующих:
разрешения, доступные только для чтения (см. третью колонку в таблице разрешений в разделе «14.12.3. Объекты и разрешения libvirt» для каждого типа объектов), предоставляются всем пользователям;
все остальные операции запрещены.
Политики polkit
представляют собой код на языке программирования JavaScript,
размещённый в виде файлов с расширением .rules
в каталоге
/etc/polkit-1/rules.d
. Соответственно, для определения собственных правил
системному администратору необходимо добавить в этот каталог новый файл,
допустим, 99-libvirt-fstec.rules
.
Подробное описание процесса создания собственных политик polkit
доступно в
соответствующей документации (man 8 polkit
), также доступна веб-версия на
официальном сайте проекта: polkit.8.html.
В данном разделе мы разберём лишь один из примеров практического применения политик polkit
для libvirt
.
14.12.3. Объекты и разрешения libvirt
14.12.3.1. Описание объектной модели API libvirt
Система виртуализации libvirt
использует объектно-ориентированную модель для
предоставления доступа к ресурсам гипервизора через API. Соответственно,
каждый тип ресурса, будь то виртуальная машина, сетевой интерфейс, пул
хранения и т.д., представлен в виде объекта и набора API-вызовов для работы с
этим объектом/ресурсом. Даже само подключение к гипервизору является таким
объектом.

Описание объектной модели API libvirt
В свою очередь, для каждого API-вызова объекта определяется свой набор разрешений (прав), которые должны быть присвоены пользователю системным администратором чтобы он мог выполнить данный API вызов.
14.12.3.2. Типы объектов
connect (virConnectPtr)
Объект connect
используется API для подключения к гипервизору.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Обнаружение доступных хранилищ. |
Нет |
|
Подключение к гипервизору и получение информации о системе. |
|
|
Управление транзакциями при изменении сетевых интерфейсов. |
Нет |
|
Управление питанием узла (сервера) гипервизора и гостевых машин. |
Нет |
|
Получение информации об узле (сервере) гипервизора. |
Да |
|
Получение списка виртуальных машин. |
Да |
|
Получение списка сетевых интерфейсов. |
Да |
|
Получение списка сетей. |
Да |
|
Получение списка оборудования. |
Да |
|
Получение списка привязок сетевых фильтров к сетевым интерфейсам. |
Да |
|
Получение списка сетевых фильтров. |
Да |
|
Получение списка секретов. |
Да |
|
Получение списка пулов хранилищ. |
Да |
|
Управление параметрами узла (сервера) гипервизора. |
Нет |
domain (virDomainPtr)
Объект domain
используется API для управления виртуальными машинами.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Чтение содержимого диска виртуальной машины. |
Нет |
|
Изменение диска виртуальной машины. |
Нет |
|
Управление точками восстановления виртуальной машины. |
Нет |
|
Управление дампами памяти виртуальной машины. |
Нет |
|
Удаление виртуальной машины. |
Нет |
|
Управление «заморозкой» файловых систем виртуальной машины. |
Нет |
|
Использование команды TRIM для дисков виртуальной машины. |
Нет |
|
Получение списка виртуальных машин. |
Да |
|
Получение информации о виртуальных машинах. |
Да |
|
Управление спящим режимом виртуальной машины. |
Нет |
|
Выключение и перезагрузка виртуальной машины. |
Нет |
|
Разрешает отправку NMI прерывания виртуальной машине. |
Нет |
|
Разрешает чтение оперативной памяти виртуальной машины. |
Нет |
|
Управление миграцией виртуальной машины на другой узел гипервизора. |
Нет |
|
Разрешает работу с каналами, последовательными терминалами, последовательными и параллельными портами, подключенными к виртуальной машине. |
Нет |
|
Разрешает подключение к графическому дисплею виртуальной машины. |
Нет |
|
Разрешает работу с пространствами имён виртуальной машины (LXC-контейнера). |
Нет |
|
Управление питанием виртуальной машины. |
Нет |
|
Чтение настроек виртуальной машины, не связанных с безопасностью. |
Да |
|
Чтение настроек виртуальной машины, связанных с безопасностью. |
Нет |
|
Принудительная перезагрузка (аналог аппаратной кнопки reset) виртуальной машины. |
Нет |
|
Изменение конфигурационного файла виртуальной машины. |
Нет |
|
Создание снимка экрана виртуальной машины. |
Нет |
|
Клавиатурный ввод через виртуализированную клавиатуру виртуальной машины. |
Нет |
|
Отправка сигналов процессам внутри виртуальной машины. |
Нет |
|
Установка пароля пользователю внутри виртуальной машины. |
Нет |
|
Установка времени на виртуальной машине. |
Нет |
|
Создание снимков (snapshots) виртуальной машины. |
Нет |
|
Запуск виртуальной машины. |
Нет |
|
Остановка виртуальной машины. |
Нет |
|
Приостановка виртуальной машины. |
Нет |
|
Изменение виртуальной машины. |
Нет |
interface (virInterfacePtr)
Объект interface
используется API для управления сетевыми интерфейсами.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление сетевого интерфейса. |
Нет |
|
Получение списка сетевых интерфейсов. |
Да |
|
Получение информации о сетевом интерфейсе. |
Да |
|
Добавление сетевого интерфейса или изменение его конфигурации. |
Нет |
|
Активация сетевого интерфейса. |
Нет |
|
Деактивация (остановка) сетевого интерфейса. |
Нет |
|
Изменение конфигурации сетевого интерфейса. |
Нет |
network (virNetworkPtr)
Объект network
используется API для управления сетями.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление сети. |
Нет |
|
Получение списка сетей. |
Да |
|
Чтение настроек сети. |
Да |
|
Добавление сети или изменение её конфигурации. |
Нет |
|
Получение списка сетевых портов. |
Нет |
|
Активация сети. |
Нет |
|
Деактивация сети. |
Нет |
|
Изменение конфигурации сети. |
Нет |
network-port (virNetworkPortPtr)
Объект network-port
используется API для управления сетевыми портами.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Создание нового сетевого порта. |
Нет |
|
Удаление сетевого порта. |
Нет |
|
Получение списка сетевых портов. |
Да |
|
Чтение настроек сетевого порта. |
Да |
|
Изменение конфигурации сетевого порта. |
Нет |
node-device (virNodeDevicePtr)
Объект node-device
используется API для управления аппаратными устройствами,
подключенными к узлу гипервизора.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление конфигурации устройства на хост системе. |
Нет |
|
Отсоединение устройства от хост системы. |
Нет |
|
Получение списка устройств. |
Да |
|
Чтение информации об устройстве. |
Да |
|
Запуск устройства. |
Нет |
|
Остановка устройства. |
Нет |
|
Изменение конфигурации устройства. |
Нет |
nwfilter (virNWFilterPtr)
Объект nwfilter
используется API для управления сетевыми фильтрами
(брандмауэром).
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление сетевого фильтра. |
Нет |
|
Получение списка сетевых фильтров. |
Да |
|
Чтение настроек сетевого фильтра. |
Да |
|
Добавление нового сетевого фильтра или редактирование его конфигурации. |
Нет |
|
Изменение конфигурации сетевого фильтра. |
Нет |
nwfilter-binding (virNWFilterBindingPtr)
Объект nwfilter-binding
используется API для привязки сетевых фильтров к
сетевым интерфейсам.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Привязывание сетевого фильтра к порту виртуальной машины. |
|
|
Удаляет привязку сетевого фильтра к порту. |
|
|
Получение списка привязок сетевых фильтров к портам. |
Да |
|
Получение информации о сетевом фильтре. |
Да |
secret (virSecretPtr)
Объект secret
используется API для работы с хранилищем секретных ключей
libvirt
. Это хранилище может использоваться для хранения ключей от LUKS или
iSCSI разделов, пароля от виртуализированного TPM устройства, ключа от Ceph RBD
и т.д..
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление секретного ключа. |
|
|
Получение списка секретных ключей. |
|
|
Получение информации о секретном ключе. |
Да |
|
Получение (значения) секретного ключа. |
|
|
Создание нового секретного ключа или изменение значения существующего. |
|
|
Изменение значения секретного ключа. |
storage-pool (virStoragePoolPtr)
Объект storage-pool
используется API для управления пулами хранения на
гипервизоре.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Удаление пула хранения. |
Нет |
|
Форматирование пула хранения или его удаление. |
Нет |
|
Получение списка пулов хранения. |
Да |
|
Получение информации о пуле хранения и его конфигурации. |
Да |
|
Обновление списка томов пула хранения. |
Нет |
|
Создание нового пула хранение или редактирование конфигурации существующего. |
Нет |
|
Получение списка томов, находящихся в пуле хранения. |
Нет |
|
Запуск пула хранения. |
Нет |
|
Остановка пула хранения. |
Нет |
|
Изменение конфигурации пула хранения. |
Нет |
storage-vol (virStorageVolPtr)
Объект storage-vol
используется API для управления томами в пулах хранения.
Разрешение |
Описание |
Только для чтения |
---|---|---|
|
Создание тома. |
Нет |
|
Чтение данных из тома через поток. |
Нет |
|
Запись данных на том через поток. |
Нет |
|
Удаление тома из пула хранения. |
Нет |
|
Форматирование тома. |
Нет |
|
Получение списка томов в пуле хранения. |
Да |
|
Получение информации о томе. |
Да |
|
Изменение размера тома. |
Нет |