ИБ (Информационная Безопасность)
September 21

Безопасность Linux. Изолируем программы и ограничиваем доступ с помощью AppArmor и Firejail

Программы, которые вы запускаете на своем компьютере зачастую имеют доступ к слишком большому объему данных. Например, веб-браузер может читать содержимое вашего диска, системные конфигурации и иную информацию, к которой мы не хотели бы предоставлять доступ. Некоторым программам вообще не следует иметь доступ к интернету или системным директориям. Например, зачем музыкальному плееру доступ в интернет? А видеоредактору доступ ко всей файловой системе? Почему бы не запретить таким программам доступ туда, куда им вообще не следует суваться?
Даже если вы уверены, что ваш веб-браузер или любая другая программа полностью безопасна и не лезет в системные настройки, это еще не значит, что не о чем беспокоиться. Время от времени хакерам удается найти уязвимости в программах (зачастую и в веб-браузерах) и использовать их для получения несанкционированного доступа к системе.
К счастью есть способы создания изолированных сред для программ, в которых они будут работать, имея доступ только к тем данным, которые мы сами им предоставим. Таким образом мы защищаемся от утечки информации и множества угроз.

Для начала предлагаю рассмотреть AppArmor, - систему контроля доступа, а далее мы перейдем к Firejail.

AppArmor

AppArmor - это система контроля доступа, которая является реализацией Mandatory Access Control (MAC), основанной на архитектуре Linux Security Modules (LSM). Политики безопасности полностью определяют, к каким системным ресурсам могут получить доступ отдельные приложения и с какими привилегиями. Доступ запрещен по умолчанию, если в профиле не указано иное. Каждое нарушение политики вызывает сообщение в системном журнале и AppArmor может быть настроен так, чтобы уведомлять пользователей с предупреждениями о нарушениях в режиме реального времени.

Чтобы понять принцип работы MAC, давайте разберемся как работает DAC (Discretionary Access Control) в Linux. Все мы знаем, что в Linux есть такие права, как выполнение, запись и чтение. Данные атрибуты распространяются на:

  • Пользователя (owner)
  • Группу (group)
  • Остальных (other)

Категория "владелец" распространяется только на одного, конкретного пользователя, в то время как группа может содержать множество пользователей ОС. В категорию "остальные" входят те пользователи, которые не принадлежат первым двум.
DAC дает владельцу ресурса право определять тип доступа для указанных категорий пользователей. Такое разграничение доступов подходит для защиты от непреднамеренных действий пользователей.

MAC в свою очередь предполагает централизованный контроль правил политики доступа, при котором посторонние пользователи не могут вносить в них какие-либо изменения. Разработчик политики определяет, какие программы или процессы могут выполнять определенные действия с системными ресурсами. MAC фокусируется в большей степени на программах, нежели на пользователях и решает задачу разграничения доступа процессов к ресурсам ОС.

AppArmor НЕ заменяет систему DAC, а дополняет ее.

Установка

В Arch Linux AppArmor доступен во всех официально-поддерживаемых ядрах. Установка выполняется через пакетный менеджер:
sudo pacman -S apparmor

Чтобы загружать все профили AppArmor при запуске системы, включаем демон:
sudo systemctl enable apparmor.service

Чтобы включить AppArmor в качестве модели безопасности по умолчанию, нужно установить следующие параметры ядра:

lsm=landlock,lockdown,yama,integrity,apparmor,bpf

Как это сделать, если у вас Grub:
Откройте конфиг /etc/default/grub и добавьте туда параметры:

CONFIG_LSM="landlock,lockdown,yama,integrity,apparmor,bpf"

