Сравнение популярных расширений безопасности для ОС Linux

Юрий «bober» Раззоренов

Unix, родившийся практически вместе с первыми компьютерами, использовал очень простой механизм безопасности (ugo), который гуру семидесятых посчитали более чем достаточным. Но в современной системе, где крутятся десятки демонов и программ, запущенных из-под разных учеток, грамотно разрулить все права старыми инструментами уже не получается. А делать что-то нужно.

Дискреционный и мандатный контроль доступа

Для начала отвлечемся и поразмышляем о том, что есть и зачем нужно еще что-то прикручивать. Одна из задач любой ОС — обеспечить разделение информации, основываясь, в первую очередь, на требованиях конфиденциальности и целостности. Традиционная модель Unix оперирует тремя параметрами — пользователь, группа-пользователь и остальные. Называется она дискреционной (Discretionary Access Control — DAC), то есть добровольной моделью доступа. Пользователь сам определяет права доступа к своим файлам, а выполняющиеся программы имеют те же права, что и запустивший их пользователь. Механизм DAC опирается в своей работе только на тождество пользователя, игнорируя другую информацию, например, о роли пользователя в системе, функции и уровне доверия конкретной программы и необходимости в целостности данных. Каждая учетная запись имеет полную свободу действий в пределах своих полномочий.

Как ты понимаешь, развернуться с DAC особенно негде: все или ничего; винда — и та дает больше возможностей по настройке доступа к объектам. Поэтому сегодня для Linux доступны решения, базирующиеся на совершенно другой модели защиты — MAC (Mandatory Access Control, принудительный контроль доступа). Они позволяют определить политики безопасности над всеми процессами и объектами, решение о доступе принимается на основе большего количества информации об объекте, а не только основываясь на тождестве пользователя. Причем MAC не отменяет, а дополняет DAC, так как сначала проверяются права Unix, и, если они запрещают доступ, то дальнейшая проверка просто не производится. Проверка прав выполняется только в том случае, если стандартные права Unix разрешают доступ к объекту. Любой объект помещается в некую виртуальную песочницу, которая позволяет приложению выполнять только строго регламентированные задачи. Причем при описании доступа к объекту конкретные реализации могут придерживаться разных принципов: очень строгие правила по типу "что не разрешено явно — запрещено" и "минимально необходимые привилегии".

Например, можно настроить систему так, что веб-сервер будет слушать соединения на строго определенном порту, сможет читать файлы только в указанном каталоге и так далее. То есть описать поведение системы в ее нормальном состоянии, создав жесткий каркас, за который нельзя будет выскочить. Это позволяет выполнять программы с правами обычного пользователя, а доступ к необходимым ресурсам указывать при помощи политик.

В дистрибутивах Linux используются два решения: SELinux в RedHat и клонах, а также AppArmor в Ubuntu. В ядре версии 2.6.30 появился код еще одного проекта — TOMOYO Linux, которому пророчат светлое будущее, но пока по умолчанию он нигде не используется. Давай рассмотрим их особенности, а также плюсы и минусы.

Сверхзащищенный SELinux

Проект SELinux (Security Enhanced Linux, selinuxproject.org) зародился в недрах U.S. NSA (National Security Agency), хмурые неразговорчивые дядьки которого поставили своей целью допилить Linux таким образом, чтобы его можно было спокойно использовать не где-нибудь, а в правительственных системах. Анонсирован общественности в 2000 году, затем разработчики справедливо решили: зачем что-то делать самим, если в интернете есть много желающих? В результате сегодня проект развивается под лицензией GNU GPL и уже включен в состав ядра ветки 2.6.х, также выполнена адаптация для FreeBSD и OpenSolaris.

Реализация MAC требует четкого описания правил, что может привести к образованию большого их количества. Поэтому в SELinux использована концепция роль-основанного контроля доступа Role-Based Access Control (RBAC), в которой определяются роли и доступ пользователей. Механизм защиты в SELinux носит название Type Enforcement (TE) и позволяет закрепить за каждым процессом и файлом, которые необходимо контролировать, некую метку. Если процесс, запущенный от имени администратора, скомпрометирован, то ущерб, который может быть причинен системе, ограничен только тем, к чему он может обращаться, согласуясь с установленными для него правилами (а они описывают поведение очень тонко).

