Применимо к редакции: МСВСфера 9 (ФСТЭК)

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 libvirt

В свою очередь, для каждого API-вызова объекта определяется свой набор разрешений (прав), которые должны быть присвоены пользователю системным администратором чтобы он мог выполнить данный API вызов.

14.12.3.2. Типы объектов

connect (virConnectPtr)

Объект connect используется API для подключения к гипервизору.

Таблица 45 - Список разрешений для объекта connect

Разрешение

Описание

Только для чтения

detect-storage-pools

Обнаружение доступных хранилищ.

Нет

getattr

Подключение к гипервизору и получение информации о системе.

interface­transaction

Управление транзакциями при изменении сетевых интерфейсов.

Нет

pm-control

Управление питанием узла (сервера) гипервизора и гостевых машин.

Нет

read

Получение информации об узле (сервере) гипервизора.

Да

search-domains

Получение списка виртуальных машин.

Да

search-interfaces

Получение списка сетевых интерфейсов.

Да

search-networks

Получение списка сетей.

Да

search-node-devices

Получение списка оборудования.

Да

search-nwfilter­bindings

Получение списка привязок сетевых фильтров к сетевым интерфейсам.

Да

search-nwfilters

Получение списка сетевых фильтров.

Да

search-secrets

Получение списка секретов.

Да

search-storage-pools

Получение списка пулов хранилищ.

Да

write

Управление параметрами узла (сервера) гипервизора.

Нет

domain (virDomainPtr)

Объект domain используется API для управления виртуальными машинами.

Таблица 46 - Список разрешений для объекта domain

Разрешение

Описание

Только для чтения

block-read

Чтение содержимого диска виртуальной машины.

Нет

block-write

Изменение диска виртуальной машины.

Нет

checkpoint

Управление точками восстановления виртуальной машины.

Нет

core-dump

Управление дампами памяти виртуальной машины.

Нет

delete

Удаление виртуальной машины.

Нет

fs-freeze

Управление «заморозкой» файловых систем виртуальной машины.

Нет

fs-trim

Использование команды TRIM для дисков виртуальной машины.

Нет

getattr

Получение списка виртуальных машин.

Да

read

Получение информации о виртуальных машинах.

Да

hibernate

Управление спящим режимом виртуальной машины.

Нет

init-control

Выключение и перезагрузка виртуальной машины.

Нет

inject-nmi

Разрешает отправку NMI прерывания виртуальной машине.

Нет

mem-read

Разрешает чтение оперативной памяти виртуальной машины.

Нет

migrate

Управление миграцией виртуальной машины на другой узел гипервизора.

Нет

open-device

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

Нет

open-graphics

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

Нет

open-namespace

Разрешает работу с пространствами имён виртуальной машины (LXC-контейнера).

Нет

pm-control

Управление питанием виртуальной машины.

Нет

read

Чтение настроек виртуальной машины, не связанных с безопасностью.

Да

read-secure

Чтение настроек виртуальной машины, связанных с безопасностью.

Нет

reset

Принудительная перезагрузка (аналог аппаратной кнопки reset) виртуальной машины.

Нет

save

Изменение конфигурационного файла виртуальной машины.

Нет

screenshot

Создание снимка экрана виртуальной машины.

Нет

send-input

Клавиатурный ввод через виртуализированную клавиатуру виртуальной машины.

Нет

send-signal

Отправка сигналов процессам внутри виртуальной машины.

Нет

set-password

Установка пароля пользователю внутри виртуальной машины.

Нет

set-time

Установка времени на виртуальной машине.

Нет

snapshot

Создание снимков (snapshots) виртуальной машины.

Нет

start

Запуск виртуальной машины.

Нет

stop

Остановка виртуальной машины.

Нет

suspend

Приостановка виртуальной машины.

Нет

write

Изменение виртуальной машины.

Нет

interface (virInterfacePtr)

Объект interface используется API для управления сетевыми интерфейсами.

Таблица 47 - Список разрешений для объекта interface

Разрешение

Описание

Только для чтения

delete

Удаление сетевого интерфейса.

Нет

getattr

Получение списка сетевых интерфейсов.

Да

read

Получение информации о сетевом интерфейсе.

Да

save

Добавление сетевого интерфейса или изменение его конфигурации.

Нет

start

Активация сетевого интерфейса.

Нет

stop

Деактивация (остановка) сетевого интерфейса.

Нет

write

Изменение конфигурации сетевого интерфейса.

Нет

network (virNetworkPtr)

Объект network используется API для управления сетями.

