blog-public/content/post/apparmor-firefox.md
Denis Zheleztsov a5dd73f274 Initial public
Some content was deleted before this project
has been moved to public
2021-10-18 19:45:57 +03:00

8.9 KiB
Raw Blame History

+++ date = "2018-11-27T11:22:39+03:00" draft = false title = "Ограничиваем в правах Firefox с помощью apparmor" tags = ["linux", "firefox", "apparmor", "archlinux"] comments = true +++

AppArmor — программный инструмент упреждающей защиты, основанный на политиках безопасности, которые определяют, к каким системным ресурсам и с какими привилегиями может получить доступ то или иное приложение. В AppArmor включён набор стандартных профилей, а также инструменты статического анализа и инструменты, основанные на обучении, позволяющие ускорить и упростить построение новых профилей.

© Wikipedia.org

Самое опасное приложение на десктопе, как я считаю, -- это браузер. На меня напал очередной приступ паранои и я написал профиль apparmor для Firefox.

tl;dr

Ставим утилиты:

pacman -S apparmor audit

Apparmor входит в ядро, так что нужно только его включить передав соответствующие параметры в cmdline Linux. Правим /etc/default/grub:

GRUB_CMDLINE_LINUX="apparmor=1 security=apparmor audit=1"

Включаем сервисы:

systemctl enable apparmor
systemctl enable auditd

Разрешаем себе читать audit.log

groupadd -r audit
gpasswd -a USERNAME audit

В /etc/audit/auditd.conf прописываем только что созданную группу: log_group = audit

Перезагружаемся

Проверяем статус apparmor:

apparmor_status
apparmor module is loaded.
62 profiles are loaded.
49 profiles are in enforce mode.
...
SKIP
...

Пишем профиль /etc/apparmor.d/usr.bin.firefox

#include <tunables/global>