Также в SELinux реализована многоуровневая система обеспечения безопасности (MLS, Multi-Level Security model), но ее задействуют только в особых случаях, например, в правительственных многопользовательских системах, требующих чрезвычайно высокого уровня защиты.

Когда в процессе работы системы субъект пытается оказать некое действие на объект, SELinux принимает решение о допустимости указанного действия, основываясь на контекстах безопасности объекта и субъекта. Субъект — это процессы, выполняемые от имени запустившего их пользователя. Объект — элементы файловой системы (файлы, каталоги, ссылки, сокеты и пр.) или другие процессы, над которыми выполняются действия. И теперь самое важное, что отличает SELinux от других решений, описанных далее — все важные защитные атрибуты сохраняются в контекстах безопасности. Поэтому файловая система должна уметь хранить дополнительные атрибуты, и сами атрибуты нужно как-то задать. Современные ядра все обеспечивают, но при самостоятельной пересборке ядра не забудь активировать параметр "Extended attributes" в выбранной файловой системе.

Атрибуты устанавливаются при инициализации системы. Отсюда делаем вывод, что объект уже должен существовать на момент установки атрибутов. Сам атрибут включает идентификатор владельца, роль и тип объекта. Причем идентификатор SELinux (создается командой semanage), хотя и может совпадать в номере с UID пользователя Linux (uid), но это две разные вещи. Не забываем еще об одном важном отличии — SELinux оперирует ролями, поэтому несколько учетных записей Linux могут иметь одну и ту же учетную запись SELinux. И главное — выполнение команды

Проверить это легко:

$ id –Z

user_u:user_t:unconfined_t

Получаем привилегии суперпользователя и проверяем снова:

$ su

# id –Z

user_u:user_t:unconfined_t

Если зайти сразу под рутом, то роль другая:

# id -Z

root:system_r:unconfined_t:SystemLow-SystemHigh

Изменить роль можно при помощи команды newrole. При использовании SELinux штатные команды выводят и контекст. Чтобы просмотреть контекст файлов и процессов, набираем:

# ls -l –context /

# ps -ax -Z

Кроме того, контекст можно считать прямо из /proc:

# ps aux | grep syslogd

root 2729 0.0 0.0 5908 624 ? Ss 07:30 0:00 syslogd -m 0

# cat /proc/2729/attr/current

system_u:system_r:syslogd_t:s0

Предусмотрена работа SELinux в трех режимах — disable (отключен), enforcing (политики выполняются, все, что не соответствует — блокируется), permissive (политики анализируются, все нарушения заносятся в журнал "avc: denied", но блокировки не производятся). Узнать текущий режим просто, как, впрочем, и некоторые другие настройки, достаточно прочитать данные из псевдофайловой системы /selinux:

$ cat /selinux/enforce

Если получим 1, значит, SELinux активирован. Чтобы изменить режим работы на лету, просто записываем в этот файл 0 или 1:

# echo 0 > /selinux/enforce

Также можно воспользоваться утилитой "setenforce [ Enforcing | Permissive | 1 | 0 ]".

Собственно настройки производятся в конфигурационных файлах, размещенных в каталоге /etc. В дистрибутивах, базирующихся на RedHat, доступен графический SELinux Administration Tool (system-configselinux, пакет policycoreutils-gui). Так, режим работы устанавливается в файле /etc/sysconfig/selinux (на самом деле это ссылка на /etc/selinux/config). В частности, режим работы определяет параметр SELINUX:

SELINUX=enforcing|permissive|disabled

По умолчанию в большинстве дистрибутивов SELinux защищает не все демоны, а только строго определенные: dhcpd, httpd, named, nscd, ntpd, portmap, snmpd, squid и syslogd. Для остальных политика не определена — unconfined_t. Чтобы защитить всю систему, необходимо изменить значение SELINUXTYPE на strict:

SELINUXTYPE=targeted|strict

В каталоге /etc/selinux/targeted/contexts находим описание контекстов.

Например, для root контекст описывается так:

# cat /etc/selinux/targeted/contexts/users/root

