LXF83:AppArmor

Материал из Linuxformat.

(Различия между версиями)
Перейти к: навигация, поиск
Строка 50: Строка 50:
== Как устроен AppArmor ==
== Как устроен AppArmor ==
-
*Ядро Linux 2.6 Имеет новый интерфейс
+
*Ядро Linux 2.6 Имеет новый интерфейс модулей безопасности Linux (Linux Security Modules), допускающий подключаемые модули безопасности. Процессы пользователя обращаются к ядру, которое при помощи всех загруженных LSM-модулей прове ряет корректность доступа.
-
модулей безопасности Linux (Linux Security
+
-
Modules), допускающий подключаемые
+
-
модули безопасности. Процессы пользова-
+
-
теля обращаются к ядру, которое при помо-
+
-
щи всех загруженных LSM-модулей прове-
+
-
ряет корректность доступа.
+
-
*Модуль ядра AppArmor Обеспечивает
+
*Модуль ядра AppArmor Обеспечивает реальную политику безопасности, сверяя обращение программы с профилем и запрещая либо разрешая действие.
-
реальную политику безопасности, сверяя
+
-
обращение программы с профилем и
+
-
запрещая либо разрешая действие.
+
-
*Профили приложений Содержат вашу
+
*Профили приложений Содержат вашу политику безопасности и описывают, что позволено делать каждому приложению.
-
политику безопасности и описывают, что
+
-
позволено делать каждому приложению.
+
-
*AppArmor Набор программ уровня поль-
+
*AppArmor Набор программ уровня пользователя для отображения и управления профилями AppArmor. Наиболее важным из них является синтаксический анализатор (parser), который читает профили, преобразует их в структуры данных, понятные ядру, и переправляет их модулю AppArmor.
-
зователя для отображения и управления
+
-
профилями AppArmor. Наиболее важным из
+
-
них является синтаксический анализатор
+
-
(parser), который читает профили, преобра-
+
-
зует их в структуры данных, понятные ядру,
+
-
и переправляет их модулю AppArmor.
+
-
*Отчеты и предупреждения Предоставляет
+
*Отчеты и предупреждения Предоставляет отчеты о конфигурации AppArmor и предупреждает о попытках вторжения.
-
отчеты о конфигурации AppArmor и предуп-
+
-
реждает о попытках вторжения.
+
-
*Yast-интерфейс В системах без Yast,
+
*Yast-интерфейс В системах без Yast, AppArmor может управляться посредством его родного интерфейса командной строки.
-
AppArmor может управляться посредс-
+
 
-
твом его родного интерфейса командной
+
== Как обезопасить Apache и другие приложения ==
-
строки.
+
В мире огромное число приложений –
 +
фактически бесконечное, ведь люди не пере-
 +
стают писать код. И если вы собираетесь
 +
использовать систему безопасности, кон-
 +
тролирующую деятельность приложений,
 +
очень важно, чтобы поддержка совмести-
 +
мости политик безопасности с програм-
 +
мным обеспечением была простой, особен-
 +
но при наличии постоянно прибывающих
 +
новых приложений.
 +
 
 +
Профили AppArmor достаточно просты:
 +
нетрудно сообразить, как создать их вруч-
 +
ную. Фактически, когда в 1998 г. появился
 +
AppArmor, именно так и делалось. Сейчас
 +
AppArmor поставляется с обучающейся
 +
системой: вы запускаете ваши приложения
 +
как обычно, а AppArmor следит и запомина-
 +
ет, что требуется разрешать приложению.
 +
 
 +
Выбрав приложение, для которого нуж-
 +
но разработать профиль, вы отсылаете
 +
модулю ядра исходный вариант профи-
 +
ля, функционирующий в режиме ‘complain’
 +
(«жалоба»): нарушения политик не блокиру-
 +
ются, а записываются в log-файл (журнал).
 +
Затем вы запускаете приложение обычным
 +
способом, и оно какое-то время работает,
 +
заодно заполняя журнал событий, харак-
 +
теризующих его поведение. После этого вы
 +
применяете к созданному журналу анали-
 +
затор AppArmor, который задаст вам интер-
 +
активные вопросы о добавлении событий в
 +
окончательный профиль.
 +
 
 +
=== Фабричные профили ===
 +
Скрипты, поставляемые с AppArmor,
 +
выполнят за вас большую часть работы.
 +
Посмотрим, как можно создать профиль
 +
для вашего web-сервера и его web-приложе-
 +
ний. Выполните от имени суперпользователя
 +
(root) genprof /usr/sbin/httpd2-prefork.
 +
Если для Apache ещё нет профиля, genprof
 +
создаст его, а если есть, то воспользуется
 +
уже существующим. Загрузив профиль в
 +
ядро в complain-режиме и попросив вас
 +
запустить ваше приложение с другого тер-
 +
минала или иным способом, genprof при-
 +
мется создавать журнал событий. В слу-
 +
чае Apache, поупражняйтесь с /etc/init.
 +
d/apache stop и /etc/init.d/apache.
 +
 
 +
Затем посетите ваш web-сайт и зай-
 +
митесь обслуживаемыми web-страницами.
 +
Как вы скоро увидите, посещать каждую
 +
отдельную страницу не обязательно, хотя
 +
это довольно просто, если использовать
 +
«паучка», например: wget --mirror http://
 +
example.com. Зато следует запустить
 +
