selinux for system administrators
TRANSCRIPT
SELinux для системных администраторов
2
Что такое SELinux и как его использовать?
3
Cодержание
1. Фундаментальные понятия в SELinux
2. Режимы работы SELinux и логирование
3. Контекст файлов и домен процессов
4. SELinux пользователи и роли
5. Управление сетевыми соединениями
6. Работа с SELinux политиками
7. SELinux в продакшн среде
4
Часть 1. Фундаментальные понятия в SELinux
5
Краткое содержание части 1
● Определение SELinux
● Избирательное управление доступом
● Принудительное управление доступом
● Фреймворк Linux Security Modules
● SELinux контекст
● SELinux политика
● SELinux модули
6
Security-Enhanced Linux
Security-Enhanced Linux (SELinux) – это модуль ядра Linux и набор пользовательских утилит для реализации механизма принудительного контроля доступа (англ. Mandatory Access Control, MAC).
7
Управление доступом в Linux
● Избирательное управление доступом (англ. Discretionary Access Control, DAC)
● Принудительное управление доступом (англ. Mandatory Access Control, MAC)
8
Избирательное управление доступом
Избирательное управление доступом (англ. Discretionary Access Control, DAC) — управление доступом субъектов к объектам на основе списков управления доступом или матрицы доступа.
9
Discretionary Access Control в Linux
Механизм Discretionary Access Control (DAC) в Linux основан на сравнении пользователя и группы процесса с владельцем и группой файла, директории или другого ресурса, к которому этот процесс обращается.
10
Пример DAC в Linux
# ls -l /etc/shadow-rw-------. 1 root root 1310 May 29 13:10 /etc/shadow
# iduid=0(root) gid=0(root) groups=0(root)
# ps -u root -o user,group,command...root root /usr/sbin/crondroot root /usr/sbin/irqbalanceroot root /usr/sbin/lvmetadroot root /usr/sbin/mcelogroot root /usr/sbin/rsyslogdroot root /usr/sbin/snmpd...
11
Принудительное управление доступом
Принудительное управление доступом (англ. Mandatory Access Control, MAC) — управление доступом субъектов к объектам основанное на назначении метки конфиденциальности для информации, содержащейся в объектах, и выдаче официальных разрешений (допуска) субъектам на обращение к информации такого уровня конфиденциальности.
12
Mandatory Access Control в Linux
Механизм Mandatory Access Control (MAC) в Linux основан на политике безопасности описывающей разрешенные операции для каждого объекта политики. Соблюдение политики безопасности гарантирует ядро через фреймворк Linux Security Modules (LSM).
13
Пример SELinux MAC
# ls -Z /etc/shadow-rw-------. root root system_u:object_r:shadow_t:s0 /etc/shadow
# id -Zcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# ps -u root -o user,group,label,command...root root system_u:system_r:crond_t:s0 /usr/sbin/crondroot root system_u:system_r:irqbalance_t:s0 /usr/sbin/irqbalanceroot root system_u:system_r:lvm_t:s0 /usr/sbin/lvmetadroot root system_u:system_r:mcelog_t:s0 /usr/sbin/mcelogroot root system_u:system_r:syslogd_t:s0 /usr/sbin/rsyslogdroot root system_u:system_r:snmpd_t:s0 /usr/sbin/snmpd...
14
Linux Security Modules
Linux Security Modules (LSM) — это фреймворк добавляющий в ядро Linux поддержку подключаемых модулей безопасности (AppArmor, SELinux, Smack, TOMOYO Linux).
15
Схема работы LSM
16
SELinux и DAC
● SELinux политика проверяется после DAC
● SELinux политика не может влиять на DAC
17
SELinux контекст
● У всего есть контекст!
● Контекст (context) = метка (label)
● Контекст состоит из четырех полей
18
Поля SELinux контекста
# id -Zcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
19
SELinux пользователь
● SELinux user ≠ Linux user
● Не меняется в течение сессии
● Используется для User-based access control (UBAC)
● Ограничивает SELinux роли пользователя
● По соглашению имеет суффикс "_u"
20
Пример SELinux пользователей
● guest_u
● root
● staff_u
● sysadm_u
● system_u
● unconfined_u
● user_u
● xguest_u
21
SELinux роль
● Может меняться в течение сессии
● Используется для Role-based access control (RBAC)
● Ограничивает SELinux типы пользователя
● По соглашению имеет суффикс "_r"
22
Пример SELinux ролей
● guest_r
● staff_r
● sysadm_r
● system_r
● unconfined_r
● user_r
● xguest_r
23
SELinux тип
● SELinux type = SELinux process domain
● Основной компонент SELinux targeted политики
● Используется для Type Enforcement
● По соглашению имеет суффикс "_t"
24
Пример SELinux типов
● crond_t
● httpd_t
● irqbalance_t
● lvm_t
● mcelog_t
● snmpd_t
● syslogd_t
● unconfined_t
25
Неограниченный домен
● Неограниченный домен (англ. unconfined domain или unconfined type) — это SELinux тип, на который не накладывается ни каких ограничений
● Позволяет запускать программы, для которых еще нет политики и работать в неограниченной консоли
● Неограниченные домены ограничены DAC
● По соглашению называется unconfined_t
26
Sensitivity level
● Состоит из уровня конфиденциальности (префикс "s") и категории (префикс "c")
● Используется для Multi-Level Security (MLS) и Multi-Category Security (MCS)
● MLS реализует модель Белла — Лападулы
● MCS дополнительно ограничивает домен только своей категорией
27
Модель Белла — Лападулы
Модель Белла — Лападулы — модель контроля и управления доступом, в которой невозможно создание информационных потоков от субъектов с более высоким уровнем доступа к субъектам с более низким уровнем доступа.
28
Схема модели Белла — Лападулы
Unclassified
Confidential
Secret
Top SecretW
riteR
ead
no read up / no write down
29
Пример Multi-Level Security (MLS)
# seinfo --sensitivity -x
Sensitivities: 1 s0 level s0:c0.c1023
30
Пример Multi-Category Security (MCS)
http://danwalsh.livejournal.com/73416.html
# ps -u qemu -o label,commandsystem_u:system_r:svirt_t:s0:c434,c803 /usr/libexec/qemu-kvm -name vm100system_u:system_r:svirt_t:s0:c154,c948 /usr/libexec/qemu-kvm -name vm101system_u:system_r:svirt_t:s0:c264,c563 /usr/libexec/qemu-kvm -name vm102system_u:system_r:svirt_t:s0:c504,c867 /usr/libexec/qemu-kvm -name vm103system_u:system_r:svirt_t:s0:c652,c458 /usr/libexec/qemu-kvm -name vm104
# seinfo -amcs_constrained_type -x mcs_constrained_type svirt_kvm_net_t svirt_lxc_net_t openshift_app_t svirt_tcg_t netlabel_peer_t sandbox_x_t svirt_t sandbox_min_t sandbox_net_t sandbox_web_t openshift_t svirt_qemu_net_t
31
SELinux политика
● Определяет поведением системы
● Существуют разные реализации политик (англ. policy type или policy store)
● SELinux Policy Store содержит одну политику
● Только одна политика активна
● Смена политики требует рестарт системы
32
Пример SELinux policy store
● strict
● targeted
● minimum
● mcs
● mls
33
Пример активной SELinux политики
# sestatus SELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: enforcingMode from config file: enforcingPolicy MLS status: enabledPolicy deny_unknown status: allowedMax kernel policy version: 28
# grep ^SELINUX /etc/selinux/config SELINUX=enforcingSELINUXTYPE=targeted
34
Policy deny_unknown
● Разрешенные операции (read, write, open, lock и др.) определены как в ядре Linux, так и в SELinux политике
● В новых версиях ядра Linux могут появиться операции, которых нет в политике
● Policy deny_unknown определяет, что делать в случае появления неизвестных операций
● Возможные варианты: allow, deny, reject
35
Max kernel policy version
● Описывает максимальную версию SELinux политики, которую поддерживает ядро Linux
● При добавлении в ядро нового SELinux функционала версия увеличивается
36
Kernel policy versions
37
SELinux модули
● Изначально SELinux политика состояла из одного бинарного файла
● Современная SELinux политика состоит из базового модуля base.pp и отдельных модулей для приложений
● SELinux модули можно загружать / выгружать / отключать / включать без рестарта системы
38
Пример SELinux модулей
# semodule -l ...apache 2.7.2bacula 1.2.0bind 1.13.1dhcp 1.11.0docker 1.0.0mysql 1.14.1samba 1.16.3ssh 2.4.2sudo 1.10.0virt 1.5.0zabbix 1.6.0...
39
SELinux booleans
SELinux booleans — это «переключатели», которые при «включении» и «выключении» меняют поведение правил SELinux политики. Booleans используются разработчиками SELinux политики для создания условных правил (англ. conditional rules).
40
Пример SELinux booleans
# semanage boolean -l | grep httpd_can_connecthttpd_can_connect_mythtv (off,off) Allow http daemon to connect to mythtvhttpd_can_connect_ldap (off,off) Allow httpd to connect to the ldap porthttpd_can_connect_ftp (off,off) Allow httpd to act as a FTP clienthttpd_can_connect_zabbix (off,off) Allow http daemon to connect to zabbix
41
Часть 2. Режимы работы SELinux и логирование
42
Краткое содержание части 2
● Режимы работы SELinux
● Отключение SELinux
● Изменение режима SELinux
● Permissive домены
● SELinux логирование и аудит
43
Режимы SELinux
● Enforcing — SELinux включен и политика безопасности соблюдается. Все нарушения логируются и запрещаются.
● Permissive — SELinux включен, но политика безопасности не соблюдается. Все нарушения логируются, но не запрещаются.
● Disabled — SELinux отключен. Для смены режима требуется рестарт системы.
44
Пример определения режима SELinux
# sestatus | grep 'Current mode'Current mode: enforcing
# sestatus | grep 'Mode from config file'Mode from config file: enforcing
# grep ^SELINUX= /etc/selinux/configSELINUX=enforcing
# getenforce Enforcing
# selinuxenabled # echo $?0
45
Отключение SELinux
Для полного отключения SELinux нужно внести изменения в конфигурационный файл /etc/selinux/config и перезагрузить систему
46
Пример отключения SELinux
# grep ^SELINUX= /etc/selinux/configSELINUX=enforcing
# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# grep ^SELINUX= /etc/selinux/configSELINUX=disabled
# reboot
47
Изменение режима SELinux
● Команда setenforce переключает режим SELinux между permissive (0) и enforcing (1). Изменения вступают в силу сразу и действуют до перезагрузки системы.
● При старте системы режим работы зачитывается из конфигурационного файла /etc/selinux/config
● Boolean secure_mode_policyload запрещает изменение режима SELinux до перезагрузки
48
Пример изменения режима SELinux
# getenforceEnforcing
# setenforce 0
# getenforcePermissive
# setenforce 1
# getenforceEnforcing
49
Пример boolean secure_mode_policyload
# setsebool secure_mode_policyload=on
# setenforce 0setenforce: setenforce() failed
# setsebool secure_mode_policyload=offCould not change active booleans: Permission denied
# aureport -a -ts recent1. 02/10/2016 11:57:02 setenforce unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1 security setenforce system_u:object_r:security_t:s0 denied 982. 02/10/2016 11:59:34 setsebool unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1 security setbool system_u:object_r:security_t:s0 denied 99
# getsebool -a | grep ^securesecure_mode --> offsecure_mode_insmod --> offsecure_mode_policyload --> on
50
SELinux параметры ядра
● SELinux параметры ядра имеют более высокий приоритет, чем параметры в конфигурационном файле /etc/selinux/config
● selinux=0 — отключить SELinux
● enforcing=0 — включить SELinux permissive режим
● enforcing=1 — включить SELinux enforcing режим
51
Permissive домены
● Начиная с Linux 2.6.26 (policy version 23) SELinux поддерживает permissive домены
● Вместо отключения SELinux для всей системы предпочтительно использовать permissive режим для отдельных доменов
52
Пример permissive домена
# semanage permissive -a httpd_t
# semanage permissive -lCustomized Permissive Typeshttpd_t...
# semodule -l | grep permissivepermissive_httpd_t 1.0permissivedomains 21
# semanage permissive -d httpd_t
53
SELinux логирование и аудит
● SELinux логирует все запрещенные операции через Linux Audit-Subsystem
● При запущенном auditd логи SELinux пишутся по умолчанию в файл /var/log/audit/audit.log
● При остановленном auditd логи SELinux пишутся в kernel ring buffer
● Сообщения от SELinux имеют тип Access Vector Cache (AVC)
54
Access Vector Cache (AVC)
● Access Vector Cache (AVC) — это часть системы безопасности SELinux в ядре отвечающая за проверку и соблюдение SELinux правил
● SELinux решения кешируются в AVC
● Если результат решения есть в кеше, то он используется. Иначе проверяется SELinux политика и результат кеширует.
55
Пример avcstat
# avcstat 1 lookups hits misses allocs reclaims frees 736510 730700 5810 5810 5216 5307 18 18 0 0 0 0 13 13 0 0 0 0 24 21 3 3 0 0 3302 3302 0 0 0 0 147 147 0 0 0 0
56
Поля AVC сообщения
● SELinux action — denied
● Permission — { write }
● Process ID — pid=1634
● Process name — comm="rsync"
● Target name — name="backup"
● Target device — dev="vda1"
● Target inode — ino=1075368783
● Source context — scontext=system_u:system_r:rsync_t:s0
● Target context — tcontext=unconfined_u:object_r:var_t:s0
● Resource class — tclass=dir
57
Dontaudit правила
● Разработчики SELinux политики могут добавлять в политику dontaudit правила, чтобы не логировать некоторые ошибки и не засорять логи
● Dontaudit правила можно временно отключить для расследования SELinux запретов
58
Пример отключения dontaudit правил
# seinfo | grep -E 'Allow|Dontaudit' Allow: 95588 Neverallow: 0 Auditallow: 160 Dontaudit: 8368
# semodule -BD
# semodule -B
# semanage dontaudit off
# semanage dontaudit on
59
Расследование SELinux запретов
● Утилиты aureport, ausearch
● Проверить DAC
● Permissive режим
● Выключить Dontaudit
60
Часть 3. Контекст файлов и домен процессов
61
Краткое содержание части 3
● SELinux контекст файлов и директорий
● Регулярные выражения контекста
● Установка контекста файлов
● Настраиваемые типы
● Type transition
● SELinux контекст процессов
● Domain transition
62
SELinux контекст файлов и директорий
● Контекст файлов и директорий хранится в расширенных атрибутах (англ. extended attributes) файловой системы
● Если файловая система не поддерживает extended attributes, то контекст определяется при монтирования файловой системы
● Если SELinux не может определить контекст файла или директории, то используется контекст по умолчанию file_t
63
Пример получения контекста файлов
# ls -Z /etc/shadow-rw-------. root root system_u:object_r:shadow_t:s0 /etc/shadow
# stat /etc/shadow | grep ContextContext: system_u:object_r:shadow_t:s0
# getfattr -n security.selinux /etc/shadowsecurity.selinux="system_u:object_r:shadow_t:s0"
# mount image.iso /media# ls -dZ /mediadrwxr-xr-x. root root system_u:object_r:iso9660_t:s0 /media
# mount image.iso /media -o context="system_u:object_r:public_content_t:s0"# ls -dZ /mediadrwxr-xr-x. root root system_u:object_r:public_content_t:s0 /media
64
Регулярные выражения контекста
● SELinux политика содержит описание контекста файлов и директорий в виде регулярных выражений
● Список регулярных выражений хранится в директории /etc/selinux/<store>/contexts/files
● Контекст файлов и директорий на диске может отличаться от регулярного выражения. Существуют утилиты для проверки и смены контекста.
65
Формат регулярного выражения контекста
● Регулярное выражение
● SELinux класс (тип) файла
● SELinux контекст
66
# semanage fcontext -lSELinux fcontext type Context
/ directory system_u:object_r:root_t:s0/.* all files system_u:object_r:default_t:s0/[^/]+ regular file system_u:object_r:etc_runtime_t:s0/\.autofsck regular file system_u:object_r:etc_runtime_t:s0/\.autorelabel regular file system_u:object_r:etc_runtime_t:s0/\.ismount-test-file regular file system_u:object_r:sosreport_tmp_t:s0/\.snapshots(/.*)? all files system_u:object_r:snapperd_data_t:s0...
# findcon /etc/selinux/targeted/contexts/files/file_contexts -p /var/.* system_u:object_r:default_t:s0/[^/]+ -- system_u:object_r:etc_runtime_t:s0/var system_u:object_r:var_t:s0
# findcon /etc/selinux/targeted/contexts/files/file_contexts -p /etc/shadow/.* system_u:object_r:default_t:s0/etc/.* system_u:object_r:etc_t:s0/etc/shadow.* -- system_u:object_r:shadow_t:s0
Пример регулярных выражений контекста
67
Классы (типы) файлов
# semanage fcontext -h... -f {a,f,d,c,b,s,l,p}, --ftype {a,f,d,c,b,s,l,p} File Type. This is used with fcontext. Requires a file type as shown in the mode field by ls, e.g. use -d to match only directories or -- to match only regular files. The following file type options can be passed: -- (regular file),-d (directory),-c (character device), -b (block device),-s (socket),-l (symbolic link),-p (named pipe) If you do not specify a file type, the file type will default to "all files"....
68
Приоритет выражений контекста
Выражение B более точное, если:
● Стока A содержит регулярное выражение, а строка B не содержит
● Количество символов до регулярного выражения в строке A меньше, чем количество символов до регулярного выражения в строке B
● Количество символов в строке A меньше, чем количество символов в строке B
● В строке A не указан тип файла, а в строке B указан
69
Приоритет выражений контекста
Локальные выражения (добавленные через semanage fcontext) имеют более высокий приоритет, чем выражения в SELinux политике!
70
Установка контекста файлов
Для установки SELinux контекста файла процесс должен иметь:
● DAC права на изменение атрибутов файла
● MAC (SELinux) права relabelfrom и relabelto
71
Утилиты для установки контекста
● chcon
● chcat
● restorecon
● fixfiles (RHEL)
● rlpkg (Gentoo)
● setfiles
● setfattr
72
Пример установки контекста
# chcon -R -t httpd_sys_content_t /srv/www
# chcon --reference /var/www /srv/www
# semanage fcontext -a -t httpd_sys_content_t "/srv/www(./*)?"# restorecon -R /srv/www
# semanage fcontext -a -e /var/www /srv/www# restorecon -R /srv/www
# fixfiles -R openssh restore
# touch /.autorelabel# reboot
73
Настраиваемые типы
● Настраиваемые типы (англ. customizable types) — это SELinux типы, которые предназначены для динамического назначения на файлы без изменения политики
● Не сбрасываются утилитами restorecon, fixfiles, setfiles без ключа -F
● Перечислены в файле /etc/selinux/<store>/contexts/customizable_types
74
Пример настраиваемых типов
# cat /etc/selinux/targeted/contexts/customizable_typessandbox_file_tsvirt_image_tsvirt_home_tsvirt_sandbox_file_tvirt_content_thttpd_user_htaccess_thttpd_user_script_exec_thttpd_user_rw_content_thttpd_user_ra_content_thttpd_user_content_tgit_session_content_thome_bin_tuser_tty_device_t
# sesearch -AC -s user_t -p relabelfrom# sesearch -AC -s user_t -p relabelto
75
Наследование контекста
● При создании файла SELinux контекст наследуется от родительской директории
● Исключение составляют SELinux-aware приложения и type transition правила
76
Пример наследования контекста
# mkdir testdir# ls -dZ testdirdrwxr-xr-x. root root system_u:object_r:user_home_t:s0 testdir
# touch testdir/testfile1# ls -Z testdir-rw-r--r--. root root system_u:object_r:user_home_t:s0 testdir/testfile1
# chcon -t home_bin_t testdir# ls -dZ testdirdrwxr-xr-x. root root system_u:object_r:home_bin_t:s0 testdir
# touch testdir/testfile2# ls -Z testdir-rw-r--r--. root root system_u:object_r:user_home_t:s0 testdir/testfile1-rw-r--r--. root root system_u:object_r:home_bin_t:s0 testdir/testfile2
77
Type transition
● Type transition — это правила SELinux политики, которые изменяют SELinux контекст объекта в зависимости от условий.
● Named file transition — это type transition правила, которые учитывают имя объекта.
78
Пример type transition правил
# sesearch -T -s httpd_t -t var_log_tFound 1 semantic te rules: type_transition httpd_t var_log_t : file httpd_log_t;
# sesearch -T -s httpd_t -t tmp_tFound 4 semantic te rules: type_transition httpd_t tmp_t : file httpd_tmp_t; type_transition httpd_t tmp_t : dir httpd_tmp_t; type_transition httpd_t tmp_t : lnk_file httpd_tmp_t; type_transition httpd_t tmp_t : sock_file httpd_tmp_t;
Found 2 named file transition filename_trans:type_transition httpd_t tmp_t : file krb5_host_rcache_t "HTTP_23"; type_transition httpd_t tmp_t : file krb5_host_rcache_t "HTTP_48";
79
SELinux контекст процессов
● У процессов есть контекст!
● SELinux тип процесса = SELinux домен
● Если не удается определить домен процесса, то домен процесса unlabeled_t
80
Пример контекста процессов
# ps -u root -o label,command...system_u:system_r:kernel_t:s0 [kswapd0]system_u:system_r:init_t:s0 /usr/lib/systemd/systemdsystem_u:system_r:udev_t:s0 /usr/lib/systemd/systemd-udevdsystem_u:system_r:crond_t:s0 /usr/sbin/crondsystem_u:system_r:irqbalance_t:s0 /usr/sbin/irqbalancesystem_u:system_r:unconfined_service_t:s0 /usr/sbin/lldpdsystem_u:system_r:lvm_t:s0 /usr/sbin/lvmetadsystem_u:system_r:mcelog_t:s0 /usr/sbin/mcelogsystem_u:system_r:syslogd_t:s0 /usr/sbin/rsyslogdsystem_u:system_r:snmpd_t:s0 /usr/sbin/snmpdunconfined_u:unconfined_r:unconfined_t:s0 -bash...
81
Domain transition
● При создании процесса SELinux контекст наследуется от родительского процесса
● Исключение составляют SELinux-aware приложения и type transition правила
● Type transition правила для процессов называются domain transition или process transition
82
Схема domain transition правил
83
Пример domain transition правил
# seinfo -rsystem_r -x | grep -E 'initrc_t|httpd_t' initrc_t httpd_t
# sesearch -AC -s httpd_t -t httpd_exec_t -c file -p entrypoint allow httpd_t httpd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
# sesearch -AC -s initrc_t -t httpd_exec_t -c file -p execute allow initrc_t exec_type : file { ioctl read getattr lock execute execute_no_trans open } ;
# sesearch -AC -s initrc_t -t httpd_t -c process -p transition allow initrc_domain daemon : process transition ;
# sesearch -T -s initrc_t -t httpd_exec_t type_transition initrc_t httpd_exec_t : process httpd_t;
84
SELinux-aware приложения
SELinux-aware приложения используют SELinux API для управления контекстом создаваемых файлов и процессов (cron, login, ssh, httpd и др.)
85
SELinux API
SELinux предоставляет API для приложений, например
● setcon
● setexeccon
● setfilecon
● setfscreatecon
● и др.
http://selinuxproject.org/page/LibselinuxAPISummary
86
Пример Apache mod_selinux
# cat /etc/httpd/conf.vhosts.d/example.com.conf
<VirtualHost *:443> DocumentRoot /var/www/vhosts/site1.example.com ServerName site1.example.com selinuxDomainVal *:s0:c1 ...</VirtualHost>
<VirtualHost *:443> DocumentRoot /var/www/vhosts/site2.example.com ServerName site2.example.com selinuxDomainVal *:s0:c2 ...</VirtualHost>
# sesearch -AC -s httpd_t -c process -p dyntransitionFound 1 semantic av rules: allow httpd_t httpd_t : process { ... dyntransition ... } ;
# sesearch -AC -c process -p dyntransition Found 141 semantic av rules:...
87
SELinux атрибуты типов
SELinux атрибуты типов (англ. type attributes) — это тэги назначаемые для группировки типов с целью сокращения количества SELinux правил
88
Пример SELinux атрибутов типов
# sesearch -AC -s initrc_t -t httpd_t -c process -p transition allow initrc_domain daemon : process transition ;
# seinfo -ainitrc_domain -x initrc_domain piranha_pulse_t initrc_t openshift_initrc_t kdumpctl_t init_t glusterd_t cluster_t condor_startd_t
# seinfo -adomain -x | wc -l 798
89
Часть 4. SELinux пользователи и роли
90
Краткое содержание части 4
● SELinux контекст пользователя
● Unconfined домены
● Linux логин, SELinux пользователь и роль
● Возможности SELinux пользователей
● Смена SELinux контекста при авторизации
● Контекст в зависимости от приложения
91
SELinux контекст пользователя
При логине в систему пользователь получает SELinux контекст, который определяет права пользователя в системе.
92
Пример информации о пользователе
# id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# ps -o label,command LABEL COMMANDunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 -bashunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ps -o label,command
93
Пример информации о пользователе
# seinfo -uUsers: 8 sysadm_u system_u xguest_u root guest_u staff_u user_u unconfined_u
# seinfo -uunconfined_u -x unconfined_u default level: s0 range: s0 - s0:c0.c1023 roles: object_r system_r unconfined_r
94
Unconfined домены
● По умолчанию в SELinux все запрещено!
● Большинство приложений не имеет своих политик
● Политики ограниченных приложений нужно обновлять так же часто, как и сами приложения
● Для многих приложений ограничения не требуются
95
Сложность разработки SELinux доменов
96
Пример unconfined доменов
# seinfo -aselinux_unconfined_type -x | wc -l83
# seinfo -aselinux_unconfined_type -x... crond_t inetd_t init_t tuned_t udev_t kernel_t httpd_unconfined_script_t rpm_script_t samba_unconfined_script_t unconfined_cronjob_t unconfined_dbusd_t unconfined_sendmail_t unconfined_service_t unconfined_t zabbix_script_t...
97
Linux логин, SELinux пользователь и роль
● При входе в систему процесс, через который происходит авторизация, определяет SELinux пользователя по Linux логину (учетной записи)
● По SELinux пользователю определяется SELinux роль пользователя
● SELinux роль пользователя ограничивает доступные пользователю SELinux типы
● SELinux типы ограничены SELinux политикой
98
Linux логин, SELinux пользователь и роль
99
Пример SELinux login mapping
# semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *root unconfined_u s0-s0:c0.c1023 *system_u system_u s0-s0:c0.c1023 *
# semanage login -a -s user_u aleksey
# semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *aleksey user_u s0 *root unconfined_u s0-s0:c0.c1023 *system_u system_u s0-s0:c0.c1023 *
100
Пример SELinux users
# semanage user -l
Labeling MLS/ SELinux User Prefix MCS Level SELinux Roles
guest_u user s0 guest_rroot user s0 staff_r sysadm_r system_r unconfined_rstaff_u user s0 staff_r sysadm_r system_r unconfined_rsysadm_u user s0 sysadm_rsystem_u user s0 system_r unconfined_runconfined_u user s0 system_r unconfined_ruser_u user s0 user_rxguest_u user s0 xguest_r
101
Возможности SELinux пользователей
102
Пример создания SELinux login mapping
[root@localhost ~]# useradd -g users aleksey[root@localhost ~]# passwd aleksey
[aleksey@localhost ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[aleksey@localhost ~]$ su -Password: ********[root@localhost ~]#
[root@localhost ~]# semanage login -a -s user_u %users
[aleksey@localhost ~]$ id -Zuser_u:user_r:user_t:s0
[aleksey@localhost ~]$ su - Password: ********su: Authentication failure
[root@localhost ~]# aureport -a -ts recent1. 01/26/2016 16:54:39 su user_u:user_r:user_t:s0 105 capability setuid user_u:user_r:user_t:s0 denied 337
103
Пример создания SELinux user
[root@localhost ~]# useradd aleksey[root@localhost ~]# passwd aleksey[root@localhost ~]# semanage user -a -R user_r aleksey_u[root@localhost ~]# semanage login -a -s aleksey_u aleksey
[aleksey@localhost ~]$ id -Zaleksey_u:user_r:user_t:s0
[aleksey@localhost ~]$ mkdir test[aleksey@localhost ~]$ ls -dZ testdrwxrwxr-x. aleksey aleksey aleksey_u:object_r:user_home_t:s0 test
104
Смена SELinux контекста пользователя
● Пользователю может быть доступно несколько SELinux ролей и типов
● Для смены SELinux роли и типа существуют утилиты newrole, sudo, run_init, runcon и др.
105
Пример смены контекста пользователя
[root@localhost ~]# useradd aleksey[root@localhost ~]# passwd aleksey[root@localhost ~]# semanage login -a -s staff_u aleksey
[aleksey@localhost ~]$ id -Zstaff_u:staff_r:staff_t:s0-s0:c0.c1023
[aleksey@localhost ~]$ sudo aureport -aError opening /var/log/audit/audit.log (Permission denied)
[aleksey@localhost ~]$ sudo -r sysadm_r -t sysadm_t aureport -aAVC Report...
[aleksey@localhost ~]$ newrole -r sysadm_rPassword: ********
[aleksey@localhost ~]$ id -Zstaff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023
106
Смена SELinux контекста при авторизации
● Приложения отвечающие за логин и авторизацию пользователя: login, ssh, kdm, gdm и др.
● Вместо модификации всех приложений используется PAM модуль pam_selinux
● pam_selinux использует SELinux API и устанавливает SELinux контекст для следующего execve вызова
107
Пример конфигурации pam_selinux
# cat /etc/pam.d/remote
#%PAM-1.0auth required pam_securetty.soauth substack password-authauth include postloginaccount required pam_nologin.soaccount include password-authpassword include password-auth# pam_selinux.so close should be the first session rulesession required pam_selinux.so closesession required pam_loginuid.so# pam_selinux.so open should only be followed by sessions to be executed in the user contextsession required pam_selinux.so opensession required pam_namespace.sosession optional pam_keyinit.so force revokesession include password-authsession include postlogin
108
Контекст в зависимости от приложения
● SELinux контекст по умолчанию зависит от приложения используемого для авторизации
● В файле targeted/contexts/default_contexts хранится контекст по умолчанию в зависимости от контекста приложения
● В директории targeted/contexts/users хранится контекст по умолчанию в зависимости от SELinux пользователя и контекста приложения
● Результат можно проверить утилитой getseuser https://github.com/SELinuxProject/selinux/wiki/Tools
109
Пример контекста по умолчанию
# cat /etc/selinux/targeted/contexts/default_contexts
system_r:crond_t:s0 system_r:system_cronjob_t:s0system_r:local_login_t:s0 user_r:user_t:s0system_r:remote_login_t:s0 user_r:user_t:s0system_r:sshd_t:s0 user_r:user_t:s0system_r:sulogin_t:s0 sysadm_r:sysadm_t:s0system_r:xdm_t:s0 user_r:user_t:s0
# cat /etc/selinux/targeted/contexts/users/unconfined_u
system_r:crond_t:s0 unconfined_r:unconfined_t:s0system_r:initrc_t:s0 unconfined_r:unconfined_t:s0system_r:local_login_t:s0 unconfined_r:unconfined_t:s0system_r:remote_login_t:s0 unconfined_r:unconfined_t:s0system_r:rshd_t:s0 unconfined_r:unconfined_t:s0system_r:sshd_t:s0 unconfined_r:unconfined_t:s0system_r:sysadm_su_t:s0 unconfined_r:unconfined_t:s0system_r:unconfined_t:s0 unconfined_r:unconfined_t:s0system_r:initrc_su_t:s0 unconfined_r:unconfined_t:s0unconfined_r:unconfined_t:s0 unconfined_r:unconfined_t:s0system_r:xdm_t:s0 unconfined_r:unconfined_t:s0
110
Часть 5. Управление сетевыми соединениями
111
Краткое содержание части 5
● SELinux поддержка для TCP и UDP
● SELinux поддержка для netfilter
112
SELinux поддержка для TCP и UDP
● Многие приложения не должны сами устанавливать сетевые соединения, а если должны, то на ограниченный список портов
● SELinux ограничивает сетевые сокеты, на которых процессу разрешено слушать и к которым разрешено подключаться разрешениями name_bind и name_connect соответственно
● SELinux маппит TCP и UDP сокеты к tcp_socket и udp_socket классам соответственно
● TCP и UDP порты по соглашению маркируются типом с префиксом "_port_t"
113
Пример SELinux маркировки TCP и UDP
# semanage port -l | grep ^httphttp_cache_port_t tcp 8080, 8118, 8123, 10001-10010http_cache_port_t udp 3130http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
# semanage port -l | grep ^ftpftp_data_port_t tcp 20ftp_port_t tcp 21, 989, 990ftp_port_t udp 989, 990
114
Пример SELinux маркировки ssh_port_t
# echo 'Port 22' >> /etc/ssh/sshd_config# echo 'Port 2222' >> /etc/ssh/sshd_config# systemctl restart sshd.service
# aureport -a -ts recent...1. 02/10/2016 16:14:25 sshd system_u:system_r:sshd_t:s0-s0:c0.c1023 49 tcp_socket name_bind system_u:object_r:unreserved_port_t:s0 denied 72
# semanage port -a -t ssh_port_t -p tcp 2222
# semanage port -l | grep ^sshssh_port_t tcp 2222, 22
115
Пример SELinux правил для TCP и UDP
# sesearch -AC -s httpd_t -t http_port_t... allow httpd_t port_type : tcp_socket { recv_msg send_msg } ; allow httpd_t port_type : udp_socket { recv_msg send_msg } ; allow httpd_t http_port_t : tcp_socket name_bind ; allow httpd_t http_port_t : udp_socket name_bind ; DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]...
Разрешения recv_msg и send_msg устаревшие и больше не используются!
116
Пример SELinux маркировки в netfilter
# cat /proc/net/nf_conntrackipv4 2 tcp 6 432000 ESTABLISHED src=192.168.111.142 dst=192.168.111.1 sport=22 dport=39647 src=192.168.111.1 dst=192.168.111.142 sport=39647 dport=22 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
117
Пример SELinux маркировки в netfilter
iptables -t security -A INPUT -p tcp -m multiport --dports 80,443 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0
iptables -t security -A INPUT -m state --state ESTABLISHED,RELATED -j CONNSECMARK --save
iptables -t security -A OUTPUT -p tcp -m multiport --dports 80,443 -j SECMARK --selctx system_u:object_r:http_client_packet_t:s0
iptables -t security -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNSECMARK --save
118
Пример SELinux правил для netfilter
# sesearch -AC -s httpd_t -t http_server_packet_tFound 1 semantic av rules: allow httpd_t http_server_packet_t : packet { send recv } ;
# sesearch -AC -s httpd_t -t mssql_client_packet_tFound 1 semantic av rules:DT allow httpd_t mssql_client_packet_t : packet { send recv } ; [ httpd_can_network_connect_db ]
# sesearch -AC -s squid_t -t http_client_packet_tFound 2 semantic av rules: allow squid_t http_client_packet_t : packet { send recv } ; ET allow squid_t packet_type : packet { send recv } ; [ squid_connect_any ]
# sesearch -AC -t unlabeled_t -c packet -p sendFound 5 semantic av rules: allow domain unlabeled_t : packet { send recv } ;...
119
Пример SELinux правил для netfilter
*security:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]-A INPUT -j SECMARK --selctx system_u:object_r:internet_packet_t:s0-A INPUT -p tcp -m tcp --dport 22 -j SECMARK --selctx system_u:object_r:ssh_server_packet_t:s0-A INPUT -p tcp -m multiport --dports 80,443 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0-A INPUT -m state --state RELATED,ESTABLISHED -j CONNSECMARK --save-A OUTPUT -j SECMARK --selctx system_u:object_r:intranet_packet_t:s0-A OUTPUT -p tcp -m tcp --sport 22 -j SECMARK --selctx system_u:object_r:ssh_server_packet_t:s0-A OUTPUT -p tcp -m multiport --sports 80,443 -j SECMARK --selctx system_u:object_r:http_server_packet_t:s0-A OUTPUT -m state --state RELATED,ESTABLISHED -j CONNSECMARK --saveCOMMIT
120
Часть 6. Работа с SELinux политиками
121
Управление SELinux политикой
● Изменения режима работы SELinux
● Переключение booleans
● Изменение контекста файлов и директорий
● Изменение контекста пользователей
● Изменение контекста сетевых соединений
● Изменение контекста процессов
● SELinux модули
122
SELinux пакеты
● policycoreutils, selinux-policy, selinux-policy-targeted, libselinux, libselinux-utils, libselinux-python — базовый набор пакетов в CentOS 7 (установлены по умолчанию)
● selinux-policy-devel, setools-console, policycoreutils-python, policycoreutils-newrole, policycoreutils-gui — пакеты для работы с политиками в CentOS 7
123
Пример system-config-selinux
124
Пример изменения контекста rsync
[root@vm100 ~]# yum -y install rsync[root@vm100 ~]# useradd -d /srv/backup -M -r -s /usr/sbin/nologin backup[root@vm100 ~]# id backupuid=997(backup) gid=995(backup) groups=995(backup)[root@vm100 ~]# mkdir -m 0770 -p /srv/backup[root@vm100 ~]# chown root:backup /srv/backup[root@vm100 ~]# ls -ld /srv/backupdrwxrwx---. 2 root backup 6 Nov 13 10:37 /srv/backup[root@vm100 ~]# cat << EOF >> /etc/rsyncd.conf[backup] path = /srv/backup uid = backup gid = backup read only = noEOF[root@vm100 ~]# systemctl start rsyncd.service
[root@vm200 ~]# yum -y install rsync[root@vm200 ~]# rsync -r rsync://vm100backup[root@vm200 ~]# rsync -r /etc rsync://vm100/backup rsync: mkdir "/etc" (in backup) failed: Permission denied (13)
125
Пример изменения контекста rsync
[root@vm100 ~]# aureport -a -ts recent1. 11/13/2015 10:45:36 rsync system_u:system_r:rsync_t:s0 83 dir write unconfined_u:object_r:var_t:s0 denied 4962. 11/13/2015 10:45:36 rsync system_u:system_r:rsync_t:s0 83 dir write unconfined_u:object_r:var_t:s0 denied 497[root@vm100 ~]# yum -y install policycoreutils-python setools-console[root@vm100 ~]# sesearch -AC -s rsync_t -c dir -p write...DT allow rsync_t rsync_data_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; [ rsync_client ]...[root@vm100 ~]# semanage boolean -m -1 rsync_client[root@vm100 ~]# semanage fcontext -a -t rsync_data_t '/srv/backup(/.*)?'[root@vm100 ~]# restorecon -iFRv /srv/backuprestorecon reset /srv/backup context unconfined_u:object_r:rsync_data_t:s0->system_u:object_r:rsync_data_t:s0
[root@vm200 ~]# rsync -rv /etc rsync://vm100/backup...sent 19980256 bytes received 16500 bytes 13331170.67 bytes/sec
126
Пример ошибки audit2why
# ausearch -m avc -a recent | audit2why type=AVC msg=audit(1447404336.985:496): avc: denied { write } for pid=1634 comm="rsync" name="backup" dev="vda1" ino=1075368783 scontext=system_u:system_r:rsync_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=dir
Was caused by: The boolean rsync_full_access was set incorrectly. Description: Allow rsync to full access
Allow access by executing: # setsebool -P rsync_full_access 1
audit2why сразу предлагает разрешить полный доступ, хотя достаточно сменить стандартный контекст таргет директории
127
Пример переключения SELinux booleans
# semanage boolean -l | grep httpd_can_network_connecthttpd_can_network_connect (off , off) Allow HTTPD scripts and modules to connect to the network using TCP.
# getsebool httpd_can_network_connecthttpd_can_network_connect --> off
# setsebool httpd_can_network_connect on
# semanage boolean -l | grep httpd_can_network_connecthttpd_can_network_connect (on , off)
# setsebool -P httpd_can_network_connect on
# semanage boolean -l | grep httpd_can_network_connecthttpd_can_network_connect (on , on)
# semanage boolean -m --off httpd_can_network_connect
128
Что именно включает SELinux boolean?
# sesearch -AC -b httpd_can_network_connectFound 17 semantic av rules:
DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ]...
# seinfo -aport_type -x | wc -l270
DT – статус disabled (D) или enabled (E) и условие включения true (T) или false (F).
129
Пример создания SELinux модуля rsync
Задача – настроить два сервера MariaDB Master / Standby с репликацией данных через rsync демон.
130
Пример создания SELinux модуля rsync
[root@vm100 ~]# yum -y install mariadb-server rsync[root@vm100 ~]# cat << EOF >> /etc/rsyncd.conf[mysql] path = /var/lib/mysql uid = mysql gid = mysql read only = noEOF[root@vm100 ~]# systemctl start rsyncd.service
[root@vm200 ~]# yum -y install mariadb-server rsync[root@vm200 ~]# systemctl start mariadb.service[root@vm200 ~]# rsync -r rsync://vm100mysql[root@vm200 ~]# rsync -r /var/lib/mysql/* rsync://vm100/mysql@ERROR: chroot failedrsync error: error starting client-server protocol (code 5)
[root@vm100 ~]# setenforce 0
[root@vm200 ~]# rsync -rv /var/lib/mysql/* rsync://vm100/mysql...sent 30408091 bytes received 1825 bytes 60819832.00 bytes/sec
131
Пример создания SELinux модуля rsync
[root@vm100 ~]# yum -y install selinux-policy-devel setools-console mcstrans policycoreutils-python @Development Tools
[root@vm100 ~]# mkdir rsync_local[root@vm100 ~]# cd rsync_local[root@vm100 ~]# sepolicy generate -n rsync_local --customize -d rsync_t[root@vm100 ~]# ausearch -m avc -ts recent -se rsync_t | audit2allow -r -m rsync_local > rsync_local.te
[root@vm100 ~]# vim rsync_local.te[root@vm100 ~]# vim rsync_local_selinux.spec[root@vm100 ~]# ./rsync_local.sh[root@vm100 ~]# setenforce 1
[root@vm200 ~]# rsync -rv /var/lib/mysql/* rsync://vm100/mysql...sent 30408091 bytes received 1825 bytes 60819832.00 bytes/sec
[root@vm100 ~]# find -name '*rpm' ./rsync_local_selinux-1.0-1.el7.centos.src.rpm./noarch/rsync_local_selinux-1.0-1.el7.centos.noarch.rpm
132
Пример анализа SELinux модуля
# yum -y install bzip2 checkpolicy# cp /etc/selinux/targeted/modules/active/modules/rsync_local.pp rsync_local.mod.bz2# bzip2 -d rsync_local.mod.bz2# sedismod rsync_local.mod ...Select a command:1) display unconditional AVTAB...
Command ('m' for menu): 1... allow [rsync_t] [mysqld_db_t] : [dir] { write search remove_name create getattr add_name }; allow [rsync_t] [mysqld_db_t] : [file] { rename write getattr setattr read create open };
# rm rsync_local.mod
133
Пример selinux-polgengui
134
Часть 7. SELinux в продакшн среде
135
SELinux в продакшн среде
● Включен по умолчанию везде
● Управляется политикой конфигурации
● Не используется semanage
● Мониторинг
136
Политика конфигурации SELinux
● Устанавливает пакеты с политиками
● setenforce 1
● Daily restorecon
● Booleans
● File contexts
● Port contexts
● SELinux users
137
Мониторинг
● SELinux режим
● SELinux модули
● SELinux permissive типы
● SELinux booleans
● При срабатывании авто инцидент
138
Вопросы?
139
Литература
https://en.wikipedia.org/wiki/Security-Enhanced_Linux
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide
https://www.packtpub.com/networking-and-servers/selinux-system-administration
140
Спасибо за внимание!
141
Алексей Чудов
Security Team Lead, System Administrator at OK.RU
https://www.linkedin.com/in/AlekseyChudov
Riga 2016