/usr/bin/firefox {
  #include <abstractions/base>
  #include <abstractions/bash>

  # Даем доступ к видео, памяти и tty
  /dev/dri/** wr,
  /dev/dri/ r,
  /dev/shm/ r,
  /dev/tty* rw,
  /dev/shm/* rw,

  # Даем доступ к конфигам, а так же сети и SSL
  /etc/fonts/** r,
  /etc/drirc r,
  /etc/mime.types r,
  /etc/pulse/client.conf r,
  /etc/nsswitch.conf r,
  /etc/ca-certificates/** r,
  /etc/resolv.conf r,
  /etc/host.conf r,
  /etc/ssl/openssl.cnf r,
  /etc/hosts r,
  /etc/gai.conf r,
  /etc/machine-id r,

  # Разрешаем исполнение самого себя
  # /usr/bin/bash ix,
  /usr/bin/firefox rix,
  /usr/bin/chrome-gnome-shell rix,
  # Разрешаем грепать
  /bin/grep ixr,

  # Доступ к библиотека на чтение/подключение
  /usr/lib/* rm,
  /usr/lib/dri/* rm,
  /usr/lib/python3.7/** rm,
  /usr/lib/firefox/** rixm,

  # Доступ к системным FS
  /sys/devices/system/cpu/present r,
  /proc/** r,
  /sys/devices/** r,

  /usr/share/hunspell/ r,
  /usr/share/fonts/** rwkl,
  /usr/share/sounds/** r,
  # тут 1000 нужно заменить на id своего юзера
  /run/user/1000/** r,
  
  # Разрешаем писать во временную директорию
  /tmp/** rwk,
  
  # Даем права на чтение/запись/лок/линкинг
  /run/user/1000/** rwkl,
  # Разрешаем писать в сокет dbus
  /var/run/dbus/system_bus_socket w,

  # Шрифты/значки и.т.д
  /var/cache/fontconfig/** r,
  /var/lib/flatpak/exports/** r,
  /usr/share/fonts/ r,
  /usr/share/icons/** r,
  /usr/share/glib-2.0/** r,
  /usr/lib/firefox/** rwkix,
  /usr/share/ca-certificates/** r,
  /usr/lib/gtk-3.0/** rmk,
  /usr/share/applications/kde4/ r,
  /usr/share/pixmaps/ r,
  /usr/share/icons/ r,
  /usr/share/libthai/thbrk.tri r,
  /usr/local/share/applications/ r,
  /usr/local/share/applications/* r,
  /usr/local/share/mime/mime.cache r,
  /usr/share/applications/ r,
  /usr/share/applications/* r,
  /usr/share/gdm/applications/ r,
  /usr/share/gdm/applications/* r,
  /usr/share/locale-langpack/** r,
  /usr/share/gtk-3.0/** r,
  /usr/share/mime/** r,
  /usr/share/myspell/** r,
  /usr/share/themes/** r,

  # Назначаем Firefox влядельцем ~/.mozilla и даем ему там все права
  # кроме исполнения и подключения библиотек
  owner @{HOME}/.mozilla/** rwkl,
  @{HOME}/.cache/fontconfig/** r,
  @{HOME}/.cache/mozilla/** rwk,
  @{HOME}/.cache/thumbnails/** r,
  @{HOME}/.config/dconf/* rkw,
  @{HOME}/.fonts/ r,
  @{HOME}/.local/share/icons/** r,
  @{HOME}/.cache/mesa_shader_cache/index rwk,
  @{HOME}/.local/lib/python3.7/** rm,
  @{HOME}/.config/fcitx/dbus/* r,
  @{HOME}/.local/share/recently-used.xbel rk,

  # Определяем каталоги в домашней директории куда можно ходить
  # Firefox и с какими правами.
  # В моем случае браузер не может даже получить список 
  # каталогов, но может читать в разрешенных местах и писать в ~/Загрузки
  @{HOME}/Изображения/ r,
  @{HOME}/Документы/ r,
  @{HOME}/Загрузки/ r,
  @{HOME}/Видео/ r,
  @{HOME}/Музыка/ r,
  @{HOME}/soft/ r,
  @{HOME}/Изображения/** r,
  @{HOME}/Документы/** r,
  @{HOME}/Музыка/** r,
  @{HOME}/Загрузки/** rwk,
  @{HOME}/Видео/** r,
  @{HOME}/soft/** r,

  # Кэши и локальные конфиги
  @{HOME}/.local/share/fonts/ r,
  @{HOME}/.fonts/** r,
  @{HOME}/.ICEauthority r,
  @{HOME}/.Xauthority r,
  @{HOME}/.adobe/**/ r,
  @{HOME}/.config/* r,
  @{HOME}/.cache/* wrk,
  @{HOME}/.config/gtk-2.0/* r,
  @{HOME}/.config/gtk-3.0/* r,
  @{HOME}/.fonts.conf r,
  @{HOME}/.icons/ r,
  @{HOME}/.local/share/applications/ r,
  @{HOME}/.local/share/applications/* r,
  @{HOME}/.local/share/fonts/** r,
  @{HOME}/.local/share/icons/ r,
  @{HOME}/.local/share/mime/mime.cache r,
  @{HOME}/.pulse-cookie krw,
  @{HOME}/.config/pulse/** krw,
}

PULL THE LEVER

aa-enforce /etc/apparmor.d/usr.bin.firefox
Назначение /etc/apparmor.d/usr.bin.firefox принудительного режима.

Теперь можно запустить браузер и проверить его работоспособность. Наблюдаем через tail -f /var/log/audit/audit.log | grep DENIED что было запрещенно Firefox.

Для меня, например, это:

type=AVC msg=audit(1543307263.804:81037): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/etc/passwd" pid=31159 comm="firefox" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307263.884:81039): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/lsb_release" pid=31177 comm="firefox" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0
type=AVC msg=audit(1543307263.991:81040): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/dev/" pid=31156 comm="firefox" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.698:81043): apparmor="DENIED" operation="open" profile="/usr/bin/firefox" name="/usr/bin/" pid=31493 comm="chrome-gnome-sh" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.944:81044): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/ldconfig" pid=31533 comm="chrome-gnome-sh" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0
type=AVC msg=audit(1543307266.968:81045): apparmor="DENIED" operation="exec" profile="/usr/bin/firefox" name="/usr/bin/gcc" pid=31534 comm="chrome-gnome-sh" requested_mask="x" denied_mask="x" fsuid=1000 ouid=0

Зачем браузеру запускать компилятор я категорически не понимаю.

Смотрим еще раз в apparmor_status, в конце должно быть что-то подобное:

...
9 processes are in enforce mode.
   /usr/lib/firefox/firefox (587) /usr/bin/firefox
   /usr/lib/firefox/firefox (3857) /usr/bin/firefox
   /usr/lib/firefox/firefox (31156) /usr/bin/firefox
   /usr/lib/firefox/firefox (31212) /usr/bin/firefox
   /usr/lib/firefox/firefox (31298) /usr/bin/firefox
   /usr/bin/python3.7 (31491) /usr/bin/firefox
   /usr/lib/firefox/firefox (31516) /usr/bin/firefox
   /usr/bin/ntpd (1462) /usr/{bin,sbin}/{,open}ntpd
   /usr/bin/dnsmasq (1510) dnsmasq

Все довольно просто в отличии от того же SELinux. А еще у apparmor есть очень хорошая документация с quick guide.