{"id":249,"date":"2015-06-16T00:29:43","date_gmt":"2015-06-15T23:29:43","guid":{"rendered":"http:\/\/blog.brimbelle.org\/?p=249"},"modified":"2015-06-16T12:57:26","modified_gmt":"2015-06-16T11:57:26","slug":"checklist-https","status":"publish","type":"post","link":"https:\/\/blog.brimbelle.org\/index.php\/2015\/06\/16\/checklist-https\/","title":{"rendered":"Checklist HTTPS"},"content":{"rendered":"<p><a href=\"https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/a_plus.png\" rel=\"lightbox[249]\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-250\" src=\"https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/a_plus.png\" alt=\"a_plus\" width=\"136\" height=\"135\" \/><\/a>Depuis les r\u00e9v\u00e9lations de Snowden,\u00a0<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Heartbleed\" target=\"_blank\">Heartbleed<\/a> en 2014 et l&rsquo;actualit\u00e9 en g\u00e9n\u00e9ral&#8230; la cryptographie et en particulier les protocoles\u00a0<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Transport_Layer_Security\" target=\"_blank\"><del>SSL<\/del>\/TLS<\/a> connaissent \u00e0 juste raison une g\u00e9n\u00e9ralisation quelque soit le site web, service, application, etc.<\/p>\n<p>Dans cet article, je vais pr\u00e9senter une <em>check-list<\/em> des bonnes pratiques lorsque l&rsquo;on administre un serveur web s\u00e9curis\u00e9.<\/p>\n<p>Je ne d\u00e9taillerai pas toutes les diff\u00e9rentes techniques mises en oeuvre : d&rsquo;innombrables sites ou blogs le font tr\u00e8s bien. Je\u00a0vais en revanche lister les point importants pour rendre le protocole TLS particuli\u00e8rement robuste. Ceci avec des exemples de configuration pour le serveur HTTP <a href=\"http:\/\/nginx.org\/\" target=\"_blank\">NGINX<\/a>.<\/p>\n<p><!--more--><\/p>\n<p style=\"padding-left: 30px;\"><strong>1. Maintenir \u00e0 jour la librairie TLS<\/strong><\/p>\n<p>On ne le r\u00e9p\u00e9tera jamais assez : la librairie TLS (par exemple\u00a0<a href=\"https:\/\/openssl.org\/\" target=\"_blank\">OpenSSL<\/a> ou mieux, <a href=\"http:\/\/www.libressl.org\/\" target=\"_blank\">LibreSSL<\/a>) doit absolument \u00eatre maintenue \u00e0 jour, en particulier apr\u00e8s chaque correctif de s\u00e9curit\u00e9.<\/p>\n<p>Bien \u00e9videmment, cela s&rsquo;applique \u00e9galement au serveur HTTP et tout le syst\u00e8me d&rsquo;exploitation en g\u00e9n\u00e9ral.<\/p>\n<p style=\"padding-left: 30px;\"><strong>2. D\u00e9sactiver SSL<\/strong><\/p>\n<p>Aujourd&rsquo;hui il est plus que recommand\u00e9 de d\u00e9sactiver totalement SSL (jusqu&rsquo;\u00e0 la v3). En particulier pour b\u00e9n\u00e9ficier de la <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Confidentialit%C3%A9_persistante\" target=\"_blank\">confidentialit\u00e9 persistante (PFS)<\/a>. Ainsi, votre serveur web ne devrait r\u00e9pondre qu&rsquo;aux protocoles TLS (1.0 et sup\u00e9rieur).<\/p>\n<p>Ceci aura pour effet de casser la compatibilit\u00e9 avec les navigateurs anciens. Notamment\u00a0Internet Explorer 6 sous Windows XP qui ne supporte pas TLS par d\u00e9faut (il peut \u00eatre param\u00e9tr\u00e9\u00a0pour supporter TLS 1.0, avec quelques algorithmes de faible robustesse, qui doivent absolument \u00eatre bannis de nos jours). Est-ce r\u00e9ellement un probl\u00e8me ?<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> :\u00a0<code>ssl_protocols TLSv1 TLSv1.1 TLSv1.2;<\/code><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>3. Suites de chiffrement fortes<\/strong><\/p>\n<p>Votre serveur web doit \u00eatre param\u00e9tr\u00e9 pour fonctionner avec des suites de chiffrement robustes. Il faut donc, dans la configuration du serveur web prohiber : RC4, MD5, DES, EXPORT (suites de chiffrement anciennes, autoris\u00e9es \u00e0 \u00eatre export\u00e9es des USA).<\/p>\n<p>De la m\u00eame fa\u00e7on que la d\u00e9sactivation de SSL, ce point cassera la compatibilit\u00e9 avec les navigateurs anciens.<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> :<\/span><br \/>\n<span style=\"color: #800080;\"> <code>ssl_ciphers HIGH:!aNULL:!MD5;<br \/>\nssl_prefer_server_ciphers on;<\/code><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>4. G\u00e9n\u00e9rer ses propres param\u00e8tres DH<\/strong><\/p>\n<p>Avec l&rsquo;utilisation de PFS et des certificats de 2048 bits, ceci permet de rendre plus robuste les \u00e9changes de cl\u00e9s Diffie Hellman, qui utiliseraient sinon les cl\u00e9s par d\u00e9faut d&rsquo;OpenSSL d&rsquo;une taille de 1024 bits.<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> : <code>ssl_dhparam \/etc\/ssl\/certs\/dhparam.pem;<\/code><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>5. OCSP Stapling<\/strong><\/p>\n<p><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Online_Certificate_Status_Protocol\" target=\"_blank\">OCSP<\/a> souffre de deux probl\u00e8mes :<\/p>\n<ul>\n<li>C&rsquo;est au client de valider le certificat du serveur en contactant l&rsquo;Autorit\u00e9 de Certification (AC) lui-m\u00eame \u00e0 chaque connexion. Ceci est tr\u00e8s co\u00fbteux en performance.<\/li>\n<li>Si l&rsquo;AC ne r\u00e9pond pas : soit on accepte tout de m\u00eame le certificat du serveur avec un gros risque en terme de s\u00e9curit\u00e9, soit on refuse la connexion ce qui est tr\u00e8s p\u00e9nalisant pour l&rsquo;utilisateur.<\/li>\n<\/ul>\n<p>L&rsquo;<a href=\"https:\/\/en.wikipedia.org\/wiki\/OCSP_stapling\" target=\"_blank\">OCSP Stapling<\/a> permet de rendre plus efficient la validation des certificats, puisqu&rsquo;il d\u00e9l\u00e8gue cette t\u00e2che au serveur lui-m\u00eame, qui renvoie au client le certificat accompagn\u00e9 de sa validation sign\u00e9e par l&rsquo;AC. Cette extension de TLS inclut un m\u00e9canisme de cache pour am\u00e9liorer les performances et ne pas trop solliciter l&rsquo;AC.<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> :<\/span><br \/>\n<span style=\"color: #800080;\"> <code>ssl_stapling on;<br \/>\nssl_stapling_verify on;<br \/>\nssl_trusted_certificate \/etc\/ssl\/startssl_ca.pem;<br \/>\nresolver 127.0.0.1 valid=300s;<br \/>\nresolver_timeout 5s;<\/code><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>6. HTTP Strict Transport Security<\/strong><\/p>\n<p>Le m\u00e9canisme <a href=\"https:\/\/fr.wikipedia.org\/wiki\/HTTP_Strict_Transport_Security\" target=\"_blank\">HSTS<\/a> permet au serveur web d&rsquo;inclure une en-t\u00eate HTTP signalant au navigateur que durant une p\u00e9riode donn\u00e9e (6 mois minimum\u00a0recommand\u00e9), il ne doit communiquer avec le serveur que de fa\u00e7on s\u00e9curis\u00e9e.<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> :\u00a0<code>add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\";<\/code><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>7. HTTP Public Key Pinning<\/strong><\/p>\n<p>L&rsquo;extension <a href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP_Public_Key_Pinning\" target=\"_blank\">HPKP<\/a> permet au serveur web d&rsquo;inclure une ent\u00eate HTTP contenant\u00a0un condensat du ou des certificats autoris\u00e9s \u00e0 \u00e9tablir la session TLS.<\/p>\n<p>Le serveur web fournit donc une liste blanche de certificats autoris\u00e9s \u00e0 chiffrer une communication avec un site web.<\/p>\n<p>Ceci permet d&rsquo;\u00eatre certain que le certificat que l&rsquo;on utilise pour chiffrer la communication est bien celui autoris\u00e9 par le propri\u00e9taire du site : et donc bloquer les attaques MiTM sur lesquelles reposent notamment les solutions de d\u00e9chiffrement SSL du march\u00e9, tr\u00e8s utilis\u00e9es en entreprise ou par les Etats.<\/p>\n<p><span style=\"color: #800080;\"><strong>NGINX<\/strong> : <code>add_header Public-Key-Pins 'pin-sha256=\"XXX_le_condensat_apparait_ici_XXX\"; max-age=2592000; includeSubDomains';<\/code><\/span><\/p>\n<p>Attention, ce m\u00e9canisme n\u00e9cessite des pr\u00e9cautions lors du renouvellement des certificats. Je vous conseille de bien \u00e9tudier HPKP avant de le mettre en place.<\/p>\n<p style=\"padding-left: 30px;\"><strong>8. Conclusion<\/strong><\/p>\n<p>Ces m\u00e9canismes de s\u00e9curit\u00e9 autour de TLS sont applicables sur d&rsquo;autres serveurs web (<a href=\"https:\/\/httpd.apache.org\/\" target=\"_blank\">Apache<\/a> ou <a href=\"http:\/\/www.lighttpd.net\/\" target=\"_blank\">Lighttpd<\/a>).<\/p>\n<p>Pour mes configuration, je me suis fortement inspir\u00e9 de <a href=\"https:\/\/raymii.org\/s\/tutorials\/Strong_SSL_Security_On_nginx.html\" target=\"_blank\">cet article<\/a>, plus complet et renvoyant vers beaucoup de liens tr\u00e8s int\u00e9ressants. Je vous en conseille la lecture.<\/p>\n<p>Enfin, l&rsquo;\u00e9diteur <a href=\"https:\/\/www.ssllabs.com\/ssltest\/\" target=\"_blank\">Qualys fournit un outil<\/a> tr\u00e8s pratique permettant de tester la robustesse d&rsquo;un service HTTPS. Je vous conseille de l&rsquo;utiliser pour valider votre configuration.<\/p>\n<p>Voici mon r\u00e9sultat :<\/p>\n<p><a href=\"https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/brimbelle_ssl_score.png\" rel=\"lightbox[249]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-251\" src=\"https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/brimbelle_ssl_score-300x194.png\" alt=\"brimbelle_ssl_score\" width=\"300\" height=\"194\" srcset=\"https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/brimbelle_ssl_score-300x194.png 300w, https:\/\/blog.brimbelle.org\/wp-content\/uploads\/2015\/06\/brimbelle_ssl_score.png 806w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depuis les r\u00e9v\u00e9lations de Snowden,\u00a0Heartbleed en 2014 et l&rsquo;actualit\u00e9 en g\u00e9n\u00e9ral&#8230; la cryptographie et en particulier les protocoles\u00a0SSL\/TLS connaissent \u00e0 juste raison une g\u00e9n\u00e9ralisation quelque soit le site web, service, application, etc. Dans cet article, je vais pr\u00e9senter une check-list des bonnes pratiques lorsque l&rsquo;on administre un serveur web s\u00e9curis\u00e9. Je ne d\u00e9taillerai pas toutes [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[142,152,145,143,146,144,153,151,150,140,147,148,141,149],"class_list":["post-249","post","type-post","status-publish","format-standard","hentry","category-informations-pour-les-geeks","category-securite","tag-https","tag-key","tag-libressl","tag-nginx","tag-ocsp","tag-openssl","tag-pinning","tag-public","tag-security","tag-ssl","tag-stapling","tag-strict","tag-tls","tag-transport"],"_links":{"self":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts\/249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/comments?post=249"}],"version-history":[{"count":0,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/posts\/249\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/media?parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/categories?post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.brimbelle.org\/index.php\/wp-json\/wp\/v2\/tags?post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}