- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF83:AppArmor
Материал из Linuxformat.
Содержание |
Армированный 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