Перейти к содержанию

Настройка SELinux

SELinux (Security-Enhanced Linux) – это модуль безопасности Linux (LSM), который реализует списки контроля доступа. Он определяет, как и с какими ограничениями процессы взаимодействуют с файлами, сетевыми портами, каталогами, другими процессами и дополнительными компонентами сервера.

Политика SELinux определяет набор правил, «типы» файлов и «домены» для процессов. Правила определяют, как процесс взаимодействует с другим типом. SELinux решает, разрешить или запретить действие, исходя из контекста субъекта, того, какой объект инициирует действие и какой объект является целью действия.

Метка представляет контекст для администраторов и пользователей.

CentOS 7 и CentOS 8 содержат политику MySQL SELinux. MyDB Сервер для MySQL является полной заменой MySQL и может использовать эту политику без изменений.

Пример контекста SELinux

Чтобы просмотреть контекст SELinux, добавьте ключ -Z, который поддерживается многими системными утилитами. Вот пример контекста mysqld:

$ ps -eZ | grep mysqld_t
Ожидаемый результат
system_u:system_r:mysqld_t:s0    3356 ?        00:00:01 mysqld

Контекст имеет следующие свойства:

  • Пользователь — system_u

  • Роль — system_r

  • Тип или домен — mysqld_t

  • Уровень чувствительности - s0 3356

Большинство правил политики SELinux основаны на типе или домене.

Список типов или доменов SELinux, связанных с файлами

Свойство безопасности, на которое опирается SELinux, — это свойство безопасности Type. Имя типа часто заканчивается на _t. Группа объектов с одинаковым значением безопасности типа принадлежит одному домену.

Чтобы просмотреть типы mysqldb_t, связанные с каталогами и файлами MySQL, выполните следующую команду:

$ ls -laZ /var/lib/ | grep mysql
Ожидаемый результат
drwxr-x--x. mysql   mysql   system_u:object_r:mysqld_db_t:s0 mysql
drwxr-x---. mysql   mysql   system_u:object_r:mysqld_db_t:s0 mysql-files
drwxr-x---. mysql   mysql   system_u:object_r:mysqld_db_t:s0 mysql-keyring

Примечание

Если тип политики не определяет свойство типа для объекта, значением по умолчанию является unconfined_t.

Режимы SELinux

SELinux имеет следующие режимы:

  • Disabled — модули политики SELinux не загружены, что отключает политики. Ничего не сообщается.

  • Permissive — SELinux активен, но модули политики не применяются. Сообщается о нарушении политики, но это не останавливает действие.

  • Enforcing — SELinux активен, о нарушениях сообщается и действия отклоняются. Если нет правила, разрешающего доступ к ограниченному ресурсу, SELinux запрещает доступ.

Типы политик

SELinux имеет несколько типов политик:

  • Targetd — большинство процессов работают без ограничений. Конкретные службы содержатся в доменах безопасности и определяются политиками.

  • Strict — все процессы содержатся в доменах безопасности и определяются политиками.

SELinux управляет ограниченными процессами, которые выполняются в домене, и ограничивает всё, если это явно не разрешено. Неограниченному процессу в неограниченном домене разрешен почти весь доступ.

MySQL — это ограниченный процесс, и модуль политики определяет, какие файлы читаются, какие порты открываются и т. д. SELinux предполагает, что установка MyDB Сервер для MySQL использует расположение файлов и порты по умолчанию.

Если вы измените значение по умолчанию, вам также необходимо отредактировать политику. Если вы не обновите политику, SELinux в принудительном режиме откажет в доступе ко всем ресурсам, отличным от настроек по умолчанию.

Проверка режима SELinux

Чтобы проверить текущий режим SELinux, используйте любую из следующих команд:

$ 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
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

или

$ grep ^SELINUX= /etc/selinux/config
Ожидаемый результат
SELINUX=enforcing

Примечание

Добавьте параметр -b в sestatus, чтобы отобразить логические значения политики. Отображаются логические значения для каждого параметра. Пример использования параметра -b:

$ sestatus -b | grep mysql
Ожидаемый результат
mysql_connect_any                           off
selinuxuser_mysql_connect_enabled

Файл /etc/selinux/config определяет, включен или отключен SELinux, а если включен, то будет ли SELinux работать в принудительном (Enforcing) или разрешающем (Permissive) режиме.

