Гайд: Исправление ошибки access denied в QEMU на Astra Linux CE/SE: AppArmor, мандатный контроль
Ошибка access denied при запуске виртуальной машины через QEMU/libvirt в Astra Linux чаще всего связана с тремя факторами:
- Недостаточные права на файлы/каталоги (образы дисков, ISO, PCI/USB устройства).
- Блокировка со стороны LSM-модуля (AppArmor в CE, мандатный контроль/Parsec в SE).
- Некорректная настройка пользователя, от имени которого запускается процесс 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 <имя_вм>
- Если ошибка исчезла, но ВМ не получает сеть/консоль → проверьте
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