Таблица 48 - Список разрешений для объекта network

Разрешение

Описание

Только для чтения

delete

Удаление сети.

Нет

getattr

Получение списка сетей.

Да

read

Чтение настроек сети.

Да

save

Добавление сети или изменение её конфигурации.

Нет

search-ports

Получение списка сетевых портов.

Нет

start

Активация сети.

Нет

stop

Деактивация сети.

Нет

write

Изменение конфигурации сети.

Нет

network-port (virNetworkPortPtr)

Объект network-port используется API для управления сетевыми портами.

Таблица 49 - Список разрешений для объекта network-port

Разрешение

Описание

Только для чтения

create

Создание нового сетевого порта.

Нет

delete

Удаление сетевого порта.

Нет

getattr

Получение списка сетевых портов.

Да

read

Чтение настроек сетевого порта.

Да

write

Изменение конфигурации сетевого порта.

Нет

node-device (virNodeDevicePtr)

Объект node-device используется API для управления аппаратными устройствами, подключенными к узлу гипервизора.

Таблица 50 - Список разрешений для объекта node-device

Разрешение

Описание

Только для чтения

delete

Удаление конфигурации устройства на хост системе.

Нет

detach

Отсоединение устройства от хост системы.

Нет

getattr

Получение списка устройств.

Да

read

Чтение информации об устройстве.

Да

start

Запуск устройства.

Нет

stop

Остановка устройства.

Нет

write

Изменение конфигурации устройства.

Нет

nwfilter (virNWFilterPtr)

Объект nwfilter используется API для управления сетевыми фильтрами (брандмауэром).

Таблица 51 - Список разрешений для объекта nwfilter

Разрешение

Описание

Только для чтения

delete

Удаление сетевого фильтра.

Нет

getattr

Получение списка сетевых фильтров.

Да

read

Чтение настроек сетевого фильтра.

Да

save

Добавление нового сетевого фильтра или редактирование его конфигурации.

Нет

write

Изменение конфигурации сетевого фильтра.

Нет

nwfilter-binding (virNWFilterBindingPtr)

Объект nwfilter-binding используется API для привязки сетевых фильтров к сетевым интерфейсам.

Таблица 52 - Список разрешений для объекта nwfilter-binding

Разрешение

Описание

Только для чтения

create

Привязывание сетевого фильтра к порту виртуальной машины.

delete

Удаляет привязку сетевого фильтра к порту.

getattr

Получение списка привязок сетевых фильтров к портам.

Да

read

Получение информации о сетевом фильтре.

Да

secret (virSecretPtr)

Объект secret используется API для работы с хранилищем секретных ключей libvirt. Это хранилище может использоваться для хранения ключей от LUKS или iSCSI разделов, пароля от виртуализированного TPM устройства, ключа от Ceph RBD и т.д..

Таблица 53 - Список разрешений для объекта secret

Разрешение

Описание

Только для чтения

delete

Удаление секретного ключа.

getattr

Получение списка секретных ключей.

read

Получение информации о секретном ключе.

Да

read-secure

Получение (значения) секретного ключа.

save

Создание нового секретного ключа или изменение значения существующего.

write

Изменение значения секретного ключа.

storage-pool (virStoragePoolPtr)

Объект storage-pool используется API для управления пулами хранения на гипервизоре.

Таблица 54 - Список разрешений для объекта storage-pool

Разрешение

Описание

Только для чтения

delete

Удаление пула хранения.

Нет

format

Форматирование пула хранения или его удаление.

Нет

getattr

Получение списка пулов хранения.

Да

read

Получение информации о пуле хранения и его конфигурации.

Да

refresh

Обновление списка томов пула хранения.

Нет

save

Создание нового пула хранение или редактирование конфигурации существующего.

Нет

search-storage-vols

Получение списка томов, находящихся в пуле хранения.

Нет

start

Запуск пула хранения.

Нет

stop

Остановка пула хранения.

Нет

write

Изменение конфигурации пула хранения.

Нет

storage-vol (virStorageVolPtr)

Объект storage-vol используется API для управления томами в пулах хранения.

Таблица 55 - Список разрешений для объекта storage-vol

Разрешение

Описание

Только для чтения

create

Создание тома.

Нет

data-read

Чтение данных из тома через поток.

Нет

data-write

Запись данных на том через поток.

Нет

delete

Удаление тома из пула хранения.

Нет

format

Форматирование тома.

Нет

getattr

Получение списка томов в пуле хранения.

Да

read

Получение информации о томе.

Да

resize

Изменение размера тома.

Нет