Отключение SELinux

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

Чтобы отключить SELinux при загрузке, установите параметр ядра selinux=0. В этом случае ядро не загружает инфраструктуру SELinux. Эта опция имеет тот же эффект, что и добавление инструкции SELINUX=disabled в файле конфигурации с последующей перезагрузкой системы.

Дополнительные инструменты SELinux

При необходимости установите инструменты управления SELinux, такие как semanage или search.

В RHEL 7 или совместимых операционных системах используйте следующую команду от имени пользователя root:

$ yum -y install policycoreutils-python

В RHEL 8 или совместимых операционных системах используйте следующую команду от имени пользователя root:

$ yum -y install policycoreutils-python-utils

Примечание

Для запуска команд управления SELinux вам могут потребоваться права root.

Переключение режима в файле конфигурации

Переключение между режимами может помочь при устранении неполадок или изменении правил.

Чтобы навсегда изменить режим, отредактируйте файл /etc/selinux/config и измените значение SELINUX=. Вам также следует проверить изменение.

$ cat /etc/selinux/config | grep SELINUX= | grep -v ^#
Ожидаемый результат
SELINUX=enforcing
SELINUX=enforcing
$ sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

$ cat /etc/selinux/config | grep SELINUX= | grep -v ^#
Ожидаемый результат
SELINUX=permissive
SELINUX=permissive

Перезагрузите систему после изменений.

При переключении из отключенного или разрешающего режима в принудительное использование см. раздел Перемаркировка всей файловой системы.

Переключение режима до следующей перезагрузки

Чтобы изменить режим до следующей перезагрузки, используйте любую из следующих команд от имени пользователя root:

$ setenforce Enforcing

или

$ setenforce 1

Доступны следующие параметры setenforce:

параметры setenforce Также допустимо
0 Permissive
1 Enforcing

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

$ getenforce
Ожидаемый результат
Enforcing

или

$ sestatus | grep -i mode
Ожидаемый результат
Current mode:                   permissive
Mode from config file:          enforcing

Переключение режима службы

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

Чтобы добавить службу в разрешительный домен, запустите от имени пользователя root:

$ sudo semanage permissive -a mysqld_t

Чтобы просмотреть текущие разрешительные домены, выполните следующую команду:

$ sudo semanage permissive -l
Ожидаемый результат
...
Customized Permissive Types

mysqld_t

Builtin Permissive Types
...

Чтобы удалить службу из разрешительного домена, выполните следующую команду:

$ sudo semanage permissive -d mysqld_t

Служба возвращается в системный режим SELinux. Обязательно выполните действия по перемаркировке всей файловой системы.

Перемаркировка всей файловой системы

Переход от отключенного или разрешительного режима к принудительному требует дополнительных действий. Для функционирования принудительного режима требуются правильные контексты или метки. Разрешительный режим позволяет пользователям и процессам неправильно помечать файлы и системные объекты. Отключенный режим не загружает инфраструктуру SELinux и не маркирует ресурсы или процессы.

В RHEL и совместимых системах для изменения меток используйте приложение fixfiles. Вы можете перемаркировать всю файловую систему или контексты файлов приложения.

Для одного приложения выполните следующую команду:

$ fixfiles -R mysqld restore

Чтобы перемаркировать файловую систему без перезагрузки системы, используйте следующую команду:

$ fixfiles -f -F relabel

Другой вариант перемаркировывает файловую систему во время перезагрузки. Вы можете добавить сенсорный файл, прочитать его во время перезагрузки или настроить параметр загрузки ядра. Завершение операции изменения метки автоматически удаляет сенсорный файл.

Добавьте сенсорный файл от имени root:

$ touch /.autorelabel

Чтобы настроить ядро, добавьте параметр ядра autorelabel=1 в список параметров загрузки. Параметр вызывает перемаркировку системы. Перезагрузитесь в разрешительном режиме, чтобы процесс завершился, прежде чем переходить к принудительному использованию.

Примечание

Перемаркировка всей файловой системы требует времени. После завершения перемаркировки система снова перезагружается.

Установка пользовательского каталога данных

Если вы не используете настройки по умолчанию, SELinux в принудительном режиме блокирует доступ к системе.