каждый исполняемый файл, относящийся
 +
к сайту. Посетив достаточное для пред-
 +
ставления количество web-страниц, вновь
 +
выполните /etc/init.d/Apache stop и вер-
 +
нитесь к genprof.
 +
 
 +
Нажмите S, чтобы попросить genprof
 +
просканировать журнал событий, который
 +
находится в /var/log/audit/audit.log, и
 +
genprof задаст вам серию вопросов о том,
 +
как обрабатывать события. Вопросы зада-
 +
ются по блокам; первый – об управлении
 +
дочерними процессами, запускаемыми из
 +
программы, для которой создается про-
 +
филь. Выберите из следующего:
 +
 
 +
Inherit (наследование) Дочернее
 +
приложение (потомок) запускается с тем
 +
же профилем безопасности, что и роди-
 +
тель. Идеально для служебных программ;
 +
пример – сценария командной оболочки,
 +
запускающего программу cp с целью ско-
 +
пировать файл.
 +
 
 +
Profile (профиль) Потомок имеет
 +
свой профиль. Осторожно: этот профиль
 +
имеет действие во всей системе, так что
 +
для его создания вам придётся проде-
 +
 
 +
лать большую работу. Если этого потомка
 +
(например, web-приложение, обычно запус-
 +
каемое web-сервером) использует только
 +
одна программа, то выбор P является безо-
 +
пасным. Если потомок используется разны-
 +
ми программами, придётся погонять его во
 +
всех режимах, чтобы правильно определить
 +
его поведение для профиля.
 +
Unconfined (неограниченный)
 +
Потомок запускается вообще без профи-
 +
ля. Это очень опасный выбор, предполага-
 +
ющий, что у потомка нет уязвимостей. Он
 +
существует преимущественно для того, что-
 +
бы позволить системным администраторам
 +
удаленно управлять AppArmor, потому как
 +
программам с ограничениями манипуляции
 +
с AppArmor не разрешены.
 +
Deny (запрещено) просто не позволя-
 +
ет родителю запускать этого потомка.
 +
В каждом из блоков вопросов также
 +
имеются дополнительные опции abort,
 +
которая отменяет все изменения и выходит
 +
из genprof, а также Finish, которая обры-
 +
вает создание профиля на данном этапе и
 +
осуществляет выход.
 +
Следующий блок вопросов касается
 +
функций POSIX.1e. Здесь имеются опции
 +
Allow (Разрешить) приложению доступ
 +
к этим функциям, или Deny (Запретить).
 +
Если вы уверены, что ваше приложение не
 +
атаковалось в момент обучения, то Allow,
 +
скорее всего, верный ответ. Однако если
 +
профиль создается на машине, открытой
 +
для Интернета, ваше приложение вполне
 +
может быть атаковано во время «обучения»,
 +
и здесь нужна осторожность. Создание
 +
профиля приложений подобно обучению
 +
детей: они учатся на примерах, поэтому не
 +
делайте ничего дурного в их присутствии.
 +
Последний блок вопросов касается доступа
 +
к файлам. Кроме простых Allow и Deny,
 +
здесь есть опции:
 +
Glob this access («Глобализовать»
 +
доступ) Каждое нажатие клавиши G заме-
 +
няет на шаблон очередной уровень «хвос-
 +
та» полного (включающего путь) имени
 +
файла. Одно нажатие G превратит /srv/
 +
www/htdocs/images/star.gif в /srv/
 +
