Безопасный Linux: Часть 6. Система мандатного контроля доступа Smack

Евгений Ивашко, Сотрудник Института РАН, Институт прикладных математических исследований Карельского научного центра РАН.

Описание: Из этой статьи вы узнаете о еще одном средстве обеспечения мандатного контроля доступа для ОС на базе ядра Linux — Simplified Mandatory Access Control Kernel. Отличительные особенности этой системы — контроль безопасности на основе присвоения меток объектам, поддержка и развитие в рамках ядра и относительная простота использования.

1. Введение

Прошлая статья серии «Безопасный Linux» завершила обзор средств обеспечения мандатного контроля доступа, основанных на контроле пути к файлам. Ранее мы рассмотрели систему AppArmor, развиваемую компанией Novell (см. п. 1 раздела «Ресурсы»), и ее более удачливого конкурента из Японии — систему TOMOYO Linux (п. 2 раздела «Ресурсы»). Отдельная статья была посвящена более подробному рассмотрению недостатков (и потенциальных уязвимостей) самого подхода обеспечения мандатного контроля доступа на основе контроля пути к файлам, а также методов, которыми эти самые недостатки стараются ликвидировать разработчики AppArmor и TOMOYO Linux (см. п. 3 раздела «Ресурсы»).

Новая статья серии «Безопасный Linux» открывает тему систем обеспечения мандатного контроля доступа, основанных на присваивании уникальных меток всем защищаемым объектам операционной системы (label-based approach). Считается, что такие системы гарантируют значительно более высокий уровень безопасности, нежели их pathname-based конкуренты.

Первая рассматриваемая нами система обеспечения мандатного контроля доступа, основанная на расстановке меток, называется Smack.

2. Smack — простая безопасность

2.1 Что такое Smack

Smack продолжает ряд Linux-систем, предназначенных для обеспечения мандатного контроля доступа. Однако в отличие от AppArmor и Tomoyo Linux, эта система разграничения прав доступа использует подход, основанный на присваивании уникальных меток объектам защищаемым объектам операционной системы.

При разработке Smack ставилась труднодостижимая цель создать мощный, но простой в использовании механизм обеспечения мандатного контроля доступа. Само название Smack — это сокращение английского Simplified Mandatory Access Control Kernel (Упрощенный мандатный контроль доступа к ядру). При этом, по уверениям Кэйси Шауфлер (Casey Schaufler) — главного разработчика системы — Smack предоставляет полноценный механизм защиты процессов и данных операционной системы. Подтверждением этим словам можно считать тот факт, что, начиная с версии 2.6.25, система обеспечения мандатного контроля доступа Smack была включена в ядро Linux.

Для перехвата обращений и контроля доступа на уровне ядра Linux, Smack использует уже упоминавшийся в прошлых статьях механизм Linux Security Modules (LSM). Возможности системы безопасности покрывают контроль файловых операций и передачи сетевых пакетов на уровне приложений.

Одно из ограничений применимости Smack заключается в необходимости использования файловых систем, поддерживающих расширенные атрибуты (см. врезку «Расширенные атрибуты файловой системы»). Именно возможности расширенных атрибутов используются при работе с метками файлов.

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

Расширенные атрибуты файловой системы
Расширенные атрибуты файлов — это возможность файловой системы ассоциировать с обычными файлами некоторый набор метаданных, которые не интерпретируются самой файловой системой (по сравнению с обычными атрибутами, строго задаваемыми файловой системой, например, правами доступа, временем создания и последнего изменения файла и т.д.).
Примерами метаданных могут служить имя автора текстового документа, контрольная сумма и кодировка.
В Linux целый список файловых систем (ext2, ext3, ext4, JFS, ReiserFS и XFS) поддерживают расширенные атрибуты (или xattr). Если в настройках ядра включена возможность libattr, то любой файл в соответствующей файловой системе может иметь список расширенных атрибутов, записываемых в виде пары <имя атрибута> <значение атрибута>.

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

2.2 Установка Smack

Для тестирования/использования Smack повозиться придется побольше, чем при исследовании AppArmor и Tomoyo Linux...

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

Компиляция ядра
Тема сборки нового ядра из исходных кодов очень часто занимает умы поклонников ОС на базе ядра Linux. В отличие от лишенных этого счастья пользователей Windows, «линуксоид» может — потратив несколько часов личного и компьютерного времени — собрать свой собственный, оптимизированный вариант ядра. Собрав новое ядро, в лучшем случае можно получить более производительную и стабильную систему, обладающую необходимыми функциями и лишенную избыточной функциональности.

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

