Данный документ исправлен и дополнен, чтобы соответствовать
особенностям новой реализации SE Linux. Старый вариант документа
"Getting Started with SE Linux HOWTO" остается в силе, однако для всех
новых инсталляций SE Linux рекомендуется использовать новую реализацию
SE Linux. Новая реализация SE Linux работает на ядрах ветки 2.6.x, а
также была портирован для ветки 2.4.x. Этот документ во многом
дублирует предыдущий, однако содержит необходимые изменения.
Документ представляет собой введение в NSA Security Enhanced Linux. В
основном рассматривается дистрибутив Debian, потому примеры команд по
управлению пакетами специфичны для Debian. Этот документ предназначен
людям, которые хотят начать использовать SE Linux, так что сложные
моменты не рассматриваются. В разделе "Ссылки" представлены ссылки на
различные материалы по SE Linux.
______________________________________________________________________
Содержание
1. Введение
1. Обратная связь
2. Отказ от ответственности
3. Новые возможности нового SE Linux
4. Каталог исходных политик для пользователей Fedora
2. Обзор
1. Почему SE Linux?
2. Используемая терминология
1. сущность
2. домен
3. тип
4. роль
5. контекст безопасности
6. переход
7. политика
3. Установка
1. Установка основных пакетов для Debian
1. Модифицированные утилиты управления пакетами для Debian
2. Установка основных пакетов для Fedora
3. Установка пакетов, связанных с SE Linux
1. Установка ядра с поддержкой LSM
2. Установка пакета selinux-policy-default
3. Редактирование файла /etc/fstab и создание точки монтирования /selinux
4. Выполнение make relabel
5. Редактирование файлов /etc/pam.d/login и /etc/pam.d/ssh
6. Добавление пользователей
4. Вход в систему
1. Передача пользовательского контекста при регистрации в системе
2. Изменение контекста командой newrole -r
3. Выполнение программ в домене sysadm_t
4. Разрешающий и принудительный режимы
5. Сравнение результатов выполнения команд в различных ролях
5. Создание учётных записей
1. Создание нового пользователя
2. Присвоение ролей пользователям и активация изменений
3. Установка контекста безопасности по умолчанию для пользователей
4. Перемаркировка домашнего каталога пользователя
6. Добавление нового пользовательского домена
1. Редактирование файла пользовательских доменов
2. Создание нового тестового пользователя
7. Разбор стандартных сообщений
8. Ссылки
______________________________________________________________________
1. Введение
Данный документ составлен в ответ на просьбы людей о вводном курсе для
SE Linux. Он охватывает базовые аспекты SE Linux, такие как
терминология, установка и добавление новых пользователей, а так же
некоторые другие. Кроме того, будет составлен более углублённый
документ, который рассмотрит вопросы редактирования файлов политик
(обычно, начинающий пользователь SE Linux с таким объемом информации
справиться не может, потому здесь она не включена).
1.1. Обратная связь
Приветствуются комментарии по данному документу. Пожалуйста, пишите на
адрес faye@lurking-grue.org
1.2. Отказ от ответственности
Этот документ всего лишь руководство. Я настойчиво рекомендую вам для
начала устанавливать SE Linux на тестовой машине и лишь потом на
производственных серверах.
1.3. Новые возможности нового SE Linux
Новая реализация SE Linux включает значительное число новых функций.
Давайте рассмотрим их.
Файловая система /selinux
Появилась новая файловая система /selinux. При установке необходимо
соответствующим образом отредактировать файл /etc/fstab. Как и
файловая система /proc, /selinux является псевдофайловой системой. При
выполнении команды ls -l /selinux мы получим
total 0
-rw-rw-rw- 1 root root 0 Nov 25 11:27 access
-rw-rw-rw- 1 root root 0 Nov 25 11:27 context
-rw-rw-rw- 1 root root 0 Nov 25 11:27 create
-rw------- 1 root root 0 Nov 25 14:19 enforce
-rw------- 1 root root 0 Nov 25 11:27 load
-r--r--r-- 1 root root 0 Nov 25 11:27 policyvers
-rw-rw-rw- 1 root root 0 Nov 25 11:27 relabel
-rw-rw-rw- 1 root root 0 Nov 25 11:27 user
Если вывести файл "enforce", то будет показана либо 1 в принудительном
(enforcing) режиме, либо 0 в разрешающем (permissive) режиме.
Использование расширенных атрибутов
Новая реализация SE Linux использует расширенные атрибуты для хранения
контекста безопасности. Ваше ядро должно иметь поддержку расширенных
атрибутов. Расширенные атрибуты представляют собой кортежи, вида
"имя-данные". Например, security.selinux это имя атрибута, а контекст
безопасности -- это данные. Контекст безопасности файла можно
просмотреть с помощью команды ls --context filename (рассмотрено далее
в документе) при работающем SE Linux, иначе необходимо использовать
команду getfattr. Помните, что вам нужно установить пакет attr и
прочесть страницу руководства команды getfattr. Выполнение команды
даёт следующие результаты:
faye@kaos:~$ getfattr -m . -d /etc/passwd
getfattr: Removing leading '/' from absolute path names
# file: etc/passwd
security.selinux="system_ubject_r:etc_t 00"
Атрибут security.selinux имеет контекст, соответствующий
запрашиваемому файлу. Т.е. в вышеприведённом примере контекст это
system_ubject_r:etc_t. Все файлы на файловых системах ext2 и ext3 в
новом SE Linux имеют атрибут security.selinux (новая важная
особенность). Если вы загрузитесь с ядром без поддержки SE Linux,
расширенные атрибуты не исчезнут, и вы сможете видеть их. Расширенные
атрибуты устанавливаются при запуске команды setfiles, которая
устанавливает контекст безопасности файлов в рамках операции make
relabel.
Загрузка политики SE Linux процессом init .
Теперь на процесс init возложены функции по монтированию файловой
системы /selinux и загрузке политики.
SID и PSID больше не используются
Идентификаторы безопасности (SID, Security Identifiers) использовались
в старой реализации SE Linux в интерфейсе к ядру (из пользовательского
пространства). Персистентные идентификаторы безопасности (PSID,
Persistent SID) использовались в коде ядра для отображения файлов в
контексты для файлов и каталогов на диске. Обратитесь к документу NSA
"Настройка политики SELinux" за подробной информацией по этому
вопросу. В новой реализации SE Linux, расширенные атрибуты содержат
контекст, потому идентификаторы больше не нужны.
Сокращённый параметр -Z
Параметр -Z может использоваться вместо --context после таких команд,
как ls и ps.
Команда chsid удалена: используйте команду chcon .
Команда chsid применялась в старой реализации SE Linux для изменения
контекста файла. В новой реализации для этих целей применяется команда
chcon. Эта команда присутствовала и в старом SE Linux, но была
переработана и поддерживает установку пользователя и типа. Обратитесь
к руководству за подробностями.
1.4. Каталог исходных текстов политик для пользователей Fedora
В дистрибутиве Debian, исходные тексты политики расположены в каталоге
/etc/selinux. В Fedora они находятся в
/etc/security/selinux/src/policy. В данном документе я использую
каталог в дистрибутиве Debian, так что если вы пользователь Fedora
заменяйте /etc/selinux на /etc/security/selinux/src/policy.
______________________________________________________________________
2. Обзор
В этом разделе приведены некоторые сведения, которые объясняют для
чего нужно использовать SE Linux и как он работает. Раздел 2.2
определяет термины, которые будут часто использоваться в дальнейших
разделах, поэтому в них нужно хорошо разобраться.
2.1 Почему SE Linux?
SE Linux обеспечивает большую безопасность вашей системы.
Пользователям могут быть назначены предопределённые роли таким
образом, что они не смогут получить доступ к файлам и процессам,
которыми они не владеют. При этом не существует эквивалента операции
"chmod 777". Это отличается от обычной системы Unix-привилегий в том,
что определённые пользователем роли, или контексты безопасности в
которых они находятся, имеют ограниченный, но более управляемый доступ
к файлам и другим ресурсам. Рассмотрим пользовательский файл .rhosts
на обычной Unix системе. Если всем дать доступ на запись в этот файл,
тогда кто угодно сможет зайти в систему и причинить массу
неприятностей. Используя SE Linux, вы можете контролировать
возможность пользователя изменять права доступа в своему файлу
.rhosts, а кроме того запретить другим людям писать в этот файл даже
после того, как владелец это разрешил.
Частый вопрос, это как связаны права доступа SE Linux и стандартные
права Unix. Когда вы выполняете какую-либо операцию, в первую очередь
проверяются права доступа Unix. Если они разрешают выполнить операцию,
тогда проверяются права SE Linux. Только тогда операция будет
разрешена или запрещена. Но если права доступа Unix запрещают
операцию, то проверка прав SE Linux не производится, а операция
запрещается.
Рассмотрим другой пример. Допустим, есть ошибка в программе
/usr/bin/passwd, которая позволяет выполнить команду chmod 666
/etc/shadow. В этом случае вступают в действия права SE Linux, которые
предотвратят неавторизированный доступ к файлу.
Чтобы не цитировать документ NSA FAQ, я просто даю на него ссылку --
http://www.nsa.gov/selinux/faq.html Чтение официальных документов,
которые публикует NSA обязательно.
2.2 Используемая терминология
Следующие термины будут часто употребляться в этом документе и
формируют концептуальную основу SE Linux. Весьма сложно определить
одно слово, не употребляя при этом других, требующих определения. Я
понимаю, что мои определения содержат то, что требует определения. ;)
2.2.1 сущность (identity)
Сущность в SE Linux это не то же, что и традиционный идентификатор
пользователя (Unix uid, user id). Они могут сосуществовать в одной
системе, но их смысл совершенно разный. Сущность в SE Linux формирует
часть контекста безопасности, который задает домены, в которые можно
войти. Т.е. что собственно можно сделать. Сущность SE Linux может
иметь одинаковое с именем пользователя символьное представление (чаще
всего так и есть), но важно понимать, что это две разные вещи.
Выполнение команды su не меняет сущности пользователя в SE Linux.
Пример:
Непривилегированный пользователь faye выполняет команду id (в SE
Linux) и видит свой контекст безопасности:
context=faye:user_r:user_t
Часть контекста "faye" представляет сущность. Теперь, пользователь
faye выполняет su, чтобы получить привилегии пользователя root, и
вызывает id, и видит, что контекст всё ещё:
context=faye:user_r:user_t
то есть, контекст остался прежним и не изменился на контекст
пользователя root. Однако, если сущность faye разрешает доступ к роли
sysadm_r, и пользователь это сделает (введя команду newrole -r,
детальнее команда рассматривается ниже), и снова выполнит id, то
увидит уже:
context=faye:sysadm_r:sysadm_t
Итак, сущность осталась той же, но роль и домен (второе и третье поле
соответственно) изменились. Такой стиль работы с сущностью
обеспечивает возможность идентификации пользователя. Ключевым моментом
в безопасности системы является то, что сущность пользователя
определяет какие роли и домены могут быть использованы.
2.2.2 домен (domain)
Каждый процесс выполняется в домене. Домен однозначно определяет
привилегии процесса. По существу домен это список того, что может
делать процесс, или какие действия процесс может выполнять над
различными типами. Представляйте себе домен, как стандартный Unix uid.
Пускай у пользователя root есть какая-то программа, для которой он
выполнил команду chmod 4777 (установил атрибут setuid). Кто угодно в
системе, даже пользователь nobody, может выполнить эту программу с
полномочиями пользователя root, тем самым, нарушая безопасность
системы. При использовании SE Linux, процесс, инициирующий переход в
привилегированный домен, должен иметь роль, которой разрешено
использовать этот домен, иначе процесс работать не сможет.
В качестве примеров доменов можно привести sysadm_t, домен системной
администрации, и user_t, который является общим доменом для
непривилегированных пользователей. Процесс init выполняется в домене
init_t, а named -- в домене named_t.
2.2.3 тип (type)
Тип задаётся для объекта и определяет доступ к этому объекту. Т.е. это
приблизительно то же самое, что и домен, но домен относится к
процессам, а тип к таким объектам, как каталоги, файлы, сокеты и т.п.
2.2.4 роль (role)
Роль определяет, какие домены могут быть использованы. Домены, к
которым имеет доступ пользовательская роль, предопределяются в
конфигурационных файлах политики. Если роль не имеет доступа к
заданному домену (в базе данных политики), то при попытке выполнить
это действие доступ будет запрещён.
Пример:
для того, чтобы разрешить пользователю из домена user_t (домен
непривилегированных пользователей) выполнять команду passwd, в
соответствующем файле конфигурации указано:
role user_r types user_passwd_t
Она означает, что пользователь с ролью user_r может входить в домен
user_passwd_t, т.е. может выполнять команду passwd.
2.2.5 контекст безопасности (security context)
Контекст безопасности это набор всех атрибутов, связанных с объектами
типа файлов, каталогов, процессов, TCP сокетов и т.п. Контекст
безопасности состоит из сущности, роли и домена или типа. Увидеть свой
собственный контекст вы можете, выполнив команду id в SE Linux.
Важно понимать различие между доменом и типом, иначе у вас будут
затруднения с пониманием дальнейшего материала.
У процессов есть домен. Когда вы смотрите контекст безопасности
процесса (пример команды приведен в следующем разделе), последнее поле
-- это домен, например user_passwd_t (если выполняется программа
passwd).
Такие объекты как файлы, каталоги, сокеты и т.п. имеют типы. Например,
при выполнении команды ls --context для файла, последнее поле
представляет тип, такой как user_home_t для файлов, созданных в
домашнем каталоге пользователя с ролью user_r.
Вот здесь и накапливается непонимание, где есть домен, а где тип.
Рассмотрим файловую систему /proc. У каждого процесса есть домен, а в
файловой системе /proc для каждого процесса есть каталог. Каждый
процесс имеет метку, или точнее, контекст безопасности, в применении к
файлу. Но в файловой системе /proc, метка содержит тип, а не домен. Не
смотря на то, что /proc представляет собой выполняющиеся процессы,
содержимое /proc является файлами, а потому имеет тип, а не домен.
Вызов команды ls --context /proc выдаёт следующую информацию для
процесса init (процесс с идентификатором 1):
dr-xr-xr-x root root system_u:system_r:init_t 1
Метка, или контекст безопасности, говорит нам о том, что этот файл
имеет тип init_t. Но, кроме того, это значит, что процесс init
выполняется в домене init_t. Каждый файл и каталог файловой системы
/proc, соответствующий некоторому процессу, также следует этому
соглашению, т.е. тип, указанный в выводе команды ls --context
соответствует, так же, домену в котором выполняется процесс.
Ещё одним важным моментом является то, что команды chsid (изменить
идентификатор безопасности) и chcon (изменить контекст) не работают на
файловой системе /proc, т.к. она не поддерживает изменение меток.
Контекст безопасности файла, например, может варьироваться в
зависимости от домена, который создал файл. По умолчанию, новый файл
или каталог наследует тип от родительского каталога, однако вы можете
задать иную политику.
Пример:
пользователь faye создаёт файл test в своем домашнем каталоге. После
чего выполняет команду ls --context test и видит:
-rw-r--r-- faye faye fayebject_r:user_home_t test
Теперь faye создаёт файл в каталоге /tmp с именем tmptest и выполняет
команду ls --context /tmp/tmptest. Теперь результат такой :
В первом примере контекст безопасности включал тип "user_home_t",
который является типом по умолчанию для домашнего каталога
непривилегированного пользователя с ролью user_r. После выполнения
второй команды ls --context, видим, что тип теперь user_tmp_t. Это тип
по умолчанию для файлов, созданных процессами домена user_t в каталоге
типа tmp_t.
2.2.6 переход (transition)
Решение о переходе, определяет контекст безопасности, который будет
назначен запрошенной операции. Есть два основных типа переходов.
Первый тип, это переход домена процесса. Он используется при
выполнении процесса определённого типа. Второй, это переход типа
файла, который применяется при создании файла в определённых
каталогах.
Пример:
Пример перехода второго типа (переход типа файла) приведён в
предыдущем разделе "контекст безопасности". При выполнении команды ls
--context вы можете видеть тип файла (т.е. user_home_t и user_tmp_t в
вышеприведённом примере). Итак, при создании пользователем файла в
каталоге /tmp происходит переход в тип user_tmp_t и новый файл
помечается соответствующим образом.
Рассмотрим теперь пример перехода домена процесса. Запустите ssh
из-под обычного пользователя, или, точнее, из домена user_t (помните,
что для проверки текущего контекста безопасности можно использовать
команду id). Теперь выполите ps ax --context и найдите строку с
данными о команде ssh. Полагая, что это сделал пользователь faye, она,
в частности, увидит:
faye:user_r:user_ssh_t
Процесс ssh выполняется в домене user_ssh_t потому что программа имеет
тип ssh_exec_t, а роль user_r имеет право доступа в домен user_ssh_t.
2.2.7 политика (policy)
Политики -- это наборы правил, контролирующие такие вещи как список
ролей, к которым имеет доступ пользователь, какие роли имеют доступ к
каким доменам и какие домены имеют доступ к каким типам. Вы можете
редактировать файлы политик в соответствии с тем, как вы хотите
настроить свою систему.
______________________________________________________________________
3. Установка
Данный раздел описывает процедуру инсталляции пакетов для новой
реализации SE Linux. Поскольку я работаю с Debian, мои инструкции
относятся к этому дистрибутиву. Предполагается, что вы знаете, как
устанавливать пакеты в вашем дистрибутиве, как компилировать ядро и
накладывать на ядро патчи.
Если вы обновляетесь со старой версии SE Linux на новую, и работаете с
ядром, поддерживающим SE Linux, вам следует перейти в разрешающий
режим (при помощи команды avc_toggle) и следовать приведённым
инструкциям.
3.1 Установка основных пакетов для Debian
Для Debian unstable:
Поместите следующую строку в файл /etc/apt/sources.list :
deb http://www.coker.com.au/newselinux/ ./
Пакеты для ветки unstable поддерживаются Расселом Кокером (Russell
Coker).
На момент написания документа (конец ноября 2003) пакетов с новой
реализаций SE Linux для ветки stable не было. Файлы .deb могут быть
загружены с указанного узла. Обязательно загружайте самые свежие
пакеты. Я не указываю полных имён пакетов, поскольку они постоянно
меняются.
Вот список пакетов, которые необходимо установить для работы нового SE
Linux на системе Debian unstable. Вам не нужно загружать ядро с
поддержкой SE Linux для установки этих пакетов:
* libselinux1
содержит разделяемые библиотеки для нового SE Linux.
* selinux-policy-default
содержит примеры политик для многих используемых программ, таких
как postfix, sendmail, X и forth.
* checkpolicy
содержит компилятор исходных текстов политик.
* policycoreutils
содержит базовые утилиты: setfiles, load_policy, newrole и пр.
* selinux-utils
содержит утилиты для различных операций, например выполнения
запросов к политике.
* selinux-doc
содержит некоторую документацию.
Ниже приведены дополнительные пакеты для Debian, которые вам
понадобятся.
* kernel-patch-2.4-lsm
патч для поддержки LSM и SE Linux.
* coreutils
пакет coreutils, содержащий модифицированные версии команд cp, mv,
ls и т.п.
* procps
пакет procps содержит модифицированные версии команд ps и top.
* sysvinit
содержит патч для загрузки политики при старте системы.
* dpkg
необходим модифицированный dpkg, который будет корректно
маркировать файлы после установки пакетов.
* libpam-modules
иногда для аутентификации программе нужен доступ к файлам passwd и
shadow. Если в такой программе есть ошибка, злоумышленник может
получить содержимое файла shadow, запустить что-то вроде программы
crack и у вас появляется новая проблема. При использовании
libpam-modules программе не нужно иметь прямой доступ к файлу
shadow. Вместо этого, программа (которая хочет аутентифицировать
пользователя) вызывает вспомогательную программу-посредника,
которая сравнивает переданный ей пароль с содержащимся в файле
/etc/shadow и возвращает код 1 или 0, означающий совпадают они или
нет. В этом случае для получения содержимого файла shadow
необходимо взломать программу-посредник, а не вызывающую
программу.
* logrotate
содержит модифицированную версию logrotate, которая выставляет
контекст безопасности на новых файлах.
* cron
необходим модифицированный пакет cron, чтобы скрипты и программы
запускались в нужном домене, проверялся владелец для входа в домен
cron.
3.1.1 Модифицированные утилиты управления пакетами для Debian
Пользователи Debian должны быть знакомы с командами dselect, apt-get и
dpkg. se_dselect, se_apt-get и se_dpkg представляют собой
скрипты-надстройки для вызова обычных версий ds-elect, apt-get и dpkg,
но с некоторыми нюансами. То же самое относится и к
se_dpkg-reconfigure. Зачем нужны эти модифицированные версии? Чтобы
корректно маркировать файлы устанавливаемых пакетов и запускать
скрипты в нужном контексте.
При использовании этих команд у вас запросят подтверждение пароля
(пароль сущности, которую вы используете). Зачем? Для примера возьмём
команду se_dselect. Запустим её из контекста sysadm_r:sysadm_t. Теперь
из другого сеанса, с тем же контекстом, выполним ps ax --context|grep
dselect и увидим что-то вроде:
5292 404 system_u:system_r:dpkg_t dselect
обратите внимание на контекст безопасности, в котором сейчас
выполняется dselect. Как видите, изменилась сущность, роль и домен.
Потому для выполнения этой программы вам нужно подтвердить свой
пароль.
3.2 Установка основных пакетов для Fedora
Пакеты RPM с новой реализацией SE Linux могут быть получены с узла
ftp://people.redhat.com/dwalsh/SELinux
Эти пакеты поддерживаются Дэном Уолшем (Dan Walsh).
Для установки SE Linux на тестовой машине с дистрибутивом Fedora я
сделала следующее:
* отредактировала файл yum.conf, чтобы он содержал такие строки:
[development]
name=Fedora Core $releasever - Development Tree
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/i386
baseurl=http://mirror.dulug.duke.edu/pub/fedora/linux/core/development/i386
* после этого, выполнила такие команды
cd /etc/security/selinux/src/policy
make load
make relabel
* перезагрузила машину.
3.3 Установка пакетов, связанных с SE Linux.
В старой реализации SE Linux пакеты было необходимо устанавливать в
определённом порядке, например, в первую очередь следовало
устанавливать обновлённый пакет login. В настоящий момент порядок
установки определяют зависимости пакетов.
3.3.1 Установка ядра с поддержкой LSM
Пакет kernel-patch-2.4-lsm устанавливает необходимый патч LSM для
нового SE Linux. Он содержит поддержку LSM и код SE Linux, который её
использует.
Теперь прочтите /usr/share/doc/kernel-patch-2.4-lsm/README.Debian и
следуйте инструкциям по установке параметров CONFIG_ для компиляции
вашего ядра. После чего переходите к компиляции нового ядра или
используйте make-kpkg для создания пакета.
Вот выдержка из /usr/share/doc/kernel-patch-2.4-lsm/README.Debian:
Данный патч реализует поддержку Linux Security Modules. Она
необходима для NSA Security Enhanced Linux (среди прочего).
Для автоматического наката, перед первым запуском make-kpkg (из
пакета: kernel- package) установите PATCH_THE_KERNEL=YES и выполните
"make-kpkg clean".
Во время конфигурации ядра выберите следующие параметры:
(В Networking Options, выберите Network Packet Filtering.
В Security Options, выберите Capabilities, IP Networking и
SELinux. Последние две опции должны быть скомпилированы статически.)
Это означает, что в вашем конфигурационном файле /usr/src/linux/.config должн
о присутствовать:
Параметры CONFIG_EXT3_FS_XATTR_USER и CONFIG_EXT3_FS_XATTR_TRUSTED для
SE Linux не требуются, но и не мешают.
Если вы скомпилировали ядро с параметром
CONFIG_SECURITY_SELINUX_DEVELOP, система будет загружаться в
разрешающем режиме, а переход в принудительный режим должен
осуществляться вручную. Если же этот параметр не был задан, то после
загрузки вы будете работать в принудительном режиме, без возможности
переключиться в разрешающий режим. Подробнее это рассматривается в
разделе 4.4: "Разрешающий и принудительный режимы".
Если вы используете файловую систему ext2, вам необходимо собрать ядро
с параметром CONFIG_EXT2_FS_XATTR. Если вы хотите иметь возможность
монтировать файловую систему ext3, не создавая при этом расширенных
атрибутов, то в этом случае компиляция ext2 без поддержки XATTR может
быть одним из решений. Тогда файловую систему ext3 можно смонтировать
как файловую систему ext2 без поддержки расширенных атрибутов (просто
отредактируйте файл /etc/fstab).
3.3.2 Установка пакета selinux-policy-default
Этот пакет содержит стандартные политики безопасности. Эквивалентный
пакет RPM называется policy-sources.
При установке этого пакета в Debian вам будут заданы вопросы о нужных
вам политиках. Вы решаете, какие политики вам нужны, а какие нет. Если
вдруг окажется, что нужна политика, от которой вы отказались, то в
любой момент вы можете её скопировать из
/usr/share/selinux/policy/default/domains/program/ в
/etc/selinux/domains/program и выполнить из любого каталога команду
make -C /etc/selinux load.
Маленькое замечание о политике sendmail.te -- её лучше удалить,
поскольку она конфликтует с политиками других почтовых серверов.
Естественно, если вы не используете сервер sendmail. В этом случае, вы
не будете устанавливать политики других почтовых серверов.
Вопросы будут выглядеть следующим образом:
Removal of unwanted policy files
Do you want domains/program/amavis.te:Amavis anti-virus Yes/No/Display[Y/n/d]?
Если вы ответите Y, файл политики amavis.te будет установлен. Если вы
ответите n, политика установлена не будет (но вы сможете скопировать
её позже, как было указано ранее). Выбор d выведет указанный файл
политики.
Когда вы закончите, выбранные политики будут скомпилированы и
установлены.
На этом этапе наступает ответственный момент. Каждый файл маркируется
контекстом безопасности.
3.3.3 Редактирование файла /etc/fstab и создание точки монтирования /selinux
Перед перезагрузкой вам потребуется отредактировать файл /etc/fstab и
создать точку монтирования /selinux. Итак, создавайте каталог /selinux
и устанавливайте права доступа 500. Теперь вставьте в файл /etc/fstab
строку:
none /selinux selinuxfs noauto 0 0
3.3.4 Выполнение make relabel
Если у вас установлено ядро 2.6.x с поддержкой XATTR, после создания
точки монтирования и редактирования /etc/fstab, вы должны выполнить
команду make -C /etc/selinux relabel. Эта команда перемаркировывает
файловую систему правильными контекстами безопасности. Обратите
внимание, что вам нужно будет выполнить команду повторно, после
перезагрузки (обсуждается далее в документе). Если вы используете ядро
2.4.x, то вы не сможете выполнить эту команду, так как ядра 2.4.x без
поддержки SE Linux не позволяют задавать расширенные атрибуты.
3.3.5 Редактирование файлов /etc/pam.d/login и /etc/pam.d/ssh
Перед перезагрузкой мы должны отредактировать файлы /etc/pam.d/login и
ssh (sshd в Fedora), чтобы командный интерпретатор запускался в
правильном контексте. Добавьте в эти файлы строку:
session required pam_selinux.so
3.3.6 Добавление пользователей
До перезагрузки вы можете добавить нового пользователя для SE Linux
командой useradd и отредактировать файл users. Это можно сделать и
после перезагрузки. В этом документе мы добавим пользователя позже.
Теперь вы готовы к перезагрузке. Как только вы загрузите ядро, с
поддержкой SE Linux, вы будете должны перемаркировать все файловые
системы.
______________________________________________________________________
4. Вход в систему
В этом разделе мы рассмотрим процесс регистрации пользователя в
системе и немного поговорим о контекстах безопасности пользователей.
Последний раздел будет посвящен разрешающему и принудительному
режимам.
4.1 Передача пользовательского контекста при регистрации в системе.
На этом этапе вы должны были уже перезагрузиться и увидеть приглашение
в систему. При установке пакета selinux-policy-default (или
policy-sources для Fedora), политика разрешает вход в систему для роли
пользователя по умолчанию (поскольку новых пользователей мы еще не
добавляли).
Зарегистрируйтесь как пользователь root. Ваш контекст безопасности
будет root:user_r:user_t. Введите id и посмотрите на контекст. Там
должно быть примерно следующее (нас интересует контекст безопасности,
на остальную часть вывода сейчас не обращайте внимания):
итак, в этой строке контекст безопасности представлен выражением
root:user_r:user_t
Теперь давайте представим, что вы ранее разрешили доступ своему
пользователю к другой роли. Этому посвящён раздел 5: "Создание
учётных записей пользователей". Есть два способа переключения между
ролями. Во-первых, при регистрации. Допустим, пользователю faye
разрешено входить в домен sysadm_t. При регистрации на консоли она
увидит вопрос "Your default context is faye:user_r:user_t. Do you want
to choose a different one? [n]" (Ваш контекст по умолчанию
faye:user_r:user_t. Хотите выбрать другой?). Если пользователь ответит
y, система даст возможность выбора контекста:
[1] faye:user_r:user_t
[2] faye:sysadm_r:sysadm_t
Enter number of choice:
В этом примере мы видим, что сущности "faye" разрешён доступ к роли
sysadm_r и домену sysadm_t. Выводятся лишь те варианты, к которым
имеет доступ сущность. Обратите внимание, что это работало в старой
реализации SE Linux и будет настраиваемой возможностью в новой
реализации SE Linux (не доступной на момент написания), которая по
умолчанию будет выключена.
Если пользователь faye выберет второй вариант (чтобы получить роль
sysadm_r), после чего вызовет команду id, она увидит, что её контекст
теперь:
context=faye:sysadm_r:sysadm_t
Перейдём теперь ко второму способу переключения контекстов.
4.2 Изменение контекста командой newrole -r
Второй способ переключения контекстов безопасности -- это команда
newrole -r. Синтаксис этой команды:
newrole -r role
где role -- это роль, которую вы хотите получить. Например, если вы
хотите получить роль sysadm_r, вы должны ввести:
newrole -r sysadm_r
Вас попросят подтвердить пароль для вашей сущности, увидеть которую вы
можете с помощью команды id. Если у вас нет прав доступа к указанной
роли, вы увидите следующее сообщение (положим, что сущность fred
пытается получить доступ к роли sysadm_r):
fred:sysadm_r:sysadm_t is not a valid context
Это сообщение означает, что fred не может войти в sysadm_r:sysadm_t
роль/домен, так как у него нет на это прав.
После успешного изменения роли используйте команду id для проверки
своего текущего контекста.
4.3 Выполнение программ в домене sysadm_t
Для выполнения команд из домена sysadm_t ваша роль должна быть
sysadm_r. Сейчас мы должны немного прибраться после установки, так что
давайте зарегистрируемся в системе как пользователь root. Вас не будут
спрашивать о контексте.
Я должна извинится за некоторую непоследовательность и повторяемость в
инструкциях. В этом документе мы ещё не разрешали пользователю root
доступ к роли sysadm_r и вы, вероятно, думаете о том, как мы сможем
выполнять административные задачи из контекста user_r:user_t. Мы
работаем в разрешающем режиме, который лишь имитирует выполнение
политики безопасности и протоколирует результат. Кроме того, вы можете
использовать команду newrole -r для переключения в роль sysadm_r. Если
вы попытаетесь выполнить что-либо, для чего у вас нет полномочий, вы
получите не один экран сообщений об ошибках.
Итак, получите роль sysadm_r и проверьте свой контекст командой id.
Теперь мы можем работать дальше. Когда мы установили все необходимые
пакеты в разделе 3, мы пометили все файлы файловой системы. Но SE
Linux ещё не был запущен. Таки образом, если файл был создан после
процесса маркировки, но до загрузки ядра SELinux, то он не имеет
ассоциации с типом. Например, файлы могли создаться во время
завершения работы системы. Возможен другой вариант, вы удалили файл.
Теперь освободившийся индексный дескриптор может быть использован для
другого файла и в результате новый файл получит тип удаленного. Это
может причинить массу хлопот.
Рассмотрим файл /etc/nologin. Он создается при выполнении команды
shutdown. Если этот файл существует при загрузке системы,
зарегистрироваться может только пользователь root. Что случится, если
скрипты загрузки системы не смогут удалить этот файл? Например, если
метка файла будет неправильной? Если пользователь root имеет доступ к
роли sysadm_r, то вы можете зарегистрироваться в системе и удалить
этот файл -- проблема решена.
Что случится, если вы не дали прав доступа к роли sysadm_r сущности
root? В этом случае, контекст может быть root:user_r:user_t. Но домен
user_t не дает вам возможности удалять что-либо из каталога /etc. Вот
и проблема! Вы можете зарегистрироваться как пользователь root, но у
вас нет привилегий роли sysadm_r чтобы что-то сделать.
Далее, допустим, что у вас есть своя сущность с именем "faye". Этой
сущности назначена роль sysadm_r. То есть faye может выполнять работу
в роли sysadm_r, которую не может выполнить сущность root (поскольку
находится в роли user_r, домен user_t). но в данном случае, это
бесполезно, ведь сущность faye не сможет зарегистрироваться в системе
из-за существующего файла /etc/nologin !
Вот почему правильная маркировка файлов критична. Давайте теперь
вернёмся к процессу маркировки. Нам необходимо ещё раз выполнить
команду
make -C /etc/selinux relabel
Она корректно перемаркирует все файлы в системе. Время, необходимое на
этот процесс зависит от быстродействия вашего компьютера.
Приблизительно, это займет столько же времени, сколько команда find /
. Не забудьте сменить вашу роль на sysadm_r, т.к. если ваша роль
(например, user_t) не имеет прав доступа к другим доменам, вы получите
огромное количество сообщений "отказано в доступе".
4.4 Разрешающий и принудительный режимы
Разрешающий режим -- это режим, в котором SE Linux лишь протоколирует
сообщения, ничего более того (вы можете работать точно так же, как и
на машине без SE Linux). Принудительный режим -- это режим, в котором
применяются все настроенные политики. Собственно, только теперь SE
Linux начал работать. Разрешающий режим хорош для отладки работы
системы. Сообщения можно увидеть с помощью команды dmesg.
Предупреждение: загружайтесь в принудительном режиме только когда у
вас всё настроено! Для настройки используйте разрешающий режим. В нём
файлам назначаются метки, работает вся функциональность SE Linux, но
ничего не запрещается, только протоколируется. Некоторые люди
компилируют ядро без параметра CONFIG_SECURITY_SELINUX_DEVELOP, в
результате они вообще не могут попасть в разрешающий режим.
Для переключения в принудительный режим используйте команду echo "1" >
/etc/selinux/enforce . Чтобы вернуться обратно в разрешающий режим,
замените 1 на 0. В старой реализации SE Linux использовалась команда
avc_toggle, которая отсутствует в новой реализации. Просто просмотрев
файл /etc/selinux/enforce, вы увидите режим, в котором работает
система (раньше использовалась команда avc_enforcing).
В разделе 7: "разбор стандартных сообщений" приведены примеры
сообщений, выводящихся при переключении режимов.
Если вы скомпилировали ядро в режиме разработки (т.е. ваша система
загружается в разрешающий режим, и вручную переключается в
принудительный), то для того, чтобы переключатся в принудительный
режим во время загрузки можно создать скрипт или передать ядру
параметр enforcing=1 (например, указав в файле lilo.conf строку
append="enforcing=1"). (Пробел не забудьте: append=" enforcing=1",
иначе ядро не сможет обработать корректно параметры и они не вступят в
силу. -- прим.ред.)
4.5 Сравнение результатов выполнения команд в разных ролях
Давайте теперь запустим некоторые команды в разных контекстах
безопасности. Переключитесь в принудительный режим. Из вашей роли
user_r запустите команду ps ax --context и посмотрите на результат. Не
забывайте, что вместо длинного ключа можно использовать короткий : ps
ax -Z. Из роли user_r вы видите процессы, которые находятся в домене
user_t и других доменах, к которым есть доступ в каталоге /proc. Если
у вас нет доступа к подкаталогам в каталоге /proc, тогда процессы не
будут отображены в выводе команды ps ax.
Теперь выполните команду ps ax --context в домене sysadm_t. Теперь вы
увидите все процессы, вне зависимости от их домена. Домен sysadm_t
имеет доступ к другим доменам, в отличие от user_t. Вот почему вы не
видели всех процессов из домена user_t. Представим, что злоумышленник
может увидеть все процессы системы. Тогда он может увидеть какой-то
демон, в котором может быть уязвимость и воспользоваться ею. Риск
значительно уменьшается, если обычные пользователи не могут увидеть
список процессов.
Другим примером уязвимости могут служить программы, которым пароль
передается параметром командной строки. В обычной Linux-системе такой
пароль будет виден всем пользователям, тогда как SE Linux этого не
допустит (конечно, пароль в командной строке -- это все равно плохо).
Переключитесь назад в разрешающий режим. Теперь вы сможете видеть все
процессы из домена user_t.
______________________________________________________________________
5. Создание учётных записей
Перейдем теперь к более интересным вещам! Мы создадим нового
пользователя, назначим ему роль и установим для пользователей контекст
безопасности по умолчанию. В старом SE Linux были специальные
программы-надстройки для vipw (это была svipw), useradd (suseradd),
passwd (spasswd), chfn (schfn) и т.п. В новой реализации ничего такого
нет и используются обычные команды (т.е. НЕ svipw и пр.).
5.1 Создание нового пользователя
Создадим нового пользователя с именем setest.
Переключимся в sysadm_r:sysadm_t роль:домен и добавим нового
пользователя setest:
root@kaos:~# id
uid=0(root) gid=0(root) groups=0(root) context=faye:sysadm_r:sysadm_t sid=398
Итак, uid у нас 0, роль:домен -- sysadm_r:sysadm_t. Если это не так,
переключитесь к root командой su, потом войдите в роль sysadm_r
командой newrole -r.
root@kaos:~# useradd -c "SE Linux test user" -m -d /home/setest -g users -s /bin/bash -u 1005 setest
root@kaos:~# finger setest
Login: setest Name: SE Linux test user
Directory: /home/setest Shell: /bin/bash
Never logged in.
No mail.
No Plan.
root@kaos:~# passwd setest
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Пользователь setest добавлен.
5.2 Назначение ролей пользователям и активация изменений
Нам необходимо назначить роль пользователю setest. Допустим, мы хотим
дать доступ к роли user_r. Настраивается это в файле
/etc/selinux/users, так что открываем его в редакторе.
В конце файла добавьте строку:
user setest roles { user_r };
эта строка означает, что пользователь setest имеет доступ к роли
user_r. если вы хотите, чтобы пользователь имел доступ к роли
sysadm_r, то вместо этой строки, добавьте:
user setest roles { user_r sysadm_r };
Теперь нужно активировать изменения, внесённые в /etc/selinux/users.
Для этого из роли:домена sysadm_r:sysadm_t выполняем:
make -C /etc/selinux load
Эта операция занимает некоторое время, т.к. создается база политики и
сжимается с помощью gzip. После завершения вы увидите:
Если у пользователя роль по умолчанию user_r, то его не обязательно
явно прописывать в файле /etc/selinux/users. Это имеет смысл лишь в
том случае, если пользователю необходима возможность менять свой
пароль, иметь доступ к другим ролям или видеть имя пользователя в
сообщениях SE Linux, где это возможно.
Теперь мы должны задать контекст безопасности по умолчанию.
5.3 Установка контекста безопасности по умолчанию для пользователей
После добавления нового пользователя в файл /etc/selinux/users, нужно
назначить контекст безопасности по умолчанию для пользовательских
сеансов. Это делается в файле /etc/security/default_context. В нём вы
увидите строку:
system_r:local_login_t user_r:user_t
При локальной регистрации пользователя (т.е. с консоли), запускается
программа /bin/login в домене local_login_t. После регистрации, она
присваивает сессии роль:домен user_r:user_t. Если бы вместо этой
строки в файле было указано:
и регистрирующийся пользователь имел доступ в домен sysadm_t, тогда бы
он сразу в него и входил. Если у пользователя нет доступа к этому
домену, он попадал бы в домен user_t.
Обратите внимание на строку
system_r:sshd_t user_r:user_t
она говорит, что после регистрации через ssh, пользователь будет
попадать в user_r:user_t роль:домен.
5.4 Перемаркировка домашнего каталога пользователя
Если для добавления пользователя с ролью user_r вы использовали
команду useradd, то все файлы маркированы правильно. Если же вы
пользовались чем-то вроде vipw, или пользователь должен иметь другую
роль, то необходимо провести маркировку файлов:
Эта команда выполняет chcon (изменение контекста безопасности) для
всех файлов в каталоге /home/setest . Домашнему каталогу пользователя
присваивается тип user_home_dir_t , а файлам в нём -- user_home_t.
Иногда, процесс может иметь доступ в домашний каталог пользователя, но
не иметь доступа к файлам и каталогам в нём. Поэтому используются два
разных типа.
______________________________________________________________________
6. Добавление нового пользовательского домена
Давайте теперь создадим наш собственный пользовательский домен и
назовём его second_t. Также создадим новую роль second_r . Повторив
процедуру из раздела 5.2, назначьте пользователю spike роль second_r
(которого еще не существует, мы создадим его позже), но не выполняйте
команды make. Вместо этого, начните выполнять инструкции из этого
раздела.
Мы не вызываем команды make, потому что в предыдущем разделе мы
назначали существующую роль user_r. А сейчас нам нужно создать новую
роль и новый домен. Давайте займёмся этим.
6.1 Редактирование файла пользовательских доменов
/etc/selinux/domains/user.te -- это конфигурационный файл
пользовательских доменов. Просмотрите его. Теперь добавьте где-нибудь,
можно в начале файла, строки
# if adding new user roles make sure you edit the in_user_role macro in
# macros/user_macros.te to match
# при добавлении новой пользовательской роли отредактируйте соответствующий
# макрос in_user_role в файле macros/user_macros.te
Так что нужно отредактировать файл /etc/selinux/macros/user_macros.te.
Открываем этот файл в редакторе и ищем строку in_user_role (где-то в
конце файла). И добавляем строку "role second_r types $1;" следующим
образом:
Теперь давайте детальнее разберем, что мы сделали. Первая строка
конфигурации в этом разделе (full_user_role(second)) создаёт домен
second_t и типы : second_home_dir_t и second_home_t (соответственно:
для домашнего каталога и файлов в нём). Для файлов в каталоге /tmp
создаётся тип second_tmp_t. Для разделяемой памяти, созданной в
контексте tmpfs, создаётся тип second_tmpfs_t. Наконец, создаются типы
second_tty_device_t и second_devpts_t для маркирования устройств tty и
псевдо tty. Кроме того, эта директива определяет некоторые базовые
политики, связанные с этими типами.
SE Linux не поддерживает объектно-ориентированного подхода,
наследования доменов/типов и т.п. Также сейчас нет языка для
определения политик, который поддерживал бы эти функции (хотя его
можно написать, но пока этого никто не сделал). Потому, для упрощения
создания новых доменов, мы используем макросы M4.
Теперь создадим тестового пользователя, который будет иметь доступ к
домену second_t и роли second_r.
6.2 Создание нового тестового пользователя
С помощью команды useradd создайте нового пользователя (допустим, он
будет называться "spike"). Добавьте в файл /etc/selinux/users запись
для spike, которая разрешит ему доступ к роли second_r. После чего
активируйте изменения:
make -C /etc/selinux load
Теперь мы должны задать домен по умолчанию для новой роли. Для этого в
файл /etc/security/default_type добавляем:
second_r:second_t
Наконец, вручную перемаркируем каталог /home/spike и его содержимое.
Команда useradd этого не делает поскольку поддерживает перемаркировку
только для роли user_r. Выполните команду:
Теперь зарегистрируйтесь в системе как пользователь spike.
______________________________________________________________________
7. Разбор стандартных сообщений
Ниже приводятся примеры сообщений системы SE Linux. Я объясню значение
каждой части сообщения. Для облегчения чтения, сообщения разбиты на
строки.
Иногда сообщения не так понятны, как хотелось бы. Потому удобно
помнить, что в ReiserFS и Ext2/Ext3 (файловых системах, поддерживающих
SE Linux), корневой индексный дескриптор (inode) равен 2.
Файловые системы XFS и JFS на текущий момент не оттестированы в
достаточной мере.
В этом примере непривилегированный пользователь (faye) попытался
отредактировать файл /etc/shadow, когда система был в принудительном
режиме.
avc: denied означает, что операция была запрещена.
{ getattr } означает, что была попытка выполнить операцию stat(). В
этом случае, была попытка прочесть атрибуты файла, которая не удалась.
Содержимое скобок {} содержит операцию или операции, связанные с
выполняемыми SE Linux действиями. Протоколироваться могут как успешные
действия, так и действия, в выполнении которых было отказано. В этом
случае, в действии было отказано.
for pid= идентификатор процесса, выполнившего операцию.
exe=/usr/bin/vim выполняющаяся команда (в этом случае -- vim).
path=/etc/shadow путь к объекту, над которым проводилась операция.
dev=03:03 номер блочного устройства, на котором расположена файловая
система, в которой выполнялось действие. Первые цифры "03" означают
hda, вторые -- 3 раздел. Т.е. "dev=03:03" указывает на устройство
/dev/hda3 (или, если вы используете devfs,
/dev/ide/host0/bus0/target0/lun0/part3). Когда SE Linux проверяет
права доступа, полный путь к объекту не известен. Потому в протоколе
регистрируется устройство и местоположение объекта на этом устройстве.
Допустим, вы обращаетесь к файлу /etc/shadow. SE Linux не знает, что
файл находится на корневой файловой системе. Известно лишь, что это
файл /etc/shadow на текущей файловой системе.
ino=123456 индексный дескриптор объекта (в этом случае /etc/shadow)
avc: granted означает, что операция была разрешена к выполнению.
{ avc_toggle } означает, что программа обратилась к системному вызову
avc_toggle().
tclass=system означает, что целевой процесс принадлежит к системному классу.
Пример 3
avc: denied { append } for pid=6153 exe=/bin/bash path=/.bash_history dev=03:03 ino=498
scontext=faye:user_r:user_t tcontext=fayebject_r:root_t tclass=file
это сообщение говорит о том, что сущность faye из user_r:user_t
роли:домена попыталась дописать в файл .bash_history пользователя
root, который имеет тип root_t, но система отказала в доступе.
Пример 4
avc: denied { write } for pid=605 exe=/bin/touch dev=09:03 ino=2
scontext=root:user_r:user_t tcontext=system_ubject_r:root_t tclass=dir
обратите внимание на отсутствие пути в этом примере. Однако мы можем
сказать, что это был коневой каталог, т.к. inode равен 2.
______________________________________________________________________
8. Ссылки
Ниже приведены ссылки на материалы по SE Linux. Пожалуйста, прочтите
официальные документы NSA.
Официальный узел NSA
Официальный сайт NSA находится по адресу
http://www.nsa.gov/selinux
Официальный документ SE Linux FAQ находится по адресу
http://www.nsa.gov/selinux/faq.html
Опубликованные NSA материалы, отчёты и презентации можно найти по адресу
http://www.nsa.gov/selinux/docs.html
Список рассылки и архивы
NSA ведёт список рассылки для обсуждения SE Linux. Для того, чтобы на
него подписаться, следуйте инструкциям по адресу
http://www.nsa.gov/selinux/list.html. по этому же адресу находятся
архивы рассылки.
Проект SE Linux на Sourceforge
Проект SE Linux на Sourceforge находится по адресу
http:/sourceforge.net/projects/selinux.