LINUX:PHP (dépôt de Remi) et SeLinux

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour au menu de PHP


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é.




retour au menu de PHP