Как уже говорилось раньше, система Smack была включена в ядро. Однако, как ни странно, ни один из наиболее популярных дистрибутивов не имеет по умолчанию поддержки Smack. Но это не повод отступать — всегда можно собрать если уж не собственный дистрибутив, то хотя бы ядро Linux! Это не так уж сложно, тем более, что при должном упорстве, в сети Интернет можно найти и подробные руководства по этому процессу (примеры ссылок на инструкции по компиляции ядра прилагаются к этой статье — см. врезку «Компиляция ядра», а также «KernelCheck»). Самое главное, что нужно сделать — это включить в ядре поддержку Smack, а для этого необходимо также подключить (выключенную по умолчанию) подсистему NetLabel, используемую для реализации установки меток на сетевые пакеты (опция NetLabel subsystem support (NETLABEL), находится в разделе Networking support->Networking options->TCP/IP networking). Заодно можно сделать Smack системой безопасности по умолчанию (см. Рис. 1).

Рис. 1. Включение поддержки Simplified Mandatory Access Control в ядре Linux

Система обеспечения мандатного контроля доступа Smack состоит из трех основных компонент:
компонент ядра, который реализован как модуль Linux Security Modules;
скрипт загрузки и вспомогательные утилиты, предназначенные для загрузки базовых настроек, проверки корректности атрибутов Smack для отдельных файлов устройств и т.п.;
набор исправлений к пакету GNU Core Utilities, благодаря которому некоторые стандартные утилиты (типа ls) могут оперировать расширенными атрибутами файлов, используемых системой безопасности.

После компиляции и установки ядра, успешно загрузившись, можно приступать к следующему этапу развертывания системы обеспечения мандатного контроля доступа. Скачайте архив с набором загрузочных скриптов и модифицированных приложений Smack (п. 5 в разделе «Ресурсы»). В этом архиве вы обнаружите вот что:root@linux:~/smack-util-0.1-x86> ls
busybox
libsmack.a
smackcipso
smackpolyport
etc-init.d-smack
ls
smackload
sshd

Нам понадобятся не все входящие в архив файлы. Скрипт загрузки etc-init.d-smack нужно скопировать (как подсказывает имя файла) в каталог /etc/init.d под именем smack. Этот скрипт должен запускаться на раннем этапе загрузки операционной системы, так как он проверяет корректность установленных атрибутов и загружает конфигурацию системы безопасности.

Из скрипта загрузки вызываются также файлы /usr/sbin/smackload и /usr/sbin/smackcipso (их, соответственно, нужно скопировать в каталог /usr/sbin).

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

В файл /etc/fstab — для монтирования виртуальной файловой системы smack — необходимо добавить следующую строчку:smackfs /smack smackfs smackfsdef=* 0 0

Не забудьте также создать точку монтирования /smack.

На этом этап установки заканчивается. Перезагрузите операционную систему, и, если все прошло успешно, в каталоге /smack вы увидите следующий набор файлов:root@linux:~>ls /smack
ambient
cipso
direct
doi
load
logging
netlabel
onlycap

Эти файлы используются при работе Smack — в них загружаются текущие настройки системы безопасности, которые хранятся в соответствующих файлах каталога /etc/smack.

Как уже говорилось ранее, Smack использует уникальные метки для разграничения доступа между объектами операционной системы. Установить метку на файл можно следующей командой (от имени пользователя root):attr -S -s SMACK64 -V «<метка>» <путь к файлу>

Теперь можно посмотреть какую метку имеет файл:ls -lM <путь к файлу>

Однако помните, что вы увидите метку только в том случае, если стандартная утилита ls была заменена версией из пакета smack. По умолчанию все файлы имеют метки «_» (ниже рассказывается о том, что означает эта метка). Кроме того, метку любого работающего в операционной системе процесса можно просмотреть в файле виртуальной файловой системы /proc/<pid>/attr/current.

2.3 Правила доступа

------------------------------------------------------
KernelCheck
Для пользователей Debian и основанных на нем дистрибутивах (включая Ubuntu) разработана и поддерживается программа KernelCheck, которая позволяет провести весь процесс компиляции ядра, не заходя в консоль. После запуска KernelCheck предложит свежие версии ядра и исправления, скачает исходный код, запустит графический конфигуратор. Программа соберет ядро в .deb пакеты и установит их. Распространяется KernelCheck по условиям лицензии GNU Public License v. 3.

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

Правила мандатного контроля доступа, как и положено «упрощенной» системе, отличаются простотой: они записываются в файл /etc/smack/accesses в виде

<метка субъекта> <метка объекта> <тип доступа>



