{"id":1341,"date":"2016-09-28T16:43:50","date_gmt":"2016-09-28T14:43:50","guid":{"rendered":"https:\/\/signal.eu.org\/blog\/?p=1341"},"modified":"2016-09-30T10:27:35","modified_gmt":"2016-09-30T08:27:35","slug":"securite-des-serveurs-web-avec-tls-petite-toilette-dautomne-2016","status":"publish","type":"post","link":"https:\/\/signal.eu.org\/blog\/2016\/09\/28\/securite-des-serveurs-web-avec-tls-petite-toilette-dautomne-2016\/","title":{"rendered":"S\u00e9curit\u00e9 des serveurs web avec TLS, petite toilette d&#8217;automne 2016"},"content":{"rendered":"\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=pbeyssac\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n<p><em>R\u00e9sum\u00e9 pour gens tr\u00e8s press\u00e9s : ce n&#8217;est pas si difficile que cela en a l&#8217;air.<\/em><\/p>\n<p><em>R\u00e9sum\u00e9 pour gens press\u00e9s : m\u00eame sans \u00eatre un gourou de la cryptographie, il est possible de s\u00e9curiser son site au niveau approximatif de l&#8217;\u00e9tat de l&#8217;art (du moment &#8212; ce n&#8217;est jamais une t\u00e2che d\u00e9finitive) en s&#8217;appuyant sur des sites de recommandations r\u00e9alis\u00e9s par des sp\u00e9cialistes.<\/em><\/p>\n<p><em>Apr\u00e8s avoir pass\u00e9 quelques heures \u00e0 peaufiner ma configuration, je pense utile de partager ce que j&#8217;ai appris pour dispenser autour de moi un peu de bonheur artificiel par l&#8217;entremise de la s\u00e9curit\u00e9 cryptographique.<br \/>\n<\/em><\/p>\n<p>L. Hirlimann (<a class=\"ProfileCard-screennameLink u-linkComplex js-nav\" href=\"https:\/\/twitter.com\/lhirlimann\" data-aria-label-part=\"\" data-send-impression-cookie=\"true\">@<span class=\"u-linkComplex-target\">lhirlimann<\/span><\/a>) m&#8217;a r\u00e9cemment orient\u00e9 sur un excellent site de la fondation Mozilla, <a href=\"https:\/\/observatory.mozilla.org\/\">observatory.mozilla.org<\/a>,\u00a0 qui permet de v\u00e9rifier la configuration s\u00e9curit\u00e9 basique de votre site web, \u00e0 commencer par l&#8217;aujourd&#8217;hui indispensable <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Transport_Layer_Security\">TLS<\/a>, et mutualise \u00e9galement (par d\u00e9faut, mais c&#8217;est d\u00e9brayable) les r\u00e9sultats des non moins excellents :<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/www.ssllabs.com\/ssltest\/\">SSL Labs<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/tls.imirhil.fr\/\">tls.imirhil.fr<\/a><\/strong> de <a class=\"account-group js-account-group js-action-profile js-user-profile-link js-nav\" href=\"https:\/\/twitter.com\/aeris22\" data-user-id=\"61644598\">@Aeris22<\/a><\/li>\n<li><strong><a href=\"https:\/\/tls.imirhil.fr\/\"><span class=\"h3\">securityheaders.io<\/span><\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/hstspreload.appspot.com\">hstspreload.appspot.com<\/a><\/strong><\/li>\n<\/ul>\n<h2>1. TLS, les algorithmes cryptographiques<\/h2>\n<p>Au-del\u00e0 de ses origines math\u00e9matiques, la cryptographie est une affaire de parano\u00efaques qui n&#8217;ont pas tous exactement le m\u00eame avis sur ce qui est <em>casher<\/em> ou pas \u00e0 un instant donn\u00e9.\u00a0 Les audits rapides r\u00e9alis\u00e9s par les sites qui pr\u00e9c\u00e8dent vous en convaincront rapidement.<\/p>\n<p>Ainsi, apr\u00e8s quelques premi\u00e8res modifications rapides sur ma configuration TLS, SSL Labs attribuait un <strong>A+<\/strong> \u00e0 ce site, alors que <a href=\"http:\/\/tls.imirhil.fr\">tls.imirhil.fr<\/a> l&#8217;affublait d&#8217;un catastrophique <strong>F<\/strong> sous pr\u00e9texte que l&#8217;algorithme <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Data_Encryption_Standard\">DES<\/a> n&#8217;\u00e9tait pas d\u00e9sactiv\u00e9.<\/p>\n<p>Bien entendu, cela \u00e9volue aussi au fil du temps, qui fait qu&#8217;un algorithme donn\u00e9 va passer en quelques petites d\u00e9cennies \u00e0 peine du statut de &#8220;s\u00fbr&#8221; \u00e0 celui de &#8220;passoire&#8221;, que ce soit par l&#8217;\u00e9volution des performances brutes ou par celles de la recherche en attaques cryptographiques.<\/p>\n<p>Par ailleurs, vous aurez \u00e9ventuellement \u00e9galement le plaisir de vous faire rappeler \u00e0 l&#8217;ordre par ces analyses si votre impl\u00e9mentation TLS comporte des trous de s\u00e9curit\u00e9 connus. J&#8217;ai d\u00e9couvert qu&#8217;il est assez facile de se faire avoir, m\u00eame avec un syst\u00e8me d&#8217;exploitation que l&#8217;on pensait \u00e0 jour.<\/p>\n<p>Les &#8220;suites&#8221; cryptographiques recommand\u00e9es varient au fil des sites sp\u00e9cialistes que l&#8217;on consulte.<\/p>\n<p>Voici, pour ne pas vous faire languir, celle que j&#8217;ai concoct\u00e9e pour satisfaire les sites cit\u00e9s (!) ci-dessus, et qui est certainement sujette \u00e0 commentaires et critiques (attention, c&#8217;est suppos\u00e9 tenir sur une ligne sans retour) :<\/p>\n<pre style=\"font-size: 8pt;\"><strong>EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA<\/strong>\r\n<strong>-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-S<\/strong>\r\n<strong>HA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:<\/strong>\r\n<strong>ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-<\/strong>\r\n<strong>SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-<\/strong>\r\n<strong>SHA256:AES256-SHA:AES128-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC<\/strong><strong>4<\/strong><\/pre>\n<p>N&#8217;allez surtout pas croire que j&#8217;ai construit ni m\u00eame analys\u00e9 en d\u00e9tail ce qui pr\u00e9c\u00e8de : la liste provient \u00e0 l&#8217;origine de <a href=\"https:\/\/www.digicert.com\/ssl-support\/ssl-enabling-perfect-forward-secrecy.htm\">https:\/\/www.digicert.com\/ssl-support\/ssl-enabling-perfect-forward-secrecy.htm <\/a>dont l&#8217;objet est d&#8217;expliquer la configuration d&#8217;un serveur web pour \u00e9viter qu&#8217;un vol de cl\u00e9 priv\u00e9e permette le d\u00e9chiffrement <em>a posteriori<\/em> des communications, une mesure \u00e0 prendre suite aux r\u00e9v\u00e9lations de l&#8217;affaire Snowden sur les capacit\u00e9s de la <a href=\"https:\/\/fr.wikipedia.org\/wiki\/National_Security_Agency\">NSA<\/a>, et suite \u00e9galement \u00e0 l&#8217;affaire <a href=\"http:\/\/www.theverge.com\/2013\/8\/10\/4608664\/lavabit-founder-closed-his-secure-email-service-to-protect-the\">Lavabit<\/a>.<\/p>\n<p>J&#8217;ai simplement amend\u00e9 la liste pour y ajouter <strong>!DES:!3DES: <\/strong>pour \u00e9vacuer ce vieil algorithme des choix et passer chez <a href=\"https:\/\/tls.imirhil.fr\/\">tls.imirhil.fr<\/a> d&#8217;un catastrophique <strong>F<\/strong> \u00e0 un passable <strong>B<\/strong>.<\/p>\n<p>Si comme moi vous utilisez Apache, cette liste est \u00e0 placer dans la directive <a href=\"https:\/\/httpd.apache.org\/docs\/current\/mod\/mod_ssl.html#sslciphersuite\"><strong>SSLCipherSuite<\/strong><\/a>.<\/p>\n<p>Probl\u00e8me : l&#8217;incantation qui pr\u00e9c\u00e8de est difficile \u00e0 comprendre, et donc \u00e0 modifier, si on n&#8217;a pas lu la documentation. En particulier il ne suffit pas d&#8217;ajouter <strong>!DES<\/strong> pour se d\u00e9barrasser \u00e9galement de <strong>3DES<\/strong>. Ce n&#8217;est pas facile \u00e0 d\u00e9couvrir rapidement en passant par les sites ci-dessus, qui pour \u00e9viter d&#8217;\u00eatre surcharg\u00e9s ne permettent pas des acc\u00e8s trop fr\u00e9quents (limite \u00e0 5 minutes au mieux).<\/p>\n<p>J&#8217;ai donc d\u00e9couvert \u00e9galement l&#8217;excellente (tout le monde est excellent ici, vous l&#8217;aurez compris) commande :<\/p>\n<pre><strong>openssl ciphers \"la cha\u00eene\"<\/strong><\/pre>\n<p>et son avatar plus bavard :<\/p>\n<pre><strong>openssl ciphers -v \"la cha\u00eene\"<\/strong><\/pre>\n<p>qui permettent de tester la cha\u00eene imm\u00e9diatement en local pour voir ce qu&#8217;elle produit sans avoir \u00e0 attendre la r\u00e9ponse d&#8217;un serveur situ\u00e9 \u00e0 l&#8217;autre bout de la plan\u00e8te.<\/p>\n<h2>2. S\u00e9curit\u00e9 &#8220;web&#8221; :\u00a0 contenu et ent\u00eates<\/h2>\n<p>Ce qui pr\u00e9c\u00e8de ne concerne que la partie TLS, c&#8217;est-\u00e0-dire la couche de chiffrement.<\/p>\n<p>C&#8217;est ensuite que <a href=\"https:\/\/observatory.mozilla.org\/\">observatory.mozilla.org<\/a> prend tout son sens, en compl\u00e9tant l&#8217;expertise cryptographique avec l&#8217;expertise web des auteurs de Firefox par le tableau suivant (exemple pour ce site au jour de la publication de ce billet) :<a href=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/moz.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-1354\" src=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/moz-300x189.png\" alt=\"moz\" width=\"515\" height=\"325\" srcset=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/moz-300x189.png 300w, https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/moz-768x483.png 768w, https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/moz.png 989w\" sizes=\"(max-width: 515px) 100vw, 515px\" \/><\/a>Je ne vais pas entrer dans les d\u00e9tails ; chaque point correspond \u00e0 des cat\u00e9gories particuli\u00e8res d&#8217;attaques plus ou moins pertinentes pour chaque site, et comme vous pouvez le voir je n&#8217;ai pas encore d\u00e9bloqu\u00e9 tous les troph\u00e9es. On y trouve des recommandations sur :<\/p>\n<ul>\n<li>HSTS (<a href=\"https:\/\/wiki.mozilla.org\/Security\/Guidelines\/Web_Security#HTTP_Strict_Transport_Security\">Host Strict Transport Security<\/a>), permettant au site de s&#8217;engager vis-\u00e0-vis du navigateur sur la disponibilit\u00e9 de https.<\/li>\n<li><a href=\"https:\/\/wiki.mozilla.org\/Security\/Guidelines\/Web_Security#Subresource_Integrity\">Subresource Integrity<\/a>, pour valider les contenus inclus (en particulier scripts) stock\u00e9s sur des serveurs tiers ;<\/li>\n<li><a href=\"https:\/\/wiki.mozilla.org\/Security\/Guidelines\/Web_Security#X-Content-Type-Options\">X-Content-Type-Options<\/a>, pour interdire au navigateur d&#8217;interpr\u00e9ter n&#8217;importe quoi (par exemple une suppos\u00e9e image t\u00e9l\u00e9charg\u00e9e par un attaquant) comme un script ;<\/li>\n<li><a href=\"https:\/\/wiki.mozilla.org\/Security\/Guidelines\/Web_Security#X-Frame-Options\">X-Frame-Options<\/a>, pour bloquer des attaques par d\u00e9tournement de clics (<em>clickjacking<\/em>) ;<\/li>\n<li>les redirections diverses afin d&#8217;amener l&#8217;utilisateur \u00e0 un site https m\u00eame dans le cas o\u00f9 il ne s&#8217;y est pas dirig\u00e9 lui-m\u00eame initialement ;<\/li>\n<li>etc<\/li>\n<\/ul>\n<p><a href=\"https:\/\/observatory.mozilla.org\/\">observatory.mozilla.org<\/a> vous donne par les liens bleus (dont j&#8217;ai recopi\u00e9 certains ci-dessus) toutes les explications d\u00e9taill\u00e9es sur les possibilit\u00e9s et le sens de chaque option de configuration.<\/p>\n<p>Sous Apache, cela se configure comme ci-dessous, \u00e0 condition d&#8217;avoir charg\u00e9 le module <code class=\"module\"><a href=\"http:\/\/httpd.apache.org\/docs\/current\/mod\/mod_headers.html\">mod_headers<\/a><\/code>.<\/p>\n<p><strong>Attention<\/strong> : les options pour mon site ne sont certainement pas exactement celles dont vous aurez besoin ; en particulier vous pouvez facilement vous tirer une petite balle dans le pied et vous retrouver avec Javascript d\u00e9sactiv\u00e9 sur certaines fonctions essentielles. Ce fut mon cas, ce qui m&#8217;a fait perdre temporairement l&#8217;\u00e9diteur <a href=\"https:\/\/fr.wikipedia.org\/wiki\/What_you_see_is_what_you_get\">Wysiwyg<\/a> de WordPress, et le probl\u00e8me est encore potentiellement pr\u00e9sent dans l&#8217;exemple qui suit.<\/p>\n<p>Attention \u00e9galement aux sauts de ligne si vous recopiez.<\/p>\n<pre style=\"font-size: 8pt;\">\u00a0 # HSTS 366 days\r\nHeader set Strict-Transport-Security \"max-age=31622400\"\r\n# Prevent browsers from incorrectly detecting non-scripts as scripts\r\nHeader set X-Content-Type-Options: nosniff\r\n# Block site from being framed\r\nHeader set X-Frame-Options \"DENY\"\r\n# Do the same thing, but with Content Security Policy\r\n# +Disable unsafe inline\/eval, only allow loading of resources\r\n# (images, fonts, scripts, etc.) over https (recommended)\r\nHeader set Content-Security-Policy \"default-src https:; frame-ancestors 'none'\"\r\n# Block pages from loading when they detect reflected XSS attacks\r\nHeader set X-XSS-Protection \"1; mode=block\"<\/pre>\n<p>Ces recommandations permettent d&#8217;\u00e9lucider le comportement souvent myst\u00e9rieux des navigateurs en ce qui concerne le contenu s\u00e9curis\u00e9, dans le but de comprendre comment passer du cadenas https &#8220;avec avertissement&#8221; <a href=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/c0.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1370 alignnone\" src=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/c0.png\" alt=\"c0\" width=\"18\" height=\"15\" \/><\/a> au cadenas &#8220;vert&#8221;<a href=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/c1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1371 alignnone\" src=\"https:\/\/signal.eu.org\/blog\/wp-content\/uploads\/2016\/09\/c1.png\" alt=\"c1\" width=\"18\" height=\"15\" \/><\/a>.<\/p>\n<p>Je n&#8217;ai pas encore tout \u00e0 fait r\u00e9ussi en ce qui concerne la page <a href=\"https:\/\/signal.eu.org\/osm\/\">https:\/\/signal.eu.org\/osm\/<\/a>, malgr\u00e9 la mise en \u0153uvre de <a href=\"https:\/\/wiki.mozilla.org\/Security\/Guidelines\/Web_Security#Subresource_Integrity\">Subresource Integrity<\/a>.<\/p>\n<h2>3. Les cookies<\/h2>\n<p>Pour les cookies, c&#8217;est encore diff\u00e9rent, cela d\u00e9pend de l&#8217;environnement (framework) web que vous utilisez. Concernant WordPress je n&#8217;ai pas encore trouv\u00e9 si\/o\u00f9 cela se g\u00e9rait, pour <a href=\"http:\/\/djangoproject.com\">Django<\/a> voici ce que j&#8217;ai configur\u00e9 dans le fichiers <a href=\"https:\/\/docs.djangoproject.com\/en\/1.10\/ref\/settings\/\"><strong>settings.py<\/strong><\/a> :<\/p>\n<pre>LANGUAGE_COOKIE_AGE=1209600\r\nCSRF_COOKIE_HTTPONLY=True\r\nCSRF_COOKIE_SECURE=True\r\nSESSION_COOKIE_AGE=1209600\r\nSESSION_COOKIE_HTTPONLY=True\r\nSESSION_COOKIE_SECURE=True<\/pre>\n<h2>4. One more thing<\/h2>\n<p>Enfin, vous pouvez aussi pour tout cela vous faire assister par un autre site propos\u00e9 par la fondation Mozilla, le g\u00e9n\u00e9rateur de configuration pour serveur web, qui vous conseillera sur la configuration de l&#8217;agrafage (<em>stapling<\/em>) OCSP et certains des points qui pr\u00e9c\u00e8dent :<\/p>\n<p><a href=\"https:\/\/mozilla.github.io\/server-side-tls\/ssl-config-generator\/\">https:\/\/mozilla.github.io\/server-side-tls\/ssl-config-generator\/<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Nul doute qu&#8217;il y a des pr\u00e9cisions ou corrections \u00e0 apporter \u00e0 ce qui pr\u00e9c\u00e8de, si vous le jugez utile n&#8217;h\u00e9sitez pas ci-dessous.<\/p>\n<p class=\"TweetTextSize js-tweet-text tweet-text\" lang=\"fr\" data-aria-label-part=\"0\"><strong>Mise \u00e0 jour<\/strong> : <a class=\"ProfileCard-screennameLink u-linkComplex js-nav\" href=\"https:\/\/twitter.com\/_eric_quinton\" data-aria-label-part=\"\" data-send-impression-cookie=\"true\">@<span class=\"u-linkComplex-target\">_eric_quinton <\/span><\/a>me signale gentiment sur twitter ce document de l&#8217;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Agence_nationale_de_la_s%C3%A9curit%C3%A9_des_syst%C3%A8mes_d%27information\">ANSSI <\/a>:\u00a0 Le nouveau (juillet 2016) <a class=\"twitter-timeline-link\" dir=\"ltr\" title=\"http:\/\/www.ssi.gouv.fr\/actualite\/le-nouveau-guide-de-recommandations-de-securite-relatives-a-tls\/\" href=\"https:\/\/t.co\/jrr2WZLxZq\" target=\"_blank\" rel=\"nofollow\" data-expanded-url=\"http:\/\/www.ssi.gouv.fr\/actualite\/le-nouveau-guide-de-recommandations-de-securite-relatives-a-tls\/\"><span class=\"js-display-url\">&#8220;guide de recommandations de s\u00e9curit\u00e9 relatives \u00e0 TLS&#8221;<\/span><span class=\"tco-ellipsis\">.\u00a0 <\/span><\/a>C&#8217;est tr\u00e8s complet mais tr\u00e8s technique, et cela mixe recommandations \u00e0 destination des administrateurs de site comme \u00e0 destination des d\u00e9veloppeurs de suites crypto, ce qui complique la lecture.<\/p>\n<div class=\"js-tweet-text-container\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9sum\u00e9 pour gens tr\u00e8s press\u00e9s : ce n&#8217;est pas si difficile que cela en a l&#8217;air. R\u00e9sum\u00e9 pour gens press\u00e9s : m\u00eame sans \u00eatre un gourou de la cryptographie, il est possible de s\u00e9curiser son site au niveau approximatif de l&#8217;\u00e9tat de l&#8217;art (du moment &#8212; ce n&#8217;est jamais une t\u00e2che d\u00e9finitive) en s&#8217;appuyant sur &hellip; <a href=\"https:\/\/signal.eu.org\/blog\/2016\/09\/28\/securite-des-serveurs-web-avec-tls-petite-toilette-dautomne-2016\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">S\u00e9curit\u00e9 des serveurs web avec TLS, petite toilette d&#8217;automne 2016<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,7,13,4],"tags":[],"_links":{"self":[{"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/posts\/1341"}],"collection":[{"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/comments?post=1341"}],"version-history":[{"count":37,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/posts\/1341\/revisions"}],"predecessor-version":[{"id":1391,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/posts\/1341\/revisions\/1391"}],"wp:attachment":[{"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/media?parent=1341"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/categories?post=1341"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/signal.eu.org\/blog\/wp-json\/wp\/v2\/tags?post=1341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}