SELinux
Описание
Безопасность системы Linux построена на базе принципов безопасности UNIX
Решения в рамках обеспечения безопасности UNIX системы развивались без учета потребностей современных требований к IT инфраструктуре
Больгинство этих решений фокусируется на определенной части ОС, таким образом для обеспечения безопасности всей системы нужно собрать множество модулей
SELinux обеспечивает комлексное единое решение для целей безопасности системы
Главный принцип: "что не разрешено, то запрещено"
Исходя из этого "неизвестным" сервисам в системе всегда необходима дополнительная конфигурация для активации их в системе с включенным SELinux
Режимы SELinux
SELinux имеет два базовых состояния: включен и выключен
Смена состояния возможна только с перезагрузкой системы
В включенном (enabled) состоянии есть два режима:
Enforcing - включены все механизмы
Permissive - логирование, но без блокирования сервисов
Смена между режимами не требует перезагрузки
setenforce - смена режима
[root@centos8 ~]# setenforce --help
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
getenforce - отобразить текущий статус
/etc/sysconfig/selinux позволяет настроить статус по-умолчанию
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
После перевода SELinux из отключенного состояния во включенное, система будет перемаркирована, о чем уведомит в консоли при перезагрузке
Это может занять продолжительное время в зависимости от размера файлов и системы
Маркираторы и логические операторы
Каждый объект в системе промаркирован с помощью context label
Он состоит из трех компонентов:
user - пользовательский контекст
role - ролевой контекст
type - флаги операций, доступных объекту
Многие команды поддерживают опцию -Z для отображения текущей контекстной информации
Типы контекстов используется в правилах политик для определения того, какие объекты к каким таргетам имеют доступ
Пример вывода контекстной информации:
unconfined - статус процесса, который не блокируется SELinux
system_u - пользовательский контекст
system_r - ролевой контекст
kernel_t - контекст типа
Доступ определяется правилами в SELinux, которые сопоставляют какие контексты могут между собой взаимодействовать
system_u:system_r:auditd_t:s0 root 977 0.0 0.0 134940 784 ? S<sl Mar23 0:00 /sbin/auditd
system_u:system_r:auditd_t:s0 root 979 0.0 0.0 47844 4 ? S< Mar23 0:00 /usr/sbin/sedispatch
system_u:system_r:kernel_t:s0 root 989 0.0 0.0 0 0 ? I< Mar23 0:00 [rpciod]
system_u:system_r:kernel_t:s0 root 991 0.0 0.0 0 0 ? I< Mar23 0:00 [xprtiod]
system_u:system_r:alsa_t:s0 root 1006 0.0 0.0 17460 0 ? SNs Mar23 0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
system_u:system_r:bluetooth_t:s0 root 1008 0.0 0.1 76896 2168 ? Ss Mar23 0:00 /usr/libexec/bluetooth/bluetoothd
system_u:system_r:lsmd_t:s0 libstor+ 1010 0.0 0.0 18876 0 ? Ss Mar23 0:00 /usr/bin/lsmd -d
system_u:system_r:avahi_t:s0 avahi 1013 0.0 0.0 81592 1020 ? Ss Mar23 0:01 avahi-daemon: running [centos8.local]
system_u:system_r:irqbalance_t:s0 root 1014 0.0 0.0 124820 464 ? Ssl Mar23 0:18 /usr/sbin/irqbalance --foreground
system_u:system_r:systemd_machined_t:s0 root 1015 0.0 0.0 83196 888 ? Ss Mar23 0:01 /usr/lib/systemd/systemd-machined
system_u:system_r:modemmanager_t:s0 root 1016 0.0 0.0 461568 1144 ? Ssl Mar23 0:00 /usr/sbin/ModemManager
[root@centos8 ~]# ls -lZ /etc/ssh
total 600
-rw-r--r--. 1 root root system_u:object_r:etc_t:s0 577388 Feb 4 19:01 moduli
-rw-r--r--. 1 root root system_u:object_r:etc_t:s0 1716 Feb 4 19:01 ssh_config
drwxr-xr-x. 2 root root system_u:object_r:etc_t:s0 28 Feb 4 19:01 ssh_config.d
-rw-------. 1 root root system_u:object_r:etc_t:s0 4425 Feb 4 19:01 sshd_config
-rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 492 Jan 7 12:38 ssh_host_ecdsa_key
-rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 162 Jan 7 12:38 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 387 Jan 7 12:38 ssh_host_ed25519_key
-rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 82 Jan 7 12:38 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0 2578 Jan 7 12:38 ssh_host_rsa_key
-rw-r--r--. 1 root root system_u:object_r:sshd_key_t:s0 554 Jan 7 12:38 ssh_host_rsa_key.pub
Логический оператор (boolean) - есть переключатель on/off
Используется для включения или отключения определенных категорий функциональности разом
Статус можно проверить через getsebool
[root@centos8 ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
<...>
dbadm_exec_content --> on
dbadm_manage_user_files --> off
dbadm_read_user_files --> off
deny_bluetooth --> off
deny_execmem --> off
deny_ptrace --> off
dhcpc_exec_iptables --> off
dhcpd_use_ldap --> off
domain_can_mmap_files --> off
domain_can_write_kmsg --> off
domain_fd_use --> on
domain_kernel_load_modules --> off
entropyd_use_audio --> on
Изменить значение можно через setsebool -P <boolean_name>
[root@centos8 ~]# setsebool -P httpd_enable_homedirs on
Файловый контекст
Установить файловый контекст:
semanage fcontext
Данная команда запишет контекст в политики SELinux, но не меняет значения в файловой системе
Для установки политики в файловую систему необходимо использовать restorecon
Альтернативно можно использовать touch /.autorelabel для перемаркировки всех файлов
Система должна быть перезагружена
Пример:
Если необходимо заменить для HTTP сервера директорию, то соответственно для контекста типа надо произвести замену (в данном случае меняется /var/www/html на /web и создается новое правило)
restorecon для применения изменений
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -R -v /web
Логи SELinux
SELinux использует auditd для записи логов
Данные логи трудны для восприятия
Для интерпретации логов аудита в удобочитаемые логи /var/log/messages используется sealert
Использование sealert вместе с UUID даст рекомендации по решению проблемы с SELinux
[root@centos8 ~]# grep AVC /var/log/audit/audit.log
type=USER_AVC msg=audit(1581970964.577:688): pid=1026 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=2) exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'UID="dbus" AUID="unset" SAUID="dbus"
type=USER_AVC msg=audit(1581970998.982:689): pid=1026 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=3) exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'UID="dbus" AUID="unset" SAUID="dbus"
type=USER_AVC msg=audit(1585248790.086:2490): pid=1026 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=4) exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'UID="dbus" AUID="unset" SAUID="dbus"
type=USER_AVC msg=audit(1585248790.105:2491): pid=81416 uid=0 auid=0 ses=8 subj=unconfined_u:unconfined_r:unconfined_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=4) exe="/usr/bin/dbus-daemon" sauid=0 hostname=? addr=? terminal=?'UID="root" AUID="root" SAUID="root"
type=USER_AVC msg=audit(1585248793.770:2493): pid=1026 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=5) exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'UID="dbus" AUID="unset" SAUID="dbus"
type=USER_AVC msg=audit(1585248793.772:2494): pid=81416 uid=0 auid=0 ses=8 subj=unconfined_u:unconfined_r:unconfined_dbusd_t:s0-s0:c0.c1023 msg='avc: received policyload notice (seqno=5) exe="/usr/bin/dbus-daemon" sauid=0 hostname=? addr=? terminal=?'UID="root" AUID="root" SAUID="root"
[root@centos8 ~]# journalctl | grep sealert
Last updated
Was this helpful?