SElinux est réputé pour être parfois un peu capricieux, et pour cause : cette distribution se veut être l’une des plus sécurisées au monde.
Voyons comment installer un serveur NGINX avec PHP 8 sur cette distribution qui semble énerver plus d’un admin système !
(Configuration de départ : l’OS d’origine est un CENTos « minimal »)
Installation de SELinux
1. Mettre à jour le système :
yum update -y
2. Installer les paquets nécessaires pour SELinux :
yum install -y selinux-policy selinux-policy-targeted policycoreutils setools setroubleshoot
3. Configurer SELinux :
nano /etc/selinux/config
Modifiez les lignes suivantes pour activer SELinux en mode « enforcing » (je reviendrai dans un autre article sur les spécificités de ce mode):
SELINUX=enforcing
SELINUXTYPE=targeted
4. Redémarrer la machine
reboot
5. Vérifier l’état de SELinux :
sestatus
Vous devriez voir quelque chose de ce genre :
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
6. (Optionnel) Configurer les règles de SELinux
Vous pouvez personnaliser les règles SELinux en fonction de vos besoins spécifiques. Utilisez les outils comme semanage
et setsebool
pour ajuster les politiques SELinux.
Exemple d’ajustement des règles pour un service spécifique (par exemple, HTTPD) :
setsebool -P httpd_can_network_connect on
7. (optionnel) configurer les règles de SELinux :
Si vous rencontrez des problèmes avec SELinux, utilisez audit2allow
pour analyser et générer des règles permettant de corriger les problèmes.
Par exemple, pour analyser les erreurs et générer une politique d’autorisation :
grep AVC /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp
Avec ces étapes, votre Centos devrait être équipée de SELinux pour une sécurité renforcée. Passons maintenant à la mise en place d’un serveur NGINX
Installer et configurer NGINX sur SELinux
1. Installer NGINX
yum install -y epel-release
yum install -y nginx
2. Démarrer et activer NGinx :
systemctl start nginx
systemctl enable nginx
3. Configurer le firewall (si nécessaire) :
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
4. Vérifier l’état de SELinux
sestatus
5. Configurer les contextes SELinux pour Nginx :
SELinux utilise des contextes pour contrôler l’accès aux fichiers et aux répertoires. Nginx nécessite des contextes spécifiques pour fonctionner correctement.
Vérifier les contextes actuels des fichiers de Nginx :
ls -Z /etc/nginx
ls -Z /usr/share/nginx/html
Appliquer les contextes SELinux nécessaires
Appliquer le contexte correct aux répertoires et fichiers Nginx :
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html(/.*)?"
restorecon -Rv /usr/share/nginx/html
semanage fcontext -a -t httpd_sys_content_t "/etc/nginx(/.*)?"
restorecon -Rv /etc/nginx
Permettre à Nginx d’écouter sur le réseau :
setsebool -P httpd_can_network_connect 1
6. Vérifier le bon fonctionnement de Nginx :
Accédez à l’adresse IP de votre serveur depuis un navigateur web pour vérifier que Nginx fonctionne correctement. Vous devriez voir la page d’accueil par défaut de CENTOS :
7. Dépannage et gestion des erreurs
Si vous rencontrez des erreurs, vous pouvez utiliser audit2allow
pour créer des règles SELinux qui permettent les opérations nécessaires à Nginx.
Exemple d’utilisation d’audit2allow :
1. Reproduisez l’erreur.
2. Vérifiez les logs SELinux pour trouver les erreurs associées à Nginx :
grep nginx /var/log/audit/audit.log
3. Utilisez audit2allow
pour générer et appliquer une nouvelle politique :
grep nginx /var/log/audit/audit.log | audit2allow -M nginx_local
semodule -i nginx_local.pp
En suivant ces étapes, vous pouvez installer et configurer Nginx sur une machine avec SELinux en mode enforcing. La clé est de s’assurer que les contextes SELinux sont correctement définis pour permettre à Nginx de fonctionner sans restriction.
On va pouvoir maintenant passer à l’ajout de PHP.
3. Installer PHP sur Centos avec NGinx et SELinux
Pour installer PHP sur une machine CentOS avec Nginx, suivez ces étapes :
1. Installer EPEL et Remi Repository
Les paquets PHP les plus récents sont souvent disponibles dans le dépôt Remi. Commencez par installer EPEL (Extra Packages for Enterprise Linux) et le dépôt Remi.
sudo yum install -y epel-release
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
2. Activer le dépôt Remi
Activez le dépôt Remi pour PHP. Par exemple, pour PHP 8.0, utilisez la commande suivante :
sudo yum install -y yum-utils
sudo yum-config-manager --enable remi-php80
3. Installer PHP et les modules nécessaires
Installez PHP et quelques modules couramment utilisés :
sudo yum install -y php php-fpm php-mysqlnd php-opcache php-gd php-xml php-mbstring php-mcrypt php-json
4. Configurer PHP-FPM
Ouvrez le fichier de configuration de PHP-FPM pour effectuer quelques ajustements nécessaires :
sudo nano /etc/php-fpm.d/www.conf
Assurez-vous que les lignes suivantes sont définies pour que PHP-FPM fonctionne avec Nginx :
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Ensuite, assurez-vous que le répertoire /var/run/php-fpm
existe et que les permissions sont correctes :
sudo mkdir -p /var/run/php-fpm
sudo chown -R nginx:nginx /var/run/php-fpm
sudo chmod -R 755 /var/run/php-fpm
5. Démarrer et activer PHP-FPM
Démarrez PHP-FPM et configurez-le pour qu’il démarre automatiquement au démarrage :
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
Vérifiez ensuite que le fichier de socket php-fpm a bien été créé :
ls -l /var/run/php-fpm/php-fpm.sock
Vous devriez voir quelque chose comme ceci :
srw-rw---- 1 nginx nginx 0 Jun 3 23:30 /var/run/php-fpm/php-fpm.sock
6. Configurer Nginx pour utiliser PHP
Ouvrez le fichier de configuration du site Nginx. Par exemple, si vous utilisez la configuration par défaut :
sudo nano /etc/nginx/conf.d/default.conf
Modifiez le fichier de configuration pour traiter les fichiers PHP. Ajoutez ou modifiez les lignes suivantes dans le bloc server
:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
7. Redémarrer Nginx
Redémarrez Nginx pour appliquer les modifications :
sudo systemctl restart nginx
8. Tester l’installation de PHP
Créez un fichier PHP de test pour vous assurer que PHP fonctionne correctement avec Nginx. Par exemple :
sudo nano /usr/share/nginx/html/info.php
Ajoutez le contenu suivant :
<?php
phpinfo();
?>
Accédez à ce fichier via votre navigateur web en visitant http://your_server_ip/info.php
. Vous devriez voir la page d’information PHP, indiquant que PHP fonctionne correctement avec Nginx.
Le mot de la fin
Et voilà, cette procédure vous permet à priori d’avoir un serveur PHP tournant sous SELinux prêt à l’emploi ! Je ne suis pas entré volontairement dans les détails sur certains points qui paraissent un peu obscurs mais je ne manquerai pas d’y revenir un peu plus tard 😉
Laisser un commentaire