« Installation de configuration du serveur web Apache 2.4 sous Debian Bullseye » : différence entre les versions

Aller à la navigation Aller à la recherche
 
(18 versions intermédiaires par le même utilisateur non affichées)
Ligne 71 : Ligne 71 :


Nous allons créer un fichier afin d'interdire l'accès à certains dossiers qu'apache autorise en général par défaut. Notez qu'activer ces options empêchera la configuration par défaut de nombreux paquets debian de fonctionner.<br>
Nous allons créer un fichier afin d'interdire l'accès à certains dossiers qu'apache autorise en général par défaut. Notez qu'activer ces options empêchera la configuration par défaut de nombreux paquets debian de fonctionner.<br>
Créez le fichier <code>/etc/apache2/conf-available/zzz_localsecurity.conf</code> (le faire commencer par zzz devrait vous assurer qu'il soit lu en dernier)
Créez le fichier <code>/etc/apache2/conf-available/zzz-local-security.conf</code> (le faire commencer par zzz devrait vous assurer qu'il soit lu en dernier) contenant :
<pre>
<pre>
# Disable access to / by default
# Disable access to / by default
<Directory />
<Directory />
        Options -Includes -IncludesNOEXEC -ExecCGI -Indexes -FollowSymLinks -SymLinksIfOwnerMatch -MultiViews
         AllowOverride None
         AllowOverride None
         Require all denied
         Require all denied
Ligne 80 : Ligne 81 :


# Disable access to /usr/share by default
# Disable access to /usr/share by default
<Directory /usr/share>
<Directory /usr/share/>
        Options -Includes -IncludesNOEXEC -ExecCGI -Indexes -FollowSymLinks -SymLinksIfOwnerMatch -MultiViews
         AllowOverride None
         AllowOverride None
         Require all denied
         Require all denied
Ligne 87 : Ligne 89 :
# Disable access to /usr/lib/cgi-bin/ by default (will override conf-enabled/serve-cgi-bin.conf if enabled)
# Disable access to /usr/lib/cgi-bin/ by default (will override conf-enabled/serve-cgi-bin.conf if enabled)
<Directory /usr/lib/cgi-bin/>
<Directory /usr/lib/cgi-bin/>
        Options -Includes -IncludesNOEXEC -ExecCGI -Indexes -FollowSymLinks -SymLinksIfOwnerMatch -MultiViews
         AllowOverride None
         AllowOverride None
         Require all denied
         Require all denied
Ligne 93 : Ligne 96 :
# Disable access to svn tree
# Disable access to svn tree
<DirectoryMatch "/\.svn">
<DirectoryMatch "/\.svn">
  Require all denied
        Require all denied
</DirectoryMatch>
</DirectoryMatch>


# Disable access to git tree
# Disable access to git tree
<DirectoryMatch "/\.git">
<DirectoryMatch "/\.git">
  Require all denied
        Require all denied
</DirectoryMatch>
</DirectoryMatch>


Ligne 106 : Ligne 109 :
</FilesMatch>
</FilesMatch>


# Disable access to htpasswd and htdigest files as some user don't make them hidden
# Disable access to htpasswd and htdigest files as some users don't make them hidden
<FilesMatch "htpasswd">
<Files htpasswd>
        Require all denied
</Files>
<Files htdigest>
        Require all denied
</Files>
 
# Disable access to .user.ini (used by php for local config)
<Files .user.ini>
         Require all denied
         Require all denied
</FilesMatch>
</Files>
<FilesMatch "htdigest">
 
# Deny access to most php project configuration files (localsettings.php, config.php but also things like config.anything.php
<FilesMatch "(?i)^(config-db|wp-config|commonsettings|localsettings|config)(\.([a-z]|[0-9])+)*\.ph(ar|p|tml)$">
         Require all denied
         Require all denied
</FilesMatch>
</FilesMatch>
Ligne 116 : Ligne 129 :
# Enforce a restricted open_basedir if php7 module is loaded
# Enforce a restricted open_basedir if php7 module is loaded
<IfModule php7_module>
<IfModule php7_module>
  php_admin_value open_basedir /var/www/
        php_admin_value open_basedir /var/www/
</IfModule>
</IfModule>


Ligne 129 : Ligne 142 :
         EnableCapabilities on
         EnableCapabilities on
</IfModule>
</IfModule>
</pre>


</pre>
Vous pouvez noter que les sections concernant <code>/usr/lib/cgi-bin/</code> et <code>/usr/share/</code> sont superflues étant données que la section concernant <code>/</code> couvre déjà ces répertoires. Il est néanmoins pratique d'avoir prédéfini des règles pour ces deux dossiers car ce sont ceux pour lesquels vous risquez le plus d'avoir à assouplir les règles de sécurité à l'échelle du serveur entier.


Activez ce fichier de configuration :  
Activez le fichier de configuration avec <code>a2enconf</code> :  
<pre>a2enconf zzz_localsecurity.conf
<pre>a2enconf zzz-local-security.conf
/etc/init.d/apache2 reload</pre>
/etc/init.d/apache2 reload</pre>


Ligne 146 : Ligne 160 :
</pre>
</pre>


Pour les alias et les proxy, le mappage se fait dans le sens inverse, du plus spécifique au moins spécifique :
Pour les <code>Alias</code> et les proxy (<code>ProxyPass</code>), le mappage se fait dans le sens inverse, du plus spécifique au moins spécifique :
<pre>
<pre>
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo/bar" "/srv/www/uncommon/bar"
Ligne 180 : Ligne 194 :


Ce mode de fonctionnement est plus complexe, mais augmente les performances et permet d'utiliser les mpm worker et event (eux même plus performants que prefork et itk).<br>
Ce mode de fonctionnement est plus complexe, mais augmente les performances et permet d'utiliser les mpm worker et event (eux même plus performants que prefork et itk).<br>
Le principe est d'avoir un daemon php-fpm exécutant les scripts php. Apache s'y connecte au moyen d'un socket.<br>
Le principe est d'avoir un daemon php-fpm exécutant les scripts php. Apache s'y connecte en fcgi au moyen d'un socket.<br>
Chaque daemon php-fpm existe au sein d'un pool qui a son propre socket. Pour des raisons de sécurité, il est conseillé d'utiliser un pool (donc un socket) différent pour chaque site. En effet, si un script malveillant est exécuté au sein d'un pool, il a le potentiel de contaminer l'ensemble du pool et donc l'ensemble des sites utilisant le pool. Il est également possible d'attribuer un utilisateur/groupe spécifique à chaque pool ce qui compense l'impossibilité d'utiliser mpm-itk.
Chaque daemon php-fpm existe au sein d'un pool qui a son propre socket. Pour des raisons de sécurité, il est conseillé d'utiliser un pool (donc un socket) différent pour chaque site. En effet, si un script malveillant est exécuté au sein d'un pool, il a le potentiel de contaminer l'ensemble du pool et donc l'ensemble des sites utilisant le pool. Il est également possible d'attribuer un utilisateur/groupe spécifique à chaque pool ce qui compense l'impossibilité d'utiliser mpm-itk.


Ligne 215 : Ligne 229 :


La première méthode consiste à modifier directement le fichier de configuration principal de php/fpm : <code>/etc/php/7.4/fpm/php.ini</code>.<br>
La première méthode consiste à modifier directement le fichier de configuration principal de php/fpm : <code>/etc/php/7.4/fpm/php.ini</code>.<br>
Les options appliquées le seront à l'ensemble des scripts lancé par php/fpm et ce quelque soit le pool utilisé. '''Cela n'est donc viable que pour une configuration "par défaut" valable pour l'ensemble de vos sites (ou que vous modifierez par d'autre méthode décrites plus bas).'''
Les options appliquées le seront à l'ensemble des scripts lancé par php/fpm et ce quelque soit le pool utilisé. '''Cela n'est donc viable que pour une configuration "par défaut" valable pour l'ensemble de votre serveur et quelque soit le site (ou que vous modifierez par d'autre méthode décrites plus bas).'''


===php-fpm.conf===
===php-fpm.conf===
Ligne 290 : Ligne 304 :
Si la même valeur est définie dans le pool.d et dans un .user.ini, c'est celle de .user.ini qui sera appliquée. Attention quand même à quelques spécificités, par exemple, la valeur de open_basedir locale ne peut-être définie que dans des sous-dossiers de la valeur globale de pool.d.
Si la même valeur est définie dans le pool.d et dans un .user.ini, c'est celle de .user.ini qui sera appliquée. Attention quand même à quelques spécificités, par exemple, la valeur de open_basedir locale ne peut-être définie que dans des sous-dossiers de la valeur globale de pool.d.


Vous pouvez désactiver cette fonctionnalité (par sécurité et si vous n'en avez pas besoin) en vidant la variable suivante dans <code>user_ini.filename</code> :
Vous pouvez désactiver cette fonctionnalité (par sécurité et si vous n'en avez pas besoin) en vidant la variable suivante dans <code>/etc/php/7.4/php.ini</code> :
<pre>user_ini.filename =</pre>
<pre>user_ini.filename =</pre>
==Attribuer un pool a une vhost==
<pre>
# PHP-FPM admin sock
<FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.4-fpm-poolname.sock|fcgi://localhost"
</FilesMatch>
</pre>


=Note on PHP=
=Note on PHP=
Ligne 335 : Ligne 358 :
* Évitez absolument d'allowoverride fileinfo (permet de modifier l'handler par défaut d'un fichier)
* Évitez absolument d'allowoverride fileinfo (permet de modifier l'handler par défaut d'un fichier)
* Évitez si possible d'allowoverride options (car permet principalement d'activer l'execution CGI)
* Évitez si possible d'allowoverride options (car permet principalement d'activer l'execution CGI)
* Si vous êtes certains que votre projet n'utilise pas de fichiers .htaccess :
* Si vous êtes certains que votre projet n'utilise pas de fichiers .htaccess ou que vous pouvez les intégrer à la configuration de la virtualhost :
<pre>
<pre>
AllowOverride none
AllowOverride none
Ligne 439 : Ligne 462 :


Notez que ces vhosts ne spécifient pas de <code>ServerName</code>, il sera donc déduit du nom d'hôte FQDN de la machine (<code>hostname -f</code>).<br>
Notez que ces vhosts ne spécifient pas de <code>ServerName</code>, il sera donc déduit du nom d'hôte FQDN de la machine (<code>hostname -f</code>).<br>
Attention, cela implique que vous ne créez aucune autre virtualhost ayant "simplement" le nom d'hôte de la machine comme ServerName, sinon vous aurez 2 virtualhost avec le même nom d'hôte, et la première chargée en configuration (ordre alphamumérique) sera celle présentée au client (mais pas forcément celle que vous souhaitez).
'''Attention, cela implique que vous ne créez aucune autre virtualhost ayant "simplement" le nom d'hôte de la machine comme ServerName''', sinon vous aurez 2 virtualhost avec le même nom d'hôte, et la première chargée en configuration (ordre alphamumérique) sera celle présentée au client (mais pas forcément celle que vous souhaitez).


==Activer server-status / vhost d'admin==
==Activer server-status / vhost d'admin==
Ligne 536 : Ligne 559 :
====FPM Status====
====FPM Status====


Si vous utilisez FPM :
Si vous utilisez php-fpm :
<pre>
<pre>
# fpm status page
# fpm status page
Ligne 546 : Ligne 569 :
</pre>
</pre>


Et dans <code>/etc/php/7.4/fpm/pool.d/<votre pool>.conf</code> :
Et dans <code>/etc/php/7.4/fpm/pool.d/<votre pool>.conf</code> (par défaut dans le cas présent ça devrait être le pool <code>www</code> !
<pre>pm.status_path = /fpm-status</pre>
<pre>pm.status_path = /fpm-status</pre>


4 231

modifications

Menu de navigation