Ceci est une ancienne révision du document !


Apache

Cette page me sert de “tips”, pour des parties plus détaillées, voir https://khaganat.net/wikhan/fr:apache.

Commandes de base

Pour connaître sa version d'apache

apache -v

Pour vérifier avant tout que la syntaxe est propre :

sudo apachectl -t

Pour relancer proprement le serveur apache :

sudo apachectl graceful

Modules et configuration à activer

/etc/apache2/conf-available/security.conf
# Cacher la version d'Apache2
ServerTokens Prod
ServerSignature Off
/etc/apache2/conf-available/tracker.conf
<IfModule mod_rewrite.c>
    RewriteEngine On
 
    # Supprimer les paramètres de tracking communs de la chaîne de requête (facebook, google, etc)
    # Facebook
    RewriteCond %{QUERY_STRING} (?:^|&)fbclid=[^&]+ [OR]
    # campagnes marketing Google Analytics
    RewriteCond %{QUERY_STRING} (?:^|&)utm_[^&]+ [OR]
    # Identifiant de clics Google Ads
    RewriteCond %{QUERY_STRING} (?:^|&)gclid=[^&]+ [OR]
    # Identifiant de clics Yandex
    RewriteCond %{QUERY_STRING} (?:^|&)yclid=[^&]+ [OR]
    # Paramètres de suivi Mailchimp
    RewriteCond %{QUERY_STRING} (?:^|&)mc_cid=[^&]+ [OR]
    RewriteCond %{QUERY_STRING} (?:^|&)mc_eid=[^&]+ [OR]
    # Paramètre de clic Microsoft Ads
    RewriteCond %{QUERY_STRING} (?:^|&)msclkid=[^&]+ [OR]
    # Paramètre de suivi Display Ads de Google.
    RewriteCond %{QUERY_STRING} (?:^|&)dclid=[^&]+
 
    # Rediriger vers l'URL sans les paramètres de tracking
    RewriteRule ^ %{REQUEST_URI}? [L,R=301]
</IfModule>
/etc/apache2/mods-available/ssl.conf
SSLProtocol +TLSv1.2
SSLCompression off
SSLCipherSuite HIGH:!aNULL:!eNULL:!LOW:!MEDIUM:!EXP:!RC4:!3DES:!MD5:!PSK:!kRSA:!SRP:-DH:+ECDH
SSLHonorCipherOrder On
 
# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling          on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)
SSLSessionTickets Off

Voir https://ssl-config.mozilla.org/ pour adapter la CipherSuite.

/etc/apache2/mods-available/headers.conf
# Contrôler l’accès des bots de facon plus fine qu'avec robots.txt :
Header set X-Robots-Tag "index,follow,noarchive"
# Évite que le contenu soit interprété différemment que définit dans le mime Type
Header set X-Content-Type-Options nosniff
# Protection contre le clickjacking
Header set X-Frame-Options "SAMEORIGIN"
# Protection contre les failles X-XSS
Header set X-XSS-Protection "1; mode=block"
# Faille spécifique IE8, on espère que plus personne ne l'utilise, mais...
Header set X-Download-Options noopen;
# Interdire l'embarquement de tout ou partie de votre site dans un site ou logiciel tiers 
Header set X-Permitted-Cross-Domain-Policies none
# X-Clacks, ça sert à rien, c'est donc vital.
Header set X-Clacks-Overhead "GNU Terry Pratchett"
# HSTS (15768000 seconds = 6 months)(63072000 = 24 mois) ; éviter le vol de cookies et le downgrade SSL.
Header set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
# S'assurer que X-Forwarded-For est bien passé au backend et que l'ip des clients est transmise
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}"
# Supprimer les en-têtes de serveur par défaut pour la sécurité
Header unset Server
Header unset X-Powered-By
# Enfin, les CSP permettent de vérifier l'origine des éléments du site
# CSP, pour éviter de charger des scripts d'ailleurs. /!\ partie complexe à gérer suivant vos CMS
#Header set Content-Security-Policy "default-src 'self' *.monsite.org 'unsafe-eval' 'unsafe-inline' "
/etc/apache2/conf-available/full-qualified-domain-name.conf
ServerName localhost

Enfin, activer modules et conf :

sudo a2enmod headers ssl rewrite
sudo a2enconf security tracker full-qualified-domain-name
sudo apachectl -t
sudo apachectl graceful

Surplus sur les serveurs derrière un proxy

