- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF130:SELinuix
Материал из Linuxformat.
- SELinux Настроить безопасность машины без отрыва от производства
Содержание |
SELinux: Страж вашей системы
- Боб Мосс научит, как прикрыть вашу Linuxсистему, не добавляя мер безопасности, препятствующих выполнению повседневных задач.
Спешу успокоить тех, кто ранее не слышал о SELinux [Security Enhanced Linux – Linux с повышенной безопасностью]: вы не одиноки. SELinux идет в составе большинства ведущих дистрибутивов, но по умолчанию выключен (а есть и пользователи, отключающие его намеренно); в итоге этот мощный инструмент безопасности слабо востребован и полузабыт.
Любопытствуете, почему так случилось? Начнем с самого начала: когда US National Security Agency [Агентство национальной безопасности США] открыло его под свободной лицензией, SELinux влился в основной код ядра. Однако он загораживал дорогу людям, занятым в своих системах Red Hat выполнением ежедневных заданий, и был слишком сложен и громоздок для настройки пользователями среднего уровня, так что они обычно просто сдавались и отключали его.
Тем не менее с тех пор многое изменилось, и у него даже возникли конкуренты (например, AppArmor), предоставляющие такой же высокий уровень безопасности для стандартного настольного компьютера с Linux.
Так в чем же идея SELinux? По сути, он присваивает всем пользователям, процессам и файлам категории, а затем предоставляет этим «объектам» самый минимум прав, которые им нужны для выполнения своих функций. Если объект пытается выйти за эти рамки или вторгается в действия другого объекта, его останавливают и сообщают вам об этом в соответствии с заданной политикой безопасности.
SELinux, однако, поставляется с набором правил, покрывающих только типовые сценарии работы, и в один прекрасный день, приступая к очередной важной задаче, вы можете обнаружить, что SELinux взбрыкнул и остановил вас.
Но прежде чем в ярости швырять свой компьютер за окно или немедленно вырубать SELinux, просто выдайте себе права, позволяющие делать то, что вам надо, и там, где надо – это не слишком трудно. Со временем ваше терпение окупится: ведь укрепится безопасность вашей машины. На данном уроке мы разберемся, как работают политики безопасности SELinux, как изменить текущий режим SELinux для конкретных сценариев и как проверить выданные вам права, когда вы приспособите SELinux для своих личных компьютерных нужд.
Первый шаг
Первым делом надо убедиться, установлен ли SELinux в вашей системе. Пользователи Fedora скорее всего заметят, что он присутствует по умолчанию, благодаря родству с Red Hat – просто наберите следующие строки в стандартном терминале пользователя, чтобы увидеть, в каком состоянии SELinux находится сейчас:
getenforce
Вы можете получить один из трех результатов: enforcing, permissive или disabled. Первое говорит, что SELinux принуждает к выполнению всех заданных политик безопасности и сообщает обо всех нарушениях. Permissive показывает, что SELinux сообщает обо всех нарушениях, но насильно заданные правила безопасности не применяет; а последний вариант – SELinux отключен.
Пользователи Ubuntu нуждаются в нескольких добавочных шагах для установки SELinux, поскольку по умолчанию обычно установлен AppArmor. Прочитайте раздел «Альтернатива – AppArmor», и если все же решите держаться SELinux, установите его через ваш менеджер пакетов. Покончив с этим, наберите в терминале следующую команду, для его запуска:
sudo sed i ‘s/SELINUX=.*/SELINUX=enforcing/’ /etc/selinux/config
Она изменит состояние SELinux прямо через его конфигурационный файл. Вы также можете изменить enforcing на permissive или disabled, в соответствии с текущим режимом вашей деятельности.
У пользователей Fedora маршрут для включения SELinux и изменения режима работы много проще. Одна из возможностей – применение инструмента с графическим интерфейсом из System > Administration [Система > Администрирование] рабочего стола Gnome: изменения вносятся через выпадающее меню, после чего остается только кликнуть Apply [Применить]. Если вам больше нравится командная строка – то же самое действие выполнится при наборе
echo 0 > /selinux/enforce
Оператор 0 велит SELinux выключить режим Enforce до окончания текущей сессии и перейти в режим Permissive. Если вы захотите вернуть режим Enforce, просто запустите эту же команду снова, но установив 1 вместо 0.
При желании изменить режим насовсем, откройте от имени root файл /etc/selinux/config в вашем текстовом редакторе и исправьте соответствующую строку SELINUX:
SELINUX=enforcing
Опять же, можете изменить enforcing на permissive или disabled, как вам удобнее.
Тут вас, видимо, посетит вопрос: а зачем вообще менять режимы работы SELinux? Суть в том, что при выполнении любой администраторской задачи или решении проблемы может оказаться, что политики SELinux (рассчитанные на повседневное использование на настольных компьютерах) мешают вам работать. То есть в данном случае отключение полезно; но когда вы снова будете использовать ваш компьютер как обычно, вы должны иметь возможность заставить настроенную конфигурацию SELinux тихо работать в фоновом режиме, не досаждая вам.
Позвольте вам не позволить
При запущенном SELinux иногда обнаруживается, что вещи, работавшие ранее, перестали это делать (или вы видите диалоговое окно, угрожающее сообщить обо всем вам же). В этом случае можно попробовать полезный инструмент Audit2allow: он соберет данные о недавних действиях, которые предотвратил SELinux, и позволит вам разрешить их. Перед его использованием проверьте, что у вас запущен демон auditd, посредством команды
ps ef | grep auditd
Если вы видите auditd в списке, и перед ним нет слова grep, значит, демон запущен. Не паникуйте, если он не появился, потому что единственное различие нижеприведенной команды будет в замене a на d:
audit2allow l a M local
Параметр -l читает запреты с момента последней перезагрузки политик (в большинстве случаев – с момента вашего входа в систему), а -m перемещает запреты в модуль, который вы можете употребить для составления правил. Учтите, что если вы хотите использовать эту строку более одного раза, имя local нужно будет изменить, во избежание конфликтов. Удовлетворившись правилом, соберите его – для этого достаточно набрать semodule -i local.pp.
Альтернатива – AppArmor
Пользователи Ubuntu или OpenSUSE могут обнаружить, что AppArmor уже установлен по умолчанию, хотя последние должны включать его вручную (как показано на экранном снимке). Те, кто знаком с SELinux, могут найти некоторые аспекты AppArmor очень похожими. Например, AppArmor имеет режимы Enforce, Complain и Disabled – полная аналогия с SELinux. Его также чуть легче запустить и остановить: пользователи Ubuntu могут просто набрать
rcapparmor start
Замена start на stop даст обратный эффект. Вы можете также использовать reload для перезагрузки всех текущих профилей AppArmor (эквивалента правил SELinux), или status для отображения количества загруженных профилей в режимах Complain и Enforce. Регистрацией событий в журнале также легко манипулировать:
rcaaeventd start
Как и ранее, для обратного эффекта можно просто использовать stop вместо start.
Преимуществом AppArmor является его режим Learning, который наблюдает, как ваша машина используется в заданный вами промежуток времени, и затем применяет эту информацию для выяснения того, что разрешать делать, а что нет.
Трещины в броне
Это чрезвычайно полезно для настройки webсерверов, где локальный доступ в идеале должен быть ограничен, а webстраницы должны быть доступны только особым людям по определенным путям.
Звучит такая идея замечательно, но на практике имеет препятствие. В режиме Learning AppArmor легко перенимает дурные привычки, то есть видит события, которые вы бы сочли нарушениями, но не предоставляет доклада об этом, считая такое поведение нормальным. Это может быть смягчено осторожностью поведения и в некоторых сценариях особенно не повредит, но всетаки должно считаться недостатком. У SELinux такой проблемы нет, потому что он распространяется с набором политик безопасности для основных востребованных сценариев, и затем позволяет пользователю при необходимости задать более точные политики. Конечно, потребуется больше усилий и некоторый уровень понимания, но зато вы узнаете о всех нежелательных событиях на вашей машине сразу при их появлении.
Оба решения имеют свои «за» и «против», но после нашего урока вы сможете сделать более обоснованный выбор, что именно ставить на ваш любимый дистрибутив.
SELinux: Свои правила лучше
- Научившись применять SELinux, почему бы не создать правила самим?
Еще более подробную информацию о SELinux вы получите на http://selinuxproject.org.
Теперь вы можете настроить SELinux и знаете, как создать новое правило, если система безопасности начнет мешать выполнению повседневных задач на вашей Linux-машине. Однако в вашей системе бывают такие файлы и зоны, которые желательно уберечь от чужих глаз или защитить дополнительно. Тогда нужно создать собственные правила.
Опять же, от правил мало проку, если нет возможности проверить политики SELinux, применяемые в той или иной ситуации, и этот вопрос мы также рассмотрим.
Итак, вы убедились, что SELinux присутствует и запущен в правильном режиме работы, и изучили, как обойти его блокировки для допустимых действий; следующим шагом приступайте к применению ваших собственноручно заданных правил. При желании можно просто использовать встроенный в Fedora мастер правил, но уж если вы зашли так далеко, то, скорее всего, захотите знать больше о том, что происходит за кулисами безопасности.
Сперва рассмотрим, что SELinux понимает под ‘user’ [пользователь]. Это не то же самое, что обычный пользователь системы, который может повысить привилегии до root с помощью sudo или su. На самом деле, многие системные пользователи имеют «двойников» в SELinux, поэтому удобнее считать пользователей SELinux подвидом «группы пользователей», каждая из которых может содержать любое количество пользователей системы с одинаковыми ролями и разрешениями. Когда пользователь SELinux упоминается в правиле или системной политике, к его имени обычно приписывается окончание _u (к примеру, bob_u).
Ну, а что такое роль пользователя? Пользователь SELinux может иметь их столько, сколько вы для него зададите, и каждая роль определяется политикой SELinux. Примерами ролей могут быть «посетитель» или «администратор сайта». Пользователи объектов, ассоциированных с ролями, по соглашению обычно имеют в конце имени _r, поэтому при просмотре политики их можно относительно быстро засечь.
Каждое правило должно также ссылаться на ‘type’ [тип] (в Интернете его иногда называют «домен»), определяя, какие ресурсы разрешены к доступу, а какие нет. Опять же согласно правилам, имя типа оканчивается на _t.
Следующим шагом будет создать ‘context’ [контекст] для правила, вооружившись этими тремя понятиями. Это по сути означает помещение пользователя, роли и типа вместе в первой половине правила; но можно использовать их и по отдельности.
Сохраним это в контексте
По желанию вы можете добавить в этот контекст ‘range’ [диапазон], но это не является строго необходимым, пока вы не применяете правила для множества различных типов. Ваш контекст может иметь следующую форму:
user:role:type:range
А контекст без диапазона был бы
system_u:system_r:xserver_t
В данном контексте вы ссылаетесь на пользователя system с ролью system и привилегиями доступа типа xserver (вполне конкретная вещь). Если бы здесь не было двоеточий, вы бы задали правила для всех пользователей system, всех пользователей с ролью system и всех пользователей с привилегиями доступа как у xserver_t; этим условиям, конечно, удовлетворяет гораздо больше пользователей.
Теперь, получив представления о том, что такое ‘context’, вы можете применить свой контекст к любому классу объектов и дать им подходящие права. SELinux предоставляет мириады классов объектов (лучше сказать, категорий объектов) для пользователей, процессов и файлов. Примерами классов объектов будут dir для директорий и file для файлов.
Далее, каждый из этих объектов имеет набор прав, которые вы можете выдавать или отбирать. Например, file может иметь права на создание, разлинковку (удаление), чтение и запись, а объект network – на подключение и передачу данных. Исчерпывающий список всех доступных классов объектов и их ассоциированных прав имеется на сайте проекта SELinux: http://selinuxproject.org/page/ObjectClassesPerms.
Применяем правила
К примеру, выдача ваших прав классов объектов двум различным типам пользователей будет выглядеть так
allow user_t user_home_t:file { create read write unlink };
Как видите, allow используется для разрешения данным конкретным типам пользователей выполнять перечисленные действия над файлами (а для запрещения команда будет deny).
Вы можете применять похожие правила к типам, именам или комбинациям всех трех, о чем мы говорили выше, в зависимости от того, что вы хотите позволить или запретить в вашей системе для определенных объектов; так у вас будет максимальный контроль над тем, как работает ваша машина.
Теперь, когда вы разбираетесь в правилах, должно быть ясно, что глобально насаждаемые системные настройки могут в некоторых ситуациях не работать. К примеру, вам может понадобиться временно изменить часть вашей системы с последующим возвратом умолчаний SELinux.
Вместо глобального изменения режима работы SELinux, что влияет на всю систему, можно просто сменить режим работы отдельного правила, используя semanage:
semanage permissive -a myapp_t
Попробуйте заменить myapp_t на любой другой объект или контекст. Затем просто замените a на d, чтобы вернуть данный объект назад к системным умолчаниям.
Покончив с манипуляциями над SELinux, заставляющими его работать как вам хочется, вы можете обнаружить, что нужно излечить какую-то проблему или вам просто интересно узнать, что делает каждая политика SELinux в том или ином случае. Это особенно удобно, если вы пытаетесь передать файл или установить «нехороший» пакет, от которых SELinux вас защищает. Есть две строки, применяемые в терминале, и в обеих фигурирует магическое и регистрозависимое -Z, о чем упомянуто на множестве сайтов в Интернете:
ls -alZ *
Эта строка выведет список всех файлов в текущей директории с их ассоциированным владельцем, правами и правилами SELinux (просто замените * на имя файла или нужный путь). Похожее действие для процессов, в настоящий момент работающих в системе, выполняет следующая строка:
ps -eZ > example.txt
Она выведет список всех запущенных процессов вместе с их ассоциированными правилами SELinux и затем вставит эту информацию в текстовый файл, чтобы вы его проанализировали. Отобразить все эти данные в окне терминала тоже можно, но это менее удобно: результат будет некрасивый и более сложный для последующей интерпретации.
И, наконец, если нужно проверить, какие активные пользователи системы имеют ассоциированные политики SELinux, просто наберите id -Z в вашем терминале.
Итак, вооружившись чуточкой терпения и этими инструкциями, можете приступать к своим повседневным задачам, в полнойуверенности, что ваш компьютер хорошо защищен.
Любителям приключений
Тем, кто хочет добраться до реальной начинки работающего механизма SELinux или писать и собирать собственные политики безопасности без помощи графического интерфейса или инструментов командной строки, будет полезно узнать, как SELinux размещается в корневом разделе.
Все основные файлы конфигурации, используемые и модифицируемые сопутствующими приложениями и утилитами, доступны в /etc/selinux. Файлы, относящиеся к политикам, находятся в том же каталоге, имеют соответственные имена и снабжены поддиректорией modules, где расположены дополнительные настройки политик. Вы также можете найти имена политик в файле /etc/selinux/config, начиная со строки SELINUXTYPE=.
Модули и файлы SELinux, зависящие от ядра системы, расположены в директории /selinux и содержат текущую конфигурацию и активные политики безопасности. Если вы не абсолютно уверены в своих действиях, лучше держаться подальше от этой директории, потому что последствия ошибок будут катастрофическими – вы можете поломать систему или, чего доброго, заблокировать доступ себе же!
Написание и компиляция своих собственных политик SELinux без инструментов выходит за рамки данного учебника, но на сайте Red Hat опубликован учебник, охватывающий этот высший пилотаж. Но, повторюсь, это для продвинутых пользователей, о чем четко указано по адресу http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/index.html.