Здесь субъект представляет собой исполняемый файл системы, объект — некоторый ресурс, к которому необходим доступ (например, файл или сетевое соединение). Smack, в основном, придерживается традиционной Linux-модели разделения прав доступа на запись (w), выполнение (x) и чтение (r), дополняя эту модель правом добавления или дозаписи (a). Право добавления особенно важно для безопасности при работе с лог-файлами: системные процессы могут записывать свои сообщения в лог-файлы, но не должны иметь возможности уничтожать сообщения, записанные ранее!

Однако такая модель разграничения прав доступа подходит лишь при работе с файлами. Необходимо обобщить ее и на другие ресурсы:
передача сигнала от объекта к субъекту рассматривается как операция записи;
передача сетевого пакета от объекта к субъекту рассматривается как операция записи.

Наконец, основой всей системы мандатного контроля доступа являются метки.

Все субъекты и объекты, которые фигурируют в правилах доступа системы безопасности Smack, должны иметь метки. Smack оперирует метками в виде строк длиной до 23 символов (это ограничение связано с размером заголовка IP-пакета). Метки не могут содержать непечатаемых символов, а также символов /, (слеш и обратный слеш), '',' (одинарные и двойные кавычки) и пробелов.

Кроме того, односимвольные метки, состоящие из специальных символов (не являющиеся буквами или цифрами), зарезервированы для служебного использования системой. Однако из всех таких односимвольных меток на текущий момент используется лишь часть (см. следующую таблицу зарезервированных Smack служебных меток и их назначения).

Таблица 1. Зарезервированные метки системы Smack.

Права доступа субъекта к объекту определяются установленными пользователем правилами. Однако следующие аксиомы являются главенствующими и всегда определяют взаимоотношения субъекта и объекта:
разрешен любой доступ объекта к субъекту, если они имеют одинаковые метки;
разрешен тот тип доступа, который явно указан в правилах;
если объект и субъект имеют различные метки, ни один из них не имеет служебной метки, и правила доступа для таких меток не заданы, то любой доступ объекта к субъекту запрещен.

При запуске Smack, правила доступа, записанные в файле /etc/smack/accesses, переписываются в специальный файл виртуальной файловой системы /smack/load. Имея соответствующие права доступа, правила можно записывать напрямую в файл /smack/load — они будут применяться сразу же. Такая возможность удобна, например, при отладке — эффект правила (а значит, и возможные ошибки) можно заметить сразу же.

Для каждой пары <объект> - <субъект> может существовать только одно правило. Будьте внимательные: если таких правил несколько, то применяется последнее по порядку!

Теперь приведем несколько примеров правил. ПравилоTopSecret Secret rwx

означает, что субъект, имеющий метку TopSecret, имеет права на чтение, запись и исполнение объектов, имеющих метку Secret. Доступ субъектов Secret к объектам TopSecret будет запрещен.

Следующее правило ограничит аудио-проигрыватели (которым нужно будет назначить метку MusicPlayer) только доступом на чтение аудио-файлов (которым нужно присвоить метку Music).MusicPlayer Music r

2.4 Мандатный контроль доступа к сети

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

CIPSO
Стандарт CIPSO — Common IP Security Option — получил поддержку в ядре, начиная с версии 2.6.19. CIPSO — это один из нескольких используемых «доверенными» операционными системами стандартов установки меток на сетевые пакеты. Для взаимодействия с такими доверенными системами, а также для их замены, операционные системы на базе ядра Linux должны был получить ту же функциональность.
В сущности, CIPSO — это соглашение между системами по установке меток (тегов), описывающих уровень безопасности или контекст того процесса, который посылает сетевые пакеты. Пользователи CIPSO определяют «области значений» (Domain of Interpretation — DOI), которые отвечают за интерпретацию тегов, чтобы взаимодействующие стороны могли определить имеют ли процессы обеих систем достаточные права для связи друг с другом. DOI и метки устанавливаются в области опций каждого отсылаемого IP-пакета и, на основе этих значений, на уровне ядра могут контролироваться требования безопасности.
За реализацию стандарта в ядре Linux отвечает подсистема NetLabel — это механизм вставки информации CIPSO в исходящие сетевые пакеты и проверки входящих пакетов на наличие тегов CIPSO. NetLabel использует перехватчики LSM для реализации таких проверок и установки отметок.

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

Помимо файловой системы, Smack также способен контролировать входящий/исходящий сетевой трафик на уровне процессов.

Сетевой пакет, отправляемый процессом, который находится под контролем системы обеспечения мандатного контроля доступа Smack, получает соответствующую метку. Это делается добавлением тега CIPSO (см. врезку «CIPSO») в заголовок IP-пакета. В каждом сетевом пакете, полученном операционной системой, Smack ищет тег CIPSO, определяющий метку доступа. Перед принятием пакета и направлением его процессу-получателю, выполняется проверка, что субъект, который послал пакет, имеет право доступа на запись к получающему процессу. В случае, если такое право отсутствует, пакет отбрасывается.

