AppArmor - это система управления доступом к файлам на основе имен (Mandatory Access Control). Недавно мы рассматривали еще одну реализацию такой системы - SELinux. Apparmor работает подобным способом, на основе модуля ядра Linux Security (LSM). Но он сильно отличается от SELinux и в первую очередь своей простотой. Здесь нет никаких ролей и маркеров. Есть только программы и список файлов, к которым они могут иметь доступ. Если SELinux используется по умолчанию в Red Hat, то AppArmor, установлен и активирован по умолчанию в Ubuntu.
В этой статье мы рассмотрим как выполняется настройка Apparmor в Ubuntu, как контролировать доступ приложений к файлам, а также как создавать свои файлы профилей для новых приложений.
Содержание статьи
- Немного теории
- Установка Apparmor в Ubuntu
- Настройка Apparmor в Ubuntu
- Создание профиля в AppArmor
- Отключение Apparmor
- Выводы
Немного теории
Контроль доступа для программы осуществляется на основе файла профиля. Причем вам необязательно полностью включать или отключать Apparmor, вы можете контролировать доступ только для отдельных приложений.
Профили могут работать в двух режимах:
- Enforce - ядро гарантирует соблюдение правил, указанных в файле профиля, все нарушения блокируются, а также записываются в файл журнала, где могут быть очень легко просмотрены.
- Complain - режим обучения, программа будет только регистрировать нарушения ничего не блокируя.
Таким образом, для каждой программы, которую нужно контролировать создается файл профиля, если его нет или он отключен, программа выполняется без ограничений. Это гарантирует, стабильную работу системы и позволяет контролировать работу программ.
Установка Apparmor в Ubuntu
Я уже сказал, что Apparmor в системе установлен. Но установлены только базовые компоненты, если нам нужны дополнительные профили и инструменты управления, нужно их устанавливать отдельно:
sudo apt install apparmor-utils apparmor-profiles
Теперь можем переходить к работе с Apparmor.
Настройка Apparmor в Ubuntu
Перед тем как переходить непосредственно к настройке Apparmor, давайте посмотрим ее состояние. Для этого выполните:
apparmor_status
Из снимка видно, что сейчас загружено 57 профилей, 20 из которых находятся в принудительном режиме (enforce), а 37 в режиме обучения.
Если изучить список дальше, то мы можем увидеть, сколько процессов подпадают под наши профили. В моем случае профили были найдены только для одного запущенного процесса, и он работает в режиме блокировки и не может получить доступ к недозволенным ресурсам. Также могут быть не настроенные процессы, это происходит потому, что они были запущены до запуска AppArmor, чтобы и над ними выполнялось управление просто перезапустите их. Большинство профилей только для серверных утилит и для браузеров, если же мы захотим контролировать другие программы, то нужно будет добавлять профили вручную.
Как видите, профилей не так уж много, но на самом деле их есть больше. Мы установили дополнительные профили в пакете apparmor-profiles, все они находятся в папке /usr/share/doc/apparmor-profiles/extras/. Посмотрите ее содержимое:
ls /usr/share/doc/apparmor-profiles/extras/
Здесь доступны как уже привычные серверные профили, так и профили для настольных приложений, например, браузеров и почтовых клиентов.
Имя профиля представляет из себя полный путь к файлу программы в котором наклонная черта заменена на точку, например: usr.bin.skype или usr.bin.man.
Давайте, для примера, скопируем профиль для утилиты man:
sudo cp /usr/share/doc/apparmor-profiles/extras/usr.bin.man /etc/apparmor.d/
Смотрим состояние и видим, что теперь у нас есть такой профиль.
Для переключения режима для профиля используются две команды aa-enforce и aa-complain. Давайте включим принудительное выполнение для нашего профиля:
sudo aa-enforce man
А чтобы вернуться в режим обучения наберите:
sudo aa-comlain man
Но проверить как это работает сейчас мы не можем, man просто так не станет нарушать правила. Давайте скопируем утилиту cp вместо man и проверим, будет ли она копировать файлы в корневом каталоге:
sudo touch /test
$ sudo cp /usr/bin/man /usr/bin/man1
$ sudo cp /bin/cp /usr/bin/man
$ sudo man /test /test1
Отказано в доступе, но как такое может быть, ведь мы выполняли команду от суперпользователя? Для Apparmor неважно root это или нет, сказано нет доступа к файлам, значит нет, и все. Возвращаем нашу man на место:
sudo cp /usr/bin/man1 /usr/bin/man
$ rm /test
Теперь смотрим лог Apparmor, и видим в конце две записи, об отказе в доступе:
tail /var/log/kern.log
Работает. Теперь рассмотрим как создать свой профиль, это тоже должна включать настройка apparmor в Ubuntu, поскольку профили есть далеко не для всех приложений.
Создание профиля в AppArmor
Создать профиль для AppArmor не так сложно как кажется на первый взгляд. Для этого в системе существует несколько утилит. Но для начала давайте рассмотрим синтаксис файла, чтобы было понятно с чем мы имеем дело. Возьмем опять же файл от man:
include <tunables/global>
/usr/bin/man {
#include <abstractions/base>
#include <abstractions/nameservice>
capability setgid,
capability setuid,
/usr/bin/man r,
/usr/lib/man-db/man Px,
}
Основу профиля составляют адреса файлов, к которым программа может иметь доступ, а также разрешения для этих файлов. Синтаксис такой:
/адрес/файла права
Доступны такие права:
- r - разрешить чтение
- w - разрешить запись
- a - разрешить запись в конец файла
- px - разрешить запуск новых процессов если для них есть профиль
- Px - разрешить запуск новых процессов, если для них есть профиль и стереть переменные окружения
- ix - разрешить запуск нового процесса под профилем текущего
- m - разрешить загружать исполняемые файлы в память и запускать
- l - разрешить создавать символические ссылки на исполняемые файлы
- k - разрешить блокировать файлы
- ux - не контролировать новые процессы
- Ux - не контролировать новые процессы и очистить переменные окружения.
Этих полномочий вполне достаточно, для управления правами, но кроме списка файлов и их полномочий, файл профиля содержит еще директивы include и capability.
include позволяет включать другие файлы с разрешениями, они находятся в папке /etc/apparmor.d/abstractions/. Это такие же части профиля, со списком файлов и правами доступа. Они облегчают создание новых профилей.
С capability все немного сложнее. Программа может обращаться к ядру с помощью системных вызовов, эти вызовы Apparmor тоже контролирует. Посмотреть все доступные вызовы вы можете командой man capabilities. В нашем случае мы разрешаем процессу задать свой uid и gid, то есть сменить пользователя и группу, от которого он запущен.
Есть еще папка /etc/apparrmor.d/tunables с переменными, которые могут использоваться в каждом профиле. Но с ними разберемся по ходу. Теперь вы готовы к тому, чтобы создать профиль apparmor. Для примера будем создавать новый профиль для утилиты free. Напомню, что эта утилита показывает доступную оперативную память.
Сначала выполните такую команду, чтобы инициализировать шаблон профиля:
sudo aa-autodep free
Шаблон профиля создан, можете его посмотреть, теперь нужно выполнить профилирование программы, чтобы посмотреть какие ей файлы нужны и добавить их в профиль:
sudo aa-genprof free
Программа говорит, что нужно запустить программу в отдельном окне терминала, и выполнить все действия, которые она может делать, затем нажать S. Так и поступаем:
free -h
Готово, теперь нажимаем F, чтобы завершить работу утилиты. Дальше включаем принудительный режим:
sudo aa-enforce free
И проверяем работоспособность утилиты:
free
Если вы меняли профиль вручную, то его необходимо перезагрузить, чтобы изменения вступили в силу, для этого используйте команду:
sudo aa-parser имя_профиля -a
Перезагрузить все профили можно командой:
sudo service apparmor reload
Вот и все, настройка apparmor в Ubuntu 16.04 завершена.
Отключение Apparmor
Если вам больше не нужен Apparmor, вы не хотите, чтобы программа тратила системные ресурсы или хотите просто отключить ее для отладки, это можно очень просто сделать.
Очищаем кеш профилей и останавливаем сервис управления AppArmor:
sudo service apparmor stop
Но эта команда не остановит работу уже выполняющихся профилей, чтобы их выгрузить выполните:
sudo service apparmor teardown
Вот теперь профили выгружены.
Выводы
Хотя и осталось еще много белых пятен, настройка apparmor теперь не кажется вам такой сложной. Мы не смогли затронуть все, потому что это очень обширная тема, но я старался рассказать основы, которые позволят вам дальше самим найти информацию. Если у вас остались вопросы, спрашивайте в комментариях!
День добрый!
Кажется первые скрины не соответсвуют тексту после них.
Да, вы правы, была неточность, подправил.
Сергей, спасибо за статью.
А что бет если cp скопировать не вместо man, а вместо asdfghjkl ? Тогда AppArmor не помешает запуску? Или есть режим, в котором все, что не задано профилями блочится, по-моему у SElinux есть такой режим, если не путаю.
Еслиже такого режима нет, то как посоветуете защищаться в таком случае?
Если защищаемое ПО переименовать или скопировать в другое место - apparmor перестанет это самое ПО контролировать...т.е., если потенциальный взломщик получит доступ к консоли - больше защита apparmor не работает...как-то не по фэншую эти грабли, которые не защищают, уж лучше ПО в виртуалки уводить, но это огромный расход ресурсов, даже если это будет xen или jail.
"А чтобы вернуться в режим обучения наберите:
sudo aa-comlain man" - исправьте ошибку пожалуйста.