QEMU/KVM Astra Linux: TLS-миграция, VFIO-автоматизация, конвертация Windows, PDP SE

Настройка TLS-миграции, автоматизация VFIO, конвертация Windows-ВМ и XML-профили PDP для Astra Linux SE.

2026.04.02                  


QEMU/KVM Astra Linux: TLS-миграция, VFIO-автоматизация, конвертация Windows, PDP SEQEMU/KVM Astra Linux: TLS-миграция, VFIO-автоматизация, конвертация Windows, PDP SE Материал ориентирован на Astra Linux CE/SE, содержит готовые конфигурации и учитывает требования безопасности.

1. Настройка TLS для безопасной миграции

Libvirt использует TLS для шифрования API и живой миграции. Требуется центр сертификации (CA), сертификаты сервера и клиента.

Шаги:

Установка утилит:

sudo apt install gnutls-bin libvirt-daemon-system

2. Генерация CA (выполняется один раз):

sudo mkdir -p /etc/pki/libvirt
certtool --generate-privkey > /etc/pki/libvirt/private/cakey.pem
certtool --generate-self-signed \
  --load-privkey /etc/pki/libvirt/private/cakey.pem \
  --outfile /etc/pki/libvirt/ca-cert.pem \
  --template /etc/pki/libvirt/ca.info

Создайте /etc/pki/libvirt/ca.info:

cn = "Astra Libvirt CA"
ca
cert_signing_key

3. Генерация сертификатов для каждого узла:

# На узле node1 (IP: 10.0.0.1)
certtool --generate-privkey > /etc/pki/libvirt/private/node1-key.pem
certtool --generate-certificate \
  --load-privkey /etc/pki/libvirt/private/node1-key.pem \
  --load-ca-certificate /etc/pki/libvirt/ca-cert.pem \
  --load-ca-privkey /etc/pki/libvirt/private/cakey.pem \
  --outfile /etc/pki/libvirt/node1-cert.pem \
  --template /etc/pki/libvirt/node1.info

node1.info:

organization = "Astra Cluster"
cn = node1.local
tls_www_server
encryption_key
signing_key
ip_address = "10.0.0.1"

4. Настройка libvirtd (/etc/libvirt/libvirtd.conf):

listen_tls = 1
tls_port = 16514
auth_tls = "none"
ca_file = "/etc/pki/libvirt/ca-cert.pem"
cert_file = "/etc/pki/libvirt/node1-cert.pem"
key_file = "/etc/pki/libvirt/private/node1-key.pem"

5. Настройка QEMU (/etc/libvirt/qemu.conf):

migration_tls = 1
migration_tls_certificates = "/etc/pki/libvirt"
migration_tls_verify = 1

6. Перезапуск и файрвол:

sudo systemctl restart libvirtd
sudo ufw allow 16514/tcp

7. Миграция:

virsh migrate --live --persistent --tls --verbose \
  vm-name qemu+tls://10.0.0.2/system

Примечание:

  • клиенты должны иметь clientcert.pem и clientkey.pem, подписанные тем же CA. В SE убедитесь, что файлы в /etc/pki/libvirt имеют метку system_u:object_r:cert_t:s0 или разрешены в PDP для libvirtd.

Скрипты автоматизации VFIO

Автоматизация реализуется через libvirt-хуки. Хуки вызываются при запуске/остановке ВМ и управляют привязкой драйверов.

Подготовка окружения:

sudo mkdir -p /etc/libvirt/hooks
sudo chmod 755 /etc/libvirt/hooks

Создание хука /etc/libvirt/hooks/qemu:

#!/bin/bash
GUEST_NAME="$1"
ACTION="$2"
PHASE="$3"

# Укажите PCI-адреса GPU и аудио через пробел
GPU_DEVICES="0000:01:00.0 0000:01:00.1"

bind_vfio() {
  for dev in $GPU_DEVICES; do
    echo "vfio-pci" > "/sys/bus/pci/devices/$dev/driver_override"
    echo "$dev" > /sys/bus/pci/drivers_probe
  done
}

unbind_vfio() {
  for dev in $GPU_DEVICES; do
    echo "" > "/sys/bus/pci/devices/$dev/driver_override"
    echo "$dev" > /sys/bus/pci/drivers_unbind
    echo "$dev" > /sys/bus/pci/drivers/vfio-pci/unbind
    # Возврат к родному драйверу (пример для nouveau/nvidia)
    echo "$dev" > /sys/bus/pci/drivers/nvidia/bind 2>/dev/null || \
    echo "$dev" > /sys/bus/pci/drivers/nouveau/bind 2>/dev/null
  done
}