system_r:unconfined_t:s0 system_r:unconfined_t:s0

system_r:initrc_t:s0 system_r:unconfined_t:s0

Чтобы просмотреть все контексты, связанные с httpd, введи такую команду:

# grep -iR httpd /etc/selinux/targeted/contexts

Ты увидишь, что для разных ситуаций контекст будет отличаться. Теперь получим список всех параметров SELinux: "getsebool -a". Для установки используй команду setsebool (с ключом '-P' для сохранения значения после перезагрузки) или графическую утилиту system-configsecuritylevel. Вывод "sestatus -v" покажет все текущие установки. Не забываем и о журналах:

# dmesg | grep -i selinux

SELinux: Initializing.

SELinux: Starting in permissive mode

# grep -iR selinux /var/log/messages

Все вспомогательные утилиты SELinux собраны в нескольких пакетах: setools или policycoreutils, policycoreutils-newrole. Первый, как правило, уже установлен в системе, остальных нет. Например, newrole, дающая возможность пользователю сменить роль, доступна именно в policycoreutils. После установки в системе присутствуют только наборы политик для targened, остальные наборы политик скачиваются в пакетах selinux-policy*. Сорцы политик для их самостоятельной сборки вынесены в selinux-policy-devel.

Разобраться в более чем 200 файлах, имеющих несколько тысяч строк, врукопашную очень трудно. Автоматизировать эту задачу призван питоновый скрипт audit2allow (в policycoreutils), он генерирует новые политики на основе анализа журналов и блокировок SELinux.

--------------------------------------------------------

Проекты LIDS, GRSecurity и RSBAC

Кроме проектов, описанных в статье, в настоящее время развиваются и другие, позволяющие повысить защиту Linux-систем — LIDS (Linux Intrusion Detection System), GRSecurity и RSBAC (Rule Set Based Access Control). Кратко о них.

Проект LIDS реализует MAC, админ может четко указать разрешения для файлов и каталогов. Помимо этого механизмы TPE (Trusted Path Execution) и TDE (Trusted Domain Enforcement) позволяют убедиться, что программа работает так, как предназначено. Сайт проекта некоторое время был заброшен, хотя инструменты развиваются. Управление производится при помощи утилит и чем-то напоминает настройку правил файера.

# lidsconf -A -o /sbin -j READONLY

GRSecurity — разработка, охватывающая несколько технологий укрепления безопасности — MAC/ACL, улучшенный chroot, рандомизация TCP ISN и PID, ролевая система контроля доступа RBAC, функции аудита, защита адресного пространства и стека PaX (доступен и отдельно). Большинство параметров указывается на этапе сборки ядра, затем при помощи утилиты gradm настраиваются ACL.

Проект RSBAC, реализующий мандатный и ролевой механизмы доступа, уже в 2000 году вовсю использовался в защищенных дистрибутивах. По сути, это среда, позволяющая создать различные модели доступа. Идея основана на публикации Маршала Абрамса и Ла Падула "Обобщенная среда для управления доступом" (GFAC, Generalized Framework for Access Control). Кроме root в ОС появляется учетка администратора безопасности, который и управляет доступом к информации. Реализовано много интересных функций: отключение Linux DAC, сокрытие процессов, JAIL, поддержка PaX, антивирусный интерфейс Dazuko, контроль ресурсов Linux и многое другое. Например, можно организовать доступ к файлу в определенные часы.

--------------------------------------------------------

AppArmor

Технология Application Armor изначально разработана Immunix Inc. После того, как софтверный гигант Novell приобрел эту компанию, код открыли под лицензией GNU GPL, а затем включили в состав openSUSE. Позднее AppArmor стал доступен и в других дистрибутивах. Но когда команда Immunix покинула Novell, дальнейшее развитие проекта остановилось. И хотя в том же openSUSE поддержка AppArmor была сохранена, в дистрибутив интегрировали SELinux. В итоге начали разноситься слухи а-ля "AppArmor is dead", что у одних вызвало радость, так как теперь все усилия можно бросить на развитие одной системы защиты, у других критику — отсутствие конкуренции еще ни к чему хорошему не приводило. Сегодня апологетом этой технологии является Canonical, разработчики которого не смотря ни на что продолжают развитие AppArmor. Так, в последних версиях добавлен механизм кэширования правил, что позволило ускорить их загрузку. Для этих же целей, и чтобы защитить сетевые сервисы на раннем этапе загрузки, часть профилей вынесли в initramfs. И главное — в Ubuntu AppArmor прикрутили к LSM (Linux Security Modules), задействовав security_path вместо vfs.

