Гонка вооружений: сравниваем популярные расширения безопасности для ОС LinuxUnix, родившийся практически вместе с первыми компьютерами, использовал очень простой механизм безопасности (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. И главное — выполнение команды Проверить это легко:
Получаем привилегии суперпользователя и проверяем снова:
Если зайти сразу под рутом, то роль другая:
Изменить роль можно при помощи команды newrole. При использовании SELinux штатные команды выводят и контекст. Чтобы просмотреть контекст файлов и процессов, набираем:
Кроме того, контекст можно считать прямо из /proc:
Предусмотрена работа SELinux в трех режимах — disable (отключен), enforcing (политики выполняются, все, что не соответствует — блокируется), permissive (политики анализируются, все нарушения заносятся в журнал "avc: denied", но блокировки не производятся). Узнать текущий режим просто, как, впрочем, и некоторые другие настройки, достаточно прочитать данные из псевдофайловой системы /selinux:
Если получим 1, значит, SELinux активирован. Чтобы изменить режим работы на лету, просто записываем в этот файл 0 или 1:
Также можно воспользоваться утилитой "setenforce [ Enforcing | Permissive | 1 | 0 ]". Собственно настройки производятся в конфигурационных файлах, размещенных в каталоге /etc. В дистрибутивах, базирующихся на RedHat, доступен графический SELinux Administration Tool (system-configselinux, пакет policycoreutils-gui). Так, режим работы устанавливается в файле /etc/sysconfig/selinux (на самом деле это ссылка на /etc/selinux/config). В частности, режим работы определяет параметр SELINUX:
По умолчанию в большинстве дистрибутивов SELinux защищает не все демоны, а только строго определенные: dhcpd, httpd, named, nscd, ntpd, portmap, snmpd, squid и syslogd. Для остальных политика не определена — unconfined_t. Чтобы защитить всю систему, необходимо изменить значение SELINUXTYPE на strict:
В каталоге /etc/selinux/targeted/contexts находим описание контекстов. Например, для root контекст описывается так:
Чтобы просмотреть все контексты, связанные с httpd, введи такую команду:
Ты увидишь, что для разных ситуаций контекст будет отличаться. Теперь получим список всех параметров SELinux: "getsebool -a". Для установки используй команду setsebool (с ключом '-P' для сохранения значения после перезагрузки) или графическую утилиту system-configsecuritylevel. Вывод "sestatus -v" покажет все текущие установки. Не забываем и о журналах:
Все вспомогательные утилиты SELinux собраны в нескольких пакетах: setools или policycoreutils, policycoreutils-newrole. Первый, как правило, уже установлен в системе, остальных нет. Например, newrole, дающая возможность пользователю сменить роль, доступна именно в policycoreutils. После установки в системе присутствуют только наборы политик для targened, остальные наборы политик скачиваются в пакетах selinux-policy*. Сорцы политик для их самостоятельной сборки вынесены в selinux-policy-devel. Разобраться в более чем 200 файлах, имеющих несколько тысяч строк, врукопашную очень трудно. Автоматизировать эту задачу призван питоновый скрипт audit2allow (в policycoreutils), он генерирует новые политики на основе анализа журналов и блокировок SELinux.
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.
Чтобы просмотреть список загруженных профилей, достаточно считать файл /sys/kernel/security/apparmor/profiles (или запустить /etc/init.d/apparmor status); в зависимости от варианта дистрибутива Server/Desktop количество активных профилей будет различно. Сами профили хранятся в файлах (отдельно для каждого приложения) в каталоге /etc/apparmor.d и внутри содержат описание каталогов и отдельных файлов, с указанием прав доступа. Также указывается работа в сети и совместимость с другими профилями. Для упрощения задачи используются регулярные выражения. По умолчанию профили AppArmor работают в принудительном enforce-режиме. Когда сервис не может выйти за рамки установок, все попытки блокируются и фиксируются в журнале. При необходимости его можно перевести в щадящий режим complain, когда нарушения лишь фиксируются. Причем, в отличие от SELinux, где режим обучения активируется глобально, в AppArmor его можно включить для отдельного профиля. Перевести профиль в щадящий режим можно тремя способами:
А еще профили отключаются на лету, перегружаются, в общем, полная свобода действий. Собственно, простота и привлекает в AppArmor админов, разработчиков и простых пользователей. Дополнительные профили можно найти в репозитории дистрибутива (apt-cache search apparmor), кроме того, есть онлайн-банк профилей — apparmor.opensuse.org. К слову, для ядер 2.4/2.6 существовала разработка Trustees, реализующая ACL a-ля Novell Netware, которая в удобной форме расписывала доступ к каталогам вплоть до указания отдельных групп и пользователей и не зависела от файловой системы. К сожалению, проект заглох, а это была бы золотая середина между SELinux и 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:
Если ядро собирается самостоятельно, активируй параметр "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 (обучаясь, система сама строит правила). Есть и другие файлы:
После установки пакета ccs-tools необходимо провести инициализацию TOMOYO, выполнив скрипт /usr/lib/ccs/tomoyo_init_police.sh, который и создаст нужные конфиги. Далее потребуется перезагрузка системы. Затем можно запускать редактор политик:
Еще одна немаловажная черта — TOMOYO может работать параллельно с SELinux и AppArmor. |