среда, июля 08, 2009

SELinux Lockdown, 8: Unconfined

оригинал - SELinux Lockdown Part Eight: Unconfined

Продолжаю выкладывать перевод цикла статей по использованию SELinux. Оригинал на английском языке опубликован в блоге Доминика Грифта (Dominick Grift).


Незакрытая (unconfined) область для процессов, которым требуется практически неограниченный (unrestricted) доступ. Почти, потому что не разрешается исполнение (execution) в перезаписываемых областях памяти (writable memory). Для процессов, выполняющихся в незакрытой области, если обратное не определено, ограничены следующие полномочия: Execmem Execstack Execheap Execmod.

прим. перев.: в предыдущих частях термин «unconfined» переводился как «неограниченный», тогда это было не столь принципиально, в этой части близкие термины «(un)confined» и «(un)restricted» встречаются чаще, дабы не превратить всё в масло масленое, для первого термина здесь использую дословное значение.

В установленной по умолчанию Fedora 11 в незакрытом домене (Unconfined Domain) выполняются следующие процессы: ядро Linux, RPM (пакетный менеджер), init scripts (скрипты инициализации) и незакрытые пользователи (unconfined users).
Если иное не определено, незакрытые процессы обычно запускают также незакрытые программы. Предполагается, что незакрытые процессы неограниченны и что потомки наследует это незакрытое окружение. Исключения из этого правила, как было сказано, должны быть определены путём создания политики, определяющей переходы из незакрытого домена в ограниченные области при запуске программ незакрытым процессом.

Можно существенно повысить безопасность, удалив незакрытую область. В результате все процессы будут ограниченны SELinux. В Fedora 11 незакрытую область разделили на две части. Первая часть – незакрытая область для программ, вторая часть – незакрытая область для пользователей. Вторую часть переименовали в «unconfineduser domain».

Результат этого разделения позволяет удалить одно из двух или оба окружения сразу. При удалении домена unconfined, являющегося доменом для незакрытых программ, будут ограничены init-скрипты. В итоге системные службы, для которых не определена политика SELinux, будут запускаться в ограниченном окружении init-скрипта и не будут работать неограниченными. Это отличный способ обеспечить отсутствие в системе неограниченных системных служб. Процессы ядра и RPM останутся незакрытыми (unconfined), потому что этим процессам для нормальной работы требуется слишком много полномочий.

Для обеспечения работы всех операторов в ограниченном окружении можно удалить домен unconfineduser. В случае принятия решения об удалении домена unconfineduser необходимо соответствующим образом изменить конфигурацию сопоставлений SELinux (SELinux mappings).

Если оператор уверенно владеет SELinux (feels comfortable with) не должно быть причин, чтобы не удалить домен unconfined. При необходимости он сможет реализовать политику SELinux для любого системного процесса, не имеющего пока ещё своей политики.

Домен unconfineduser обычно удобнее сохранить, так как оператор имеет возможность вручную определить, каким конкретно пользователям Linux сопоставить этот домен. Настройками SELinux можно не разрешать незакрытые входы в систему через OpenSSH или графический интерфейс пользователя. Это означает, что пользователи имеющие доступ к домену unconfineduser могут входить, используя это окружение, только на TTY (терминал) или получать доступ к незакрытой области посредством команд sudo или su вместе с newrole.

Использование незакрытого пользовательского домена в качестве дополнительного домена повышает безопасность, только если не допускается незакрытый вход в систему.

Пример:
Удалим домен unconfined, запретим вход незакрытых пользователей, сопоставим роль unconfined_r существующему пользователю SELinux staff_u, удалим пользователю SELinux staff_u роль sysadm_r. Добавим Linux-пользователя John, сопоставим его SELinux-пользователю staff_u и добавим для него запись в файл /etc/sudoers.

sudo setsebool -P unconfined_login off
sudo semanage user -m -L s0 -r s0-s0:c0.c1023 -R "staff_r system_r unconfined_r" -P user staff_u
sudo semodule -r unconfined
sudo useradd -Z staff_u john
sudo visudo (john ALL=(ALL) TYPE=unconfined_t ROLE=unconfined_r ALL)


John входит в систему как ограниченный SELinux-пользователь staff_u. Когда John хочет получить привилегии пользователя root он просто выполняет команду sudo. John может открыть оболочку пользователя root (root shell) в незакрытой области, запустив команду sudo с опцией -s.

Такая конфигурация не должна сильно изменить ваши привычки (ways of doing things), потому что не поощряется вход от имени пользователя root, а ограниченный домен staff_t имеет все необходимые полномочия, требуемые непривилегированному пользователю. Также можно создать собственный домен пользователя, специально под ваши персональные требования и сопоставить его роль специально созданным пользователям SELinux вместе с ролями system_r и unconfined_r. Так вы сможете сохранить в оригинальном виде SELinux-пользователя staff_u и изменять под ваши требования созданные домен и пользователя SELinux.

Вывод:
Обдумайте удаление доменов Unconfined и Unconfineduser для повышения безопасности.

Справка: man semanage, man semodule, man visudo, man setsebool, man sudo

Комментариев нет: