LINUX:PHP (dépôt de Remi) et SeLinux
But
L'activation de SeLinux ne posait aucun problème jusqu'à la version de Fedora 43. Avec cette version, j'utilise PHP 8.3 du dépôt de Remi.
En tentant de régler le problème, un message d'erreur récurent apparaît:
ValueError: La spécification du fichier /var/opt/remi/php83 est en conflit avec la règle d'équivalence « /var/opt /opt ».
En regardant dans le fichier "/etc/selinux/targeted/contexts/files/file_contexts.subs", on trouvait auparavant la ligne d'équivalence:
/var/opt/remi/php83 /var
Mais elle n'existe plus et il est impossible de l'ajouter. Il est aussi impossible d'éliminer l'équivalence apparaissant dans le message d'erreur car elle fait partie de la stratégie du système.
Stratégie
J'ai dû me résoudre à trouver une alternative. Déplacer les répertoires et fichiers incriminés dans une structure analogue à PHP venant avec la distribution.
Elle concerne:
- le canal de communication entre PHP et Apache (PHP-FPM)
- le n° de processus (PID) de PHP-FPM
- les fichiers journaux
- la rotation des fichiers journaux (service LogRotate)
Ces opérations nécessitent diverses modifications que nous allons passer en revue.
Le service concerné qui fait l'interface entre le service Httpd (Apache) et l'interpréteur de script PHP 8.3 se nomme "php83-php-fpm.service".
PHP-FPM
Répertoires
Pour le service "php83-php-fpm.service", le répertoire qui accueille à l'origine le canal de communication et le n° de processus est "/var/opt/remi/php83/run/php-fpm". On va le migrer vers le répertoire "/run/php83-fpm". Nous allons le créer pour la session courante.
Voici les commandes à exécuter:
mkdir /run/php83-fpm chmod 755 /run/php83-fpm
Le répertoire où se placeront les journaux de PHP 8.3 est à l'origine "/var/opt/remi/php83/log/php-fpm" et il est déplacé vers le répertoire "/var/log/php83-fpm".
Voici les commandes à exécuter:
mkdir /var/log/php83-fpm chmod -R 770 /var/log/php83-fpm chown -R apache:root /var/log/php83-fpm
Fichiers de configuration
Le fichier de configuration principal du service "php83-php-fpm.service", est "/etc/opt/remi/php83/php-fpm.conf".
Les lignes suivantes dans ce fichier:
pid = /var/opt/remi/php83/run/php-fpm/php-fpm.pid error_log = /var/opt/remi/php83/log/php-fpm/error.log
sont à remplacer par les suivantes:
pid = /run/php83-fpm/php-fpm.pid error_log = /var/log/php83-fpm/error.log
Ce fichier fait appel au fichier de configuration secondaire "/etc/opt/remi/php83/php-fpm.d/www.conf".
Les lignes suivantes dans ce fichier:
listen = /var/opt/remi/php83/run/php-fpm/www.sock php_admin_value[error_log] = /var/opt/remi/php83/log/php-fpm/www-error.log
sont à remplacer par les suivantes:
listen = /run/php83-fpm/www.sock php_admin_value[error_log] = /var/log/php83-fpm/www-error.log
Système de fichiers "/run"
Le système de fichiers "/run" est dans la mémoire. A chaque démarrage de la machine, il doit être créé ainsi que son contenu.
Notre répertoire "/run/php83-fpm" n'échappe pas à la règle. Pour ce faire, on crée le fichier "php83-fpm.conf" dans le répertoire de configuration "/etc/tmpfiles.d". Voici son contenu:
d /run/php83-fpm 755 root root
On remarque c'est un répertoire ("d") qui est créé. Il appartient à l'utilisateur "root" et ses privilèges d'accès sont "755".
Au démarrage de la machine, les fichiers de configuration ("*.conf") des répertoires "/usr/lib/tmpfiles.d" et "/etc/tmpfiles.d" sont traités.
SeLinux
Il faut maintenant adapter le contexte SeLinux de ces deux répertoires par les commandes suivantes:
semanage fcontext -a -t httpd_sys_content_t '/run/php83-fpm(/.*)?' restorecon -Rv /run/php83-fpm/ semanage fcontext -a -t httpd_log_t '/var/log/php83-fpm(/.*)?' restorecon -Rv /var/log/php83-fpm/
Apache et PHP-FPM
Comme on a changé l'emplacement du canal de communication, le service HTTPD (Apache) doit en être informé.
Par défaut le fichier de configuration est "/etc/httpd/conf.d/php83-php.conf". Il peut avoir été déplacé et adapté comme suggéré plus haut.
Voici la ligne concernée d'origine:
SetHandler "proxy:unix:/var/opt/remi/php83/run/php-fpm/www.sock|fcgi://localhost"
est adapté comme suit:
SetHandler "proxy:unix:/run/php83-fpm/www.sock|fcgi://localhost"
Services
Maintenant que la configuration est en place, il faut relancer les services concernés.
On commence à les arrêter:
systemctl stop httpd.service systemctl stop php83-php-fpm.service
Ensuite on lance:
systemctl start httpd.service
Le service "php83-php-fpm.service" qui lui est lié sera automatiquement relancé.
On vérifie que tout fonctionne correctement (processus, fichiers, sites,...).
LogRotate
Configuration
Périodiquement les journaux sont nettoyés et archivés afin qu'ils n'encombre pas le système.
Ce service est "logrotate.timer".
Il traite les différents fichiers de configuration ("*.conf") se trouvent dans le répertoire "/etc/logrotate.d".
Le fichier qui intéresse les journaux de PHP 8.3 est "php83-php-fpm".
Voici son contenu d'origine:
/var/opt/remi/php83/log/php-fpm/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/kill -SIGUSR1 `cat /var/opt/remi/php83/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
Deux lignes sont à adapter:
/var/log/php83-fpm/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/kill -SIGUSR1 `cat /run/php83-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
SeLinux
Il a besoin d'un nouveau module que l'on nommera "my-logrotate-phpremi.te" dont voici le contenu:
module my-logrotate-phpremi 1.0;
require {
type httpd_sys_rw_content_t;
type logrotate_t;
class file { read open getattr };
}
#============= logrotate_t ==============
allow logrotate_t httpd_sys_rw_content_t:file { read open getattr };
Comme décrit dans l'article sur les Modules, il faut le compiler et l'installer.
Vérification
Pour vérifier son bon fonctionnement nous nous assurons en premier qu'il y a des enregistrements dans les fichiers journaux "www-error.log" et "error.log" du répertoire "/var/log/php83-fpm".
Ensuite on va reculer d'un mois la date du dernier traitement de ces fichiers. On édite avec un éditeur de texte le fichier "/var/lib/logrotate/logrotate.status". On repère les deux lignes concernant le répertoire "/var/log/php83-fpm". Et on recule la date d'un mois. Si elles n'existent pas encore, lancez une première fois le service "logrotate.service".
On exécute le service:
systemctl start logrotate.service
et on vérifie le bon fonctionnement de la rotation. Deux fichiers d'archives des journaux doivent apparaître. Le service "php83-php-fpm.service" a aussi été relancé.