Например, при установке вы использовали следующую конфигурацию:

datadir=/var/lib/mysqlcustom
socket=/var/lib/mysqlcustom/mysql.sock

Перезапустите службу.

$ service mysqld restart
Ожидаемый результат
Redirecting to /bin/systemctl restart mysqld.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

Проверьте журнал, чтобы увидеть код ошибки.

$ journalctl -xe
Ожидаемый результат
...
SELinux is preventing mysqld from getattr access to the file /var/lib/mysqlcustom/ibdata1.
...

Проверьте типы SELinux в /var/lib/mysqlcustom.

ls -1aZ /var/lib/mysqlcustom
Ожидаемый результат
  total 164288
  drwxr-x--x.  6 mysql mysql system_u:object_r:var_lib_t:s0       4096 Dec  2 07:58  .
  drwxr-xr-x. 38 root  root  system_u:object_r:var_lib_t:s0       4096 Dec  1 14:29  ..
  ...
  -rw-r-----.  1 mysql mysql system_u:object_r:var_lib_t:s0   12582912 Dec  1 14:29  ibdata1
  ...

Для решения проблемы используйте следующие методы:

  • Установите правильные метки для файлов mysqlcustom.

  • Измените политику SELinux mysqld, чтобы разрешить mysqld доступ к файлам var_lib_t.

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

  1. Чтобы изменить контекст SELinux, используйте semanage fcontext. На этом этапе вы определяете, как SELinux будет работать с пользовательскими путями:

    $ semanage fcontext -a -e /var/lib/mysql /var/lib/mysqlcustom
    

    SELinux применяет к пользовательскому каталогу ту же схему маркировки, которая определена в политике mysqld для каталога /var/lib/mysql. Файлы, созданные в пользовательском каталоге, помечаются так, как если бы они находились в /var/lib/mysql.

  2. Команда restorecon применяет изменения.

    $ restorecon -R -v /var/lib/mysqlcustom
    
  3. Перезапустите службу mysqld:

    $ service mysqld start
    

Установка нестандартного местоположения журнала

Если вы не используете настройки по умолчанию, SELinux в принудительном режиме блокирует доступ к местоположению. Измените местоположение журнала на произвольное в my.cnf:

log-error=/logs/mysqld.log

Проверьте расположение журнала с помощью следующей команды:

$ ls -laZ /
Ожидаемый результат
  ...
  drwxrwxrwx.   2 root root unconfined_u:object_r:default_t:s0    6 Dec  2 09:16 logs
  ...

Запуск MySQL возвращает следующее сообщение:

$ service mysql start
Ожидаемый результат
Redirecting to /bin/systemctl start mysql.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

$ journalctl -xe
...
SELinux is preventing mysqld from write access to the directory logs.
...

Политика SELinux по умолчанию позволяет mysqld записывать журналы в местоположение, помеченное var_log_t, которое является местоположением /var/log. Решить проблему можно одним из следующих способов:

  • Правильно пометьте местоположение /logs

  • Отредактируйте политику SELinux, чтобы разрешить mysqld доступ ко всем каталогам.

Рекомендуется пометить пользовательское местоположение /logs, поскольку из-за него блокируется доступ. Выполните следующие команды, чтобы пометить произвольное местоположение:

$ semanage fcontext -a -t var_log_t /logs
$ restorecon -v /logs

Возможно, вы не сможете изменить метку каталога /logs. Например, другие приложения со своими правилами используют тот же каталог.

