Logo Khaganat

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
fr:securite_sysadmin [2021/12/03 19:19] – modification externe 127.0.0.1fr:securite_sysadmin [2023/06/21 08:30] (Version actuelle) – Transfert des infos sur une page dédiée zatalyz
Ligne 114: Ligne 114:
  
 ==== Apache2 ==== ==== Apache2 ====
-[[wpfr>Apache_HTTP_Server|Apache]] n'est pas une obligation ; il existe d'autres très bons serveurs http, comme [[wpfr>Nginx|Nginx]]. Mais comme les tutoriels et les logiciels sont souvent paramétrés pour Apache, c'est plus facile pour les débutants d'utiliser ce dernier. Donc, quitte à l'utiliser, autant faire quelques manipulations de base. +Voir la page dédiée [[fr:apache]].
- +
-Apache a un avantage dans le cas d'une architecture "pare-feu qui protège des serveurs", il est assez facile d'avoir une communication mixte entre le pare-feu et les serveurs, avec et sans chiffrement. Certains logiciels ont besoin que toutes les communications soient protégés ; par exemple Teampass ne fonctionne pas sans https sur le serveur où il est installé (même si le pare-feu, lui, sert l'accès à l'internaute en https). +
- +
-Pour Apache, il y a des modules à activer quoi qu'il arrive : +
-  a2enmod headers ssl +
-Et dans le cas d'utilisation de proxy (typiquement si vous passez par un pare-feu) : +
-  a2enmod proxy proxy_http +
- +
-Pour connaître sa version d'apache et d'openssl : +
-  apache -v +
-  openssl version +
- +
-À utiliser sur [[https://mozilla.github.io/server-side-tls/ssl-config-generator/|Mozilla SSL Configuration Generator]] pour générer les options de base à mettre dans sa configuration, ce sera probablement plus à jour que ce tutoriel au fil du temps.  +
- +
-Liens utiles : +
-  * [[https://blog.adminrezo.fr/2016/12/securiser-serveur-apache-https-headers/|Rouler en classe A avec Apache]] +
-  * [[https://f4fia.wordpress.com/2015/08/09/configurer-son-serveur-web-en-https/|Configurer son serveur web en HTTPS]] +
- +
- +
-=== Cacher la version d'apache === +
-En principe nos serveurs sont à jours, hein. Mais en cas d'oubli, ne facilitons pas la tâche des observateurs : +
- +
-  nano /etc/apache2/conf-available/security.conf +
- +
-<code># Cacher la version d'Apache2 +
-ServerTokens Prod +
-ServerSignature Off</code> +
- +
-  service apache2 restart +
- +
-À refaire sur chacun de ses serveurs ! +
- +
-<WRAP center round tip 60%> +
-On peut aussi paramétrer (et modifier) ces options dans ''/etc/apache2/apache2.conf'' mais c'est moins élégant. +
-</WRAP> +
- +
-=== Module header === +
- +
-Activer les headers dans Apache si ce n'est pas déjà fait : +
-  a2enmod headers +
- +
-Puis modifiez le fichier ''/etc/apache2/mods-enabled/headers.conf''+
- +
-<code> +
-# Ce qui suit vient de +
-# https://blog.adminrezo.fr/2016/12/securiser-serveur-apache-https-headers/ +
-# controler l'acces des bots de facon plus fine qu'avec robots.txt : +
-Header set X-Robots-Tag "index,follow,noarchive" +
-# Evite que le contenu soit interprete differemment que definit 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 specifique IE8 +
-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" +
-# Enfin, les CSP permettent de vérifier l'origine des éléments du site +
-# CSP, pour eviter 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'+
-</code> +
- +
-Les explications : +
-  * Header set X-Robots-Tag : http://robots-txt.com/x-robots-tag/ +
-  * CSP : https://ole.michelsen.dk/blog/secure-your-website-with-content-security-policy.html  +
- +
-== Content Security Policy (CSP) == +
-Les CSP améliorent grandement la sécurité d'une installation, en interdisant à certaines ressources de s'exécuter, par exemple des scripts malicieux injectés dans vos sites webs. +
- +
-Mais il est difficile de faire marcher les CMS tout en ayant une politique sécurisée sur les CSP.  +
- +
-Le site de référence est [[https://content-security-policy.com/]]. En anglais, mais il contient toute la documentation officielle sur le sujet. +
- +
-  * Premier cas : pas de politique CSP. Certains CMS permettent aux utilisateurs d'appeler "des bouts de web" venant d'ailleurs, généralement les images, mais dans certains cas aussi du code... Un attaquant peut se servir de ça pour appeler sur le serveur un code malicieux. Un CMS sécurisé réduit beaucoup les possibilités, mais le risque zéro n'existe pas, et la plupart des CMS ont des failles, c'est un fait. +
-  * Second cas : une politique CSP stricte (paramétrée uniquement sur ''self''). Ici, plus moyen d'appeler un truc d'ailleurs. Par contre cela va bloquer le fonctionnement légitime de certains CMS, entre autre ce qui concerne les scripts (pourquoi, je n'ai pas pas encore bien compris, mais c'est un fait). +
-  * Troisième cas : ajouter des règles comme ''unsafe-eval'' et ''unsafe-inline''. Cela va permettre aux scripts en question de fonctionner MAIS cela permet aussi à certains attaquant d'utiliser des failles : comme leur nom l'indique, cela est considéré comme "non sécurisé". Ils autorisent explicitement certains trucs à marcher, sans plus de vérification. Cela ouvre la porte à des injections. Cependant, d'après mes tests, les scripts ayant une adresse externe ne sont PAS exécutés sur le domaine. Ne vous sentez pas en confiance pour autant. +
-  * Quatrième cas : exécuter localement uniquement les scripts validés explicitement. Cela demande de rajouter la variable ''nonce'' ou ''hash'', puis d'ajouter dans chacun des scripts de notre serveur la clé associée (un hash sur les scripts, ou bien une clé dans ces derniers). Cela veut donc dire : avoir la main sur tout... c'est assez irréaliste dans la majorité des cas, et entre autre pour les CMS qui embarquent trop de scripts et qui écraseront nos modifications à chaque mise à jour. Cela demande aussi un certain niveau de développement, or la plupart des sysadmin/webmestres sont surtout des bidouilleuses, pas des développeuses. +
- +
-== Quelques exemples == +
- +
-L'option suivante permet à Dokuwiki et Simple Machine Forum de marcher, mais pas à Etherpad, et ne vaut rien aux yeux de [[https://observatory.mozilla.org/|l'Observatoire Mozilla]]. Cependant, même l'etherpad de Mozilla ne fait pas mieux. +
-  Header set Content-Security-Policy "default-src 'self' *khaganat.net; script-src 'self' 'unsafe-inline' *khaganat.net; style-src 'self' 'unsafe-inline'; img-src * " +
-   +
-''img-src *'' ici accepte tout, mais sans ça, on n'affiche plus les images en lien, par exemple dans le forum, ce qui demande une solution interne pour les héberger. +
- +
-Pour onlyoffice, après de nombreuses galères : la solution a été la CSP frame-ancestors pour permettre l'accès à une autre instance Onlyoffice par plusieurs instances nextcloud. Dans ce cas sur nginx avec le module more_headers, ça a donné ça : +
-  more_set_headers "Content-Security-Policy : frame-ancestors https://site1.example.com/nextcloud https://site2.example.com/ https://site3.example.com/nextcloud "; +
- +
-La règle suivante, assez générique, va "fonctionner" pour la plupart des CMS. La mettre dans une règle sur le proxy, appelée par les diverses configurations : +
-  add_header Content-Security-Policy "default-src 'self' *.monsite.org 'unsafe-eval' 'unsafe-inline'; "; +
- +
- +
- +
-=== Module ssl === +
-Activer le module ssl dans Apache si ce n'est pas déjà fait : +
-  a2enmod ssl +
- +
-Puis modifiez le fichier ''/etc/apache2/mods-available/ssl.conf'' suivant ces informations : +
-  * Enlever le protocole SSL3 et SSLv2 qui ne sont plus considérés comme sûrs (notez le "-" devant SSLv3 et SSLv2) +
-  * Interdire la compression d'échanges chiffrés (oui oui cela introduit une possibilité d'attaque) +
-  * Lister la liste des algorithmes de chiffrement autorisés et interdits +
-  * Imposer de négocier ces protocoles dans l'ordre, donc du plus sûr au moins sûr (notez le "!" devant certains nom d'algorithme pour les interdire, par exemple : !PSK, !RC4, etc... et le + devant ceux à favoriser) +
-  * Le dernier morceau concerne OCSP qui accélère un peu les échanges en https, voir aussi [[https://www.octopuce.fr/accelerer-votre-ssl-tls-avec-ocsp-stapling/|Accélérer votre réponse SSL/TLS avec l’OCSP Stapling]] +
-<code> +
-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) +
-</code> +
-   +
- +
-Pour la liste ''SSLCipherSuite'', consulter les préconisations de [[https://mozilla.github.io/server-side-tls/ssl-config-generator/|Mozilla SSL Configuration Generator]] et lire tranquillement l'explication si dessous avant de modifier la proposition <wrap hi>mise à jour le 29 novembre 2017.</wrap> +
- +
- +
-À partir de la version 2.4.11 d'apache, vous pouvez ajouter dans le fichier ''/etc/apache2/mods-available/ssl.conf''+
- +
-<code> +
-SSLSessionTickets Off +
-</code> +
- +
- +
-== Explications == +
-<WRAP center round info 60%> +
-Ce qui suit est extrait d'une conversation avec TychoBrahe ; j'ai conservé son style fleuri si savoureux.  +
- +
- --- //[[user:zatalyz|zatalyz]] 2016/12/30 13:27// +
-</WRAP> +
- +
-Une ciphersuite est un ensemble de 4 algorithmes différents, chacun servant à un rôle distinct : +
-  * 1 pour faire un échange de clés +
-  * 1 pour faire du chiffrement asymétrique +
-  * 1 pour faire du chiffrement symétrique +
-  * 1 pour le contrôle +
- +
-Un exemple : DHE-RSA-AES256-SHA256 +
-  * DHE : diffie hellman, c'est l'échange de clés +
-  * RSA pour l'asymétrique, en particulier pour la signature +
-  * AES avec une clé de 256 bits pour le chiffrement symétrique +
-  * et enfin sha256 pour calculer les empreintes des sommes de contrôle +
-On pourrait croire qu'il y a 5 algorithmes, par exemple avec ECDHE-RSA-AES128-GCM-SHA256. En fait, GCM est un des modes de fonctionnement d'AES, donc AES128-GCM désigne de l'AES en mode GCM avec une clé de 128 bits. Pour info, les EC devant ECDHE et parfois ECDSA c'est pour //elliptic curve//, donc l'utilisation de courbes elliptiques au lieu de nombres premiers. +
- +
-SSL et TLS permettent d'utiliser non pas une seule combinaison, mais plusieurs, ce qui fait que ces protocoles intègrent une phase de négociation de la cipher suite. Chaque version de SSL ou TLS autorise ou non certaines cipher suites etc, bref c'est le bordel, sachant qu'il faut, avant ça, négocier la version de SSL ou TLS utilisée. Soit dit en passant, il existe une cipher suite NULL qui dit qu'il n'y a aucun chiffrement, du coup cette phase de négociation a été attaquée, un MITM(([[wpfr>Attaque_de_l'homme_du_milieu|Man In The Middle]])) permettant de forcer une cipher suite (genre NULL ou une faible). +
- +
-Afin d'éviter les ennuis, on va dire au serveur de n'utiliser que certaines cipher suites et pas d'autres : c'est l'option SSLCipherSuite. Chaque cipher suite est séparée par '':'' et s'il y a un ''!'' devant son nom, c'est pour explicitement l'interdire. +
- +
-Le site de Mozilla cite toutes les ciphersuites, c'est sans doute bien, mais ils ont juste oublié un truc : à tout citer explicitement, il faut faire évoluer la liste avec les avancées en matière de recherche. Personnellement j'utilise et recommande d'utiliser des familles. Ces familles sont définies par la librairie SSL/TLS utilisée : +
-  * ALL <- on autorise tout +
-  * !aNULL:!eNULL <- on interdit les familles de NULL +
-  * !LOW:!MEDIUM <- on interdit les cipher suites disposant d'une clé de 128 bits (MEDIUM) ou moins (LOW) +
-  * !EXP <- ce sont les variantes d'exportation, donc fortement affaiblies, de certains algos +
-  * !RC4 <- RC4 est un algo de chiffrement symétrique qui a été démoli mais un truc bien grave alors qu'il était très populaire +
-  * !3DES <- pareil, on interdit cette merde +
-  * !MD5 <- celui qui utilise encore md5 pour du checksum crypto est un grand malade +
-  * !PSK <- pareil, une merde de plus de virée +
-  * +HIGH <- et enfin on autorise la famille des cipher suites reconnues comme fortes +
- +
-Du coup on fait confiance dans les familles définies dans les lib crypto, mais en imposant des restrictions sur certains trucs trop limite pour y être inclus mais qui ont des chances de tout de même s'y retrouver. +
- +
-Les librairies ont un outil pour lister les familles, qui liste soit toutes les cipher suites supportées, soit, si on précise, la liste de ce qui est autorisé : +
-  openssl ciphers +
-  openssl ciphers HIGH +
-  openssl ciphers 'HIGH:!AES' +
- +
-Voir aussi  +
-  man 1 ciphers +
- +
-== L'échange de clefs == +
- +
-C'est un mécanisme permettant l'échange de clefs en toute confidentialité, sans qu'un tiers puisse avoir connaissance de celles-ci. +
- +
-== Le chiffrement a/symétrique == +
- +
-La différence entre le chiffrement symétrique et le chiffrement asymétrique est que dans le premier cas, il n'y a besoin que d'une seule clef, qui permet aussi bien de chiffrer un message que de le déchiffrer. Pour le chiffrement asymétrique, on utilise une clef pour le chiffrement, et une autre clef différente de la première pour le déchiffrement. C'est pour cela qu'on parle de clef dite publique (celle que tout le monde peut voir et avec laquelle on va chiffrer les messages qui nous sont destinés) et de clef dite privée (celle avec laquelle on va déchiffrer notre message ; si on n'a pas accès à cette clef privée, on ne peut pas déchiffrer le message). +
- +
-== Le contrôle == +
- +
-Afin de vérifier l'intégrité des messages que l'on transmet, on calcule une somme de contrôle que l'on envoie avec le message. Une fois le message et sa somme de contrôle réceptionnés, on peut recalculer la somme de contrôle du message et vérifier qu'elle correspond bien à celle qui a été transmise. Si elles diffèrent, c'est que le message a été altéré (ou qu'il y a une collision, c'est à dire que pour deux messages différents on obtient la même somme de contrôle, mais ce cas ne devrait quasiment presque jamais arriver). +
-=== Les fichiers de sites-enabled (vhost) === +
- +
-Une fois https configuré (let's encrypt lancé, les fichiers ''/etc/apache2/site-enabled/MONSITE-le-ssl.conf'' automatiquement configurés, vérifiez ces derniers. Là, deux possibilités : soit l'architecture "de base", où on a un seul serveur, sur la même machine que le pare-feu, soit deux machines, l'un étant le pare-feu et l'autre hébergeant les services web. +
- +
-Dans le cas d'un pare-feu sur un autre serveur que les serveurs de base, chaque vhost sur le serveur du pare-feu doit contenir ceci : +
- +
-<code> +
-ServerName sousdomaine.monserveur.net +
- +
-# Proxy : permet de renvoyer vers l'adresse ip du serveur. Ici l'exemple est  +
-# dans le cas de VM Xen, c'est donc une adresse locale. +
-ProxyPass / http://192.168.20.43/ +
-ProxyPassReverse / http://192.168.20.43/ +
- +
-ProxyRequests off +
-ProxyPreserveHost on +
-                <Proxy *> +
-                Options FollowSymLinks MultiViews +
-                AllowOverride All +
-                Order allow,deny +
-                allow from all +
-                </Proxy> +
- +
-# SSL +
-SSLEngine on +
-SSLCertificateFile /etc/letsencrypt/live/MONSITE.COM/certificate.pem +
-SSLCertificateChainFile /etc/letsencrypt/live/MONSITE.COM/chain.pem +
-SSLCertificateKeyFile /etc/letsencrypt/live/MONSITE.COM/privkey.pem +
-Include /etc/letsencrypt/options-ssl-apache.conf +
- +
-# HSTS (mod_headers requis) (15768000 seconds = 6 months)(63072000 = 24 mois) +
-Header set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" +
-</code> +
- +
-HSTS (module Header) permet de déclarer au client directement dans la réponse HTTP qu'il faut communiquer en HTTPS. Cet en-tête permet d'éviter le vol de cookies et le downgrade SSL. +
- +
- +
-<WRAP center round todo 60%> +
-<code># Le paramètre suivant est valide si vous avez amélioré la clé Diffie Hellman +
-SSLDHParametersFile /etc/letsencrypt/live/MONSITE.COM/dhparams.pem</code> +
- +
-Je n'ai sans doute pas tout compris, ou alors ce n'est pas compatible avec ma version d'apache, mais si je l'ajoute ça me fait une erreur. +
- +
- --- //[[user:zatalyz|zatalyz]] 2017/01/01 18:33// +
-</WRAP> +
- +
-=== Faire suivre les IP derrière les reverse proxy === +
-Si vous avez une VM (A) qui sert de pare-feu avant de redistribuer le trafic aux autres VM (B) de votre serveur, il y a un petit souci : les VM B croient que tout le trafic vient de l'ip de la VM A. Ce qui pose un gros souci dans le cas où vous avez du spam et que votre CMS favori permet de bannir par IP... si vous bannissez la VM A, plus rien ne passera, même les utilisateurs légitimes. +
- +
-Il faut donc activer le transfert des IP sur les VMs destinataires (pas toucher au pare-feu, ce n'est pas là que ça se joue). +
- +
-Créer ''/etc/apache2/conf-available/remoteip.conf'' et lui donner ceci : +
-<code> +
-RemoteIPHeader X-Forwarded-For +
-RemoteIPInternalProxy 192.168.20.35 +
-</code> +
- +
-Remplacer ''192.168.20.35'' par l'IP interne de la VM pare-feu. +
- +
-Activer le [[https://httpd.apache.org/docs/trunk/mod/mod_remoteip.html|module remoteip]] qui fait ça : +
-  a2enmod remoteip +
-  a2enconf remoteip +
-  apache2ctl configtest && service apache2 restart +
- +
-Cela devrait marcher. À répeter sur chaque VM du réseau. +
- +
-=== Virer les traqueurs de Facebook === +
-Si vos liens se baladent sur Facebook, vos visiteurs vont visiter vos pages avec un tracker collé à l'url, du type ''https://monsite.fr/?fbclid=IwAR1RNFCx5Gu9SHRAbuj67ebqbu3Hc7YGgkOKh''. C'est pas propre, et puis ça peut mettre le bazar dans certains sites.  +
- +
-On se fait un petit fichier appelé "bidouilles.conf"((On peut y rajouter d'autres trucs, pour le moment y'a surtout du Facebook.)) avec ce contenu : +
-<code> +
-# Des bidouilles à inclure partout. +
- +
-# Pour virer le tracker de Facebook +
-<IfModule mod_rewrite.c> +
-  RewriteEngine On +
-  RewriteCond %{QUERY_STRING} ^(.*)(?:^|&)fbclid=(?:[^&]*)((?:&|$).*)$ [NC] +
-  RewriteCond %1%2 (^|&)([^&].*|$) +
-  RewriteRule ^(.*) $1?%2 [R=301,L] +
-</IfModule> +
- +
-</code> +
- +
-Ensuite on appelle ce fichier dans nos vhost actifs : +
-<code> +
-<VirtualHost *:443> +
-        ServerName monsite.fr +
- +
-# toute configuration utile en rab... +
-         +
-# bidouilles perso +
-        Include /etc/apache2/bidouilles.conf+
    
-</code> 
- 
- 
-Relancer apache et voilà, ça marche. 
- 
-Astuce tirée de [[https://blog.paranoidpenguin.net/2018/12/how-to-remove-facebooks-fbclid-parameter-using-mod_rewrite-on-apache-2-4/|ce site]] avec quelques aménagements.  
 {{tag> Serveur Sysadmin Sécurité }} {{tag> Serveur Sysadmin Sécurité }}
CC Attribution-Share Alike 4.0 International Driven by DokuWiki
fr/securite_sysadmin.txt · Dernière modification : 2023/06/21 08:30 de zatalyz

Licences Mentions légales Accueil du site Contact