Основная идея AppArmor состоит в том, что система защиты не должна быть сложной и не должна мешать. В отличие от SELinux, AppArmor не использует расширенные атрибуты и не зависит от файловой системы. Доступ к ресурсам определяется на основе профилей (profiles), которые привязаны к пути файла или каталога, причем самого файла может и не быть на момент активации профиля. Профиль разрабатывается индивидуально под каждое приложение. Хотя в этом есть и недостаток: при переносе файла в SELinux за ним полностью сохраняется контекст безопасности, в AppArmor — нет, но этого от него и не требовали. Хотя, если файл имеет два имени, и профиль блокирует доступ к одному из них, есть возможность работать с другим. Это следует учитывать. Также, если средствами SELinux можно предусмотреть несколько уровней доступа к объекту для разных субъектов, то AppArmor этого не умеет. В настоящее время созданы профили для большинства популярных серверов и приложений, поэтому наличие активного AppArmor обычно незаметно, он не создает проблем. Кроме того, в комплекте поставки идут два скрипта aa-genprof и aa-logprof, которые помогут быстро создать профиль для новой программы. Управление AppArmor производится при помощи init-скрипта, который запускает модуль ядра, инициализирует профили и монтирует псевдофайловую систему securityfs.

$ sudo /etc/init.d/apparmor start

Чтобы просмотреть список загруженных профилей, достаточно считать файл /sys/kernel/security/apparmor/profiles (или запустить /etc/init.d/apparmor status); в зависимости от варианта дистрибутива Server/Desktop количество активных профилей будет различно. Сами профили хранятся в файлах (отдельно для каждого приложения) в каталоге /etc/apparmor.d и внутри содержат описание каталогов и отдельных файлов, с указанием прав доступа. Также указывается работа в сети и совместимость с другими профилями. Для упрощения задачи используются регулярные выражения. По умолчанию профили AppArmor работают в принудительном enforce-режиме. Когда сервис не может выйти за рамки установок, все попытки блокируются и фиксируются в журнале. При необходимости его можно перевести в щадящий режим complain, когда нарушения лишь фиксируются. Причем, в отличие от SELinux, где режим обучения активируется глобально, в AppArmor его можно включить для отдельного профиля. Перевести профиль в щадящий режим можно тремя способами:
указать в файле профиля flags=(complain);
использовать команду complain название_программы (вернуть командой enforce);
или глобально командой "echo 1 > /sys/kernel/security/apparmor/control/complain".

А еще профили отключаются на лету, перегружаются, в общем, полная свобода действий. Собственно, простота и привлекает в AppArmor админов, разработчиков и простых пользователей.

Дополнительные профили можно найти в репозитории дистрибутива (apt-cache search apparmor), кроме того, есть онлайн-банк профилей — apparmor.opensuse.org.

К слову, для ядер 2.4/2.6 существовала разработка Trustees, реализующая ACL a-ля Novell Netware, которая в удобной форме расписывала доступ к каталогам вплоть до указания отдельных групп и пользователей и не зависела от файловой системы. К сожалению, проект заглох, а это была бы золотая середина между SELinux и AppArmor.

--------------------------------------------------------

Сбиваем спесь со Skype

Наверное, больше всего претензий с точки зрения безопасности у пользователя вызывает Skype. Куда только не лезет эта прога (см. статью Криса "Skype: скрытая угроза"). Описываемые технологии как раз и позволяют обезопасить себя. Забегая вперед, скажу, что пользователи уже давно нагенерировали профили для большинства популярных прог, и скайп здесь не исключение. Смотри, например, здесь: www.cynapses.org/tmp/apparmor/usr.bin.skype. Некоторые профили собраны в отдельном пакете — apparmor-profiles. Но профиль легко создать и самому. Для этого в комплекте идет утилита aa-genprof (или просто genprof). Запускаем ее с указанием исполняемого файла в качестве параметра:

$ sudo aa-genprof /usr/bin/skype

Далее работаем как обычно: звоним, отсылаем сообщения, принимаем файлы, добавляем и удаляем учетки. По окончании прерываем работу в каталоге /etc/apparmor.d/usr.bin.skype. Затем перезапускаем AppArmor или просто активируем профиль в enforce-режиме:

$ sudo aa-enforce skype

Все проблемы и замечания по работе профилей AppArmor ищи в логах.

--------------------------------------------------------

TOMOYO Linux

Проект TOMOYO Linux начат в 2003 году японской компанией NTT DATA CORPORATION как легкая реализация MAC для Linuх-ядра. Через два года лицензию изменили на GNU GPL и выложили код на SF.net. Некоторое время проект предоставлял патчи и готовые сборки ядер для разных дистрибутивов. Но начиная с версии ядра 2.6.30, код TOMOYO Linux включен в основную ветку разработки, что уже само по себе — Событие для любого подобного проекта.

В настоящее время существует две версии TOMOYO Linux. Первая версия использует оригинальные хуки, она доступна только в виде патчей и может использоваться в ядрах 2.4 и 2.6. Вторая (которая уже в ядре) адаптирована под LSM, но по функциональным возможностям уступает версии 1.х: нет поддержки сетевых функций, обработки атрибутов, POSIX-возможностей (на сайте представлена сравнительная таблица). В настоящее время соответствующие пакеты имеются в репозиториях многих дистрибутивов, но фактически поддержка заявлена пока только в Mandriva. К слову, в этом дистрибутиве предлагается и графический интерфейс Tomoyo GUI, позволяющий запустить и настроить политики приложений. Доступность в репозиториях пакетов для большинства дистрибутивов позволяет буквально в считанные минуты перевести ОС на новую систему безопасности. Например, Ubuntu 10.04:

$ sudo echo 'deb http://osdn.dl.sourceforge.jp/tomoyo/47128/ ./' >> /etc/apt/sources.list

$ sudo apt-get update

$ sudo apt-get install linux-ccs ccs-tools

Если ядро собирается самостоятельно, активируй параметр "Enable different security models" и "TOMOYO Linux Support" в секции Security options.

При беглом взгляде TOMOYO очень похож на AppArmor. Обе системы контролируют путь (pathname based), а правила имеют сходный синтаксис. Но есть и отличия. Так, в TOMOYO можно указать поведение программы в зависимости от того, как она запущена. Например, оболочка, запущенная через SSH, может иметь больше ограничений, чем запущенная с локальной системы. Предусмотрена проверка дополнительных параметров, с которыми включена программа, а также привилегий (UID/GUD). Приложения в терминологии TOMOYO называются доменами (domains). Конфигурационные файлы TOMOYO находятся в каталоге /etc/tomoyo, после запуска системы настройки имеют свое отражение в /proc/tomoyo, где их можно редактировать на лету. Параметры работы TOMOYO хранятся в /etc/tomoyo/profile.conf и доступны в /proc/tomoyo/profile. Именно здесь определяются режимы работы TOMOYO — disable, permissive, enforsing и learning (обучаясь, система сама строит правила). Есть и другие файлы:
manager.conf (/proc/tomoyo/manager) — программы, которые могут изменить политику в /proc/tomoyo;
exception_policy.conf (/proc/tomoyo/exception_policy) — исключения для политик домена;
domain_policy.conf (/proc/tomoyo/domain_policy) — политики домена;
meminfo.conf (/proc/tomoyo/meminfo) — настройка использования памяти и квот.

После установки пакета ccs-tools необходимо провести инициализацию TOMOYO, выполнив скрипт /usr/lib/ccs/tomoyo_init_police.sh, который и создаст нужные конфиги. Далее потребуется перезагрузка системы. Затем можно запускать редактор политик:

# /usr/lib/ccs/editpolicy /etc/tomoyo/

Еще одна немаловажная черта — TOMOYO может работать параллельно с SELinux и AppArmor.

http://www.xakep.ru/post/53424/default.asp

Обновлено: 13.03.2015