Профиль AppArmor для Firefox

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

Я использую Ubuntu Mate 19.04. Я хочу включить AppArmor для Firefox. Я нашел существующий профиль в /etc/apparmor.d/usr.bin.firefox, который я активировал, удалив /etc/apparmor.d/disable/usr.bin.firefox.

Всё работает в основном, но я заметил одну проблему. Я не могу открывать свои загрузки из Firefox. Я даже не могу “Открыть содержащую папку” для загрузки. Оба варианта спрашивают, какое приложение я хочу использовать для выполнения действия.

Вот ошибки, которые я вижу в Firefox, когда запускаю его. Первые 4 ошибки AppArmor происходят сразу после запуска Firefox. Последние 3 ошибки “не удается запустить” возникают, когда я пытаюсь открыть загрузки.

** (firefox:6062): WARNING **: 17:58:37.874: Не удается запросить dbus: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Политика AppArmor запрещает этому отправителю отправлять это сообщение этому получателю; type="method_call", sender=":1.138" (uid=1000 pid=6062 comm="/usr/lib/firefox/firefox " label="/usr/lib/firefox/firefox{,*[^s][^h]} (enforce)") interface="org.freedesktop.DBus" member="ListNames" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

** (/usr/lib/firefox/firefox:6127): WARNING **: 17:58:38.319: Не удается запросить dbus: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Политика AppArmor запрещает этому отправителю отправлять это сообщение этому получателю; type="method_call", sender=":1.140" (uid=1000 pid=6127 comm="/usr/lib/firefox/firefox -contentproc -childID 1 -" label="/usr/lib/firefox/firefox{,*[^s][^h]} (enforce)") interface="org.freedesktop.DBus" member="ListNames" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

** (/usr/lib/firefox/firefox:6184): WARNING **: 17:58:38.954: Не удается запросить dbus: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Политика AppArmor запрещает этому отправителю отправлять это сообщение этому получателю; type="method_call", sender=":1.141" (uid=1000 pid=6184 comm="/usr/lib/firefox/firefox -contentproc -childID 2 -" label="/usr/lib/firefox/firefox{,*[^s][^h]} (enforce)") interface="org.freedesktop.DBus" member="ListNames" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

** (/usr/lib/firefox/firefox:6253): WARNING **: 17:58:40.358: Не удается запросить dbus: GDBus.Error:org.freedesktop.DBus.Error.AccessDenied: Политика AppArmor запрещает этому отправителю отправлять это сообщение этому получателю; type="method_call", sender=":1.142" (uid=1000 pid=6253 comm="/usr/lib/firefox/firefox -contentproc -childID 3 -" label="/usr/lib/firefox/firefox{,*[^s][^h]} (enforce)") interface="org.freedesktop.DBus" member="ListNames" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

** (firefox:6062): WARNING **: 17:58:51.217: Не удается запустить приложение по умолчанию: Не удалось выполнить дочерний процесс “/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop” (Доступ запрещен)

** (firefox:6062): WARNING **: 17:58:51.227: Не удается запустить приложение по умолчанию: Не удалось выполнить дочерний процесс “/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop” (Доступ запрещен)

** (firefox:6062): WARNING **: 17:58:54.538: Не удается запустить приложение по умолчанию: Не удалось выполнить дочерний процесс “/usr/lib/x86_64-linux-gnu/glib-2.0/gio-launch-desktop” (Доступ запрещен)

Вот моя полная политика:

# vim:syntax=apparmor
# Автор: Jamie Strandboge <[email protected]>

# Объявляем переменную apparmor для помощи с переопределениями
@{MOZ_LIBDIR}=/usr/lib/firefox

#include <tunables/global>

