Использование Tomoyo Linux
Заблокировать подозрительное поведение программы? Смягчить последствия от эксплуатации уязвимостей? Заблокировать выполнение несанкционированного кода? TOMOYO Linux — реализация мандатного управления доступом для операционной системы Linux. Встроена в ядро по умолчанию. Позволяет взять под контроль поведение системы и жестко ограничить в рамках заданной политики.
Ниже будет описано создание политик, как на отдельные приложения, так и на всю систему в целом.Примеры будут построены на базе Debian Wheezy и Tomoyo 2.5 имеющейся в ядре.
Основы1. Домены.Tomoyo в своей работе руководствуется таким понятием, как Домены. Домены это процессы и взаимосвязь между процессами domain transition.
Базовый домен это всегда
Возьмем к примеру процесс /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 — режим разрешения, по сути тоже что и 03 — режим запрета, запрещено все, что не определено политикой конкретного домена.
Вот так выглядят профили в редакторе 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 — проверяет сохраненные политики на ошибки.
Это не все утилиты, далее будет еще несколько примеров.
Подробнее о внутреннем устройстве 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
Подробнее об управлениями доменами в Исключениях.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 '
tomoyo-savepolicy -d
выводит всю кучу доменов.
tomoyo-selectpolicy -r '
/etc/tomoyo/domain_policy.conf
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
/etc/tomoyo/domain_policy.conf
file execute @ALLOW_EXEC file execute @ALLOW_EXEC_ROOT task.uid=0 file execute /usr/bin/medit file execute /usr/bin/midori
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
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/