TL; DR: dans un système où SELinux est utilisé, les fichiers utilisés par le système (par exemple, les démons) doivent être copiés ou déplacés avec cp -aZ
et à la mv -Z
place de cp -a
et mv
. Si cela n'a pas été fait, il suffit d'utiliser restorecon -v -r
ou restorecon -v -F -r
sur la destination pour demander au système de restaurer les contextes SELinux par défaut. C'est toujours une bonne idée d'utiliser restorecon
à la fin d'un script qui a fonctionné sur des fichiers de configuration clés.
RHEL et donc la plupart de ses dérivés utilisent SELinux par défaut .
Donc, pour résoudre votre problème, si votre système est basé sur RHEL et utilise le mariadb-server
package, procédez à l'étape finale lorsque le fichier se trouve au bon endroit :
# 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
(Notez que sans -F
cela, unconfined_u
la configuration ne changerait pas system_u
. Cela n'aurait pas d'importance pour les systèmes courants. Ma connaissance de la différence et de la raison pour laquelle cela n'a aucune importance ne va pas aussi loin).
Ce serait simplement plus de travail de mettre le bon contexte sur le fichier ailleurs . chcon
peut le faire (soit en l'indiquant avec -u
-t
etc., plus simplement en copiant le contexte depuis un autre fichier avec --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
Si vous suspectez des problèmes avec SELinux, vérifiez les /var/log/audit/audit.log
entrées avec le mot denied
associé à votre processus ou fichier. Vous pouvez toujours demander temporairement à SELinux d'autoriser les opérations, puis de les restaurer, avec respectivement setenforce Permissive
et setenforce Enforcing
pour comparer le comportement. Ne le laissez pas Permissive
spécialement pour la production.
Diverses explications suivantes ...
Exemple et ce qu'il faut faire pour travailler sur des fichiers de configuration
Exemple de comportement avec diverses cp
options et mv
sur un système activé pour 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
Donc, utiliser cp -aZ
ou mv -Z
fonctionne bien lorsque les contextes de sécurité importent tout en préservant les autres attributs. Un script système de fichiers doit se déplacer toujours utiliser l' -Z
option pour tout cp
ou mv
commande, ou bien il suffit d' utiliser restorecon
dans son étape finale pour éviter des problèmes inattendus.
Pourquoi ces différences?
La mv
commande conserve un comportement cohérent. Si cela se produisait dans le même système de fichiers, bien entendu tout ce qui serait attaché à un fichier, y compris son contexte de sécurité, ne serait pas modifié puisqu'il ne s'agit que d'un "renommer". Ainsi, sur deux systèmes de fichiers, où il s’agit d’une copie puis d’une suppression, il copie également tout ce qui est attaché au fichier et qui est connu, ainsi que son contexte de sécurité, pour des raisons de cohérence.
La cp
commande par défaut vient de créer un nouveau fichier, si ce fichier hérite du contexte de SELinux du parent comme d' habitude, à moins bien sûr dit autrement --preserve=context
inclus dans -a
. --preserve=context
peut être soustrait -a
à l’option de -Z
sorte que le meilleur choix lors de la copie d’arborescences entières est de l’utiliser à la -aZ
place de -a
si SELinux est important.
Par défaut, lors de la création d’un fichier, ce qui est le cas habituel, ce nouveau fichier hérite du contexte du répertoire SELinux, c’est pourquoi tout fonctionne correctement le nom du noyau ne l’intéressera pas, des programmes comme le démon restorecond
seront nécessaires pour le gérer).
Qu'est-ce que SELinux?
SELinux est un mécanisme de contrôle d'accès obligatoire ( MAC ), utilisé en plus de tous les autres mécanismes (autorisations Unix aka DAC , Listes de contrôle d'accès aka ACL, etc.). Lorsqu'un processus s'exécute dans un contexte de sécurité de processus, une "matrice de règles" permet de vérifier si ce contexte de processus peut effectuer l'opération demandée (ouvrir, lire, écrire, mmap, ...) sur le contexte de fichier sur lequel il tente de travailler.
Exemple pour le cas d'OP: Si le mysqld
contexte de processus de 's n'est autorisé qu'à accéder à quelques types de contexte de fichier, l'inclusion mysqld_etc_t
mais pas au user_home_t
démarrage mysqld
échouera car il ne pourrait pas lire son fichier de configuration avec un user_home_t
type incorrect .
Sur les systèmes habituels, cela n'a pas d'importance pour l'utilisateur interactif / connecté, car son contexte de processus habituel n'est pas confiné, ce qui signifie qu'aucune règle SELinux ne s'appliquera. Chaque démon a commencé par systemd
ou d' autres mécanismes similaires seront recevoir un contexte de processus, ce qui peut être vérifié avec ps
des » -Z
option. Exemple sur un système Debian exécutant 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