Fedora 8 Руководство пользователя — страница 25 из 28

7.7.1. Система контроля доступа

Как мы уже знаем, и Linux есть обычные пользователи и суперпользователь. Обычные пользователи практически не имеют никаких прав. Они могут создавать и изменять файлы только из своего домашнего каталога, а к остальным файлам файловой системы они обычно имеют доступ лишь в режиме "только чтения" (да и то не ко всем файлам).

Суперпользователь - это локальный царь и бог: ему подвластна вся система. Иначе говоря, система безоговорочно выполнит любую команду пользователя root, даже если root прикажет системе уничтожить саму себя. Да, система беззащитна перед пользователем root.

Представим, что пароль root вашей системы каким-то образом узнал очень нехороший человек. Каким именно образом злоумышленник завладел паролем, нас не интересует, для нас важны последствия: злоумышленник получил полный контроль над системой! Все остальное зависит только от него: он может удалить или изменить любые файлы, скопировать любую информацию и т.д.

Но обычные пользователи, несмотря на практически полное отсутствие прав доступа, тоже не совсем безопасны. Да, у обычных пользователей нет доступа к большинству файлов, но не к большинству программ. Обычный пользователь может, например, запустить компилятор gcc, если он установлен. Если пользователь имеет навыки программирования, то он запросто может написать программу, которая узурпирует большую часть процессорного времени или других системных ресурсов (это одна из самых распространенных атак на отказ - DoS-атак), Система не ограничивает использование программ обычными пользователями (конфигураторы являются системными утилитами, поэтому они не в счет).

Для обеспечения необходимой безопасности нам нужна некоторая дополнительная система контроля доступа, которая не даст пользователю root разнести все в пух и прах (умышленно или случайно) и не запретит обычным пользователям захватывать слишком большую часть системных ресурсов.

Система контроля доступа позволяет устанавливать права доступа к файлам не только для отдельных пользователей, но и для отдельных процессов. Например, FTP-серверу ProFTPD не нужен доступ ко всем файлам из каталога /etc. Ему нужен доступ только к каталогу, содержащему его конфигурационные файлы - /etc/proftpd. Контроль доступа к файлам, если установлена система контроля доступа, осуществляется в два этапа.

1. Проверка прав доступа на уровне файловой системы. Если файловая система запрещает доступ к файлу, то дальнейшая проверка не проводится.

2. Проверка прав доступа на уровне SELinux. Если файловая система разрешила доступ к файлу, проводится дополнительная проверка на уровне SELinux.

SELinux (Security-Enhanced Linux - Linux с улучшенной безопасностью) - система принудительного контроля доступа. SELinux считается одной из самых совершенных (понятно, при правильной настройке) систем контроля доступа, обеспечивающих максимальную безопасность. Сейчас она входит в состав ядра Linux и поставляется в составе многих дистрибутивов, Но по-прежнему есть и такие дистрибутивы, в которых SELinux не используется.

Системе SELinux можно доверять только потому, что она была разработана агентством национальной безопасности США, а затем уже была передана миру OpenSource. Такая организация, как NSA, не могла сделать небезопасную систему.

Нужно отметить, что SELinux по-настоящему нужна на сервере или компьютере, содержащем важную информацию. На домашнем компьютере она не нужна, поэтому ее можно смело отключить. В данной главе мы не будем подробно рассматривать все возможности SELinux, поскольку книга рассчитана на рядового пользователя, а не системного администратора, Обычному же пользователю будет достаточно информации, приведенной в этом разделе.

7.7.2. Базовые понятия SELinux: сущность, роль и домен

Чтобы настроить SELinux, вам нужно ознакомиться с ее базовыми понятиями: сущность, роль и домен.

Сущность (identity) является частью контекста безопасности, который задает домены, в которые можно войти. Говоря более простым, языком, сущность определяет, что можно сделать. Например, сущность den определяет, что может сделать пользователь den.

Но сущность не является идентификатором или именем пользователя! Не нужно отождествлять имя пользователя с сущностью: есть имя пользователя den, а есть сущность den. Чтобы нам было понятнее откройте терминал и введите команду id. Вы получите такой вывод:

uid=500(den) gid=500(den) группы=500 (den) context=user_r:system_r:unconfined_t

Теперь введите команду su, а затем снова команду id. Вы получите следующий вывод (рис. 7.14):

uid=0(root) gid=0(root) группы=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_r:system_r:unconfined_t

Обратите внимание: UID (идентификатор пользователя) изменился, а сущность осталась прежней - user_r. Ради эксперимента, введите следующую команду:

/sbin/init 3


Рис. 7.14. Команда id om имени обычного пользователя

Вы перейдете на третий уровень запуска. Войдите в систему как пользователь root. Затем введите команду id, и вы получите следующий вывод (рис. 7.15):

uid=0(root) gid=0(root) группы=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh


Рис. 7.15. Команда id om имени пользователя root

Обратите внимание: изменилась сущность и контекст безопасности. Это доказывает, что сущность никак не привязана к идентификатору пользователя.

Пора разобраться, что же такое роль и домен. Домен (domain) определяет привилегии процесса; он представляет собой список возможностей, т.е. действий, которые разрешены процессу. Описывать данные действия самостоятельно вам не придется, об этом уже позаботились разработчики Fedora, описав более 200 процессов, которые могут выполняться в операционной системе. Все остальные процессы, которые не описаны в политике безопасности, попадают в домен unconfined_t. Данные процессы не защищаются SELinux.

Иногда домен называют типом. Тип (type) - это то же самое, что и домен, но домен относится к процессам, а тип - к файлам, каталогам, сетевым сокетам.

Роль (role) задает список доменов, которые могут быть использованы. Вот пример описания роли в конфигурационном файле (об этом позже): role user_r types user_passwd_t

Данная запись означает, что роли user_r разрешен доступ к домену user_passwd_t, т.е. пользователям с этой ролью разрешено использовать программу passwd для смены своего пароля.

Говоря обобщенно, сущность определяет, какие домены и какие роли, могут быть использованы.

Контекст безопасности состоит из сущности, роли и домена. Контекст безопасности выводится в формате:

context=сущность;роль;домен

Команда id выводит как раз контекст безопасности.

Теперь, когда мы знакомы с основными понятиями SELinux, пора рассмотреть политику безопасности. Политика безопасности - это правила, контролирующие списки ролей, к которым пользователь имеет доступ, доступ доменов к типам, доступ ролей к доменам.

7.7.3. Включение/выключение SELinux в Fedora

Включить или выключить SELinux (кстати, в Fedora SELinux по умолчанию включена) можно с помощью конфигуратора system-config-securitylevel. После запуска конфигуратора нужно в его окне перейти во вкладку Настройка SELinux (рис. 7.16) и задать режим работы SELinux.

Принудительный режим - нормальный режим работы, при котором SELinux будет запрещать доступ к объектам, если это необходимо.

Режим предупреждений - данный режим нужно использовать для отладки работы SELinux: доступ к объектам разрешается, но если SELinux считает, что при выполнении операции нарушена политика безопасности, то будет выведено предупреждение о том, что операция запрещена (предупреждение заносится в файл /var/ log/messages).

Выключен - SELinux не используется.

Рис. 7.16. Окно конфигуратора system-config-securitylevel

Учтите, что при каждом включении/выключении SELinux ваша файловая система будет перемаркирована (рис.7.17). В этой операции нет ничего страшного (при перемаркировке будут изменены контексты безопасности), но она может занять довольно много времени. Перемаркировка производится при первой перезагрузке после включения/выключения SELinux.

Рис. 7.17. Предупреждение о выполнении перемаркировки файловой системы

7.7.4. Каталог /etc/selinих

В каталоге /etc/selinux хранятся конфигурационные файлы и политики SELinux. Главный файл конфигурации - /etc/selinux/config (листинг 7.6)

Листинг 7.6. Главный файл конфигурации SELinux

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELinux=enforcing

# SELINUXTYPE= can take one of these two values:

# targeted - Only targeted network daemons are protected.

# strict - Full SELinux protection.

SELIHUXTYPE=targeted

Директива SELINUX может принимать три значения:

• enforcing - принудительный режим;

• permissive - режим предупреждений;

• disabled - SELinux выключена.

Теперь вы знаете, какой файл редактирует конфигуратор sys-tem-config-securitylevel.

Директива SELINUXTYPE позволяет выбрать тип защиты:

• targeted - будут защищены объекты, описанные в политике безопасности;

• strict - полная защита.

По умолчанию используется политика targeted. Файлы политики strict не установлены по умолчанию. Для их установки (если нужно) используется команда:

# yum install selinux-policy-strict

7.7.5. Управление SELinux

Для управления системой контроля доступом используется конфигуратор system-config-selinux (рис. 7.18). С помощью этого конфигуратора можно полностью настроить SELinux, но чаще всего вы будете посещать раздел Boolean, в котором задаются возможности той или иной сетевой службы - например, FTP-сервера, Web-сеpвepa, Х-сервера и т.д.

Рис. 7.18. Конфигуратор system-config-selinux

Также с помощью этого конфигуратора можно определить привилегии пользователей (User Privs) и администратора (Admin) (рис. 7.19).

Рис. 7.19. Привилегии пользователей

Каталог /selinux - это псевдофайловая система selinuxfs, которую можно использовать как для управления SELinux, так и для получения информации о работе SELinux. Но, как правило, данный каталог используется самой системой SELinux, а для изменения параметров системы намного удобнее использовать конфигуратор system-config-selinux.

7.7.6. Режим предупреждений

Как уже было отмечено, в режиме предупреждений в файл /var/log/messages выводятся предупреждения о запрещении доступа, но сам доступ к объекту не запрещается. Вывести все SELinux сделанные предупреждения можно с помощью команды:

# cat /var/log/messages | audit

Рассмотрим пример типичного сообщения о запрещении доступа к объекту (это не реально сделанное предупреждение, а просто пример предупреждения):

Oct 21 16:l0:l5 dhsilabs kernel: audit(2149208252_610:29):avc: denied {read} for pid=1554 comm="bash" name="/etc/shadow" dev=hda5 ino=13671 sсontext =root:system_r:hotplug_t tcontext-root:object_r:user_home_t tclass=file

Оно означает, что 21 октября в 16:10 на машине dhsilabs процесс bash (comm) с PID (идентификатор процесса) 1554 (pid) попытался открыть для чтения (read) файл /etc/shadow (name) с номером инода 13671 (ino), yстройство, на котором находился файл, называется hda5, контекст безопасности задается как scontext. Операция чтения была запрещена (denied).

7.8. Псевдофайловая система /proc