Donc, sur les vm, pas sur le proxy. C'est pour avoir les bonnes ip des visiteuses.

/etc/apache2/conf-available/remoteip.conf
RemoteIPHeader X-Forwarded-For
# Remplacer l'IP par celle du proxy
RemoteIPInternalProxy 192.168.20.PROXY
a2enmod remoteip
a2enconf remoteip
sudo apachectl -t
sudo apachectl graceful

Vhost

Convention de nommage : domaine.conf. Par exemple exemple.org.conf. On peut mettre le port 80 et 443 sur le même fichier, c'est aussi lisible et si on utilise let's encrypt en standalone, ça va très bien. Ne pas oublier sudo a2ensite exemple.org.conf puis de recharger apache ensuite.

Ici on utilise les macros, ce qui réduit un peu le nombre de trucs à répéter. Il faut activer le module correspondant :

sudo a2enmod macro

Ça c'est sur les serveurs backend, pas sur le proxy.

/etc/apache2/sites-available/common_config.conf
# Les parties "tout le monde pareil" dans les configs apache. 
<Macro common_config $domain>
		ServerName $domain
 
		# Redirection tout le trafic HTTP vers HTTPS
		RewriteEngine On
		RewriteCond %{REQUEST_URI} !.well-known/acme-challenge
		RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [R=301,L]
 
		DocumentRoot /var/www/$domain
			<Directory /var/www/$domain/ >
					Options FollowSymLinks MultiViews
					AllowOverride All
					Require all granted
			</Directory>
 
		# Logs
		ErrorLog ${APACHE_LOG_DIR}/$domain_error.log
		CustomLog ${APACHE_LOG_DIR}/$domain_access.log combined
 
		# Configuration SSL avec Let’s Encrypt
		SSLEngine On
		SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
		SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
 
		# Redirection pour les sous-domaines non déclarés
		RewriteEngine On
		RewriteCond %{HTTP_HOST} !^$domain$ [NC]
		RewriteCond %{HTTP_HOST} !^www\.$domain$ [NC]
		RewriteRule ^ https://$domain%{REQUEST_URI} [L,R=301]
</Macro>

Et les vhosts par site (à adapter donc au site, prendre les morceaux utiles) :

/etc/apache2/sites-available/exemple.org.conf
<VirtualHost *:80>
    # Déclare la macro, son appel et la variable pour le nom de domaine
    Use common_config exemple.org
    # Déclare les sous-domaines qui sont en réalité le même site
    ServerAlias www.exemple.org
</VirtualHost>
 
<VirtualHost *:443>
    Use common_config exemple.org
    ServerAlias www.exemple.org
    # Si besoin d'alias 
    Alias /app /var/www/html
</VirtualHost>

Options propre au proxy

a2enmod proxy proxy_http

Faut revoir, soit dans l'optique “le proxy demande les certifs”, soit “le backend les gère”. D'un point de vue anonymat c'est mieux si c'est chiffré tout du long mais d'un autre côté la femme du milieu, c'est moi…

Et la config sur la partie proxy :

/etc/apache2/sites-available/exemple.org.conf
<VirtualHost *:80>
    Use common_config exemple.org
    ServerAlias www.exemple.org
</VirtualHost>
 
<VirtualHost *:443>
    Use common_config exemple.org
    ServerAlias www.exemple.org
 
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://192.168.20.IP_Interne_de_la_VM/
    ProxyPassReverse / http://192.168.20.IP_Interne_de_la_VM/
		<Proxy *>
			Require all granted
			<Limit GET POST>
			Require all granted
			</Limit>
			<Limit DELETE PUT>
				Require all denied
			</Limit>
		</Proxy>
 
 
</VirtualHost>

Variables utiles

  • ${APACHE_LOG_DIR} : le chemin du dossier des logs

Certificat ssl

sudo apt installe certbot

Éteindre apache avant ça (et le rallumer ensuite) :

sudo certbot --pre-hook "service apache2 stop" --post-hook "service apache2 restart" certonly --standalone -d monsite.mondomaine.org 

Renouvellement en éteignant/rallumant automatiquement la bête :

sudo certbot renew --pre-hook "service apache2 stop" --post-hook "service apache2 restart"

 Ce texte est placé sous licence CC0

CC Attribution-Noncommercial-Share Alike 4.0 International Driven by DokuWiki
pratique/informatique/apache.1729962797.txt.gz · Dernière modification : 26/10/2024 19:13 de Zatalyz