Доверенная загрузка виртуальных машин
1. Общие сведения
Контроль целостности конфигурации виртуальной машины (далее — ВМ) реализуется программным пакетом secure_vms. При холодном старте, то есть при запуске ВМ из состояния «Выключено», фактическая конфигурация ВМ (конфигурация domxml на гипервизоре) сравнивается с эталоном, зафиксированным на сервере Engine. При расхождении служба VDSM (Virtual Desktop and Server Manager) блокирует запуск ВМ. ВМ должна быть указана в файле vars.yml.
2. Алгоритм процесса
-
Формирование эталона (Engine):
-
Выполняется запрос конфигурации ВМ через API zVirt.
-
Выполняется скрипт
/etc/ovirt-engine/secure_hasher.py, вычисляющий эталонное значение SHA256 для каждой ВМ, имя которой явно указано в файлеvars.yml. -
Эталонное значение SHA256 каждой ВМ сохраняется в файл
vm_hashes.jsonна сервере Engine.
-
-
Развертывание:
-
Файл
vm_hashes.jsonи скриптsecure_vmsкопируются по SSH с Engine на все работающие гипервизоры каждого кластера, указанного вsecure_clusters. -
Выполняется перезапуск службы
vdsmd.
-
-
Запуск ВМ:
-
Перед тем как запустить ВМ, скрипт
secure_vmsсчитывает фактическую конфигурацию ВМ (domxml) с гипервизора через VDSM (hooking.read_domxml()). -
Скрипт
secure_vmsвычисляет хеш по тому же правилу и сравнивает с эталонным значением из файлаvm_hashes.json, полученного гипервизором с сервера Engine. -
При совпадении значений ВМ запускается. При расхождении служба VDSM блокирует запуск ВМ.
-
3. Архитектура решения
| Engine (API zVirt) | Гипервизор |
|---|---|
|
|
Построение канонического JSON |
|
Вычисление SHA256 по UUID |
Сравнение хеш-значений |
Сохранение |
Чтение |
4. Состав отпечатка конфигурации
| Группа | Поля |
|---|---|
Compute |
|
Storage |
|
Network |
|
Passthrough |
|
Опционально |
|
5. Существующие ограничения
-
Контроль целостности выполняется только при запуске ВМ, находящейся в состоянии «Выключено», то есть при полноценном старте ВМ, когда формируется и применяется конфигурация виртуального оборудования.
-
Динамическое подключение устройств (hotplug) после запуска ВМ не отслеживается. Таким образом, изменения конфигурации, происходящие после запуска ВМ, не попадают под контроль целостности.
-
В список эталонных хешей защищаемых ВМ (файл
vm_hashes.json) попадают хеши только тех ВМ, имена которых явно указаны в файлеvars.yml. -
Файл
vm_hashes.jsonформируется вручную администратором с правамиrootна сервере Engine и копируется по SSH на все гипервизоры кластера.
Администратор с правами root на гипервизоре может подменить скрипт secure_vms или файл vm_hashes.json.
|
6. Установка и настройка пакета контроля целостности конфигурации ВМ
-
Для установки пакета RPM на хосте с Менеджером управления выполните команду:
dnf install secure-vms-1.0.0-1.zvn2.noarch.rpm -
По завершении установки проверьте, что на Engine доступны следующие компоненты:
Путь Назначение /etc/ovirt-engine/secure_hasher.pyРасчёт эталонного значения SHA256
/usr/share/secure-vms/secure_vms.ymlОсновной playbook
/usr/share/secure-vms/process_cluster.ymlОбработка кластеров
/usr/share/secure-vms/process_vm.ymlОбработка одной ВМ
/usr/share/secure-vms/vars.yml.exampleШаблон настроек
/usr/share/secure-vms/50_secure_vms.pyСкрипт
secure_vms(копируется на гипервизоры) -
Создайте файл
vars.ymlвручную из шаблона:cd /usr/share/secure-vms cp vars.yml.example vars.yml vim vars.ymlили
cd /usr/share/secure-vms cp vars.yml.example vars.yml nano vars.ymlНе сохраняйте пароль Engine в файл
vars.yml, так как запрос пароля выполняется при запуске процесса контроля целостности конфигурации. -
Заполните файл
vars.ymlпо следующему шаблону:engine_url: "engine.mgmt.example.com" engine_user: "admin@zvirt@internal" secure_clusters: - cluster: "Default" vms: - "vm-database-01" - "vm-app-02" - cluster: "Production" vms: - "vm-secure-01" hypervisor_ssh_user: root hypervisor_ssh_private_key_file: "/etc/pki/ovirt-engine/keys/engine_id_rsa" # hypervisor_ssh_common_args: "-o StrictHostKeyChecking=no"Описание параметров файла
vars.ymlприведено в таблице ниже:
| Параметр | Описание | Примечания |
|---|---|---|
|
Имя (hostname) Engine для обращения к API zVirt |
Указывается без |
|
Учётная запись для API zVirt |
В большинстве случаев указывается |
|
Список кластеров и имена защищаемых ВМ |
Поле |
|
Пользователь SSH для доступа с Engine на гипервизоры |
В большинстве случаев указывается |
|
Приватный ключ для SSH |
По умолчанию на Engine |
|
Дополнительные опции SSH |
По умолчанию закомментирован. См. Остановка развертывания при установке hook |
|
Проверьте, что параметры в файле
|
7. Запуск процесса контроля целостности конфигурации ВМ
-
На хосте с Менеджером управления запустите основной playbook:
-
Без вывода полного JSON ВМ и строк хешей в консоль (рекомендуется для продуктивного контура):
ansible-playbook secure_vms.yml --skip-tags debug -
С выводом полного JSON API zVirt (рекомендуется для отладки):
ansible-playbook secure_vms.yml --tags debug
-
-
Введите пароль Engine в ответ на запрос:
Enter zVirt Engine admin passwordНе указывайте фиктивный пароль, например
1: вход в API zVirt не будет выполнен. Процесс завершится ошибкой аутентификации, либо эталонное значение не сформируется.
8. Действия после развертывания
После установки и настройки пакета контроля целостности конфигурации ВМ выполните следующие действия:
-
Проверьте наличие скрипта
secure_vmsи файла эталонных хешей на гипервизоре с помощью команд:ls -l /usr/libexec/vdsm/hooks/before_vm_start/50_secure_vms ls -l /var/lib/vdsm/vm_hashes.json -
Проверьте наличие в журнале службы VDSM записей о выполнении скрипта
secure_vms:grep secure_vm /var/log/vdsm/vdsm.log -
Проверьте, что формат файла
vm_hashes.jsonсоответствует следующему шаблону:{ "fcd1d51c-73ad-40cf-be7e-b58e07bdfcf6": "3b5c0c7d0ad9d1c58a79413d4c2b4e840ecc2e393629e49831093369fe7247de" }Где:
-
ключ
fcd1d51c-73ad-40cf-be7e-b58e07bdfcf6— UUID виртуальной машины; -
значение
3b5c0c7d0ad9d1c58a79413d4c2b4e840ecc2e393629e49831093369fe7247de— вычисленное контрольное значение SHA256 конфигурации ВМ.
-
| Значение — это строка из 64 шестнадцатеричных символов, а не вложенный JSON. |
9. Регламент работы
| Ситуация | Действие |
|---|---|
Добавлена новая ВМ на защищаемый хост |
Добавьте имя ВМ в |
Добавлен новый хост в защищённый кластер |
|
Легитимно изменены RAM, диски, NIC, BIOS |
Запустите процесс контроля целостности для обновления эталонного значения |
ВМ переименована в интерфейсе управления |
Запустите процесс контроля целостности для обновления эталонного значения |
ВМ исключена из защиты |
Удалите ВМ из файла |
Подозрение на подмену файлов на гипервизоре |
Проверьте журнал службы VDSM на наличие записей |
|
Не редактируйте |
10. Возможные ошибки
10.1. Появляется сообщение skipping: no hosts matched
Сообщение skipping: no hosts matched означает, что этап Формирование эталона (Engine) выполнен без ошибок и эталонные хеши сохранены на Engine. Однако на этапе Развертывание не найдено ни одного гипервизора, поскольку в кластерах, заданных в файле vars.yml, нет хостов со статусом Работает (Up).
-
Проверьте, что имена кластеров в файле
vars.ymlуказаны корректно, и есть хосты со статусом Работает (Up). -
Проверьте, что имя кластера в запросе к API zVirt указано корректно.
10.2. ВМ не запускается, появляется сообщение Integrity violation
-
Проверьте журнал службы VDSM, отфильтровав записи командой:
grep secure_vm /var/log/vdsm/vdsm.log -
Сопоставьте следующие значения:
-
expected=— эталонный хеш из файлаvm_hashes.json; -
actual=— хеш текущего domxml; -
domxml_current_state=— канонический JSON с гипервизора для сравнения с данными API zVirt.
-
-
Убедитесь, что конфигурация ВМ была изменена намеренно и не является попыткой подмены виртуального оборудования.
-
Обновите эталонное значение, если изменение выполнено легитимно. Для этого повторно выполните запуск процесса контроля целостности.
-
Повторите запуск ВМ. После обновления эталонного значения запуск ВМ будет разрешён.
10.3. Появляется сообщение VM … not found in cluster
-
Проверьте, что в файле
vars.ymlуказаны правильные имена ВМ и кластеров. -
Проверьте, что ВМ указана в правильном кластере (блок
secure_clusters) в файлеvars.yml.
10.4. Развертывание остановилось при установке hook
-
Проверьте наличие в выводе следующей записи:
The authenticity of host 'host4.example.local (...)' can't be established. Are you sure you want to continue connecting (yes/no)? -
Раскомментируйте в файле
vars.ymlпараметрhypervisor_ssh_common_args: "-o StrictHostKeyChecking=no"и перезапустите скрипт:ansible-playbook secure_vms.yml --skip-tags debug -
Убедитесь, что в сводке PLAY RECAP для всех гипервизоров установлены значения
okилиchanged.
10.5. ВМ не блокируется при изменении конфигурации
-
Проверьте, что ВМ указана в файле
vars.yml. Если ВМ не указана, она не участвует в контроле целостности и не блокируется при изменении конфигурации. -
Проверьте, что пакет
secure_vmsустановлен, а на гипервизоре выполнен основной playbook. Перезапустите службу VDSM.