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 :
[[email protected] stackdata]$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
Kernel:
[[email protected] 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 :
[[email protected] 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 :
[[email protected] stackdata]$ lsattr *.html
-------------------- about.html
-------------------- name.html
-------------------- search.html
Controllons maintenant le context SELinux:
[[email protected] 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 :
[[email protected] stackdata]$ getenforce
Enforcing
[[email protected] 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 :
[[email protected] 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 :
[[email protected] 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 :
[[email protected] 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 :
[[email protected] 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/