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