www/htdocs/images/*, второе – в /srv/
 +
www/htdocs/*, и т.д.
 +
Glob with extensions
 +
(«Глобализовать» с расширением)
 +
Создаёт шаблон из последней части пути и
 +
расширения, так что /usr/local/myfile.html
 +
превратится в /usr/local/*.html.
 +
New path specifier (Описание
 +
нового пути) Добавьте свой собственный
 +
путь путем создания шаблонов вручную,
 +
используя *, ?, [, ], -, { и }.
 +
Получив ответ на все вопросы, genprof
 +
вновь попросит перейти к сканированию
 +
журнала; на сей раз нажмите F. Программа
 +
genprof завершится, переведя профиль
 +
Apache в режим подавления (enforce-режим).
 +
Вам не потребуется перезапускать Apache;
 +
AppArmor может изменять статус профилей
 +
на фоне запущенного процесса. Теперь ваша
 +
система функционирует с ограничениями
 +
AppArmor согласно созданной вами полити-
 +
ке. Эта политика будет работать и после пере-
 +
загрузки – вы можете посмотреть ее в /etc/
 +
apparmor.d/usr.sbin.httpd2-prefork.
 +
Общие правила
 +
Вопросы о файловом доступе, на которые
 +
вы отвечали, лишь номинально относятся
 +
к запретам. Намного важнее возможность
 +
создать общее правило доступа к файлам.
 +
Простейший случай – работа с временны-
 +
ми (temporary) файлами, которым обыч-
 +
но намеренно даются случайные имена.
 +
Заменив последнюю часть пути шаблоном,
 +
вы будете уверены, что программа будет
 +
нормально работать, а не закроется с ошиб-
 +
кой, потому что имена временных файлов с
 +
каждым запуском меняются.
 +
Другой пример обобщения – имена биб-
 +
лиотек. Например, если программе необхо-
 +
дим доступ к /usr/lib/libdb_cxx-4.3.so,
 +
наш друг genprof может предложить аль-
 +
тернативу /usr/lib/libdb_cxx-*.so, что-
 +
бы профиль работал и после обновления
 +
версии библиотеки. Пользователю предо-
 +
ставляется компромисс: широкое исполь-
 +
зование шаблонов сделает профили более
 +
удобными и безотказными, но платой за
 +
это будут большие разрешения и, как след-
 +
ствие, снижение безопасности. Но даже с
 +
широким использованием шаблонов про-
 +
фили AppArmor все еще более безопасны,
 +
чем без AppArmor.
 +
Вот ещё один пример: genprof замечает,
 +
что событие доступа имеет соответствие в
 +
каталоге abstractions, и предлагает, ска-
 +
жем, нечто вроде #include <abstractions/
 +
nameservice>, тем самым обеспечивая
 +
все правила доступа, необходимые для
 +
DNS-запросов и локальных UID-запросов.
 +
Под надзором
 +
Программа genprof помещает отметки в
 +
журнале и, таким образом, обучается толь-
 +
ко на событиях, происходящих в течении
 +
данной сессии genprof. Но вы можете обу-
 +
чать программу хоть целую неделю, невзи-
 +
рая на перезагрузки. Команда complain
 +
/usr/bin/ моя_программа или complain
 +
/etc/apparmor.d/usr.bin.моя_про-
 +
грамма переведет профиль программы
 +
моя_программа в complain-режим и оста-
 +
вит его в этом состоянии, а complain/
 +
etc/apparmor.d/* переводит все профили
 +
вашей системы в complain-режим.
 +
Запустите ваше приложение на сколь
 +
угодно долгое время, позаботившись, что-
 +
бы все журналы сохранялись и не удаля-
 +
лись при ротации. Когда вы посчитаете, что
 +
набрали достаточное количество событий,
 +
используйте программу logprof для обра-
 +
ботки журнала так же, как делает genprof –
 +
только logprof прочитает весь файл журна-
 +
ла. logprof имеет ключи командной строки,
 +
указывающие, где искать журналы, с какого
 +
места журнала начинать анализ и где нахо-
 +
дится профиль, подлежащий обновлению.
 +
Чтобы полностью разделить процессы
 +
обучения и создания профиля, отработайте
 +
все обучающие режимы для генерации жур-
 +
нала событий на большой тестовой маши-
 +
не в QA-подразделении, а затем просто
 +
отправьте набор профилей и log-файлов по
 +
электронной почте эксперту по безопаснос-
 +
ти, который при помощи logprof преобра-
 +
зует события в профили. По завершении
 +
выполните команду enforce, которая рабо-
 +
тает точно так же, как команда complain, но
 +
переводит все профили в режим ‘enforce’
 +
(«подавление»).
 +
Эти команды AppArmor могут быть
 +
выполнены только из командной оболочки
 +
root, причём оболочка должна быть свобод-
 +
на от ограничений AppArmor. Все команды
 +
также имеют псевдонимы, начинающиеся с
 +
aa-, таким образом вы сможете обнаружить
 +
все команды AppArmor в вашей системе,
 +
просто набрав aa-<TAB> в root-строке.
 +
AppArmor позволяет вам
 +
создавать профили самим, но
 +
его система мастеров (в
 +
данном случае, в Yast) упростит
 +
эту задачу.
 +
 
 +
Существует две системы политик
 +
безопасности. Системы Черного списка
 +
перечисляют запрещенные вещи*, а всё
 +
остальное разрешается; таким образом,
 +
это системы, разрешающие по умолчанию.
 +
Системы Белого списка определяют то, что
 +
разрешено, а всё остальное запрещает-
 +
ся, то есть это системы, запрещающие по
 +
умолчанию.
 +
Понятно, что системы Белого списка
 +
безопаснее, поскольку злоумышленник не
 +
может их обойти, просто приискав экзоти-
 +
ческий способ нагадить, который не пришёл
 +
в голову составителям списка. Но системы
 +
Черного списка удобнее для пользователей,
 +
потому что они не блокируют вас всякий
 +
раз, когда вы изобретаете новый способ
 +
применения своего ПК.
 +
AppArmor обходит дилемму «безопас-
 +
ность–удобство», используя гибридную
 +
модель. При использовании профиля для
 +
конкретной программы AppArmor действу-
 +
ет как Белый список: разрешены только
 +
указанные файлы и функции, и профиль
 +
не позволит злоумышленнику подсунуть
 +
программе новый вариант работы во вред.
 +
Но на уровне системы AppArmor является
 +
Черным списком: ограничиваются только
 +
программы, обладающие профилем, и их
 +
потомки, а прочие программы работают без
 +
ограничений.
 +
Но как же определить, какую программу
 +
следует ограничить? Это зависит от вашей
 +
модели угрозы. Обязательно должны быть
 +
ограничены права всех приложений, име-
 +
ющих нефильтруемый ввод данных, через
 +
которые можно осуществить атаку, потому
 +
что AppArmor никак не защищает програм-
 +
мы без ограничений.
 +
Открыты сетевые порты
 +
Очень часто встречающаяся модель угро-
 +
зы – сетевая: плохой парень «откуда-то
 +
оттуда», взламывающий ваш сервер или
 +
настольный компьютер. AppArmor предлага-
 +
ет обороняться программой unconfined. Она
 +
сканирует вашу машину на наличие откры-
 +
тых сетевых портов, находит прослушива-
 +
ющие их программы и выводит их список,
 +
а также их профили, если они есть. Если
 +
вы создали профили для всех программ,
 +
отмеченных в отчете unconfined, все откры-
 +
тые сетевые порты «упрутся» в профили
 +
AppArmor, то есть политика AppArmor пол-
 +
ностью определит, что сетевой злоумыш-
 +
ленник сможет сделать на вашей машине,
 +
даже если для всех прочих программ вашей
 +
системы вы профилей не создавали.
 +
Вот листинг результата команды
 +
unconfined в защищенной системе (web- и
 +
mail-сервер в берлоге автора):
 +
ПК на замке
 +
Описанный профиль подходит для сервера
 +
сетевой группы, поддерживающего web,
 +
электронную почту и печать. А как с безо-
 +
пасностью настольных ПК? Используется
 +
тот же подход: ограничить все приложе-
 +
ния, подверженные атакам из сети. То есть
 +
любые приложения, работающие с сетевы-
 +
ми данными.
 +
Некоторые из этих приложений имеют
 +
прямой вход из сети, например, почтовый
 +
клиент. Другие получают данные из сети
 +
опосредованно (например, OpenOffice.org,
 +
использующийся для открытия DOC-фай-
 +
лов, которые некто выслал вам в виде поч-
 +
тового вложения). Несмотря на отсутствие
 +
прямого соединения с сетью, они осущест-
 +
вляют сетевой ввод и тем создают нешу-
 +
точную опасность. Анализатор unconfined
 +
поможет и здесь, но учтите, что он не
 +
сможет найти приложения с чрезвычайно
 +
изменчивыми открытыми портами (некото-
 +
рые IM-клиенты) и, естественно, приложе-
 +
ния с опосредованным соединением (такие,
 +
как OOo).
 +
Наша настольная политика защищает
 +
систему от сетевых атак, но ничего не дела-
 +
ет для защиты от консольного пользова-
 +
теля, поскольку в нашем представлении
 +
пользователь – человек опытный, который
 +
выложил немалые деньги за свой ПК и
 +
полностью его контролирует. Однако на
 +
рабочей станции переговорного пункта или
 +
в общественном киоске консоль становится
 +
основным источником опасности. Для уст-
 +
ранения угрозы следует выявить все при-
 +
ложения, предоставляемые терминалом, и
 +
убедиться, что все они имеют профиль
 +
AppArmor. В данном случае клавиатура и
 +
мышь обязаны рассматриваться как угро-
 +
за, точно такая же, какой сеть является
 +
для нашего сервера. Только создав профи-
 +
ли для всего, до чего может добраться и
 +
использовать злоумышленник, мы можем
 +
считать свой долг выполненным.
 +
Гибкость Черного списка всей системы
 +
AppArmor позволяет обезопасить только те
 +
программы, которые внушают беспокой-
 +
ство. Платой за удобство является необ-
 +
ходимость определения таких программ,
 +
для чего надо представить себе источники
 +
угрозы. Многие из нас ожидают угрозу пре-
 +
имущественно из сети, вот почему програм-
 +
ма unconfined столь полезна. По-програм-
 +
мный Черный список AppArmor разрешает
 +
каждой программе делать только то, что
 +
ей полагается, и ничего другого, игнори-
 +
руя атаки злоумышленников. Комбинация
 +
списков помогает вам контролировать рабо-
 +
ту вашей системы легко и эффективно.
 +
Наслаждайтесь! LXF
 +
 
 +
== ДВИГАЕМСЯ ДАЛЬШЕ ==
 +
Если вы не являетесь пользователем SUSE
 +
или Debian, но хотите добавить брони
 +
AppArmor в вашу систему Linux, то программу
 +
можно портировать. Исходный код (http://
 +
forge.novell.com/modules/xfmod/project/
 +
?apparmor) не зависит от архитектуры и
 +
поддерживается на всех аппаратных плат-
 +
формах SUSE Linux (x86, x86-64, Itanium,
 +
PowerPC, и Z-series) – один из разработчи-
 +
ков AppArmor в свое свободное время порти-
 +
ровал его на свой Sharp Zaurus PDA (ARM).
 +
Вот шаги для успешного портирования:
 +
Установите на ядро заплатку, экспорти-
 +
рующую семафор пространства имен
 +
для ядра 2.6.15 или выше.
 +
Убедитесь, что модуль подготовлен для
 +
используемого вами ядра.
 +
Убедитесь, что скрипты инициализации
 +
вашего дистрибутива могут монтиро-
 +
вать securityfs.
 +
Создайте пакет для вашего дистрибути-
 +
ва аналогично RPM для SUSE и Debs
 +
для Ubuntu.
 +
1.
 +
2.
 +
3.
 +
4.
 +
Создайте или измените профили в
 +
соответствии с вашим дистрибутивом.
 +
В частности, существует небольшой
 +
набор важных профилей, которые
 +
должны быть подправлены, особенно
 +
для набора библиотек ld.so. Удачи!
 +
Проект AppArmor также пытается при-
 +
влечь больше участников из сообщества
 +
Open Source. Если вы администратор или
 +
пользователь Linux, вы можете запускать
 +
приложения для своих целей и публико-
 +
вать результаты в списке рассылки
 +
apparmor-general (http://forge.novell.com/
 +
mailman/listinfo/apparmor-general). Если
 +
вы разработчик приложений, подумайте
 +
над разработкой и распространением про-
 +
филей AppArmor с вашим приложением.
 +
Намного легче обслуживать профили
 +
AppArmor, если они являются частью про-
 +
цесса разработки приложения. Или вы
 +
можете помочь в разработке новых воз-
 +
можностей AppArmor. Узнайте больше,
 +
посетив http://en.opensuse.org/Apparmor

Версия 04:53, 10 марта 2008

Содержание

Армированный Linux

AppArmor – отличный, гибкий инструмент безопасности для Linux. Его создатель, Криспин Коуэн, поведает вам о нем.


Основная беда безопасности приложений – невозможно сказать, как поведет себя ваше приложение в нестандартных условиях: число состояний и вариантов ввода слишком велико, чтобы исчерпывающе протестировать даже небольшую программу. Когда это выливается в проблему? Когда некто обнаруживает, что определённый набор входных данных приводит к некорректному поведению программы, и разрабатывает приложение, эксплуатирующее найденную уязвимость (подобные приложения так и называют – эксплойты, exploits).

Для решения проблемы эксплойтов и разработан AppArmor. AppArmor обеспечивает безопасность приложений, заставляя их делать только то, что они обязаны делать и не более того. Конкретно, AppArmor контролирует файлы и функции POSIX.1e (см. man 7 capabilities), к которым приложение имеет доступ, поскольку контроль над этими ресурсами и привилегиями на вашей машине и есть мечта злоумышленника. В данной статье мы разъясним, как настроить и использовать AppArmor для защиты ваших программ и системы от атак.

AppArmor полностью интегрирован в SUSE Linux 10.1, SLES 9 SP3 и SUSE Linux Enterprise 10. Он устанавливается и работает по умолчанию, но использует скромный набор профилей (об этом позже). Намного больший набор профилей можно найти в /etc/apparmor/profiles/extras/; вы можете скопировать их в /etc/apparmor.d, где хранятся активные профили. В SUSE, интерфейс пользователя Yast содержит кнопку AppArmor, которая выводит графический эквивалент описываемых здесь инструментов genprof и logprof.

AppArmor вступил в жизнь как проприетарная система, но после приобретения Immunix Inc в 2005 году фирмой Novell приложение выпускается по лицензии GPL. С тех пор AppArmor был портирован на Slackware, Ubuntu и Pardus Linux, турецкий дистрибутив.

Для установки AppArmor в Ubuntu, выполните

sudo dpkg -i apparmor-* libapparmor1_2.0-0ubuntu2_i386.deb linux-image-2.6.15-21-386_2.6.15-21.32mr1_i386.deb

Заметьте, что эти пакеты включают новое ядро, поскольку для поддержки AppArmor необходима небольшая заплатка для ядра. Ubuntu основан на Debian, так что пакеты прекрасно подойдут для Debian, MEPIS и прочих систем на базе Debian. Если вы хотите использовать AppArmor в другой системе Linux, потребуется его портировать – см. врезку «Двигаемся дальше» на странице 47.

Обезопасим NTPD

Теории достаточно; обратимся к примеру. Рассмотрим NTPD, Network Time Protocol Daemon. Он обеспечивает синхронизацию вашей системы с главным сервером вашей локальной сети или с интернетом – важная задача! Однако для изменения вашего системного времени NTPD потребуются привилегии суперпользователя (root), а также открытый сетевой порт, чтобы узнавать время на главном сервере. В итоге получается убойная комбинация: открытый сетевой порт и доступ к процессам с правами суперпользователя – классический пример из руководства по безопасности. Злодей, нашедший уязвимость в коде NTPD, сможет атаковать демона NTP и получить права суперпользователя на вашем компьютере.

Права суперпользователя отнять нельзя – ведь тогда NTPD не сможет менять время; открытый сетевой порт удалить тоже нельзя – тогда NTPD не сможет узнавать время. Тут-то и поможет AppArmor, ограничив привилегии NTPD посредством профиля безопасности. Вот AppArmor-профиль для программы ntpd:

/usr/sbin/ntpd {
#include <abstractions/base>
#include <abstractions/nameservice>
capability ipc_lock,
capability net_bind_service,
capability setgid,
capability setuid,
capability sys_chroot,
capability sys_resource,
capability sys_time,
/drift/ntp.drift rwl,
/drift/ntp.drift.TEMP rwl,
/etc/ntp.conf r,
/etc/ntp/drift* rwl,
/etc/ntp/keys r,
/etc/ntp/step-tickers r,
/tmp/ntp* rwl,
/usr/sbin/ntpd rix,
/var/lib/ntp/drift rwl,
/var/lib/ntp/drift.TEMP rwl,
/var/lib/ntp/drift/ntp.drift r,
/var/lib/ntp/var/run/ntp/ntpd.pid w,
/var/log/ntp w,
/var/log/ntp.log w,
/var/run/ntpd.pid w,
}

Сейчас ntpd запускается от имени root, то есть имеет доступ ко всем функциям POSIX.1e. Но этот профиль ограничивает доступ ntpd семью функциями, описанными в коде. Будучи root-процессом, ntpd мог бы читать, записывать и запускать любой файл в файловой системе, но теперь ему доступны только файлы, описанные в профиле.

Что же произойдёт, при наличии данного профиля, если злоумышленник припас программу-эксплойт, направленную против ntdp? Будьте спокойны: ничего. У него нет прав на выполнение, а значит, простой shell-код [«полезная нагрузка» эксплойта, выполняющая задуманные злоумышленником действия, – прим. ред.] вида exec(sh) не пройдет. Если ntpd зачем-либо потребуется командная оболочка (shell), злоумышленник сможет запустить ее, но только из-под профиля, и сможет читать и записывать лишь файлы, принадлежащие ntpd на основании профиля. Короче говоря, злоумышленник сможет разве что изменить ваше системное время. AppArmor разрешил ntpd выполнять только конкретные операции – в литературе по безопасности это называется запуском приложения с наименьшими привилегиями.

Как устроен AppArmor

  • Ядро Linux 2.6 Имеет новый интерфейс модулей безопасности Linux (Linux Security Modules), допускающий подключаемые модули безопасности. Процессы пользователя обращаются к ядру, которое при помощи всех загруженных LSM-модулей прове ряет корректность доступа.
  • Модуль ядра AppArmor Обеспечивает реальную политику безопасности, сверяя обращение программы с профилем и запрещая либо разрешая действие.
  • Профили приложений Содержат вашу политику безопасности и описывают, что позволено делать каждому приложению.
  • AppArmor Набор программ уровня пользователя для отображения и управления профилями AppArmor. Наиболее важным из них является синтаксический анализатор (parser), который читает профили, преобразует их в структуры данных, понятные ядру, и переправляет их модулю AppArmor.
  • Отчеты и предупреждения Предоставляет отчеты о конфигурации AppArmor и предупреждает о попытках вторжения.
  • Yast-интерфейс В системах без Yast, AppArmor может управляться посредством его родного интерфейса командной строки.

Как обезопасить Apache и другие приложения

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

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

Выбрав приложение, для которого нуж- но разработать профиль, вы отсылаете модулю ядра исходный вариант профи- ля, функционирующий в режиме ‘complain’ («жалоба»): нарушения политик не блокиру- ются, а записываются в log-файл (журнал). Затем вы запускаете приложение обычным способом, и оно какое-то время работает, заодно заполняя журнал событий, харак- теризующих его поведение. После этого вы применяете к созданному журналу анали- затор AppArmor, который задаст вам интер- активные вопросы о добавлении событий в окончательный профиль.

Фабричные профили

Скрипты, поставляемые с AppArmor, выполнят за вас большую часть работы. Посмотрим, как можно создать профиль для вашего web-сервера и его web-приложе- ний. Выполните от имени суперпользователя (root) genprof /usr/sbin/httpd2-prefork. Если для Apache ещё нет профиля, genprof создаст его, а если есть, то воспользуется уже существующим. Загрузив профиль в ядро в complain-режиме и попросив вас запустить ваше приложение с другого тер- минала или иным способом, genprof при- мется создавать журнал событий. В слу- чае Apache, поупражняйтесь с /etc/init. d/apache stop и /etc/init.d/apache.

Затем посетите ваш web-сайт и зай- митесь обслуживаемыми web-страницами. Как вы скоро увидите, посещать каждую отдельную страницу не обязательно, хотя это довольно просто, если использовать «паучка», например: wget --mirror http:// example.com. Зато следует запустить каждый исполняемый файл, относящийся к сайту. Посетив достаточное для пред- ставления количество web-страниц, вновь выполните /etc/init.d/Apache stop и вер- нитесь к genprof.

Нажмите S, чтобы попросить genprof просканировать журнал событий, который находится в /var/log/audit/audit.log, и genprof задаст вам серию вопросов о том, как обрабатывать события. Вопросы зада- ются по блокам; первый – об управлении дочерними процессами, запускаемыми из программы, для которой создается про- филь. Выберите из следующего:

Inherit (наследование) Дочернее приложение (потомок) запускается с тем же профилем безопасности, что и роди- тель. Идеально для служебных программ; пример – сценария командной оболочки, запускающего программу cp с целью ско- пировать файл.

Profile (профиль) Потомок имеет свой профиль. Осторожно: этот профиль имеет действие во всей системе, так что для его создания вам придётся проде-

лать большую работу. Если этого потомка (например, web-приложение, обычно запус- каемое web-сервером) использует только одна программа, то выбор P является безо- пасным. Если потомок используется разны- ми программами, придётся погонять его во всех режимах, чтобы правильно определить его поведение для профиля. Unconfined (неограниченный) Потомок запускается вообще без профи- ля. Это очень опасный выбор, предполага- ющий, что у потомка нет уязвимостей. Он существует преимущественно для того, что- бы позволить системным администраторам удаленно управлять AppArmor, потому как программам с ограничениями манипуляции с AppArmor не разрешены. Deny (запрещено) просто не позволя- ет родителю запускать этого потомка. В каждом из блоков вопросов также имеются дополнительные опции abort, которая отменяет все изменения и выходит из genprof, а также Finish, которая обры- вает создание профиля на данном этапе и осуществляет выход. Следующий блок вопросов касается функций POSIX.1e. Здесь имеются опции Allow (Разрешить) приложению доступ к этим функциям, или Deny (Запретить). Если вы уверены, что ваше приложение не атаковалось в момент обучения, то Allow, скорее всего, верный ответ. Однако если профиль создается на машине, открытой для Интернета, ваше приложение вполне может быть атаковано во время «обучения», и здесь нужна осторожность. Создание профиля приложений подобно обучению детей: они учатся на примерах, поэтому не делайте ничего дурного в их присутствии. Последний блок вопросов касается доступа к файлам. Кроме простых Allow и Deny, здесь есть опции: Glob this access («Глобализовать» доступ) Каждое нажатие клавиши G заме- няет на шаблон очередной уровень «хвос- та» полного (включающего путь) имени файла. Одно нажатие G превратит /srv/ www/htdocs/images/star.gif в /srv/ www/htdocs/images/*, второе – в /srv/ www/htdocs/*, и т.д. Glob with extensions («Глобализовать» с расширением) Создаёт шаблон из последней части пути и расширения, так что /usr/local/myfile.html превратится в /usr/local/*.html. New path specifier (Описание нового пути) Добавьте свой собственный путь путем создания шаблонов вручную, используя *, ?, [, ], -, { и }. Получив ответ на все вопросы, genprof вновь попросит перейти к сканированию журнала; на сей раз нажмите F. Программа genprof завершится, переведя профиль Apache в режим подавления (enforce-режим). Вам не потребуется перезапускать Apache; AppArmor может изменять статус профилей на фоне запущенного процесса. Теперь ваша система функционирует с ограничениями AppArmor согласно созданной вами полити- ке. Эта политика будет работать и после пере- загрузки – вы можете посмотреть ее в /etc/ apparmor.d/usr.sbin.httpd2-prefork. Общие правила Вопросы о файловом доступе, на которые вы отвечали, лишь номинально относятся к запретам. Намного важнее возможность создать общее правило доступа к файлам. Простейший случай – работа с временны- ми (temporary) файлами, которым обыч- но намеренно даются случайные имена. Заменив последнюю часть пути шаблоном, вы будете уверены, что программа будет нормально работать, а не закроется с ошиб- кой, потому что имена временных файлов с каждым запуском меняются. Другой пример обобщения – имена биб- лиотек. Например, если программе необхо- дим доступ к /usr/lib/libdb_cxx-4.3.so, наш друг genprof может предложить аль- тернативу /usr/lib/libdb_cxx-*.so, что- бы профиль работал и после обновления версии библиотеки. Пользователю предо- ставляется компромисс: широкое исполь- зование шаблонов сделает профили более удобными и безотказными, но платой за это будут большие разрешения и, как след- ствие, снижение безопасности. Но даже с широким использованием шаблонов про- фили AppArmor все еще более безопасны, чем без AppArmor. Вот ещё один пример: genprof замечает, что событие доступа имеет соответствие в каталоге abstractions, и предлагает, ска- жем, нечто вроде #include <abstractions/ nameservice>, тем самым обеспечивая все правила доступа, необходимые для DNS-запросов и локальных UID-запросов. Под надзором Программа genprof помещает отметки в журнале и, таким образом, обучается толь- ко на событиях, происходящих в течении данной сессии genprof. Но вы можете обу- чать программу хоть целую неделю, невзи- рая на перезагрузки. Команда complain /usr/bin/ моя_программа или complain /etc/apparmor.d/usr.bin.моя_про- грамма переведет профиль программы моя_программа в complain-режим и оста- вит его в этом состоянии, а complain/ etc/apparmor.d/* переводит все профили вашей системы в complain-режим. Запустите ваше приложение на сколь угодно долгое время, позаботившись, что- бы все журналы сохранялись и не удаля- лись при ротации. Когда вы посчитаете, что набрали достаточное количество событий, используйте программу logprof для обра- ботки журнала так же, как делает genprof – только logprof прочитает весь файл журна- ла. logprof имеет ключи командной строки, указывающие, где искать журналы, с какого места журнала начинать анализ и где нахо- дится профиль, подлежащий обновлению. Чтобы полностью разделить процессы обучения и создания профиля, отработайте все обучающие режимы для генерации жур- нала событий на большой тестовой маши- не в QA-подразделении, а затем просто отправьте набор профилей и log-файлов по электронной почте эксперту по безопаснос- ти, который при помощи logprof преобра- зует события в профили. По завершении выполните команду enforce, которая рабо- тает точно так же, как команда complain, но переводит все профили в режим ‘enforce’ («подавление»). Эти команды AppArmor могут быть выполнены только из командной оболочки root, причём оболочка должна быть свобод- на от ограничений AppArmor. Все команды также имеют псевдонимы, начинающиеся с aa-, таким образом вы сможете обнаружить все команды AppArmor в вашей системе, просто набрав aa-<TAB> в root-строке. AppArmor позволяет вам создавать профили самим, но его система мастеров (в данном случае, в Yast) упростит эту задачу.

Существует две системы политик безопасности. Системы Черного списка перечисляют запрещенные вещи*, а всё остальное разрешается; таким образом, это системы, разрешающие по умолчанию. Системы Белого списка определяют то, что разрешено, а всё остальное запрещает- ся, то есть это системы, запрещающие по умолчанию. Понятно, что системы Белого списка безопаснее, поскольку злоумышленник не может их обойти, просто приискав экзоти- ческий способ нагадить, который не пришёл в голову составителям списка. Но системы Черного списка удобнее для пользователей, потому что они не блокируют вас всякий раз, когда вы изобретаете новый способ применения своего ПК. AppArmor обходит дилемму «безопас- ность–удобство», используя гибридную модель. При использовании профиля для конкретной программы AppArmor действу- ет как Белый список: разрешены только указанные файлы и функции, и профиль не позволит злоумышленнику подсунуть программе новый вариант работы во вред. Но на уровне системы AppArmor является Черным списком: ограничиваются только программы, обладающие профилем, и их потомки, а прочие программы работают без ограничений. Но как же определить, какую программу следует ограничить? Это зависит от вашей модели угрозы. Обязательно должны быть ограничены права всех приложений, име- ющих нефильтруемый ввод данных, через которые можно осуществить атаку, потому что AppArmor никак не защищает програм- мы без ограничений. Открыты сетевые порты Очень часто встречающаяся модель угро- зы – сетевая: плохой парень «откуда-то оттуда», взламывающий ваш сервер или настольный компьютер. AppArmor предлага- ет обороняться программой unconfined. Она сканирует вашу машину на наличие откры- тых сетевых портов, находит прослушива- ющие их программы и выводит их список, а также их профили, если они есть. Если вы создали профили для всех программ, отмеченных в отчете unconfined, все откры- тые сетевые порты «упрутся» в профили AppArmor, то есть политика AppArmor пол- ностью определит, что сетевой злоумыш- ленник сможет сделать на вашей машине, даже если для всех прочих программ вашей системы вы профилей не создавали. Вот листинг результата команды unconfined в защищенной системе (web- и mail-сервер в берлоге автора): ПК на замке Описанный профиль подходит для сервера сетевой группы, поддерживающего web, электронную почту и печать. А как с безо- пасностью настольных ПК? Используется тот же подход: ограничить все приложе- ния, подверженные атакам из сети. То есть любые приложения, работающие с сетевы- ми данными. Некоторые из этих приложений имеют прямой вход из сети, например, почтовый клиент. Другие получают данные из сети опосредованно (например, OpenOffice.org, использующийся для открытия DOC-фай- лов, которые некто выслал вам в виде поч- тового вложения). Несмотря на отсутствие прямого соединения с сетью, они осущест- вляют сетевой ввод и тем создают нешу- точную опасность. Анализатор unconfined поможет и здесь, но учтите, что он не сможет найти приложения с чрезвычайно изменчивыми открытыми портами (некото- рые IM-клиенты) и, естественно, приложе- ния с опосредованным соединением (такие, как OOo). Наша настольная политика защищает систему от сетевых атак, но ничего не дела- ет для защиты от консольного пользова- теля, поскольку в нашем представлении пользователь – человек опытный, который выложил немалые деньги за свой ПК и полностью его контролирует. Однако на рабочей станции переговорного пункта или в общественном киоске консоль становится основным источником опасности. Для уст- ранения угрозы следует выявить все при- ложения, предоставляемые терминалом, и убедиться, что все они имеют профиль AppArmor. В данном случае клавиатура и мышь обязаны рассматриваться как угро- за, точно такая же, какой сеть является для нашего сервера. Только создав профи- ли для всего, до чего может добраться и использовать злоумышленник, мы можем считать свой долг выполненным. Гибкость Черного списка всей системы AppArmor позволяет обезопасить только те программы, которые внушают беспокой- ство. Платой за удобство является необ- ходимость определения таких программ, для чего надо представить себе источники угрозы. Многие из нас ожидают угрозу пре- имущественно из сети, вот почему програм- ма unconfined столь полезна. По-програм- мный Черный список AppArmor разрешает каждой программе делать только то, что ей полагается, и ничего другого, игнори- руя атаки злоумышленников. Комбинация списков помогает вам контролировать рабо- ту вашей системы легко и эффективно. Наслаждайтесь! LXF

ДВИГАЕМСЯ ДАЛЬШЕ

Если вы не являетесь пользователем SUSE или Debian, но хотите добавить брони AppArmor в вашу систему Linux, то программу можно портировать. Исходный код (http:// forge.novell.com/modules/xfmod/project/ ?apparmor) не зависит от архитектуры и поддерживается на всех аппаратных плат- формах SUSE Linux (x86, x86-64, Itanium, PowerPC, и Z-series) – один из разработчи- ков AppArmor в свое свободное время порти- ровал его на свой Sharp Zaurus PDA (ARM). Вот шаги для успешного портирования: Установите на ядро заплатку, экспорти- рующую семафор пространства имен для ядра 2.6.15 или выше. Убедитесь, что модуль подготовлен для используемого вами ядра. Убедитесь, что скрипты инициализации вашего дистрибутива могут монтиро- вать securityfs. Создайте пакет для вашего дистрибути- ва аналогично RPM для SUSE и Debs для Ubuntu. 1. 2. 3. 4. Создайте или измените профили в соответствии с вашим дистрибутивом. В частности, существует небольшой набор важных профилей, которые должны быть подправлены, особенно для набора библиотек ld.so. Удачи! Проект AppArmor также пытается при- влечь больше участников из сообщества Open Source. Если вы администратор или пользователь Linux, вы можете запускать приложения для своих целей и публико- вать результаты в списке рассылки apparmor-general (http://forge.novell.com/ mailman/listinfo/apparmor-general). Если вы разработчик приложений, подумайте над разработкой и распространением про- филей AppArmor с вашим приложением. Намного легче обслуживать профили AppArmor, если они являются частью про- цесса разработки приложения. Или вы можете помочь в разработке новых воз- можностей AppArmor. Узнайте больше, посетив http://en.opensuse.org/Apparmor

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию