Гайд: Исправление ошибки access denied в QEMU на Astra Linux CE/SE: AppArmor, мандатный контроль

Гайд по устранению ошибки access denied в QEMU на Astra Linux CE/SE: права доступа, AppArmor, мандатный контроль, libvirt

2026.05.03                  


Гайд: Исправление ошибки access denied в QEMU на Astra Linux CE/SE: AppArmor, мандатный контрольГайд: Исправление ошибки access denied в QEMU на Astra Linux CE/SE: AppArmor, мандатный контроль

Ошибка access denied при запуске виртуальной машины через QEMU/libvirt в Astra Linux чаще всего связана с тремя факторами:

  1. Недостаточные права на файлы/каталоги (образы дисков, ISO, PCI/USB устройства).
  2. Блокировка со стороны LSM-модуля (AppArmor в CE, мандатный контроль/Parsec в SE).
  3. Некорректная настройка пользователя, от имени которого запускается процесс QEMU.

Ниже приведён подробный пошаговый гайд по диагностике и устранению ошибки. Разделы помечены применимостью к Astra Linux CE (Common Edition) и SE (Special Edition).


Шаг 0: Определите версию и контекст ошибки

cat /etc/astra_version
# или
lsb_release -a
  • CE → используется AppArmor, стандартные права UNIX, группа libvirt-qemu.
  • SE → включён мандатный контроль целостности/конфиденциальности (Parsec), строгие политики ПСЗ. Ошибки доступа часто маскируются под Permission denied или Operation not permitted.

Запустите ВМ с включённым отладочным выводом, чтобы получить точную строку:

sudo virsh start <имя_вм> --debug 2>&1 | grep -i "denied\|permission\|access"

Шаг 1: Проверка прав на образы и каталоги

QEMU запускается от пользователя libvirt-qemu (по умолчанию). Если он не имеет прав на чтение/запись образов, возникнет access denied.

# Проверка прав
ls -l /путь/к/образу.qcow2
ls -ld /путь/к/каталогу/

# Исправление (CE и SE без строгого MAC)
sudo chown libvirt-qemu:libvirt-qemu /путь/к/образу.qcow2
sudo chmod 660 /путь/к/образу.qcow2
sudo chown libvirt-qemu:libvirt-qemu /каталог/с/образами
sudo chmod 750 /каталог/с/образами

Рекомендация:

Храните все образы в /var/lib/libvirt/images/. Libvirt автоматически применяет корректные права при создании ВМ через virt-manager или virt-install.


Шаг 2: Доступ к /dev/kvm

Без доступа к устройству KVM QEMU не может запустить аппаратную виртуализацию и падает с access denied или Could not access KVM kernel module: Permission denied.

# Проверка прав
ls -l /dev/kvm
# Ожидаемый вывод: crw-rw---- 1 root kvm ...

# Добавьте текущего пользователя в группу kvm (для ручной отладки)
sudo usermod -aG kvm $USER
newgrp kvm

# Проверьте, что libvirt-qemu также в группе kvm (обычно настроено по умолчанию)
id libvirt-qemu

Если /dev/kvm отсутствует:

sudo modprobe kvm_intel   # или kvm_amd
sudo lsmod | grep kvm

Шаг 3: Настройка /etc/libvirt/qemu.conf

По умолчанию libvirt запускает QEMU от libvirt-qemu. В некоторых конфигурациях это вызывает проблемы с правами на внешние образы.

sudo nano /etc/libvirt/qemu.conf

Найдите и раскомментируйте/измените:

# Запуск от root (упрощает отладку, но снижает безопасность)
user = "root"
group = "root"

# ИЛИ оставьте libvirt-qemu, но включите динамическую смену владельцев:
dynamic_ownership = 1

После изменений:

sudo systemctl restart libvirtd

Важно:

dynamic_ownership = 1 заставляет libvirt автоматически менять владельца образа на libvirt-qemu при старте ВМ и возвращать обратно при остановке. Это наиболее безопасное и стабильное решение для CE.


Шаг 4: AppArmor (Astra Linux CE)

AppArmor может блокировать доступ QEMU к файлам, сетевым сокетам или устройствам.

