Apparmor и TOMOYO с точки зрения удобства
Попробовал вчера настроить первое, понравилось. имхо, спроектированно намного грамотнее, чем томойо. Для человеков, так сказать. Начиная с того, что не требует настройки абсолютно всего, и заканчивая удобными профилями, в разных файлах с инклюдами. В томойо за 2 года как был один общий профиль на всех, так сейчас стало можно настроить несколько, но подключить можно всё равно, сцуко, один. Дублирование записей для каждого разрешения тоже порядком бесит.
А именно:
Полные права на один файл:
# tomoyo:
allow_read /path/to/file
allow_write /path/to/file
allow_truncate /path/to/file
allow_unlink /path/to/file
# apparmor:
/path/to/file rw
Полные права на директорию и файлы в ней
tomoyo:
allow_mkdir /path/to/dir/
allow_rmdir /path/to/dir/
allow_mkdir /path/to/dir/\{\*\}/
allow_rmdir /path/to/dir/\{\*\}/
allow_read /path/to/dir/\*
allow_write /path/to/dir/\*
allow_truncate /path/to/dir/\*
allow_unlink /path/to/dir/\*
allow_read /path/to/dir/\{\*\}/\*
allow_write /path/to/dir/\{\*\}/\*
allow_truncate /path/to/dir/\{\*\}/\*
allow_unlink /path/to/dir/\{\*\}/\*
# apparmor:
/path/to/dir/ rw,
/path/to/dir/** rw,
Как говорится, комментарии излишни. Кроме того, в apparmor'e этот набор можно описать одиножды и потом включать его одной строчкой. В tomoyo придётся либо дублировать его для каждого приложения, либо дублировать на уровне профиля.
Ещё попугаю:
squid, без учёта вышестоящих уровней и глобальных правил:
# tomoyo:
<kernel> /usr/sbin/squid use_profile 3
allow_create /var/cache/squid/\*/\*/\* 0640
allow_read/write /var/cache/squid/\*/\*/\*
allow_unlink /var/cache/squid/\*/\*/\*
allow_truncate /var/cache/squid/\*/\*/\*
allow_read /etc/squid/squid.conf
allow_read /etc/nsswitch.conf
allow_read /etc/passwd
allow_read /etc/group
allow_read /dev/urandom
allow_read/write /var/run/squid.pid
allow_unlink /var/run/squid.pid
allow_truncate /var/run/squid.pid
allow_create /var/cache/squid/swap.state.clean 0640
allow_chmod /var/cache/squid/swap.state.clean 0640
allow_write /var/cache/squid/swap.state.clean
allow_write /var/cache/squid/swap.state.last-clean
allow_unlink /var/cache/squid/swap.state.last-clean
allow_rename /var/cache/squid/swap.state.clean /var/cache/squid/swap.state
allow_create /var/cache/squid/swap.state.last-clean 0640
allow_read/write /dev/tty
allow_read/write /dev/null
allow_execute /usr/sbin/squid
allow_read /etc/hosts
allow_read /etc/resolv.conf
allow_execute /usr/lib/squid/pam_auth
allow_execute /usr/lib/squid/unlinkd
allow_read/write /var/cache/squid/swap.state
allow_create /var/cache/squid/swap.state.new 0640
allow_write /var/cache/squid/swap.state.new
allow_unlink /var/cache/squid/swap.state.new
allow_truncate /var/cache/squid/swap.state.new
allow_read /proc/\$/mounts
allow_read /etc/squid/mime.conf
allow_read /etc/services
allow_create /var/run/squid.pid 0644
allow_rename /var/cache/squid/swap.state.new /var/cache/squid/swap.state
allow_read /usr/share/squid/errors/Russian-utf8-custom/ERR_\*
allow_read /usr/share/squid/icons/\*.gif
allow_execute /usr/lib/squid/mysql_auth
allow_rename /var/log/squid/\*.log.\$ /var/log/squid/\*.log.\$
allow_rename /var/log/squid/\*.log /var/log/squid/\*.log.\$
allow_read/write /var/log/squid/\*.log
allow_create /var/log/squid/\*.log 0640
allow_create /var/cache/squid/core 0600
allow_read/write /var/cache/squid/core
allow_execute /usr/lib/squid/squid_ldap_auth
allow_execute /usr/lib/squid/squid_ldap_group
allow_read /etc/squid/errorpage.css
allow_create /var/cache/squid/swap.state.new 0644
allow_create /var/cache/squid/\*/\*/\* 0644
allow_read /usr/share/squid/errors/templates/ERR_\*
allow_create /var/log/squid/cache.log 0666
allow_create /var/cache/squid/swap.state.clean 0644
allow_create /var/cache/squid/swap.state.last-clean 0644
allow_create /var/log/squid/access.log 0644 </code>
vs
# apparmor:
#include <tunables/global>
/usr/sbin/squid3 flags=(complain) {
#include <abstractions/base>
#include <abstractions/consoles>
#include <abstractions/nameservice>
capability setgid,
capability setuid,
/etc/squid3/* r,
/proc/sys/kernel/ngroups_max r,
/run/squid3.pid rw,
/usr/lib/squid3/unlinkd rix,
/usr/sbin/squid3 mrix,
/usr/share/squid-langpack/** r,
/usr/share/squid3/** r,
/var/log/squid3/* w,
/var/log/squid3/cache.log rw,
/var/spool/squid3/** rw,
}
Однако, вещей подобных тонкой настройке chown'а, chmod'а, link()'а в apparmor'e нет.
Кроме того, разнится сам подход к организации безопасности. В TOMOYO он строится на защите системы "с нуля", начиная с init'а и по цепочке exec()'ов - до самого приложения. Apparmor же - это легковесная "песочница" для приложения. В отличие от того же chroot'а - работает прозрачно для файловой системы, никаких отдельно застроенных директорий в /opt и проблем с их обновлением.