Чтобы настроить политику SELinux при совместном использовании каталога, выполните следующие действия:

  1. Создайте локальную политику:

    ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
    
  2. Эта команда создает файлы my-mysqld.te и my-mysqld.pp. mysqld.te — это файл политики соблюдения типов. my-mysqld.pp — это модуль политики, загружаемый в виде бинарного файла в подсистему SELinux.

    Пример файла my-myslqd.te:

    module my-mysqld 1.0;
    
    require {
        *type mysqld_t*;
        type var_lib_t;
        *type default_t*;
        class file getattr;
        *class dir write*;
    }
    
    ============= mysqld_t ==============
    *allow mysqld_t default_t:dir write*;
    allow mysqld_t var_lib_t:file getattr;
    

    Эта политика содержит правила для пользовательского каталога данных и пользовательского каталога журналов. Мы установили правильные метки для местоположения каталога данных, и применение этой автоматически сгенерированной политики ослабило бы нашу защиту, разрешив mysqld доступ к тегам var_lib_t.

  3. События, генерируемые SELinux, преобразуются в правила. Созданная политика может содержать правила для недавних нарушений, а также включать несвязанные правила. Несвязанные правила создаются в результате действий, таких как изменение местоположения каталога данных, которые не связаны с каталогом журналов. Добавьте параметр --start, чтобы использовать события журнала через определенное время для фильтрации нежелательных событий. Этот параметр фиксирует события, когда отметка времени равна указанному времени или позже. SELinux генерирует политику для текущих действий.

    $ ausearch --start 10:00:00 -c 'mysqld' --raw | audit2allow -M my-mysqld
    
  4. Эта политика позволяет mysqld записывать данные в каталоги с тегами. Откройте файл my_mysqld:

    module my-mysqld 1.0;
    
    require {
        type mysqld_t;
        type default_t;
        class dir write;
    }
    
    ============= mysqld_t ==============
    allow mysqld_t default_t:dir write;
    
  5. Установите модуль политики SELinux:

    $ semodule -i my-mysqld.pp
    

Перезапустите службу. В случае сбоя проверьте журнал и выполните ту же процедуру.

Если SELinux запрещает mysql создавать файл журнала внутри каталога, вы можете просмотреть все нарушения, изменив режим SELinux на Permissive и затем запустив mysqld. Все нарушения фиксируются в журнале. После этого запуска вы можете сгенерировать модуль локальной политики, установить его и переключить SELinux обратно в режим Enforcing. Выполните следующую процедуру:

  1. Выгрузите текущий локальный модуль политики my-mysqld:

    $ semodule -r my-mysqld
    
  2. Вы можете перевести один домен в разрешительный режим. Другие домены в системе останутся в принудительном режиме. Используйте semanage permissive с параметром -a, чтобы перевести mysqld_t в разрешительный режим:

    $ semanage permissive -a mysqld_t
    
  3. Проверьте изменение режима:

    $ semdule -l | grep permissive
    
    Ожидаемый результат
    ...
    permissive_mysqld_t
    ...
    
  4. Чтобы облегчить поиск по логу, напечатайте время:

    $ date
    
  5. Запустите службу.

    $ service mysqld start
    
  6. MySQL запускается, и SELinux регистрирует нарушения в журнале. Проверьте журнал:

    $ journalctl -xe
    
  7. Остановите службу:

    $ service mysqld stop
    
  8. Создайте локальную политику mysqld, используя время, полученное на шаге 4:

    $ ausearch --start <date-c 'mysqld' --raw | audit2allow -M my-mysqld
    
  9. Просмотрите политику (созданная вами политика может отличаться):

    $ cat my-mysqld.te
    
    Ожидаемый результат
    module my-mysqld 1.0;
    
    require {
    type default_t;
        type mysqld_t;
        class dir { add_name write };
        class file { append create open };
    }
    
    ============= mysqld_t ==============
    allow mysqld_t default_t:dir { add_name write };
    allow mysqld_t default_t:file { append create open };
    
  10. Установите политику:

    $ semodule -i my-mysqld.pp
    
  11. Используйте semanage permissive с параметром -d, который удаляет разрешительный домен для службы:

    $ semanage permissive -d mysqld_t
    
  12. Перезапустите службу:

    $ service mysqld start
    

Примечание

Используйте эту процедуру для настройки локального модуля политики mysqld. Вам следует просмотреть внесенные изменения, чтобы убедиться, что правила не слишком толерантны.

Установить каталог secure_file_priv

При необходимости обновите теги SELinux для каталога /var/lib/mysql-files/, используемого для SELECT ... INTO OUTFILE или подобных операций. Серверу требуется только доступ на чтение/запись к каталогу назначения.

Чтобы настроить secure_file_priv для использования этого каталога, выполните следующие команды для установки контекста:

$ semanage fcontext -a -t mysqld_db_t "/var/lib/mysql-files/(/.*)?"
$ restorecon -Rv /var/lib/mysql-files

При необходимости отредактируйте путь для другого местоположения.


Последнее обновление: 2024-04-30