# Мы хотим ограничить двоичные файлы, которые соответствуют:
#  /usr/lib/firefox/firefox
#  /usr/lib/firefox/firefox
# но не:
#  /usr/lib/firefox/firefox.sh
/usr/lib/firefox/firefox{,*[^s][^h]} {
  #include <abstractions/audio>
  #include <abstractions/cups-client>
  #include <abstractions/dbus-strict>
  #include <abstractions/dbus-session-strict>
  #include <abstractions/dconf>
  #include <abstractions/gnome>
  #include <abstractions/ibus>
  #include <abstractions/nameservice>
  #include <abstractions/openssl>
  #include <abstractions/p11-kit>
  #include <abstractions/ubuntu-unity7-base>
  #include <abstractions/ubuntu-unity7-launcher>

  #include <abstractions/dbus-accessibility-strict>
  dbus (send)
       bus=session
       peer=(name=org.a11y.Bus),
  dbus (receive)
       bus=session
       interface=org.a11y.atspi**,
  dbus (receive, send)
       bus=accessibility,

  # для сети
  network inet stream,
  network inet6 stream,
  @{PROC}/[0-9]*/net/arp r,
  @{PROC}/[0-9]*/net/if_inet6 r,
  @{PROC}/[0-9]*/net/ipv6_route r,
  @{PROC}/[0-9]*/net/dev r,
  @{PROC}/[0-9]*/net/wireless r,
  dbus (send)
       bus=system
       path=/org/freedesktop/NetworkManager
       member=state,
  dbus (receive)
       bus=system
       path=/org/freedesktop/NetworkManager,

  # должно быть в абстракциях
  /etc/ r,
  /etc/mime.types r,
  /etc/mailcap r,
  /etc/xdg/*buntu/applications/defaults.list    r, # для всех производных
  /etc/xfce4/defaults.list r,
  /usr/share/xubuntu/applications/defaults.list r,
  owner @{HOME}/.local/share/applications/defaults.list r,
  owner @{HOME}/.local/share/applications/mimeapps.list r,
  owner @{HOME}/.local/share/applications/mimeinfo.cache r,
  /var/lib/snapd/desktop/applications/mimeinfo.cache r,
  /var/lib/snapd/desktop/applications/*.desktop r,
  owner /tmp/** m,
  owner /var/tmp/** m,
  owner /{,var/}run/shm/shmfd-* rw,
  owner /{dev,run}/shm/org.{chromium,mozilla}.* rwk,
  /tmp/.X[0-9]*-lock r,
  /etc/udev/udev.conf r,
  # Не кажется необходимым, но шумно. Возможно, разрешить 'r' для 'b*', если это необходимо.
  # Возможно, переместить в абстракцию, если что-то еще это требует.
  deny /run/udev/data/** r,
  # пусть оболочка знает, что мы что-то запустили
  dbus (send)
     bus=session
     interface=org.gtk.gio.DesktopAppInfo
     member=Launched,

  /etc/timezone r,
  /etc/wildmidi/wildmidi.cfg r,

  # специфично для firefox
  /etc/firefox*/ r,
  /etc/firefox*/** r,
  /etc/xul-ext/** r,
  /etc/xulrunner-2.0*/ r,
  /etc/xulrunner-2.0*/** r,
  /etc/gre.d/ r,
  /etc/gre.d/* r,

  # шумно
  deny @{MOZ_LIBDIR}/** w,
  deny /usr/lib/firefox-addons/** w,
  deny /usr/lib/xulrunner-addons/** w,
  deny /usr/lib/xulrunner-*/components/*.tmp w,
  deny /.suspended r,
  deny /boot/initrd.img* r,
  deny /boot/vmlinuz* r,
  deny /var/cache/fontconfig/ w,
  deny @{HOME}/.local/share/recently-used.xbel r,

  # TODO: исследовать
  deny /usr/bin/gconftool-2 x,

  # Они нужны, когда новый пользователь запускает firefox и используется firefox.sh
  @{MOZ_LIBDIR}/** ixr,
  /usr/bin/basename ixr,
  /usr/bin/dirname ixr,
  /usr/bin/pwd ixr,
  /sbin/killall5 ixr,
  /bin/which ixr,
  /usr/bin/tr ixr,
  @{PROC}/ r,
  @{PROC}/[0-9]*/cmdline r,
  @{PROC}/[0-9]*/mountinfo r,
  @{PROC}/[0-9]*/stat r,
  owner @{PROC}/[0-9]*/task/[0-9]*/stat r,
  @{PROC}/[0-9]*/status r,
  @{PROC}/filesystems r,
  @{PROC}/sys/vm/overcommit_memory r,
  /sys/devices/pci[0-9]*/**/uevent r,
  /sys/devices/platform/**/uevent r,
  /sys/devices/pci*/**/{busnum,idVendor,idProduct} r,
  /sys/devices/pci*/**/{,subsystem_}device r,
  /sys/devices/pci*/**/{,subsystem_}vendor r,
  /sys/devices/system/node/node[0-9]*/meminfo r,
  owner @{HOME}/.cache/thumbnails/** rw,

  /etc/mtab r,
  /etc/fstab r,

  # Необходимо для отчётчика сбоев
  owner @{PROC}/[0-9]*/environ r,
  owner @{PROC}/[0-9]*/auxv r,
  /etc/lsb-release r,
  /usr/bin/expr ix,
  /sys/devices/system/cpu/ r,
  /sys/devices/system/cpu/** r,

  # about:memory
  owner @{PROC}/[0-9]*/statm r,
  owner @{PROC}/[0-9]*/smaps r,

  # Необходимо, чтобы контейнер работал в сборках xul
  /usr/lib/xulrunner-*/plugin-container ixr,

  # разрешить доступ к документации и другим файлам, которые пользователь может захотеть просмотреть
  # в /usr и /opt
  /usr/ r,
  /usr/** r,
  /opt/ r,
  /opt/** r,

  # чтобы работа с директориями работала
  / r,
  /**/ r,

  # Профиль по умолчанию позволяет загрузки в ~/Downloads и загрузки из ~/Public
  owner @{HOME}/ r,
  owner @{HOME}/Public/ r,
  owner @{HOME}/Public/* r,
  owner @{HOME}/Downloads/ r,
  owner @{HOME}/Downloads/* rw,

  # специфическая конфигурация firefox для пользователя
  owner @{HOME}/.{firefox,mozilla}/ rw,
  owner @{HOME}/.{firefox,mozilla}/** rw,
  owner @{HOME}/.{firefox,mozilla}/**/*.{db,parentlock,sqlite}* k,
  owner @{HOME}/.{firefox,mozilla}/plugins/** rm,
  owner @{HOME}/.{firefox,mozilla}/**/plugins/** rm,
  owner @{HOME}/.gnome2/firefox* rwk,
  owner @{HOME}/.cache/mozilla/{,firefox/} rw,
  owner @{HOME}/.cache/mozilla/firefox/** rw,
  owner @{HOME}/.cache/mozilla/firefox/**/*.sqlite k,
  owner @{HOME}/.config/gtk-3.0/bookmarks r,
  owner @{HOME}/.config/dconf/user w,
  owner /{,var/}run/user/*/dconf/user w,
  dbus (send)
       bus=session
       path=/org/gnome/GConf/Server
       member=GetDefaultDatabase
       peer=(label=unconfined),
  dbus (send)
       bus=session
       path=/org/gnome/GConf/Database/*
       member={AddMatch,AddNotify,AllEntries,LookupExtended,RemoveNotify}
       peer=(label=unconfined),
  dbus (send)
       bus=session
       path=/org/gtk/vfs/mounttracker
       interface=org.gtk.vfs.MountTracker
       member=ListMountableInfo
       peer=(label=unconfined),

  # gnome-session
  dbus (send)
       bus=session
       path=/org/gnome/SessionManager
       interface=org.gnome.SessionManager
       member={Inhibit,Uninhibit}
       peer=(label=unconfined),

  # unity screen API
  dbus (send)
       bus=system
       interface="org.freedesktop.DBus.Introspectable"
       path="/com/canonical/Unity/Screen"
       member="Introspect"
       peer=(label=unconfined),
  dbus (send)
       bus=system
       interface="com.canonical.Unity.Screen"
       path="/com/canonical/Unity/Screen"
       member={keepDisplayOn,removeDisplayOnRequest}
       peer=(label=unconfined),

  # freedesktop.org ScreenSaver
  dbus (send)
       bus=session
       path=/{,org/freedesktop/,org.gnome/}Screen{s,S}aver
       interface=org.freedesktop.ScreenSaver
       member={Inhibit,UnInhibit,SimulateUserActivity}
       peer=(label=unconfined),

  # gnome, kde и cinnamon screensaver
  dbus (send)
       bus=session
       path=/{,ScreenSaver}
       interface=org.{gnome.ScreenSaver,kde.screensaver,cinnamon.ScreenSaver}
       member=SimulateUserActivity
       peer=(label=unconfined),

  # UPower
  dbus (send)
       bus=system
       path=/org/freedesktop/UPower
       interface=org.freedesktop.UPower
       member=EnumerateDevices
       peer=(label=unconfined),

  #
  # Расширения
  # /usr/share/.../extensions/... уже покрыты '/usr/** r', выше.
  # Разрешить 'x' для загруженных расширений, но заимствовать политику для безопасности
  owner @{HOME}/.mozilla/**/extensions/** mixr,

  deny @{MOZ_LIBDIR}/update.test w,
  deny /usr/lib/mozilla/extensions/**/ w,
  deny /usr/lib/xulrunner-addons/extensions/**/ w,
  deny /usr/share/mozilla/extensions/**/ w,
  deny /usr/share/mozilla/ w,

  # Разное (подлежит абстракции)
  # В идеале эти профили использовали бы дочерний профиль. Это все ELF исполняемые файлы
  # поэтому запуск с 'Ux', хотя и не идеально, допустим, потому что мы по крайней мере
  # извлечем выгоду из безопасного выполнения glibc.
  /usr/bin/mkfifo Uxr,  # исследовать
  /bin/ps Uxr,
  /bin/uname Uxr,

  /usr/bin/lsb_release Cxr -> lsb_release,
  profile lsb_release {
    #include <abstractions/base>
    #include <abstractions/python>
    /usr/bin/lsb_release r,
    /bin/dash ixr,
    /usr/bin/dpkg-query ixr,
    /usr/include/python2.[4567]/pyconfig.h r,
    /etc/lsb-release r,
    /etc/debian_version r,
    /usr/share/distro-info/*.csv r,
    /var/lib/dpkg/** r,

    /usr/local/lib/python3.[0-6]/dist-packages/ r,
    /usr/bin/ r,
    /usr/bin/python3.[0-6] mr,

    # file_inherit
    deny /tmp/gtalkplugin.log w,
  }

  # Аддоны
  #include <abstractions/ubuntu-browsers.d/firefox>

  # Специфические дополнения и переопределения. См. local/README для деталей.
  #include <local/usr.bin.firefox>
}

Я попытался разрешить эти методы ListNames самостоятельно, но у меня действительно нет представления о том, что я делаю. Я также пытался запускать firefox с помощью aa-genprof, но не увидел, чтобы эти нарушения всплывали, когда я это делал.

Есть идеи?

Сначала я ответил на вопрос, предполагая, что у вас нет указания каталога загрузок в ваших записях профиля. Теперь я вижу, что они есть.

owner @{HOME}/Downloads/ r,
owner @{HOME}/Downloads/* rw,

Я замечаю, что у вас нет загрузок в абстракциях. Попробуйте проверить в /etc/apparmor.d/abstractions наличие файла user-downloads и включить его вместо записей о местоположении загрузки. Попробуйте использовать более общий шаблон для разрешения (редактирование или создание профилей выигрывает от грубого старта перед тем, как уточнять точные подкаталоги, библиотеки и т. д.).

Я тоже сталкивался с некоторыми странностями такого рода, используя AppArmor. Отмененные профили, влияющие на приложение, даже когда используется завершение и перезапуск для перезагрузки профилей, теперь установленных на информацию, продолжают влиять на приложение (например, apt-get). Некоторые приложения также оказываются трудными для профилирования, несмотря на разрешение очень грубого доступа к любым требуемым библиотекам и т. д., которые все еще показывают как отказы в журналах жалоб.

Ваш пример не внушает доверия.

Я не могу комментировать отказы консоли, хотя я привык видеть некоторые ошибки Gtk в стандартной ситуации, которые, как я понимаю, не должны на самом деле там появляться (плохие сообщения окон); и поскольку я обычно блокирую запись в файлы dconf, эти сообщения всегда распечатывают как жалобы, если я утруждаюсь запуском из терминала.

Я также рекомендую проверить разрешения в профиле с рабочим профилем firejail, если это возможно. Firejail значительно упрощён и имеет грубую зернистость по сравнению с AppArmor, но мой рабочий профиль firefox-portable не включает разрешения dbus, поэтому я удивлён, что оно указано для (поистине отличного) установленного приложения.

Моя текущая проблема заключается в очевидной невозможности запуска Firefox с расширениями под профилем apparmor, и ни одно количество lsof, strace или разрешений профиля не решает эту проблему.

Я на грани того, чтобы отказаться от apparmor и просто использовать вместо него SELinux, который имеет более простую модель профиля. Существуют лишь несколько действительно работающих профилей для apparmor, которые даже не включены в операционные профили в Debian, и я всё равно использую переносимую версию Firefox. AppArmor невероятно детализированный и требует обширных знаний о системе приложений.

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

Для решения проблемы с профилем AppArmor для Firefox на Ubuntu MATE 19.04, которая связана с невозможностью открытия загруженных файлов и ошибками доступа при работе с D-Bus, предлагаю несколько шагов и рекомендаций.

Шаги для устранения проблемы

  1. Проверка профиля AppArmor:
    Обратите внимание на наличие правил, касающихся каталога загрузок. В вашем профиле уже есть следующие строки:

    owner @{HOME}/Downloads/ r,
    owner @{HOME}/Downloads/* rw,

    Эти правила предоставляют доступ к каталогу загрузок, однако стоит проверить, нет ли более глобальных ограничений на доступ к файловой системе или D-Bus.

  2. Включение абстракции для пользовательских загрузок:
    Проверьте наличие файла /etc/apparmor.d/abstractions/user-downloads. Если такой файл существует, его стоит подключить в Ваш профиль Firefox, чтобы предоставить ему доступ к пользовательским загрузкам.
    Для этого добавьте следующую строку в профиль:

    #include <abstractions/user-downloads>
  3. Общие разрешения для D-Bus:
    Ошибки, связанные с D-Bus, указывают на то, что Firefox не имеет доступа к некоторым объектам D-Bus. Вы можете попробовать расширить разрешения на использование D-Bus. В вашем профиле добавьте следующее:

    dbus (send, receive)
        bus=session,
        peer=(label=unconfined),
  4. Изменение профиля AppArmor:
    Если указанные выше шаги не помогают, пока не удается выявить точную причину, поступайте далее:

    • Увеличьте уровень доступа для каталога загруженных файлов, временно заменив существующие правила на более широкие, например:
      owner @{HOME}/Downloads/** rw,
    • Затем перезапустите профиль с помощью следующих команд:
      sudo systemctl restart apparmor
      sudo aa-enforce /etc/apparmor.d/usr.bin.firefox
  5. Использование aa-genprof для генерации правил:
    Вы уже пробовали использовать aa-genprof, однако если вы не увидели ошибок в журнале, это может означать, что профиль не фиксирует ошибки в режиме профилирования. Попробуйте временно поставить профиль в режим «жалоба» и запустить Firefox снова:

    sudo aa-complain /etc/apparmor.d/usr.bin.firefox

    Выполняйте действия в Firefox и затем проверьте журнал подвижки, чтобы увидеть запрещенные действия.

  6. Проверка прав приложения "gio-launch-desktop":
    Обратите внимание, что ошибки, связанные с gio-launch-desktop, могут указывать на проблемы с доступом к этому исполняемому файлу. Убедитесь, что файл имеет правильные разрешения и доступен для исполнения.

Заключение

Настройки AppArmor могут быть сложными и требуют тщательной настройки правил для правильной работы приложений. Если проблема не была решена после выполнения указанных шагов, возможно стоит рассмотреть другие средства управления доступом, такие как SELinux. Однако, прежде всего, попробуйте использовать более широкие разрешения на начальном этапе для выявления проблемы, а затем постепенно уточняйте их.

Если ни одно из предложенных решений не сработает, возможно стоит обратиться к сообществу Ubuntu или AppArmor для получения более подробной помощи.

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

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