Как это сделать, если у вас systemd-boot
Откройте конфиг /boot/loader/entries/*.conf и добавьте туда параметры:

options ... lsm=landlock,lockdown,yama,integrity,apparmor,bpf

Далее перезагрузите компьютер и проверьте работоспособность AppArmor:
sudo apparmor_status или sudo aa-status

Если вы столкнулись с ошибкой Failed to get profiles как на скриншоте:

То скорее всего какой-то процесс мешает запуску профилей AppArmor. Как оказалось, из за того что я первым делом настроил Firejail, а уже потом принялся за AppArmor, произошел конфликт между ними и Firejail препятствовал корректному запуску AppArmor. Решить проблему удалось следующей командой:
apparmor_parser -r /etc/apparmor.d/firejail-default

Более подробно про настройку Firejail для совместимой работы AppArmor будет чуть позже.

Если AppArmor был корректно запущен, вывод должен быть примерно таким:

Чтобы проверить, правильно ли включен AppArmor:
aa-enabled

Настройка

Профиль - это набор правил доступа, которыми мы указываем, что и как может использовать та или иная программа. Это просто читаемые текстовые файлы, находящиеся в /etc/apparmor.d/. Далее мы рассмотрим настройку и создание собственных профилей.

Базовый профиль выглядит примерно так:

#include <tunables/global>

profile test /usr/lib/test/test_binary {
    #include <abstractions/base>

    # Main libraries and plugins
    /usr/share/TEST/** r,
    /usr/lib/TEST/** rm,

    # Configuration files and logs
    @{HOME}/.config/ r,
    @{HOME}/.config/TEST/** rw,
}

include включает в себя другие профильные файлы напрямую.
@{*} - это переменные, определяемые в /etc/apparmor.d/abstractions/, /etc/apparmor.d/tunables/ или самим профилем.

Можно также указывать Capabilities ядра Linux, которые процессу разрешено использовать.

В данном примере выдаются права на:

  • чтение /usr/share/TEST/**;
  • чтение /usr/lib/TEST/** и загрузку исполняемых файлов в память;
  • чтение @{HOME}/.config/;
  • чтение и запись @{HOME}/.config/TEST/**.

В профиле мы можем указывать правила доступа с помощью следующих флагов:

  • r — чтение;
  • w — запись;
  • a — инкрементальная запись в конец файла, от английского append;
  • k — блокировка файлов;*
  • l — создание символических ссылок на исполняемые файлы;
  • m — загрузка исполняемых файлов в память;
  • cx — переход в профиль нижнего уровня при выполнении;
  • Cx — переход в профиль нижнего уровня при выполнении с очисткой переменных окружения;
  • ix — наследование исполнения;
  • px — требуется определение дискретного профиля безопасности для ресурса;
  • Px — требуется определение дискретного профиля безопасности для ресурса, производится очистка переменных окружения;
  • ux — не проверять запуск новых процессов;
  • Ux — не проверять запуск новых процессов и производить очистку переменных окружения.

В пакете с AppArmor уже идут некоторые профили, которые можно найти в /usr/share/apparmor/extra-profiles/:

Например там есть профили для firefox, freshclam, clamd, man, wireshark и многих других часто-используемых программ. Перед тем как профиль станет активным необходимо перенести его из папки /usr/share/apparmor/extra-profiles/ в /etc/apparmor.d/. После этого его можно будет изучить и при необходимости изменить. Возьмем в пример профиль для passwd:
sudo cp /usr/share/apparmor/extra-profiles/usr.bin.passwd /etc/apparmor.d/
sudo vim /etc/apparmor.d/usr.bin.passwd

Вы можете изменять этот профиль по своим предпочтениям. Таким образом вы можете создать профиль для абсолютно любой, даже системной программы и гибко его настроить.

Рассмотрим создание собственного профиля. Для начала выполните команду aa-autodep <путь к файлу>, например:
sudo aa-autodep /usr/local/bin/ping

После выполнения команды будет создан профиль в /etc/apparmor.d под названием bin.ping:

Далее мы переводим профиль в режим "обучения", то есть в режим complain:
sudo aa-complain bin.ping

Этот режим отвечает за регистрацию действий, не блокируя при этом их. Нам это нужно чтобы обучить профиль и сгенерировать для него набор правил. Обучение будет происходить путем использования программы. То есть мы просто запускаем программу и используем ее, а в этот момент AppArmor будет регистрировать то, куда и с какими правами был доступ к тем или иным файлам и каталогам. Чтобы максимально точно настроить профиль, используйте программу в соответствии со следующим набором действий:

  • Запуск приложения;
  • Остановка приложения;
  • Перезапуск приложения;
  • Прохождение man-страницы или использование всех параметров командной строки;
  • Использование различных частей приложения. Например, в случае Evolution можно протестировать электронную почту, адресбук и календари.

Процесс использования программы может занимать разное время, в зависимости от сложности программы. Например, вы можете закончить за 5 минут или потратить на это больше часа.

Убедитесь, что запущен режим complain с помощью apparmor_status. Когда вы запустите ping, он должен отобразиться в списке процессов complain:

После того, как вы завершили использование программы, нужно добавить информацию в профиль. Для этого запустите sudo aa-logproof. Если вы столкнулись ошибкой доступа к лог-файлу, то это означает, что AppArmor не может получить доступ к логам (и скорее всего они не записались) и это нужно исправить. Чтобы логи записывались, нужно включить журналирование, например с помощью auditd:
sudo systemctl start auditd.service

После этого попробуйте повторно запустить команду sudo aa-logproof.

Когда вы закончили обучение и решили приняться за ручное редактирование профиля, выполните команду sudo aa-enforce bin.ping. Таким образом мы переводим профиль в режим, в котором он гарантированно будет соблюдать записанные правила. Опять же, убедиться что профиль использует нужный режим можно проверив статус через apparmor_status (ну или aa-status).

Кстати, после этого вы можете отключить auditd, т.к. он нужен только во время обучения профиля.

Откройте файл профиля и отредактируйте его по своим предпочтениям.

Второй вариант создания профиля подразумевает собой использования aa-genprof:
sudo aa-genprof <путь к файлу>

После запуска программа попросит вас запустить целевое приложение:

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 

For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.

Запустите его в новом окне и начните им пользоваться, чтобы начать обучение. Запускать нужно явно, через терминал, то есть вводите полный путь, например /usr/bin/neohtop. Как только вы завершите процесс использования, начните анализ логов, для этого в терминале, где запущен aa-genproof нажмите S и отвечайте на вопросы.

Мы можем сделать так, чтобы получали уведомления, когда AppArmor отказывает в доступе программе. Для этого нужно включить auditd:
sudo systemctl enable auditd.service

Далее добавить пользователя в группу audit:
sudo groupadd -r audit
sudo gpasswd -a <user> audit, - укажите свое имя пользователя вместо <user>

Отредактировать файл /etc/audit/auditd.conf и отредактировать строку, чтобы получилось так:

log_group = audit

Установить пакеты:
sudo pacman -S python-notify2 python-psutil

Создать файл ~/.config/autostart/apparmor-notify.desktop и поместить в него следующее содержимое:

[Desktop Entry]
Type=Application
Name=AppArmor Notify
Comment=Receive on screen notifications of AppArmor denials
TryExec=aa-notify
Exec=aa-notify -p -s 1 -w 60 -f /var/log/audit/audit.log
StartupNotify=false
NoDisplay=true

А далее перезапустить систему и проверить процесс:
pgrep -ax aa-notify

Если скорость загрузки AppArmor вас не устраивает, то вы можете попробовать ускорить в соответствии с этой инструкцией:

Использование

Проверить, правильно ли включен AppArmor:
aa-enabled

Отобразить текущее состояние:
sudo aa-status или sudo apparmor_status

Если вы хотите отключить все профили, то можете использовать aa-teardown. Чтобы профили не были загружены при следующей загрузке системы, отключите демон:
sudp systemctl disable apparmor.service

Создать новый профиль (на примере ping):
sudo aa-autodep /usr/local/bin/ping

Перевести профиль в режим Complain (на примере ping):
sudo aa-complain bin.ping

Добавить информацию на основе логов в профиль:
sudo aa-logproof

Перевести профиль в режим enforce (на примере ping):
sudo aa-enforce bin.ping

Создать профиль и заполнить его на основе использования программы (на примере ping):
sudo aa-genprof /usr/local/bin/ping

Firejail

Firejail - это простая в использовании Setuid-программа-песочница, котороая позволяет снизить риск безопасности, ограничивая среду запуска недоверенных программ в Linux. Она легко устанавливается и настраивается.

Установка

Вы можете посетить веб-страницу с содержанием информации по установке Firejail.
Например, там вы сможете найти информацию по сборке исходного кода из репозитория GitHub:

Или по установке собранного пакета в Debian:

Пример установки в KALI Linux:
sudo apt install firejail

В Arch Linux установка выполняется аналогично, через пакетный менеджер:
sudo pacman -S firejail

Настройка

Перед использованием firejail его необходимо настроить. Firejail использует профили для каждого из приложений, выполняемых внутри него. Профиль - это определенный набор правил, который устанавливается для каждой песочницы. В профиле указываются настройки доступа. Есть несколько заранее подготовленных профилей, которые по умолчанию находятся в директории /etc/firejail:

Это все профили, включенные в пакет firejail. Позже мы рассмотрим создание своих собственных профилей.

Например, есть профиль для Firefox, который мы можем использовать. Просто запустите firejail firefox и firejail самостоятельно запустит firefox с соответствующим профилем:

Обратите внимание, что если программа уже запущена, то повторный ее запуск через Firejail завершится ошибкой. То есть, если у вас уже запущен firefox, то запуск еще одного окна firefox через firejail приведет к ошибке и вы увидите строку Parent is shutting down, bye.... Имейте это ввиду, чтобы случайно не предоставить доступ программам к важной информации.

В дополнении к использованию профилей вы можете использовать различные опции, например опцию --seccomp для включения защиты seccomp:
firejail --seccomp okular

Seccomp - это защитный механизм ядра Linux, который обеспечивает возможность ограничивать набор доступных системных вызовов и производить сложную фильтрацию вызовов и их аргументов. По умолчанию фильтры seccomp работают по черному списку (который можно найти в /usr/share/doc/firejail/syscalls.txt).

Сделайте firejail по умолчанию для всех приложений, для которых есть профили:
sudo firecfg

Данной командой мы создали символические ссылки в /usr/local/bin, указывающие на /usr/bin/firejail для программ, для которых firejail имеет профили. Таким образом, все приложения для которых есть профили будут открываться через firejail, хотя есть и некоторые исключения:
некоторые программы CLI отсутствуют, такие как: tar, curl и git. Им необходимо указывать ссылки вручную, но не всегда стоит это делать. Такое поведение связано с тем, что некоторые CLI-программы могут работать неправильно, если вы будете запускать их через firejail, например curl используется во время обновлений пакетов в Arch, поэтому стоит избегать запуска curl через firejail по умолчанию. В общем, прежде чем использовать firejail по умолчанию для запуска каких-то программ, убедитесь что это не нанесет вред вашей системе. Чтобы не ошибиться, используйте firejail только для изоляции недоверенных программ, например таких как Firefox, сторонние утилиты и т.п.

Проверить созданные символические ссылки можно следующим образом:
ls /usr/local/bin

firecfg дополнительно добавляет текущего пользователя в базу данных доступа пользователей Firejail и проверяет файлы /usr/share/applications/*.desktop, если они содержат полный путь к соответствующему исполняемому файлу, удаляет полный путь и копирует их в /usr/local/bin/. Это гарантирует, что будут использованы символические ссылки в /usr/local/bin, что предотвращает обход Firejail.

Если у вас не установлен sudo, то следует выполнить команду firecfg от имени root и firecfg --fix от имени пользователя, чтобы исправить файлы .desktop.

Возможны случаи, когда требуется вручную изменить строку Exec= в файле .desktop в ~/.local/share/applications/ для явного вызова Firejail. Имейте это ввиду.

Чтобы убедиться, что программа запускается через Firejail, запустите ее через терминал:
firefox

Если вы увидете вывод firejail, то все хорошо:

Также вы можете вывести список запущенных приложений через firejail:
firejail --list или firejail --top в зависимости от формата вывода, который вам нужен. Кстати, вы также можете использовать отображаемые PID для остановки процессов, например если программа запущенная через firejail залагала:
firejail --shutdown=3860

Более полный результат:
firejail --tree

Далее добавьте pacman hook, чтобы при выполнении операций pacman автоматически запускался firejail:

[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Operation = Remove
Target = usr/bin/*
Target = usr/local/bin/*
Target = usr/share/applications/*.desktop

[Action]
Description = Configure symlinks in /usr/local/bin based on firecfg.config...
When = PostTransaction
Depends = firejail
Exec = /bin/sh -c 'firecfg >/dev/null 2>&1'

Теперь предлагаю добавить поддержку AppArmor, чтобы использовать его совместно с Firejail. Загружаем профиль в ядро:
sudo apparmor_parser -r /etc/apparmor.d/firejail-default
sudo aa-enforce firejail-default

Локальная настройка профиля apparmor поддерживается путем редактирования файла /etc/apparmor.d/local/firejail-local.

Чтобы вручную указать запуск программы вместе с AppArmor, используйте флаг --apparmor, например:
firejail --apparmor neohtop

Чтобы указать в профиле firejail использование AppArmor, введите apparmor. Например:
vim ~/.config/firejail/warzone2100.profile

include /etc/firejail/warzone2100.profile
net none
apparmor

Примечание: более половины профилей, распространяемых с помощью программного обеспечения Firejail, уже включены в AppArmor.

На иксах (xorg) любая программа может отображать весь ввод с клавиатуры и записывать все экраны. Мы можем создать изолированную среду для X11, чтобы ограничить подобное поведение.
Xephyr и Xpra позволяют использовать изолированную среду X11. Xpra обеспечивает поддержку буфера обмена, но при работе со вложенными сессиями X11 встречаются постоянные лаги, поэтому рекомендуется использовать Xephyr.

Xephyr - это вложенный X-сервер, который работает как приложение X.

Установка:
sudo pacman -S xorg-server-xephyr

Для запуска приложения через Xephyr с разрешением 800x600 (на примере xterm):
Xephyr -br -ac -noreset -screen 800x600 :1
DISPLAY=:1 xterm (в другом терминале)

Для запуска оконного менеджера с разрешением 1920x1080:
Xephyr -br -ac -noreset -screen 1920x1080 :1
DISPLAY=:1 bspwm (в другом терминале)

Вы можете выполнять запуск автоматически при старте Xorg через файл xinitrc:
startx -- /usr/bin/Xephyr :1

Нажатие Ctrl + shift заблокирует/разблокирует указатель мыши и нажатия клавиш в окне Xephyr.

Запуск оконного менеджера с Xephyr и firejail:
firejail --x11=xephyr --net=<device> <wm>, - где вместо <device> и <wm> установите свой сетевой интерфейс для обеспечения работы DNS и оконный менеджер.

Проверить можно через netstat:
netstat -a

См. больше информации по работе с Xorg здесь: https://firejail.wordpress.com/documentation-2/x11-guide/#configurexephyr

Некоторые пользователи сообщают о проблемах при использовании Firejail и проприетарных графических драйверов от NVidia. Часто проблему можно решить, отключив опцию noroot в файле профиля приложения.

Риск безопасности, связанный с тем, что Firejail является исполняемым файлом SUID, может быть уменьшен путем добавления следующей строки в файл /etc/firejail/firejail.config:

force-nonewprivs yes

Это предотвращает повышение привилегий после того, как была начата песочница. Правда это может нарушить работу некоторых приложений, например на Arch Linux виртуальная машина VirtualBox больше не сможет запуститься. Браузер на основе Chromium и kernel.unprivileged_usrens_clone=0 тоже не совместимы с данной настройкой.

На самом деле Firejail даже не рекомендуется устанавливать на многопользовательские серверы, потому что это может только ухудшить безопасность:

https://firejail.wordpress.com/documentation-2/basic-usage/#suid

Дополнительно можно настроить файл /etc/firejail/firejail.users и указать в нем каким пользователям можно запускать firejail. Если этот файл не настроен, всем пользователям разрешен запуск.

Альтернативно мы можем создать специальную группу firejail и добавить пользователей в эту группу:

$ su
# addgroup firejail
# chown root:firejail /usr/bin/firejail
# chmod 4750 /usr/bin/firejail
# ls -l /usr/bin/firejail
-rwsr-x--- 1 root firejail 1584496 Apr 5 21:53 /usr/bin/firejail

Чтобы добавить пользователя в группу, введите:
usermod -a -G firejail username

Pacman hook для автоматической смены владельца и режима firejail:

Firejail (Русский) - ArchWiki

/etc/pacman.d/hooks/firejail-permissions.hook

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = firejail
[Action]
Depends = coreutils
Depends = bash
When = PostTransaction
Exec = /usr/bin/sh -c "chown root:firejail /usr/bin/firejail && chmod 4750 /usr/bin/firejail"
Description = Setting /usr/bin/firejail owner to "root:firejail" and mode "4750"

Переходим к созданию собственных профилей Firejail.
Черные списки:
активно используются в файлах /etc/firejail/*.inc, которые включены в большинство профилей. Черные списки определяются двумя директивами:

  • blacklist <directory/file> - запретить доступ к директории или файлу и разрешить все остальное;
  • noblacklist <directory/file> - запретить, отменить или игнорировать черный список каталога или файла, уже внесенного в черный список.
    директивы noblacklist должны быть добавлены выше директив blacklist.

Белые списки:
блокируют все, что не включено в явный белый список. Их не следует использовать в профилях приложений, которым нужен доступ к произвольным местам (например, текстовые редакторы, просмотрщики/редакторы изображений). Белые списки определяются двумя директивами:

  • whitelist <directory/file> - разрешить доступ к каталогу или файлу и запретить все остальное;
  • nowhitelist <directory/file> - запретить, отменить или игнорировать белый список каталога или файла, уже включенного в белый список.
    директивы nowhitelist должны быть добавлены выше директив whitelist. Белый список всегда составляется перед черным списком.
    Директива белого списка заносит в черный список все остальное, поэтому директива blacklist является запасным вариантом, если нет директив whitelist или если директива whitelist слишком разрешающая.

Пример использования директив для профиля Firefox:

Firejail (Русский) - ArchWiki

Чтобы создать свой профиль, нужно:

  1. Скопировать шаблон профиля /usr/share/doc/firejail/profile.template в /etc/firejail/ или ~/.config/firejail/ и переименовать его в <ProfileName>.profile, где <ProfileName> должен совпадать с названием запускаемого в песочнице приложения. Например:
    mkdir ~/.config/firejail && cp /usr/share/doc/firejail/profile.template ~/.config/firejail/cmus.profile

2. Изменить строку include PROFILE.local на include ProfileName.local

3. Начать править профиль, постепенно комментируя и раскомментируя различные опции, проверяя на каждом этапе работоспособность программы в песочнице. Не меняйте порядок разделов! Подробное объяснение возможных опций можно почитать здесь.

4. Проверьте профиль на наличие уязвимостей и проблем безопасности (как это сделать я покажу чуть позже).

Давайте для примера попробуем создать собственный профиль для cmus (консольного музыкального плеера, о котором я делал статью). На самом деле, профиль для cmus уже входит в пакет firejail, но мы попробуем его создать с нуля, чтобы лучше понять как это работает. Для начала копируем шаблон:
cp /usr/share/doc/firejail/profile.template ~/.config/firejail/cmus.profile

Далее открываем его в редакторе:
vim ~/.config/firejail/cmus.profile

Меняем строку include PROFILE.local на include cmus.local. Помимо этого я предлагаю вырезать ненужный текст в начале файла:

Далее удаляем ignore, которые отвечают за игнорирование команд:

Создаем noblacklist и whitelist, чтобы разрешить доступ к директориям с конфигами и аудио-файлами:

И запрещаем доступ к некоторым другим каталогам:

Добавляем настройки других профилей с помощью include:

  • disable-common отвечает за блокировку доступа к различным файлам и каталогам, к каким обычно не должно быть доступа большинству программ;
  • disable-devel отвечает за блокировку доступа к файлам и каталогам инструментов разработки;
  • disable-interpreters отвечает за блокировку доступа к файлам и каталогам языков программирования;
  • disable-program отвечает за блокировку доступа к файлам и каталогам различных программ, например таких как steam, atom, pycharm и т.п.;
  • disable-shell отвечает за блокировку доступа к файлам и каталогам терминальных оболочек;
  • disable-xdg отвечает за блокировку доступа к каталогам в домашней директории пользователя, например таких как Documents, Music, Pictures и т.п;
  • disable-proc отвечает за блокировку доступа к файлам и каталогам в директории /proc;
include disable-common.inc
include disable-devel.inc
include disable-interpreters.inc
include disable-programs.inc
include disable-shell.inc
include disable-xdg.inc
include disable-proc.inc

Добавляем использование apparmor:
apparmor

Запрещаем доступ к сети:
net none

Выключаем 3D акселерацию:
no3d

Запрещаем доступ к DVD и аудио CD устройствам:
nodvd

Запрещаем доступ к устройствам ввода:
noinput

Запрещаем доступ к принтерам:
noprinters

Запрещаем доступ к TPM устройствам:
notpm

Запрещаем доступ к DVB-устройствам:
notv

Запрещаем доступ к U2F-устройствам:
nou2f

Запрещаем доступ к устройствам захвата видео:
novideo

Запрещаем доступ к примонтированным устройствам:
disable-mnt

Разрешаем доступ к пространству имен ТОЛЬКО ТЕКУЩЕГО пользователя:
noroot

Включаем фильтр протоколов (фильтр основан на seccomp):
protocol unix

Включаем защиту seccomp:
seccomp

Включаем запись логов в случае нарушений:
tracelog

Наконец, разрешаем доступ в изолированной точке монтирования к исполняемому файлу:
private-bin cmus

В итоге у нас получился вот такой файл:

Теперь можно проверить работоспособность cmus. Через файловый браузер можно убедиться, что у cmus есть доступ только к каталогу ~/Music, из которого мы можем добавлять треки в плейлист:

Чтобы убедиться, что профиль не имеет уязвимостей и проблем безопасности, мы можем:

  1. Посмотреть подробное описание песочницы:
    firejail --debug cmus
  2. Посмотреть каталоги и файлы белого и черного списков:
    firejail --debug-blacklists cmus
    firejail --debub-whitelists cmus
  3. Провести тестирование с помощью jailcheck. Это поможет провести ряд тестирований на доступ к файлам и каталогам, возможность запуска программ, доступ к интернету, работу AppArmor и т.д. Например, мой профиль cmus имеет 2 проблемы:

Cmus может запускать программы в директориях /tmp и /run/user/1000. Давайте это исправим, а для этого добавим следующие строки в файл профиля:
noexec /tmp
noexec /run/user/1000

Проверим еще раз:

4. Использовать checksec для проверки бинарника на безопасность:
checksec --file=/usr/bin/cmus

Использование

Использовать firejail по умолчанию:
sudo firecfg + при необходимости можно пофиксить .desktop файлы с помощью firecfg --fix

Вернуть настройки (удалить созданные символические ссылки и вернуть на их место бинарники в /usr/local/bin):
sudo firecfg --clear

Запустить программу с firejail:
firejail <app>, - где вместо <app> имя программы, например firejaiul cmus

Запустить программу с firejail и apparmor, а также использовать защиту seccomp и предоставить изолированное смонтированное место на диске (все созданные программой файлы будут удалены по завершению работы песочницы):
firejail --apparmor --seccomp --private <app> (больше опций можно посмотреть, выполнив команду firejail --help)

С опцией private firejail устанавливает временную файловую систему (tmpfs) поверх директории /home/user. Любые файлы, созданные в этом каталоге, будут удалены при закрытии песочницы. Вы также можете использовать существующий каталог:
firejail --private=~/my_private_dir cmus

Запустить несколько программ в одной песочнице:
firejail --name=<NAME> <app>, - где вместо <NAME> указываем имя песочницы и вместо <app> имя программы. Далее запускаем вторую программу:
firejail --join=<NAME> <app>, - где вместо <NAME> указываем имя созданной ранее песочницы и вместо <app> имя второй программы, которую мы хотим запустить.

В качестве альтернативы можете просто указать PID (тогда не придется давать имена песочницам):
firejail <app> - запускаем первую программу
firejail --list - смотрим список процессов
firejail --join=<PID> <app> - запускаем вторую программу

Запустить программу на время:
firejail --timeout=0:0:10 cmus - в этом примере cmus автоматически закроется по истечении 10 секунд

Запуск оконного менеджера с Xephyr и firejail:
firejail --x11=xephyr --net=<device> <wm>, - где вместо <device> и <wm> установите свой сетевой интерфейс для обеспечения работы DNS и оконный менеджер.

Запуск AppImage (на примере kdenlive):
firejail --private=~/mykdenlive --appimage ~/Downloads/Kdenlive-17.12.0d-x86_64.AppImage

Вывести список запущенных приложений через firejail:
firejail --list или firejail --top в зависимости от формата вывода, который вам нужен.

Более полный результат:
firejail --tree

Убить процесс:
firejail --shutdown=<PID>, - где вместо <PID> ввести ID процесса, например firejail --shutdown=3860

Посмотреть подробное описание песочницы:
firejail --debug cmus

Посмотреть каталоги и файлы белого и черного списков:
firejail --debug-blacklists cmus
firejail --debub-whitelists cmus

Провести тестирование на наличие уязвимостей:
sudo jailcheck

Заключение

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

Подводя итоги, можно сказать что AppArmor и Firejail хорошо дополняют друг друга. Это отличные средства контроля доступа, которые при желании можно легко (по сравнению с аналогичными программами) настроить и использовать в Linux-дистрибутивах.


Мой Telegram

Мой GitHub

Поддержать автора донатом