if [ "$GUEST_NAME" = "win-gpu-vm" ]; then
  case "$ACTION-$PHASE" in
    start-begin)
      unbind_vfio
      sleep 2
      ;;
    started-end)
      # Готово, ВМ запущена
      ;;
    stop-begin)
      # Перед выключением можно сбросить GPU
      ;;
    released-end)
      bind_vfio
      ;;
  esac
fi

Активация:

sudo chmod 755 /etc/libvirt/hooks/qemu
sudo chown root:root /etc/libvirt/hooks/qemu
sudo systemctl restart libvirtd

В XML ВМ добавьте:

<devices>
  <hostdev mode='subsystem' type='pci' managed='yes'>
    <source><address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/></source>
  </hostdev>
  <hostdev mode='subsystem' type='pci' managed='yes'>
    <source><address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/></source>
  </hostdev>
</devices>

Примечание для SE:

  • хук выполняется от root, но доступ к /sys/bus/pci/drivers/* может блокироваться PDP. Добавьте правило для libvirtd с разрешением sysfs_read/sysfs_write.

Конвертация Windows-машин и вопросы активации

Ручная конвертация не инжектирует драйvirtio. Рекомендуется virt-v2v.

1. Установка:

sudo apt install virt-v2v libguestfs-tools

2. Конвертация с драйверами:

virt-v2v -i disk source.vmdk -o libvirt -of qcow2 \
  -os default -oa sparse \
  --network bridge:br0 \
  -it vddk  # если используется VMware ESXi

Для локального файла:

virt-v2v -i disk win10.vmdk -o local -of qcow2 \
  -os /var/lib/libvirt/images \
  -i vmdk

3. Создание ВМ с UEFI и TPM (для Win11):

virt-install --name win11-migrated --memory 8192 --vcpus 4 \
  --os-variant win11 --disk path=/var/lib/libvirt/images/win11.qcow2 \
  --network bridge=br0 --graphics spice --boot uefi,firmware.feature0.name=secure-boot \
  --noautoconsole

4. Активация Windows:

  • OEM-лицензия привязывается к материнской плате. При конвертации HWID меняется, активация слетает. Требуется розничная (Retail) или корпоративная (Volume/KMS) лицензия.
  • Проверка статуса: slmgr /dli
  • Сброс таймера (до 3 раз): slmgr /rearm + перезагрузка
  • Корпоративная среда: настройте KMS-сервер в гостевой ОС: slmgr /skms <kms_host> && slmgr /ato
  • Официальный путь: используйте Microsoft Volume Licensing Service Center (VLSC) или Azure AD Join для автоматической активации. Обход DRM-механизмов не поддерживается.

Примеры XML-профилей PDP (Astra Linux SE)

PDP управляет мандатным доступом через XML-политики. Структура зависит от версии SE (1.7+). Ниже приведён базовый шаблон для разрешения работы QEMU/Libvirt.

1. Экспорт текущей политики:

sudo pdp-export -o /tmp/pdp-base.xml

2. Пример фрагмента политики (/tmp/pdp-qemu-rules.xml):

<?xml version="1.0" encoding="UTF-8"?>
<pdp>
  <subject name="qemu-system-x86_64" type="process">
    <object path="/dev/kvm" type="device">
      <access mode="rw" />
    </object>
    <object path="/dev/vhost-net" type="device">
      <access mode="rw" />
    </object>
    <object path="/dev/vfio/*" type="device">
      <access mode="rw" />
    </object>
    <object path="/var/lib/libvirt/images/*" type="file">
      <access mode="rwx" />
    </object>
    <object path="/run/libvirt/qemu/*" type="file">
      <access mode="rw" />
    </object>
    <capability name="CAP_SYS_ADMIN" />
    <capability name="CAP_NET_ADMIN" />
  </subject>
</pdp>

3. Импорт и применение:

sudo pdp-import -i /tmp/pdp-qemu-rules.xml
sudo pdp-apply
sudo systemctl restart parsecd libvirtd

4. Проверка:

pdp-test -s qemu-system-x86_64 -o /dev/kvm -a r

5. Маркировка ресурсов (обязательно в SE):

sudo pdp-set-label -l low -c none /var/lib/libvirt/images
sudo pdp-set-label -l low -c none /etc/libvirt/qemu

Важно:

  • в сертифицированных контурах любые изменения PDP требуют согласования с ИБ-отделом. Используйте pdp-admin (GUI) для визуального редактирования правил и аудита отказов. Логи: journalctl -u parsecd -f | grep -i denied.