J’utilise un service Samba de partage de fichiers qui tourne sur un serveur CentOS 8.2 dans un container avec Podman 1.6.4.
Serveur CentOS 8.2 :
[moore@neuralux stackdata]$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
Kernel:
[moore@neuralux stackdata]$ uname -a
Linux neuralux.lan.moore.com 4.18.0-193.19.1.el8_2.x86_64 #1 SMP Sat Sep 12 14:37:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Tout cela fonctionnait correctement mais j’ai été bloqué un jour sur un fichier qui refusait de s’écrire avec Samba:
Unable to save /Volumes/git/stackdata/name.html
Error: Permission denied
J’utilise un éditeur Sublime Text sous Mac OS qui accès via le réseau au service de partage de fichiers Samba sur mon serveur Linux.
Allons regarder les droits sur le serveur. Les permissions, utilisateurs et groupe sont bons :
[moore@neuralux stackdata]$ ls -la *.html
-rw-rw-r--. 1 moore moore 165 Sep 9 21:09 about.html
-rw-rw-r--. 1 moore moore 825 Oct 4 15:38 name.html
-rw-rw-r--. 1 moore moore 763 Sep 9 21:09 search.html
Pas d’attribut unwritable :
[moore@neuralux stackdata]$ lsattr *.html
-------------------- about.html
-------------------- name.html
-------------------- search.html
Controllons maintenant le context SELinux:
[moore@neuralux stackdata]$ ls -laZ *.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:samba_share_t:s0 165 Sep 9 21:09 about.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:user_tmp_t:s0 825 Oct 4 15:38 name.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:samba_share_t:s0 763 Sep 9 21:09 search.html
Bingo, le problème vient de SELinux. Je me rappelle avoir copier ce fichier à partir du dossier /tmp. Lorsque l’on créé un fichier dans le dossier /tmp, il hérite du contexte “user_tmp_t” par défaut.
Vérifions que SELinux est bien activé sur ce système :
[moore@neuralux stackdata]$ getenforce
Enforcing
[moore@neuralux stackdata]$ grep SELINUX= /etc/selinux/config
# SELINUX= can take one of these three values:
SELINUX=enforcing
Nous allons lancer la commande “semanage fcontext -a -t samba_share_t” afin de changer le type en “samba_share_t”. L’option -a va ajouter une nouvelle entrée et l’option -t option va définir le type “samba_share_t”. Cette commande ne va pas directement changer le type :
[moore@neuralux stackdata]$ sudo semanage fcontext -a -t samba_share_t /opt/git/stackdata/name.html
La commande semanage fcontext ajoute une entrée dans le fichier de contexte local /etc/selinux/targeted/contexts/files/file_contexts.local :
[moore@neuralux stackdata]$ sudo cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Do not edit directly.
/opt/git/stackdata/name.html system_u:object_r:samba_share_t:s0
Changeons maintenant le type avec la commande restorecon :
[moore@neuralux stackdata]$ restorecon -v name.html
Relabeled /opt/git/stackdata/name.html from unconfined_u:object_r:user_tmp_t:s0 to unconfined_u:object_r:samba_share_t:s0
Vérifions le nouveau contexte :
[moore@neuralux stackdata]$ ls -Zla *.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:samba_share_t:s0 165 Sep 9 21:09 about.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:samba_share_t:s0 825 Oct 4 15:51 name.html
-rw-rw-r--. 1 moore moore unconfined_u:object_r:samba_share_t:s0 763 Sep 9 21:09 search.html
Le problème est traité, Samba peut maintenant écrire sans erreur \o/