# Статус AppArmor
sudo aa-status | grep qemu

# Проверка логов блокировок
sudo dmesg | grep -i apparmor | tail -n 20
sudo journalctl -k | grep -i apparmor | tail -n 20

Если видите APP="qemu-system-x86_64" DENIED, временно переведите профиль в complain-режим для диагностики:

sudo aa-complain /usr/bin/qemu-system-x86_64

Для создания корректного профиля:

sudo apt install apparmor-utils
sudo aa-enforce /usr/bin/qemu-system-x86_64  # после настройки
sudo systemctl restart apparmor

Не отключайте AppArmor полностью в production. Правильнее добавить исключения в /etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper.


Шаг 5: Мандатный контроль / Parsec (Astra Linux SE)

В Astra Linux SE действует обязательный мандатный контроль доступа (МКД). Даже если права UNIX rwx разрешены, процесс без нужной метки целостности/конфиденциальности получит access denied.

Проверка меток файлов

getpdpl /путь/к/образу.qcow2
# Вывод: <уровень_целостности>:<уровень_конфиденциальности> (напр. 0:0)

Проверка меток процесса QEMU

ps aux | grep qemu
# Найдите PID процесса, затем:
getpdpl /proc/<PID>/exe

Если метки не совпадают или процесс имеет более низкий уровень целостности → доступ блокируется.

Настройка через штатные средства

В SE не рекомендуется менять права вручную.

Используйте:

  • fly-admin-mac (графическая утилита)
  • astra-mc (командная строка)
  • pdpl-file / setpdpl (только для опытных администраторов)

Пример (если нужно разрешить доступ на чтение):

sudo setpdpl -l 0:0 /путь/к/образу.qcow2  # уровень 0:0 = базовый
sudo chpdpl -m +r /путь/к/образу.qcow2

Важно:

В сертифицированных конфигурациях SE изменение политик должно соответствовать руководству по эксплуатации и требованиям аттестации. Обход МКД отключает сертифицированный режим.


Шаг 6: Анализ логов QEMU и libvirt

# Логи конкретной ВМ
sudo journalctl -u libvirtd -u qemu-kvm --since "10 min ago"
sudo tail -n 50 /var/log/libvirt/qemu/<имя_вм>.log

# Проверка XML-конфигурации на ошибки путей
sudo virsh dumpxml <имя_вм> | grep -E "source|driver|emulator"

Частая ошибка: в XML указан путь, который QEMU не видит из-за chroot-подобной изоляции или неверного контекста.


Финальная проверка

1. Убедитесь, что образ доступен:
   sudo -u libvirt-qemu ls -l /путь/к/образу.qcow2
2. Запустите ВМ:
   sudo virsh start <имя_вм>
  1. Если ошибка исчезла, но ВМ не получает сеть/консоль → проверьте virtio, сетевые мосты и правила firewalld/iptables.

Чек-лист быстрого восстановления

Симптом Решение
Cannot access storage file ... Permission denied chown libvirt-qemu:libvirt-qemu + dynamic_ownership = 1
Could not access KVM kernel module: Permission denied usermod -aG kvm libvirt-qemu + chmod 660 /dev/kvm
AppArmor DENIED aa-complain qemu-system-x86_64 → добавить правило в профиль
Operation not permitted (SE) Проверить getpdpl файла и процесса, настроить через fly-admin-mac
Ошибка только при старте, но не при virsh define Проверить пути в XML, права на каталог /var/lib/libvirt/qemu/

Рекомендации по безопасности

  • Не запускайте QEMU от root в production без веских причин.
  • В Astra Linux SE не отключайте мандатный контроль. Используйте штатные инструменты управления политиками.
  • Всегда храните образы в /var/lib/libvirt/images/.
  • Регулярно обновляйте пакеты: sudo apt update && sudo apt upgrade qemu-system-x86 libvirt-daemon-system.

Если ошибка сохраняется, отправьте вывод в техническую поддержку:

virsh dumpxml <имя_вм> | grep -A5 "<disk>"
getpdpl /путь/к/образу
sudo journalctl -u libvirtd --since "5 min ago" | tail -n 30