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

27bcfc5631c8886a6f19f7925f196e94.pngЗаблокировать подозрительное поведение программы? Смягчить последствия от эксплуатации уязвимостей? Заблокировать выполнение несанкционированного кода? TOMOYO Linux — реализация мандатного управления доступом для операционной системы Linux. Встроена в ядро по умолчанию. Позволяет взять под контроль поведение системы и жестко ограничить в рамках заданной политики.

Ниже будет описано создание политик, как на отдельные приложения, так и на всю систему в целом.Примеры будут построены на базе Debian Wheezy и Tomoyo 2.5 имеющейся в ядре.

Основы1. Домены.Tomoyo в своей работе руководствуется таким понятием, как Домены. Домены это процессы и взаимосвязь между процессами domain transition.

Базовый домен это всегда О него разрастаются все остальные.

 — домен /sbin/init — домен /sbin/init /etc/rc.d/rc — еще домен /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

9b56710deef6a76cdbbd0c6879de1d49.png

Редактор полностью управляется с клавиатуры. Вот так выглядит главное меню.

926d25234c57d4d7a0505d210b465c7d.png

Для вывода главного меню нужно нажать W, для переключения к списку доменов D (w & d).

2. Политики

Политики содержат различные контроли поведения доменов. Операции записи, чтения, выхода в сеть, создания дочерних процессов. В общем стандартные вещи.

file execute /bin/ls — разрешение запуска ls Помимо этого, каждый контроль можно обвешивать условиями его срабатывания.

file execute /bin/ls task.uid=0 — разрешение запуска ls только суперпользователю. 3. Профили.Поведение каждого домена, помимо политик, определяется наложенным на него профилем.

Существует 4 базовых профиля.0 — политики отключены, домен свободен от ограничений.1 — режим обучения, все действия разрешаются и дописываются в политику конкретного домена.2 — режим разрешения, по сути тоже что и 03 — режим запрета, запрещено все, что не определено политикой конкретного домена.

Вот так выглядят профили в редакторе tomoyo-editpolicy (w & p)

832ac434a24b736a8b739ff603627bb4.png

Стандартная цель для усиления безопасности — составить политику для домена и наложить профиль 3

4. Исключения.Поведение доменов, так-же определяется с помощью Исключений. Исключения действуют глобально. Могут применяться ко всем доменам сразу. В политику исключений так-же прописывают различные, часто вызываемые переменные. Исключения используют для упрощения создания политик и улучшения читаемости конфигов.

Вот так выглядят исключения в редакторе tomoyo-editpolicy (w & e)

c11d2d8a13eedad7bc8db5cb7d501941.png

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 — проверяет сохраненные политики на ошибки.

Это не все утилиты, далее будет еще несколько примеров.

Подробнее о внутреннем устройстве Tomoyotomoyo.sourceforge.jp/2.5/chapter-4.html.en

Подробнее об утилитахtomoyo.sourceforge.jp/2.5/man-pages/index.html.en

Включение Tomoyo. 1. Правим GRUB /etc/default/grubGRUB_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 d2e1ddd3a6d702f9f29390695ec6a750.png

Подробнее об управлениями доменами в Исключениях.tomoyo.sourceforge.jp/2.5/chapter-5.html.en

После этого возвращаемся в окно Domain Transition Editor (w & d)

И находим наш домен /usr/bin/midori с пометкой *

Нажав S переводим домен в режим обучения, выставив ему 1.

c0e91e0f2961a00acf12d64db967dbaa.png

Запускаем midori и работаем в нем пару минут, совершая штатные операции. Посетим пару сайтов, сохраним страничку, покопаемся в настройках и тд.Закроем midori.

В окне Domain Transition Editor нажимаем Enter на домене и попадаем в редактор политик Domain Policy Editor, видим все операции которые совершал midori в своей работе.

c31201c895ed3eca0b8153a4e4614257.png

Основная работа будет проходить в этом окне.

Нажимая клавишу @ можно сортировать данные на экране в различных сочетаниях. По пути файлов или по выполняемой операции.

По сути это уже готовый конфиг. Теперь надо упростить его используя регулярные выражения.

В качестве примера используем типичные операции работы программы со своими настройками.

ac021bc671e3b92cb1ac90cdd412f764.png

Разрешим некоторые операции для файлов по пути /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

Давайте теперь посмотрим на операции с сетью.

a8d72090ac67277f1b965c9d0dbbfb58.png

Создадим правило разрешающее посещение любого сайта в интернете, с использованием определенных портов.

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

5287e03a1fd85d06509b823a355ed6db.png

Попробуем удалить это разрешение и протестировать результат.

Нажимаем D, удалив таким образом разрешение.Затем возвращаемся в Domain Transition Editor (w & d), нажимаем S и меняем профиль обучения 1 на профиль запрета 3.Пробуем запустить.Приложение работает? Значит так тому и быть. Приложение не работает? Значит стоит задуматься о доверии к такому приложению.

После всех манипуляций по причесыванию конфига сохраним его.

tomoyo-savepolicy -d | tomoyo-selectpolicy -r ' /usr/bin/midori' >> /etc/tomoyo/domain_policy.conf Пояснение:

tomoyo-savepolicy -d выводит всю кучу доменов. tomoyo-selectpolicy -r ' /usr/bin/midori' выбирает только нужный домен, с нужной политикой. >> /etc/tomoyo/domain_policy.conf сохраняем политику домена.Что в итоге получилось в политике для midori

/etc/tomoyo/domain_policy.conf /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] 0×541B file read /etc/gai.conf file read /usr/lib/x86_64-linux-gnu/gio/modules/libgioremote-volume-monitor.so file ioctl anon_inode: inotify 0×541B 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#TOMOYOwiki.archlinux.org/index.php/Adobe_Reader

Пишем глобальные правила. В Tomoyo можно реализовывать глобальные правила, применяющиеся для всех доменов.

Давайте сделаем глобальную политику запрета запуска программ из /home и /tmp для всех пользователей кроме учетной записи root.Для отдельных программ установим более жесткие политики.

Создаем новый профиль с контролем только выполнения файлов.

/etc/tomoyo/profile.conf 4-COMMENT=-----Enforcing file: execute only-----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 }

Добавляем в исключения следующие строчки.

/etc/tomoyo/exception_policy.conf 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 initialize_domain /usr/bin/midori from any Правим политику домена

/etc/tomoyo/domain_policy.conf 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

/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, отработает только если она указана в явном виде в родительском домене .

2.

file execute @ALLOW_EXEC_ROOT task.uid=0 Тут мы ставим условие на контроль, которое определяет, что только суперпользователь имеет право выполнять программы из заданных директорий.Подробнее об условиях.tomoyo.sourceforge.jp/2.5/chapter-10.html.en

3.

keep_domain any from Опция управления доменами в Исключениях. Принудительно оставляет все созданные дочерние процессы в рамках одного домена. 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/

© Habrahabr.ru