QEMU/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.