«Доступ запрещён» при попытке использовать внешне запущенный virtiofsd с libvirt на Ubuntu LTS 24.04

Вопрос или проблема

На сервере Ubuntu LTS 24.04 с виртуальной машиной QEMU, управляемой libvirt, я пытаюсь использовать запущенный извне virtiofsd, как задокументировано в документации libvirt, потому что мне нужно включить функции, такие как --posix-acl, которые не поддерживаются конфигурацией virtiofsd в libvirt. Однако, какие бы права доступа, владельца и группу я ни назначил для сокета virtiofsd, моя виртуальная машина не может его использовать, всегда выдает ошибку “Permission Denied”:

$ virsh start my-vm
error: Failed to start domain 'my-vm'
error: internal error: process exited while connecting to monitor: 2025-02-07T02:00:44.288580Z qemu-system-x86_64: -chardev socket,id=chr-vu-fs0,path=/run/my-virtiofsd.sock: Failed to connect to '/run/my-virtiofsd.sock': Permission denied

Как я могу это исправить?

Если стандартные права доступа Unix не решают проблему с правами, возможно, виновата система песочницы вашего дистрибутива. Ubuntu использует AppArmor для изоляции процессов (RedHat использует SELinux), чтобы гарантировать доступ только к ожидаемым ресурсам. На Ubuntu LTS 24.04 это касается процессов qemu, запускаемых libvirt, и существует набор правил apparmor для различных компонентов libvirt, таких как qemu.

Убедитесь, что внешний сокет, который вы хотите использовать qemu, запущенный libvirt, разрешен в правилах AppArmor, создав файл в /etc/apparmor.d/abstractions/libvirt-qemu.d/ (возможно, создав эту конечную директорию, если она не существует) с содержимым:

/run/my-virtiofs.sock rw,

(запятая в конце важна)

Обновите соответственно путь к сокету, который вы использовали при запуске внешнего virtiofsd и указали в XML-конфигурации виртуальной машины libvirt.

В зависимости от версии Ubuntu, которую вы используете, обратитесь к существующим конфигурациям AppArmor для libvirt, чтобы получить более подробную информацию о том, куда именно добавлять свои правила, например, /etc/apparmor.d/libvirt/TEMPLATE.qemu, который ссылается на /etc/apparmor.d/abstractions/libvirt-qemu. В моем случае, последнее включает директиву для использования дальнейших кастомизаций в /etc/apparmor.d/abstractions/libvirt-qemu.d/, поэтому именно там я создал новое правило.

Ответ или решение

На Ubuntu LTS 24.04 сервере вы сталкиваетесь с проблемой «Permission Denied» при попытке использования внешне запущенного virtiofsd с управляемой libvirt виртуальной машиной. Это препятствие связано с невозможностью виртуальной машины подключиться к сокету virtiofsd, несмотря на различные попытки изменения разрешений, владельца и группы. Проблема требует отдельного подхода, учитывая использование AppArmor, системы контроля доступа, обеспечивающей безопасность процессов.

Теория

AppArmor является механизмом разграничения прав доступа, поддерживаемым Ubuntu, который контролирует доступ приложения к файлам и ресурсам. AppArmor используется для ограничения возможностей процесса в пределах определенного профиля безопасности, гарантируя, что он может получить доступ только к разрешенным ресурсам. В вашем случае qemu, запускаемое libvirt, encapsulatesos AppArmor, который может блокировать доступ к созданному вами сокету.

Пример

Рассмотрим, как настроить AppArmor для предоставления qemu доступа к вашему сокету. Ваша цель заключается в том, чтобы добавить политику, которая явно разрешает доступ qemu к пути вашего сокета, чтобы избежать ошибки «Permission Denied». Структура AppArmor профилей и их использование могут варьироваться в зависимости от версии дистрибутива Ubuntu, однако они следуют общему принципу.

Для добавления правил AppArmor, выполните следующие действия:

  1. Создайте файл с правилами безопасности.

    Найдите или создайте каталог /etc/apparmor.d/abstractions/libvirt-qemu.d/ (возможно, вам потребуется создать последний каталог, если его не существует).

  2. Напишите правило в файле.

    Создайте файл с расширением .d, например, my-virtiofs.sock в каталоге, с содержимым:

    /run/my-virtiofsd.sock rw,

    Не забудьте, что запятая в конце правила важна для синтаксиса.

  3. Перезапустите AppArmor и libvirt.

    Перезапустите AppArmor для применения изменений и libvirt для перезагрузки конфигурации:

    sudo systemctl restart apparmor
    sudo systemctl restart libvirtd

Применение

С этими изменениями, когда виртуальная машина будет запущена, qemu должен иметь разрешение на доступ к вашему сокету благодаря обновленным правилам AppArmor. Проблема «Permission Denied» должна быть устранена, позволяя использовать ваш сокет для virtiofsd с дополнительными параметрами, такими как --posix-acl.

Кроме того, крайне важно убедиться, что ваш файл XML конфигурации виртуальной машины libvirt правильно настроен с новыми путями и параметрами. Проверьте соответствующие записи в файле XML, чтобы убедиться, что они указывают на правильный путь сокета и используйте все необходимые идентификаторы, такие как id=chr-vu-fs0.

Дополнительные советы

  1. Диагностика: Используйте aa-status для получения информации о загруженных AppArmor профилях и их состоянии.

  2. Логирование AppArmor: Активируйте логирование AppArmor, чтобы следить за тем, какие действия блокируются и под корнем каких ситуаций это происходит.

  3. Обратная связь: Убедитесь, что любые изменения в AppArmor, не только позволяют необходимые действия, но и не ослабляют безопасность всей системы. Любые руки должны быть конкретными и минимальными.

Таким образом, внедряя решение с использованием AppArmor для управления доступом к ресурсам на уровне системного профиля, вы сможете надежно и безопасно организовать работу с внешне запускаемым virtiofsd, максимально используя имеющиеся возможности UNIX-подобной платформы.

Оцените материал
Добавить комментарий

Капча загружается...