Модуль принудительного разграничения доступа SELinux

Еще одна известная реализация мандатных механизмов разграничения доступа в RedHat/CentoOS/Fedora Linux называется W:[SELinux] (Security Enhanced Linux) и имеет несколько моделей применения и соответствующих им наборов мандатных правил, называемых политиками.

Модуль принудительного разграничения доступа SELinux

Политики SELinux описывают ограничения доступа субъектов — программ к объектам операционной системы — файлам, сетевым портам протоколов TCP и UDP и пр. на основе меток безопасности..

Самая распространенная из моделей применения, похожая на AppArmor, представлена целевой (англ, target) политикой, предполагает ограничение прав доступа только определенных программ, тогда как остальные программы никак не ограничиваются. Другие модели применения представлены многоуровневой (MLS, multilayer security и ее вариантом МСS, multicategory security) и строгой (англ. strict) политиками.

В многоуровневой политике определяются уровни (и категории) доступа, например «не секретно», «для служебного пользования», «секретно», «совершенно секретно» и т. д., и реализуется принцип «nо read up, no write down», т. е. запрещение читать файлы с меткой более высокого уровня и запрещение изменять файлы с меткой более низкого уровня. В строгой политике, ограничивающей права доступа всех процессов, запрещается все, что не разрешено явно.

Модуль мандатного разграничения доступа SELinux

[lich@fedora ~]$ sestatus

SELinux status:                                                enabled
SELinuxfs mount:                                            /sys/fs/selinux
SELinux root directory:                                  /etc/selinux
Loaded policy name:                                       targeted
Current mode:                                                  enforcing
Mode from config file:                                    enforcing
Polity MLS status:                                           enabled
Policy deny unknown status:                        allowed
Max kernel policy version:                            29

В листинге выше при помощи команды sestatus показан статус модуля принудительного контроля доступа SELinux. Аналогично AppArmor, у модуля SELinux имеются разрешительный (permissive) и принудительный (enforcing) режимы работы.

В разрешительном режиме нарушения мандатных правил процессами приводят только к журналированию сообщений аудита об обнаруженных нарушениях.

Попытки нарушения мандатных правил процессами, находящимися в принудительном режиме, пресекаются модулем контроля доступа в виде отказа в доступе к тому или иному запрашиваемому объекту.

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

Каждая метка состоит из четырех компонент user:role:type:level, которые могут быть использованы лишь частично.

Например, в целевой политике используются только составляющая «тип» (type) и принцип «соблюдения типов» (ТЕ, type enforcement), согласно которому доступ программы к файлу разрешается, если они имеют «совместимые» типы.

В примере из листинге ниже показаны метки безопасности процессов bash и ps сеанса пользователя lich и процесса httpd системной службы Web-сервера.

В целевой (targeted) политике программы, запускаемые в пользовательских сеансах, и, соответственно, их процессы никак, не ограничиваются, что и обозначает тип unconfined.t их метки безопасности.

Наоборот, процессы всех системных служб и являются собственно «целями» принудительно контроля доступа целевой политики, поэтому выполняются, со, своими типами, например httpd_t для службы Web-сервера.

Мандатные метки процессов

[lich@centos ~]$ ps -Z
LABEL                                                             PID   TTY                                      TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023     8893  pts/0 60:06:06   bash unconfined_u:unconfined_r:unconflned_t:s0-s0:c0.c1023     9454  pts/0 00:00:00 ps

[ich@centos ~]$ ps -ZC httpd

LABEL                                                             PID   TTY                                      TIME CMD

system_u:systen_r:httpd_t:s0                 3262     ?                                  00:00:00 httpd

. . .                         . . .                                 . . .                                                 . . .                                     . . .
system_u:system_r:httpd_t:s0                3267     ?                                  00:00:00 httpd

Политика содержит правила назначения меток процессам тех программ, исполняемые файлы которых тоже имеют свои метки, проиллюстрированные в листинге ниже. Так, например, целевая политика содержит правила, согласно которым процессы Web-сервера httpd получают метку с типом httpd_t, потому что выполняют программы /usr/sbin/httpd с меткой httpd_exec_t.

Мандатные метки файлов программ

[lich@centos ~]$ ls -Z /usr/sbin/httpd

-rwxr-xr-x.  root  root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd

Файлы с данными тоже размечаются своими метками. Например, в листинге ниже иллюстрируются метки файлов в домашнем каталоге пользователя lich, где при помощи меток дифференцированы разные пользовательские данные по смыслу.

Мандатные метки файлов

[lich@centos ~]$ ls -Za ~

drwxr-xr-x.   lich   lich unconfined_u:object_r:user_home_t:s0 Desktop

