Заблокировать подозрительное поведение программы? Смягчить последствия от эксплуатации уязвимостей? Заблокировать выполнение несанкционированного кода?
TOMOYO Linux — реализация мандатного управления доступом для операционной системы Linux. Встроена в ядро по умолчанию. Позволяет взять под контроль поведение системы и жестко ограничить в рамках заданной политики.
Ниже будет описано создание политик, как на отдельные приложения, так и на всю систему в целом.
Примеры будут построены на базе Debian Wheezy и Tomoyo 2.5 имеющейся в ядре.
Основы
1. Домены.
Tomoyo в своей работе руководствуется таким понятием, как Домены. Домены это процессы и взаимосвязь между процессами domain transition.
Базовый домен это всегда <kernel>
О него разрастаются все остальные.
<kernel> - домен <kernel> /sbin/init - домен <kernel> /sbin/init /etc/rc.d/rc - еще домен <kernel> /etc/init.d/gdm3 /sbin/start-stop-daemon /usr/sbin/gdm3 - еще
При этом учитывается, как был запущен процесс и кто его родитель.
Возьмем к примеру процесс /bin/bash, он может быть запущен локально, а может и от sshd в процессе удаленного логина.
Эти два состояния так-же сажаются в отдельные домены.
/sbin/init… /bin/bash
/sbin/init… /usr/sbin/sshd /bin/bash
К каждому домену можно применить свою политику безопасности.
Например, если bash запущен локально — одну. А если bash запущен удаленно — другую, более жесткую. Это сильная особенность Tomoyo.
Основным инструментом работы с доменами и политиками является редактор tomoyo-editpolicy.
Вот так выглядят домены в редакторе tomoyo-editpolicy
Редактор полностью управляется с клавиатуры. Вот так выглядит главное меню.
Для вывода главного меню нужно нажать W, для переключения к списку доменов D (w & d).
2. Политики
Политики содержат различные контроли поведения доменов. Операции записи, чтения, выхода в сеть, создания дочерних процессов. В общем стандартные вещи.
file execute /bin/ls - разрешение запуска ls
Помимо этого, каждый контроль можно обвешивать условиями его срабатывания.
file execute /bin/ls task.uid=0 - разрешение запуска ls только суперпользователю.
3. Профили.
Поведение каждого домена, помимо политик, определяется наложенным на него профилем.
Существует 4 базовых профиля.
0 — политики отключены, домен свободен от ограничений.
1 — режим обучения, все действия разрешаются и дописываются в политику конкретного домена.
2 — режим разрешения, по сути тоже что и 0
3 — режим запрета, запрещено все, что не определено политикой конкретного домена.
Вот так выглядят профили в редакторе tomoyo-editpolicy (w & p)
Стандартная цель для усиления безопасности — составить политику для домена и наложить профиль 3
4. Исключения.
Поведение доменов, так-же определяется с помощью Исключений. Исключения действуют глобально. Могут применяться ко всем доменам сразу. В политику исключений так-же прописывают различные, часто вызываемые переменные. Исключения используют для упрощения создания политик и улучшения читаемости конфигов.
Вот так выглядят исключения в редакторе tomoyo-editpolicy (w & e)
5. Конфиги
Конфигурационные файлы вышеописанных составляющих находятся тут:
/etc/tomoyo/domain_policy.conf — политики для каждого домена
/etc/tomoyo/profile.conf — профили
/etc/tomoyo/exception_policy.conf — исключения
Важно понимать, что когда вы запускаете tomoyo-editpolicy и начинаете править домены, накладывать ограничения. Вы правите оперативные правила загруженные в ядро. Не кофигурационные файлы!
Для сохранения проделанных изменений служат отдельные утилиты.
6. Утилиты
tomoyo-editpolicy — основной инструмент для работы. Позволяет работать с текущими загруженными в ядро оперативными политиками.
tomoyo-loadpolicy — загружает в ядро ранее сохраненные или свежесозданные в сторонних редакторах политики.
tomoyo-savepolicy — сохраняет политику, работающую в ядре на диск. Это важно! Если вы что-то правили в оперативных политиках с помощью tomoyo-editpolicy. А потом забыли дать эту команду сохранения, все будет потеряно.
tomoyo-checkpolicy — проверяет сохраненные политики на ошибки.
Это не все утилиты, далее будет еще несколько примеров.
Подробнее о внутреннем устройстве Tomoyo
tomoyo.sourceforge.jp/2.5/chapter-4.html.en
Подробнее об утилитах
tomoyo.sourceforge.jp/2.5/man-pages/index.html.en
Включение Tomoyo.
1. Правим GRUB /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=«quiet security=tomoyo»
Даем команду
update-grub
2. Ставим пакеты
aptitude install tomoyo-tools
3. Выполняем команду
/usr/lib/tomoyo/init_policy
для первичной инициализации системы.
4. Важно!
Если вы так закрутили гайки с помощью Tomoyo, что даже система не грузится. Ничего страшного, при загрузке нажмите e в меню grub и поменяйте.
security=tomoyo
на
security=none
Пишем политику для приложения.
Попробуем наложить ограничения на браузер midori.
Выше было описано, что в зависимости от того, как процесс был запущен. От sshd, из командной строки, из гнома. Создается каждый раз отдельный домен.
Сейчас-же нам нужно создать одну общую политику для данного процесса. В независимости от метода запуска midori.
Для этого в Исключениях используем команду initialize_domain.
Запускаем tomoyo-editpolicy
Заходим в раздел Exeption Policy Editor (w & e) и нажав на клавиатуре A добавляем строчку
initialize_domain /usr/bin/midori from any
Подробнее об управлениями доменами в Исключениях.
tomoyo.sourceforge.jp/2.5/chapter-5.html.en
После этого возвращаемся в окно Domain Transition Editor (w & d)
И находим наш домен /usr/bin/midori с пометкой *
Нажав S переводим домен в режим обучения, выставив ему 1.
Запускаем midori и работаем в нем пару минут, совершая штатные операции. Посетим пару сайтов, сохраним страничку, покопаемся в настройках и тд.
Закроем midori.
В окне Domain Transition Editor нажимаем Enter на домене и попадаем в редактор политик Domain Policy Editor, видим все операции которые совершал midori в своей работе.
Основная работа будет проходить в этом окне.
Нажимая клавишу @ можно сортировать данные на экране в различных сочетаниях. По пути файлов или по выполняемой операции.
По сути это уже готовый конфиг. Теперь надо упростить его используя регулярные выражения.
В качестве примера используем типичные операции работы программы со своими настройками.
Разрешим некоторые операции для файлов по пути /home/home/.config/midori/
Нажимаем кнопку А (append) и пишем.
file read/write/unlink/truncate/rename /home/home/.config/midori/\*
Теперь удалим строчки попавшие под регулярку.
Нажимаем О и редактор выделяет все совпадения, затем нажимаем D и редактор удаляет теперь уже ненужные строчки, конфиг сокращается.
А вот, например, такой конструкцией можно разрешить определенные операции и для файлов любых подкаталогов /home/home/.config/midori/
file read/write/append/unlink/truncate /home/home/.config/midori/\{\*\}/\*
Синтаксис регулярных выражений описан здесь
tomoyo.sourceforge.jp/2.5/policy-specification/expression-rules.html.en#wildcard
Возможные файловые операции здесь
tomoyo.sourceforge.jp/2.5/policy-specification/domain-policy-syntax.html.en
Давайте теперь посмотрим на операции с сетью.
Создадим правило разрешающее посещение любого сайта в интернете, с использованием определенных портов.
network inet stream connect 0.0.0.0-255.255.255.255 80-443
//упростил указав диапазон портов
И по аналогии выше применяем его, с сокращением конфига (O & D).
Операции с сетью описаны тут
tomoyo.sourceforge.jp/2.5/policy-specification/domain-policy-syntax.html.en#network_inet
Постепенно сокращая конфиг, переходим наконец к запрету подозрительных операций.
Например, мне не нравится, что midori читает /etc/passwd
Попробуем удалить это разрешение и протестировать результат.
Нажимаем D, удалив таким образом разрешение.
Затем возвращаемся в Domain Transition Editor (w & d), нажимаем S и меняем профиль обучения 1 на профиль запрета 3.
Пробуем запустить.
Приложение работает? Значит так тому и быть. Приложение не работает? Значит стоит задуматься о доверии к такому приложению.
После всех манипуляций по причесыванию конфига сохраним его.
tomoyo-savepolicy -d | tomoyo-selectpolicy -r '<kernel> /usr/bin/midori' >> /etc/tomoyo/domain_policy.conf
Пояснение:
tomoyo-savepolicy -d
выводит всю кучу доменов.
tomoyo-selectpolicy -r '<kernel> /usr/bin/midori'
выбирает только нужный домен, с нужной политикой.
>> /etc/tomoyo/domain_policy.conf
сохраняем политику домена.
Что в итоге получилось в политике для midori
<kernel> /usr/bin/midori use_profile 3 use_group 0 misc env GNOME_KEYRING_PID misc env USER misc env SSH_AGENT_PID misc env HOME misc env DESKTOP_SESSION misc env XDG_SESSION_COOKIE misc env DBUS_SESSION_BUS_ADDRESS misc env GNOME_KEYRING_CONTROL misc env LOGNAME misc env USERNAME misc env WINDOWPATH misc env PATH misc env DISPLAY misc env LANG misc env XAUTHORITY misc env SSH_AUTH_SOCK misc env SHELL misc env GDMSESSION misc env PWD misc env XDG_DATA_DIRS misc env GNOME_DESKTOP_SESSION_ID misc env SESSION_MANAGER misc env GPG_AGENT_INFO misc env GIO_LAUNCHED_DESKTOP_FILE misc env GIO_LAUNCHED_DESKTOP_FILE_PID misc env DESKTOP_STARTUP_ID file read proc:/filesystems file read /usr/lib/locale/locale-archive file read /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache network unix stream connect /var/run/nscd/socket file read /etc/nsswitch.conf network unix stream connect \000/tmp/.X11-unix/X0 file read /run/gdm3/auth-for-home-WxYaIE/database file read /usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/engines/libclearlooks.so file read /usr/lib/x86_64-linux-gnu/gtk-2.0/modules/libcanberra-gtk-module.so network unix stream connect \000/tmp/dbus-BKDp9V4Rww file read /usr/lib/x86_64-linux-gnu/gio/modules/giomodule.cache file read /usr/lib/x86_64-linux-gnu/gio/modules/libgiognomeproxy.so file read /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so file read /usr/lib/x86_64-linux-gnu/gio/modules/libdconfsettings.so file read /etc/xdg/midori/search file read /usr/lib/x86_64-linux-gnu/gio/modules/libgiognutls.so file read proc:/sys/crypto/fips_enabled file read /dev/urandom file read /etc/pkcs11/modules/gnome-keyring-module file read /usr/lib/x86_64-linux-gnu/pkcs11/gnome-keyring-pkcs11.so network unix stream connect /home/home/.cache/keyring-XULOQY/pkcs11 file read /etc/ssl/certs/ca-certificates.crt file read /usr/lib/x86_64-linux-gnu/gio/modules/libgvfsdbus.so file read /usr/lib/x86_64-linux-gnu/gvfs/libgvfscommon.so file read /usr/lib/midori/libaddons.so file read /usr/lib/midori/libtoolbar-editor.so file read /usr/lib/midori/libtab-panel.so file read /usr/lib/midori/libadblock.so file read /usr/lib/midori/libcookie-manager.so file read /usr/lib/midori/libstatusbar-features.so file read /usr/lib/midori/libweb-cache.so file read /usr/lib/midori/libshortcuts.so file read /usr/lib/midori/libformhistory.so file read /usr/lib/midori/libstatus-clock.so file read /usr/lib/midori/libcolorful-tabs.so file read /usr/lib/midori/libfeed-panel.so file read /usr/lib/midori/libhistory-list.so file read /usr/lib/midori/libmouse-gestures.so file read /usr/lib/midori/libcopy-tabs.so file read /usr/lib/midori/libtabs-minimized.so file read /usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders.cache file read /usr/lib/x86_64-linux-gnu/pango/1.6.0/module-files.d/libpango1.0-0.modules file read /etc/fonts/fonts.conf file read /usr/lib/x86_64-linux-gnu/pango/1.6.0/modules/pango-basic-fc.so file read /usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-svg.so file read /usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/gtk.immodules file read /usr/lib/enchant/libenchant_hspell.so file read /usr/lib/enchant/libenchant_aspell.so file read /usr/lib/enchant/libenchant_myspell.so file read /usr/lib/enchant/libenchant_ispell.so file read /usr/lib/x86_64-linux-gnu/gconv/KOI8-R.so file read /usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.so file read /usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-ico.so file read /etc/host.conf file read /etc/resolv.conf file read /etc/hosts file ioctl socket:[family=2:type=2:protocol=17] 0x541B file read /etc/gai.conf file read /usr/lib/x86_64-linux-gnu/gio/modules/libgioremote-volume-monitor.so file ioctl anon_inode:inotify 0x541B file read /etc/gnome/defaults.list file read /usr/lib/libreoffice/share/\{\*\}/\* file read/write/append/unlink/truncate /home/home/\{\*\}/\* file read/write/append/unlink/truncate /home/home/\* file create/chmod /home/home/\* 0-0666 file create/chmod /home/home/\{\*\}/\* 0-0666 file rename /home/home/\* /home/home/\* file rename /home/home/\{\*\}/\* /home/home/\{\*\}/\* file rename /home/\{\*\}/\* /home/home/\{\*\}/\* file read /etc/fonts/\{\*\}/\* file read /usr/share/\{\*\}/\* file read /var/cache/\{\*\}/\* network inet stream connect 0.0.0.0-255.255.255.255 80-443 network inet dgram send 192.168.1.1 53
Затем сохраним политику исключений.
tomoyo-savepolicy -e > /etc/tomoyo/exception_policy.conf
После этого, по желанию, можно провести доводку в любом файловом редакторе.
Например добавить глобальную файловую группу с распространенными путями в exception_policy.conf
path_group Midoi_Allow /home/\*/midory/\{\*\}/\* path_group Midoi_Allow /home/\*/.config/midori/\{\*\}/\* path_group Midoi_Allow /home/home/.config/midori/\*
И прописать ее в domain_policy.conf, еще больше упростив конфиг.
file read/write/append/unlink/truncate @Midoi_Allow
В случае такой ручной правки, обязательно проверяем конфиги на ошибки, ведь обычный редактор не учитывает синтаксис Tomoyo.
tomoyo-checkpolicy d < /etc/tomoyo/domain_policy.conf tomoyo-checkpolicy e < /etc/tomoyo/exception_policy.conf
Может случиться так, что приложение будет периодически падать или глючить из-за редких вызовов каких-то разрешений, которых не было в режиме обучения.
Тогда запускаем программу логирования запретов tomoyo-auditd и как только приложение глюкнуло, идем в /var/log/tomoyo и смотрим на что сработал запрет.
Примеры политик для некоторых программ
wiki.archlinux.org/index.php/skype#TOMOYO
wiki.archlinux.org/index.php/Adobe_Reader
Пишем глобальные правила.
В Tomoyo можно реализовывать глобальные правила, применяющиеся для всех доменов.
Давайте сделаем глобальную политику запрета запуска программ из /home и /tmp для всех пользователей кроме учетной записи root.
Для отдельных программ установим более жесткие политики.
Создаем новый профиль с контролем только выполнения файлов.
4-PREFERENCE={ max_audit_log=1024 max_learning_entry=2048 }
4-CONFIG={ mode=disabled grant_log=yes reject_log=yes }
4-CONFIG::file::execute={ mode=enforcing grant_log=no reject_log=yes }
Добавляем в исключения следующие строчки.
path_group ALLOW_EXEC /\* path_group ALLOW_EXEC /bin/\{\*\}/\* path_group ALLOW_EXEC /etc/\{\*\}/\* path_group ALLOW_EXEC /lib/\{\*\}/\* path_group ALLOW_EXEC /lib64/\{\*\}/\* path_group ALLOW_EXEC /sbin/\{\*\}/\* path_group ALLOW_EXEC /sys/\{\*\}/\* path_group ALLOW_EXEC /proc/\{\*\}/\* path_group ALLOW_EXEC /boot/\{\*\}/\* path_group ALLOW_EXEC /dev/\{\*\}/\* path_group ALLOW_EXEC /usr/\{\*\}/\*\-medit\-midori path_group ALLOW_EXEC /run/\{\*\}/\* path_group ALLOW_EXEC /bin/\* path_group ALLOW_EXEC /etc/\* path_group ALLOW_EXEC /lib/\* path_group ALLOW_EXEC /lib64/\* path_group ALLOW_EXEC /sbin/\* path_group ALLOW_EXEC /sys/\* path_group ALLOW_EXEC /proc/\* path_group ALLOW_EXEC /boot/\* path_group ALLOW_EXEC /dev/\* path_group ALLOW_EXEC /usr/\* path_group ALLOW_EXEC /run/\* path_group ALLOW_EXEC_ROOT /home/\{\*\}/\* path_group ALLOW_EXEC_ROOT /opt/\{\*\}/\* path_group ALLOW_EXEC_ROOT /tmp/\{\*\}/\* path_group ALLOW_EXEC_ROOT /var/\{\*\}/\* path_group ALLOW_EXEC_ROOT /mnt/\{\*\}/\* path_group ALLOW_EXEC_ROOT /media/\{\*\}/\* path_group ALLOW_EXEC_ROOT /home/\* path_group ALLOW_EXEC_ROOT /opt/\* path_group ALLOW_EXEC_ROOT /tmp/\* path_group ALLOW_EXEC_ROOT /var/\* path_group ALLOW_EXEC_ROOT /mnt/\* path_group ALLOW_EXEC_ROOT /media/\* keep_domain any from <kernel> initialize_domain /usr/bin/midori from any
Правим политику домена
<kernel> use_profile 4 use_group 0 file execute @ALLOW_EXEC file execute @ALLOW_EXEC_ROOT task.uid=0 file execute /usr/bin/medit file execute /usr/bin/midori <kernel> /usr/bin/midori use_profile 3 use_group 0
Разбор полетов.
1.
Для чего сначала пришлось удалять midori из регулярки \-midori, а потом явно указывать снова через file execute /usr/bin/medit?
Все дело в логике Tomoyo. Когда система разбирает заданные правила, она учитывает как помечается каждый домен в конфиге и требует его указания в явном виде. Это свойство работает только для команд связанных с переходами между доменами, но не с запрещающими правилами.
Поэтому команда initialize_domain /usr/bin/midori from any при переходе в домен medit, отработает только если она указана в явном виде в родительском домене <kernel>
.
2.
file execute @ALLOW_EXEC_ROOT task.uid=0
Тут мы ставим условие на контроль, которое определяет, что только суперпользователь имеет право выполнять программы из заданных директорий.
Подробнее об условиях.
tomoyo.sourceforge.jp/2.5/chapter-10.html.en
3.
keep_domain any from <kernel>
Опция управления доменами в Исключениях. Принудительно оставляет все созданные дочерние процессы в рамках одного домена.
initialize_domain /usr/bin/midori from any
Помимо включения опции независимого запуска, принудительно выводит процесс в отдельные домен. То есть выходит процесс из под ограничения keep_domain.
4.
4-CONFIG::file::execute={ mode=enforcing grant_log=no reject_log=yes }
Настраиваем профиль только на контроль выполнения файлов. Командой use_profile 4, применяем данный профиль к политике.
Подробнее о возможных состояния профиля.
tomoyo.sourceforge.jp/2.5/chapter-9.html.en
Итог
Tomoyo позволяет несколькими простыми шагами, поднять безопасность системы в целом.
Можно распространить конфигурацию по сети и защитить таким образом целые сегменты.
ps. Для интересующихся темой mac. Один из разработчиков Tomoyo, продемонстрировал еще один инструмент принудительного контроля — caitsith.sourceforge.jp/
ссылка на оригинал статьи http://habrahabr.ru/post/224335/
Добавить комментарий