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