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

