TL; DR: в системе, где используется SELinux , файлы, используемые системой (например, демоны), следует копировать или перемещать с помощью cp -aZ
и mv -Z
вместо cp -a
и mv
. Если это не было сделано, нужно просто использовать restorecon -v -r
или restorecon -v -F -r
в месте назначения, чтобы попросить систему восстановить контексты SELinux по умолчанию. Всегда полезно использовать restorecon
в конце скрипта, который работал с ключевыми файлами конфигурации.
RHEL и, следовательно, большинство его производных по умолчанию используют SELinux.
Итак, чтобы решить вашу проблему, если ваша система основана на RHEL и использует пакет mariadb-server
, просто сделайте на последнем шаге, когда файл находится в правильном месте:
# restorecon -v -F /etc/my.cnf.d/server.cnf
Relabeled /etc/my.cnf.d/server.cnf from unconfined_u:object_r:user_home_t:s0 to system_u:object_r:mysqld_etc_t:s0
(Обратите внимание , что без -F
это не изменит unconfined_u
к настроенному system_u
Это не имеет значения для обычных систем. Мое знание разницы и почему это не имеет значения, не заходит так далеко).
Было бы просто больше работы, чтобы поместить правильный контекст в файл в другом месте. chcon
может сделать это (либо указав его с помощью -u
-t
и т. д., проще, скопировав контекст из другого файла с помощью --reference
):
# ls -lZ /home/test/server.cnf.bad
-rw-r--r--. 1 root root unconfined_u:object_r:user_home_t:s0 744 Apr 30 2017 /home/test/server.cnf.bad
# chcon -v -u system_u -t mysqld_etc_t /home/test/server.cnf.bad
changing security context of '/home/test/server.cnf.bad'
# ls -lZ /home/test/server.cnf.bad
-rw-r--r--. 1 root root system_u:object_r:mysqld_etc_t:s0 744 Apr 30 2017 /home/test/server.cnf.bad
Если вы подозреваете проблемы с SELinux, проверьте /var/log/audit/audit.log
наличие записей со словом « denied
относящихся к вашему процессу или файлу. Вы всегда можете временно попросить SELinux разрешить операции, а затем восстановить их с помощью соответственно setenforce Permissive
и setenforce Enforcing
для сравнения поведения. Не оставляйте его в Permissive
особенно для производства.
Различные объяснения следующие ...
Пример и что нужно сделать при работе с файлами конфигурации
Пример bahaviour с различными параметрами cp
и mv
в системе с поддержкой SELinux:
$ id
uid=1034(test) gid=1034(test) groups=1034(test)
$ pwd
/home/test
test@glasswalker:~$ ls -lZ foo
-rw-r--r--. 1 test test unconfined_u:object_r:user_home_t:s0 0 Aug 11 11:25 foo
$ cp foo /tmp/foo1
$ cp --preserve=context foo /tmp/foo2
$ cp -a foo /tmp/foo3
$ cp -aZ foo /tmp/foo4
$ mv foo /tmp/foo5
$ ls -lZ /tmp/foo?
-rw-r--r--. 1 test test unconfined_u:object_r:user_tmpfs_t:s0 0 Aug 11 11:25 /tmp/foo1
-rw-r--r--. 1 test test unconfined_u:object_r:user_home_t:s0 0 Aug 11 11:25 /tmp/foo2
-rw-r--r--. 1 test test unconfined_u:object_r:user_home_t:s0 0 Aug 11 11:25 /tmp/foo3
-rw-r--r--. 1 test test unconfined_u:object_r:user_tmpfs_t:s0 0 Aug 11 11:25 /tmp/foo4
-rw-r--r--. 1 test test unconfined_u:object_r:user_home_t:s0 0 Aug 11 11:25 /tmp/foo5
$ touch bar
$ ls -lZ bar
-rw-r--r--. 1 test test unconfined_u:object_r:user_home_t:s0 0 Aug 11 11:49 bar
$ mv -Z bar /tmp
$ ls -lZ /tmp/bar
-rw-r--r--. 1 test test unconfined_u:object_r:user_tmpfs_t:s0 0 Aug 11 11:49 /tmp/bar
Поэтому использование cp -aZ
или mv -Z
прекрасно работает, когда контексты безопасности имеют значение и сохраняют другие атрибуты. Скрипт, перемещающий системные файлы, всегда должен использовать опцию -Z
для любой команды cp
или mv
, или просто использовать restorecon
на последнем этапе, чтобы избежать непредвиденных проблем.
Почему эти различия?
Команда mv
поддерживает согласованное поведение. Если бы это произошло в той же файловой системе, то, конечно, все, что связано с файлом, включая контекст безопасности, не было бы изменено, так как это просто "переименование". Таким образом, в двух файловых системах, где на самом деле это копия, а затем ее удаление, она также копирует без изменений все, что прикреплено к файлу, и знает о ней, включая контекст безопасности, для согласованности.
Команда cp
по умолчанию просто создает новый файл, так что этот файл наследует родительский контекст selinux как обычно, если, конечно, не указано иное с --preserve=context
который включен в -a
. --preserve=context
может быть извлечен из -a
с опцией -Z
поэтому лучше всего копировать целую древовидность - использовать -aZ
вместо -a
если SELinux имеет значение.
По умолчанию при создании файла, что является обычным случаем, этот новый файл наследует контекст своего каталога SELinux, поэтому все работает нормально (не по теме: в редких случаях контекст файла должен отличаться от контекста своего каталога только из-за Если править его именем, ядру все равно, для его обработки потребуются такие программы, как restorecond
восстановления демона).
Что такое SELinux
SELinux - это обязательный механизм контроля доступа (MAC), используемый в дополнение ко всем другим механизмам (разрешения Unix, такие как DAC, списки контроля доступа, ACL и т.д.). Когда процесс выполняется в контексте безопасности процесса, существует "матрица правил", позволяющая проверить, может ли этот контекст процесса выполнить запрошенную операцию (открыть, прочитать, записать, mmap, ...) в контексте файла, с которым он пытается работать.
Пример для случая OP: Если контексту процесса mysqld
разрешен доступ только к нескольким типам контекста файла, включая mysqld_etc_t
но не user_home_t
то запуск mysqld
завершится неудачно, поскольку он не может прочитать свой файл конфигурации с неправильным типом user_home_t
.
На обычных системах это не имеет значения для интерактивного / вошедшего в систему пользователя, поскольку его обычный контекст процесса не ограничен, то есть правило SELinux не будет применяться. Каждый демон, запущенный systemd
или другими подобными механизмами , получит контекст процесса, который можно проверить с помощью опции ps
-s -Z
. Пример в системе Debian под управлением SELinux:
# ps -Z -p $$
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 22498 pts/7 00:00:00 bash
# ps -Z -p $(pidof /sbin/getty)
LABEL PID TTY STAT TIME COMMAND
system_u:system_r:getty_t:s0 6158 tty1 Ss+ 0:00 /sbin/getty 38400 tty1
system_u:system_r:getty_t:s0 6159 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
system_u:system_r:getty_t:s0 6160 tty3 Ss+ 0:00 /sbin/getty 38400 tty3
system_u:system_r:getty_t:s0 6161 tty4 Ss+ 0:00 /sbin/getty 38400 tty4
system_u:system_r:getty_t:s0 6162 tty5 Ss+ 0:00 /sbin/getty 38400 tty5
system_u:system_r:getty_t:s0 6163 tty6 Ss+ 0:00 /sbin/getty 38400 tty6