J'ai voulu "protéger" un fichier.php en le donnant à mon utilisateur
sudoer, que j'utilise pour administrer la machine.
Sans élévation de droit, il s'agit d'un simple utilisateur lambda.
Je suis étonné de voir que le fichier.php est tout de même interprété.
Est-ce normal ?
Je conclu avec un chmod 000.
Utiliser CHMOD pour refuser au serveur Apache le droit de lire
un fichier PHP
######################################################################################################################
# Comment interdire à Apache 2.4 d'interpréter un fichier ip.php ?
#
# Interdire l'interprétation du fichier ip.php par l'utilisateur www-data
configuré pour apache2. #
# Interdire l'interprétation du fichier ip.php par l'utilisateur
UTILISATEUR-DU-POOL-PHP-FPM configuré pour apache2. #
######################################################################################################################
# Les permissions sur les fichiers et les dossiers se définissent avec CHMOD.
# La commande chmod permet de modifier les permissions du propriétaire d'un
fichier.
# La commande setfacl pour gérer les ACL ne permet en aucun cas de modifier les
permissions propriétaires pour un fichier ou un dossier !
# Sachant que les ACL ne peuvent pas modifier les droits du propriétaire.
# Sachant que www-data est propriétaire des fichiers apache en temps normal.
# Sachant que www-data-fpm est le propriétaire des fichiers configuré dans la
configuration de php-fpm du répertoire pool.d.
# Si www-data ou www-data-fpm sont propriétaires des fichiers, les ACL ne
pourront pas leur retirer les permissions de lecture, écriture ou exécution.
# Utiliser la commande setfacl pour interdire l'interprétation du fichier
ip.php ne fonctionnera pas sur les droits du propriétaire des fichiers.
# Les permissions du propriétaire restent prioritaires, même si les ACL sont
configurées pour restreindre d'autres utilisateurs ou groupes.
# Les droits CHMOD 644 sont appliqués sur le fichier "ip.php" qui est donc
lisible de tout le monde depuis le navigateur :
chmod 644 ip.php
ls -la ip.php
-rw-r--r-- 1 www-data www-data ip.php
# On vérifier si des droits ACL existent sur le fichier "ip.php" avec la
commande getfacl.
# Aucune ACL n'est présente par défaut sur le fichier "ip.php" :
getfacl ip.php
# file: ip.php
# owner: www-data
# group: www-data
user::rw-
group::r--
other::r--
# Pour empêcher l'interprétation du fichier ip.php il faut enlever la
permission de lecture au propriétaire du fichier avec CHMOD.
# Utiliser la commande chmod sur le fichier ip.php pour enlever la permission
de lecture au propriétaire :
# (user::r--)(www-data) :
chmod u-r ip.php
# Attention !
# Il faut toujours redémarrer le service apache2 et php8.2-fpm après avoir
utilisé CHMOD pour appliquer le changement de droits CHMOD :
sudo systemctl restart apache2
sudo systemctl restart php8.2-fpm
# Sans le droit propriétaire de lecture sur le fichier ip.php, le fichier
ip.php n'est pas interprété par Apache2 depuis le navigateur !
# Le navigateur affiche le message suivant :
Access denied.
# Attention :
# Les autres droits CHMOD sont toujours présents :
ls -la ip.php
--w-r--r--
# Un simple utilisateur Linux pourra toujours afficher le résultat du fichier
ip.php depuis le terminal :
# Le fichier ip.php est interprété et affiché par apache 2.4 :
php ip.php
# Utiliser la commande CHMOD sur le fichier ip.php pour enlever toutes les
permissions ce qui va empêcher Apache 2.4 de lire le fichier et donc de
l'interpréter :
chmod 000 ip.php
# Attention :
# Il faut toujours redémarrer le service apache2 et php8.2-fpm après avoir
utilisé CHMOD pour appliquer le changement de droits CHMOD :
sudo systemctl restart apache2
sudo systemctl restart php8.2-fpm
# Avec un CHMOD 000 il n'y a aucun droit sur le fichier ip.php, le fichier
ip.php n'est pas interprété par Apache2 depuis le navigateur !
# Le navigateur affiche le message suivant :
Access denied.
# Le message affiché dans le error.log de Apache2 confirme que le CHMOD 000 a
permis d'interdire l'interprétation du fichier ip.php depuis le navigateur :
AH01071: Got error 'PHP message: PHP Warning: PHP Request Startup: Failed to
open stream: Permission denied in Unknown on line 0;
Unable to open primary script: //var/www/joomla/ip.php (Permission denied)'
# Sans aucun droit d'accès sur le fichier ip.php, le fichier ip.php ne peut
plus être interprété par Apache2 depuis le terminal !
# Aucun message n'apparait dans les logs de PHP cli puisque les droits CHMOD
000 refuse la lecture du fichier, il n'est donc pas possible de l'interpréter !
# Aucun utilisateur Linux ne pourra plus afficher le fichier depuis le terminal.
php ip.php
Could not open input file: ip.php
# Les deux messages sont équivalents et indiquent le même problème de
permissions :
# Apache réussit à capturer l'erreur de permissions grâce à ses mécanismes
intégrés :
AH01071: Got error 'PHP message: PHP Warning: PHP Request Startup: Failed to
open stream: Permission denied in Unknown on line 0;
Unable to open primary script: //var/www/joomla/ip.php (Permission denied)'
# PHP cli retourne le message que le fichier ne peut pas être ouvert :
Could not open input file: ip.php
# Que ce soit depuis Apache ou PHP CLI, les permissions chmod 000 bloquent tout
accès et interprétation du fichier ip.php.
# Utiliser la commande php cli en tant que root sur le fichier ip.php permet
toujours de l'interpréter.
#####################################################################################################
# Interdire à Apache 2.4 d'interpréter un fichier ip.php avec un CHMOD 000 sur le fichier
"ip.php". #
# Redémarrer apache2 et php8.2-fpm pour appliquer le changement de CHMOD.
#
#####################################################################################################