Для работы Smack обычно не требуется проведения дополнительной настройки CIPSO. Значения по умолчанию, как правило, покрывают все необходимые потребности. Smack будет отображать значения меток CIPSO на соответствующие метки Smack без административного вмешательства.

Подсистема Smack/CIPSO требует настройки только в том случае, когда сетевые пакеты могут быть получены от операционной системы, в которой не используется Smack, но задействованы метки CIPSO. Как правило, такой операционной системой является Trusted Solaris, однако существует и ряд других, менее распространенных. В своей работе CIPSO оперирует тремя важными значениями, устанавливаемыми для каждого сетевого пакета: область значений (DOI), уровень и категория. Область значений предназначена для задания групп систем, использующих совместимые схемы меток. DOI системы, использующей Smack, должна совпадать с DOI удаленной системы, с которой происходит взаимодействие. В противном случае входящие сетевые пакеты будут отброшены. По умолчанию значение DOI равно 3. Это значение содержится в файле /etc/smack/doi и при загрузке операционной системы переписывается в файл виртуальной файловой системы /smack/doi.

Метка и набор категорий отображаются на метку Smack согласно определению в файле /etc/smack/cipso. Отображение Smack/CIPSO имеет следующий вид:<метка Smack> <уровень> [ <категория> [<категория>] … ]

Текущее отображение меток Smack на значения CIPSO записывается в файл /smack/cipso. С помощью утилиты smackcipso можно проверить корректность задания отображения.

2.5 Администрирование Smack

Для выполнения администраторских функций применительно к системе обеспечения мандатного контроля доступа, в Smack используются понятия возможности (capability) и привилегии (privilege):

процесс, обладающий возможностью, может нарушать установленные правила мандатного контроля доступа системы Smack (какие правила — зависит от типа возможности). Соответственно, процесс обладающий одной или более возможностями, считается привилегированным, остальные процессы — непривилегированные.

Smack использует два типа POSIX-возможностей:
CAP_MAC_ADMIN позволяет процессу выполнять административные функции, такие как загрузка правил доступа;
CAP_MAC_OVERRIDE выводит процесс из под действия правил мандатного контроля доступа Smack.

Проверить установленные возможности исполняемого файла можно командой getcap, а установить — setcap. Обе утилиты входят в состав пакета libcap-progs.

В целях администрирования, Smack также поддерживает ряд опций монтирования своей служебной виртуальной файловой системы:
smackfsdef=label определяет метки для файлов, которые не имеют установленный расширенный атрибут Smack;
smackfsroot=label определяет метку, которая назначается корню файловой системы, если она не поддерживает расширенные атрибуты Smack;
smackfshat=label определяет метку объектов, которые должны иметь доступ на чтение для субъектов всех меток;
smackfsfloor=label определяет метку субъектов, доступ на чтение к которым имеют объекты всех меток.

В сетевой подсистеме Smack два атрибута ассоциируются с сокетами. Эти атрибуты могут быть установлены только привилегированными задачами, но любая задача может прочитать значения атрибутов для своих собственных сокетов.
SMACK64IPIN: метка Smack объекта. Привилегированная программа может установить это значение в метку *.
SMACK64IPOUT: метка Smack, передающаяся с исходящими пакетами. Привилегированная программа может установить ее для совпадения с другими задачами, с которыми нужно взаимодействовать.

Замечание

Некоторые сторонники SELinux критикуют Smack за то, что эта система была создана как новый модуль LSM, хотя та же функциональность может быть реализована как политика безопасности SELinux. На подобные упреки автор приводит два аргумента:
SELinux и Smack имеют принципиальные архитектурные отличия;
SELinux имеет чересчур сложный синтаксис настройки.

3. Заключение

Мы рассмотрели систему Smack — Simplified Mandatory Access Control Kernel. Эта система обеспечения мандатного контроля доступа, оправдывая свое название, предоставляет простые и удобные средства по дополнительному контролю операционной системы на базе ядра Linux. Однако для того, чтобы добраться до использования системы, придется постараться: необходимо скомпилировать ядро с поддержкой Smack и проделать несколько дополнительных шагов по установке... Почему же разработчики наиболее распространенных дистрибутивов не включают поддержку Smack в свои операционные системы? Ответ прост: Smack находится в тени своего более мощного конкурента — системы SELinux. Об этом общепризнанном лидере систем обеспечения мандатного контроля доступа, разработанном в лабораториях Национального агентства безопасности США, и пойдет речь в следующих статьях.

http://www.ibm.com/developerworks/ru/library/l-apparmor-6/index.html?ca=drs-

Обновлено: 13.03.2015