====== 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 ===== # Cacher la version d'Apache2 ServerTokens Prod ServerSignature Off 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] 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. # 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" # 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' " 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. 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 : le domaine du site+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. 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 les parties proxy. # Les parties "tout le monde pareil" dans les configs apache. Pour vhost 80 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] # Les parties "tout le monde pareil" dans les configs apache. Pour vhost 443 ServerName $domain # 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 (à condition d'avoir son DNS bien configuré aussi) RewriteEngine On RewriteCond %{HTTP_HOST} !^%{SERVER_NAME}$ [NC] RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301] Et les vhosts par site (à adapter donc au site, prendre les morceaux utiles) : # Déclare la macro, son appel et la variable pour le nom de domaine Use common_config_80 exemple.org # Déclare les sous-domaines qui sont en réalité le même site ServerAlias www.exemple.org Use common_config_443 exemple.org ServerAlias www.exemple.org # Si besoin d'alias Alias /app /var/www/html DocumentRoot /var/www/exemple.org Options FollowSymLinks MultiViews AllowOverride All Require all granted Ne pas oublier sudo a2ensite common_config_443.conf sudo a2ensite common_config_80.conf sudo a2ensite exemple.org.conf sudo apachectl -t sudo apachectl graceful ==== 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... Mise à jour : de toute façon c'est pas possible avec Apache. Et pas possible de faire un challenge dns automatisé avec bookmyname. Donc, on fera un transfert du certif post-hook. Mais je bidouille ça un autre jour. Et la config sur la partie proxy : Use common_config exemple.org ServerAlias www.exemple.org 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/ Require all granted Require all granted Require all denied ===== Variables utiles ===== * ''${APACHE_LOG_DIR}'' : le chemin du dossier des logs ===== Certificat ssl ===== sudo apt install 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" {{tag>Informatique Sysadmin Apache}} [[https://creativecommons.org/publicdomain/zero/1.0/deed.fr|{{ https://liev.re/imagesweb/licences/cc-zero.png?100 | Ce texte est placé sous licence CC0}}]]