LXF83:AppArmor
Строка 50: | Строка 50: | ||
== Как устроен AppArmor == | == Как устроен AppArmor == | ||
− | *Ядро Linux 2.6 Имеет новый интерфейс | + | *Ядро Linux 2.6 Имеет новый интерфейс модулей безопасности Linux (Linux Security Modules), допускающий подключаемые модули безопасности. Процессы пользователя обращаются к ядру, которое при помощи всех загруженных LSM-модулей прове ряет корректность доступа. |
− | модулей безопасности Linux (Linux Security | + | |
− | Modules), допускающий подключаемые | + | |
− | модули безопасности. Процессы | + | |
− | + | ||
− | + | ||
− | ряет корректность доступа. | + | |
− | *Модуль ядра 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 |
Версия 07: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