. . .                      . . .                             . . .                             . . .                               . . .

drwxr-xr-x.   lich   lich unconfined_u:object_r:audio_home_t:s0 Music

. . .                      . . .                             . . .                             . . .                               . . .

drwx——.    lich   lich unconfined_u:object_r:ssh_home_t:s0 .ssh

. . .                      . . .                             . . .                             . . .                               . . .

В частности, пользовательские ключи SSH в каталоге ~/.ssh имеют метку с типом ssh_home_t, на основании чего и можно ограничить к ним доступ таких программ, как skype или firefox. Для этого нужно просто выполнять эти программы в процессах с такими типами в их метках, доступ которых к файлам с метками, имеющими тип ssh_home_t, ограничен правилами политики.

В листинге  ниж при помощи команды sesearch производится поиск разрешительных (-А, allow) правил в политике безопасности, разрешающих (-p, permissions) всем субъектам с исходным (-s, source) типом unconfined_t открывать (open) объекты файлового (file) класса (-с, class), имеющие целевой (-t, target) тип ssh_home_t.

Мандатные метки файлов типа unconfined_t

[lich@centos ~]$ sesearch -A -s unconfined_t  -t  ssh_home_t -c file -p open

Found 2 semantic av rules:

allow files_unconfined_type file_type: file { ioctl read … open audit_access } ;

llow unconfined_t user_home_type: file { ioctl read write create … rename open } ;

[lich@centos ~)$ seinfo -tssh_home_t -x

ssh_home_t

. . .                    . . .                      . . .                        . . .                           . . .

user_home_type

. . .                    . . .                      . . .                        . . .                           . . .

[lich@centos ~]$ seinfo -auser_home_type -x

user_home_type

audio_home_t

. . .                    . . .                      . . .                        . . .                           . . .

ssh_home_t

. . .                    . . .                      . . .                        . . .                           . . .

ssh_home_t

. . .                    . . .                      . . .                        . . .                           . . .

audio_home_t

В результате найдено правило О разрешающее доступ субъектов с типом unconfined_t к объектам, типы которых «обобщаются» атрибутом user_home_type.

При помощи команды seinfo уточняется, что тип (-t, type) ssh_home_t действительно обобщен атрибутом в user_home_type, и, наоборот, атрибут user_home_type обобщает такие «пользовательские» типы, как ssh_home_t, audio_home_t, user_ home_t и пр.

Другими словами, всем процессам пользовательского сеанса (т. к. они имеют тип unconfined_t) разрешено обращаться к пользовательским SSH-ключам (имеющим тип ssh_home_t) и любым другим пользовательским данным (с типами audio_home_t, user_home_t и пр.).

Для ограничения программ в доступе к SSH-ключам пользователей потребуется некоторый другой тип (отличный от unconfined_t), которому правилами политики будет запрещено обращаться к файлам с типом ssh_home_t. Такими типами в целевой политике являются несколько типов «песочниц» (sandbox), например sandbox_t или sandbox_net_t (разрешающий сетевые соединения).

В примере из листинга ниже поиск разрешающих правил показывает, что процессам с типом sandbox_net_t не разрешено открытие файлов с типом ssh_home_t, но разрешены TCP-соединения. Таким образом, тип sandbox_net_t оказывается подходящим кандидатом процессов тех программ, которым нужно ограничить доступ к SSH-ключам и другим файлам пользователя.

 

[lleh@centos ~]$ sesearch -A -s sandbox_net_t -t ssh_home_t -c file -p open

[lich@centos ~]$ sesearch -A -s sandbox_net_t -c tcp_socket -p connect

Found 4 semantic av rules:

allow sandbox _net_t sandbox_net_t: tcp_socket { … read write … connect … shutdown } ;

. . .                    . . .                      . . .                        . . .                           . . .

[lich@centos ~]$ links -dump ~/.ssh/id_rsa

——BEGIN RSA PRIVATE KEY——

. . .                    . . .                      . . .                        . . .                           . . .

——END RSA PRIVATE KEY——

. . .                    . . .                      . . .                        . . .                           . . .

[lich@centos ~]$ sandbox -t sandbox_net_t links -dump ~/.ssh/id_rsa

ELinks: Отказано в доступе

 

Запустить программу в процессе с соответствующей меткой позволяет команда sandbox, специально предназначенная для формирования «песочниц» при помощи модуля SELinux и соответствующих sandbox_*_t-типов.

В примере из листинга выше текстовый Web-браузер links, выполненный в процессе с типом sandbox_net_t, в действительности оказывается ограниченным в доступе к SSH-ключам пользователей, что и требовалось получить.

Добавить комментарий