Openweb.eu.org https://openweb.eu.org/ fr SPIP - www.spip.net Openweb.eu.org https://openweb.eu.org/local/cache-vignettes/L144xH67/siteon0-50793.png?1763118117 https://openweb.eu.org/ 67 144 Referrer Policy https://openweb.eu.org/articles/referrer-policy https://openweb.eu.org/articles/referrer-policy 2017年12月12日T08:41:43Z text/html fr Nicolas Hoffmann Débutant Expert Sécurité Qualité Navigateurs <p>Des mécanismes parfois vieux comme le Web sont présents sur nos sites sans que nous en ayons tous les tenants et les aboutissants. Celui présenté aujourd'hui fait partie de cette catégorie. C'est également l'occasion de voir que son importance peut être capitale dans certains cas de figure. Son nom est Referrer Policy. <br class='autobr' /> Introduction <br class='autobr' /> Le mécanisme dit de Referrer (qu'on peut traduire par « référent » en français) est selon Wikipedia : <br class='autobr' /> Un référent, plus connu sous l'anglicisme Referer ou (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/debutant" rel="tag">Débutant</a>, <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/securite" rel="tag">Sécurité</a>, <a href="https://openweb.eu.org/qualite" rel="tag">Qualité</a>, <a href="https://openweb.eu.org/navigateurs" rel="tag">Navigateurs</a> <div class='rss_chapo'><p>Des mécanismes parfois vieux comme le Web sont présents sur nos sites sans que nous en ayons tous les tenants et les aboutissants. Celui présenté aujourd'hui fait partie de cette catégorie. C'est également l'occasion de voir que son importance peut être capitale dans certains cas de figure. <br />Son nom est <em lang="en">Referrer Policy</em>.</p></div> <div class='rss_texte'><h2>Introduction</h2> <p>Le mécanisme dit de <i lang="en">Referrer</i> (qu'on peut traduire par « référent » en français) est <a href="https://fr.wikipedia.org/wiki/R%C3%A9f%C3%A9rent_(informatique)" class="spip_out" rel="external">selon Wikipedia</a> :</p> <blockquote>Un référent, plus connu sous l'anglicisme <i lang="en">Referer</i> ou <i lang="en">Referrer</i><span class="spip_note_ref"> [<a href="#nb1" class="spip_note" rel="appendix" title="La graphie exacte de ce mot est en réalité Referrer, avec deux « r ». Mais (…)" id="nh1">1</a>]</span>, est, dans le domaine des réseaux informatiques, une information transmise à un serveur <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> lorsqu'un visiteur suit un lien pour accéder à l'une de ses ressources, lui indiquant l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr> de la page où se situe ce lien qu'il a suivi.</blockquote> <p>En pratique, quand un utilisateur navigue vers un autre site via un lien (ou si un site charge une ressource externe), le serveur informe le site de destination de l'origine de la requête en utilisant l'en-tête <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> <i lang="en">Referrer</i>.</p> <p>Si nous prenons l'exemple du logo d'Openweb, voici l'information de <i lang="en">referrer</i> envoyée :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH168/referrer-lien-wi-366550be-e2008.png?1763128933' alt="Affichage du referrer pour le logo sous les outils développeurs de Firefox" width='500' height='168' /></p> <p>Si nous ouvrons le lien précédent sur Wikipedia, voici l'information de <i lang="en">referrer</i> que l'on peut voir :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH168/referrer-lien-wi-366550be-e2008.png?1763128933' alt="Affichage du referrer du lien sous les outils développeurs de Firefox" width='500' height='168' /></p> <p>Cela peut être utile dans de nombreux cas (certains outils de statistiques se basent là-dessus, etc.), toutefois, cela peut aussi poser des problèmes de confidentialité et de sécurité. Ajoutons à cela que de nombreuses — et parfois insoupçonnées — <abbr lang="en" title="Application Programming Interface">API</abbr>s peuvent utiliser cette information... et parfois au désavantage des propriétaires de sites et/ou de leurs visiteurs.</p> <p>Si ce mécanisme pouvait auparavant sembler être peu clair et peu paramétrable, une spécification relativement récente permet enfin d'en maitriser les comportements.</p> <h2 lang="en">Referrer Policy</h2> <p>Son nom s'appelle très logiquement <em lang="en">Referrer Policy</em>, qu'on peut traduire par « Politique de <i lang="en">referrers</i> », ou « Politique de référents ».</p> <p>Cette spécification est à l'instant de l'écriture de cet article une <em lang="en">Candidate recommendation</em>, c'est donc raisonnablement stabilisé et <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#Browser_compatibility" class="spip_out" hreflang="en" title="en" rel="external">tout à fait utilisable en production</a>.</p> <p>À l'instar de <a href='https://openweb.eu.org/articles/content-security-policy' class="spip_in">Content Security Policy</a>, vous pouvez donc avec <i lang="en">Referrer Policy</i> définir clairement votre politique en matière de <i lang="en">referrers</i> pour votre site… et la question est loin d'être aussi anodine qu'elle peut sembler l'être.</p> <h3>Principe et fonctionnement</h3> <p>Un en-tête <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> est envoyé au navigateur contenant cette politique. En voici un exemple via <abbr title="PHP Hypertext Preprocessor" xml:lang="en" lang="en">PHP</abbr> :</p> <pre><code> header("Referrer-Policy: <ici les valeurs possibles>"); </code></pre> <p>Voici les valeurs possibles :</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: no-referrer</code> : aucun en-tête <i lang="en">referrer</i> n'est envoyé.</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: no-referrer-when-downgrade</code> (valeur par défaut) : le <i lang="en">referrer</i> est envoyé si la sécurité de la destination est à priori égale (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>→<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>), mais n'est pas envoyé pour une destination moins sécurisée (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>→<abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr>).</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: origin</code> : seule l'origine du document sera envoyée dans tous les cas. L'adresse <code class='spip_code spip_code_inline' dir='ltr'>https://openweb.eu.org/articles/</code> enverra le <i lang="en">referrer</i> <code class='spip_code spip_code_inline' dir='ltr'>https://openweb.eu.org/</code>.</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: origin-when-cross-origin</code> : envoie l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr> complète si la destination a la même origine, et seulement l'origine pour les autres cas.</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: same-origin</code> : le <i lang="en">referrer</i> sera envoyé pour les <abbr title="Uniform Resource Locator" lang="en">URL</abbr>s avec la même origine, et aucun <i lang="en">referrer</i> ne sera envoyé dans les autres cas.</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: strict-origin</code> : le <i lang="en">referrer</i> ne contiendra que l'origine du document si la sécurité de la destination est à priori égale (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>-><abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>), rien ne sera envoyé pour une destination moins sécurisée (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>→<abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr>).</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: strict-origin-when-cross-origin</code> : quand la requête a la même origine, l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr> complète est envoyée en <i lang="en">referrer</i>. Dans le cas contraire : le <i lang="en">referrer</i> ne contiendra que l'origine du document si la sécurité de la destination est à priori égale (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>→<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>), rien ne sera envoyé pour une destination moins sécurisée (<abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>→<abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr>).</p> <p><code class='spip_code spip_code_inline' dir='ltr'>Referrer-Policy: unsafe-url</code> : l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr> complète est passée en <i lang="en">referrer</i>, quel que soit le cas.</p> <p>Le réglage par défaut a longtemps été à l'origine d'un mythe : <i>que le passage à <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> tuait en lui-même le mécanisme des <i lang="en">referrers</i></i>. Quand le <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> était beaucoup moins répandu qu'actuellement, avoir un site en <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> impliquait d'avoir majoritairement des liens vers des sites ne l'ayant pas (et donc aucun <i lang="en">referrer</i> envoyé vers une destination moins sécurisée). Le passage de Google à <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> il y a quelques années a fortement contribué à propager ce mythe. Néanmoins, <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> et <i lang="en">referrers</i> sont deux choses séparées, désolé de tuer cette légende urbaine ! :)</p> <h3>Implications et données sensibles</h3> <p>De prime abord, vous vous dites peut-être que votre site n'a rien à cacher :</p> <ul class="spip" role="list"><li> vous n'avez aucun problème à ce que les sites vers lesquels pointent vos liens soient au courant desdits liens ;</li><li> ou les ressources que vous utilisez sur d'autres sites ne sont pas un secret d'état non plus…</li></ul> <p>Posons clairement la question : <strong>en êtes-vous bien sûr ?</strong></p> <p>Si certes, des liens publics ne sont pas des secrets d'état… peut-être votre site a une interface d'administration, et vous n'avez sûrement pas envie que l'adresse de cette dernière soit transmise en <i lang="en">referrer</i>.</p> <p>Autre cas de figure : imaginons un intranet sur lequel vous pouvez partager des liens. Souhaitez-vous que l'adresse de ce dernier soit transmise vers l'extérieur ? Avec tout ce que cela peut révéler comme détails sur le fonctionnement de ce dernier ? Bien sûr que non !</p> <p>D'autres <abbr lang="en" title="Application Programming Interface">API</abbr>s comme <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> peuvent également transmettre cette information. Voici un exemple d'informations qui peuvent arriver sur un <em lang="en">report-uri</em> :</p> <pre><code>{ "csp-report": { "document-uri": "https://van11y.net/accessible-tab-panel/", "referrer": "https://plainjs.com/javascript/plugins/accessible-tabs-panel-system-163/", … } } </code></pre> <p>Note : <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> étant assez verbeux de ce point de vue, ce genre d'information est fréquent.</p> <h2>Responsabilité en tant que concepteurs/possesseurs de sites</h2> <p>Vous avez plusieurs questions à vous poser en tant que concepteurs/responsables de sites à propos de votre politique de <i lang="en">referrers</i>.</p> <h3>Est-ce que l'adresse peut contenir des informations sensibles pour l'extérieur ?</h3> <p>S'il n'est pas souhaitable de communiquer certaines adresses vers l'extérieur, votre politique en matière de <i lang="en">referrers</i> doit le refléter. Et bien entendu, <a href="https://checklists.opquast.com/oqs-v3/criteria/les-donnees-sensibles-ne-sont-pas-transmises-en-clair-dans-les-url">vous ne transmettez aucune information sensible en clair dans l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr></a> ?</p> <h3>Est-ce que l'adresse en elle-même est une information sensible ?</h3> <p>Si vous êtes sur un intranet ou une partie totalement privée de votre entreprise, c'est une information sensible que vous ne devez pas communiquer, <em lang="la">a fortiori</em> via <i lang="en">referrer</i>.</p> <p>À titre d'exemple, si vous saviez le nombre surprenant d'intranets ou d'espaces privés qui partagent une page humoristique que j'ai créée il y a quelques années qui s'appelle « <a href="https://www.estcequonmetenprodaujourdhui.info/" class="spip_out" rel="external">Est-ce qu'on met en production aujourd'hui ?</a> »... je pense que les responsables sécurité de ces sites trouveraient <strong>moins drôle de savoir que cette information fuite</strong>, notamment en <i lang="en">referrer</i> dans des rapports générés par <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> que je reçois.</p> <p>Beaucoup moins drôle comme exemple, imaginons un site d'entraide pour des femmes victimes de violences<span class="spip_note_ref"> [<a href="#nb2" class="spip_note" rel="appendix" title="J'ai travaillé sur un site de ce genre : Violence que faire, et je peux vous (…)" id="nh2">2</a>]</span>. Imaginons donc une femme ainsi que l'état de choc dans laquelle elle peut se trouver après avoir été battue. Elle va donc laisser un message sur ce site, et peut-être parler du site personnel de son mari, pour dire que « c'était la première fois qu'il faisait ça », et « qu'il est gentil avec ses autres occupations ». Imaginons que ce dernier apprenne dans son outil de visites qu'un site de ce genre lui a envoyé des visites... que va-t-il penser suite à ce qu'il a fait à sa compagne ? Et que va-t-il faire ensuite ?</p> <p>Autant le dire clairement : <strong>il est de la responsabilité du site de gérer et d'anticiper ce genre de risques</strong>. Certains sujets ne souffrent <strong>pas</strong> de traiter ces risques avec légèreté, et encore moins en tant que professionnels du métier.</p> <p>Notes : des outils comme <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a> suggèrent d'utiliser comme valeurs :</p> <ul class="spip" role="list"><li> <code class='spip_code spip_code_inline' dir='ltr'>no-referrer</code></li><li> <code class='spip_code spip_code_inline' dir='ltr'>same-origin</code></li><li> <code class='spip_code spip_code_inline' dir='ltr'>strict-origin</code></li><li> <code class='spip_code spip_code_inline' dir='ltr'>strict-origin-when-cross-origin</code></li></ul> <p>Et ce, afin de ne pas divulguer d'informations sensibles.</p> <p>Le <abbr title="World Wide Web Consortium" lang="en">W3c</abbr> <a href="https://www.w3.org/blog/news/archives/6087?pk_campaign=feed&pk_kwd=w3c-invites-implementations-of-referrer-policy" class="spip_out" hreflang="en" title="en" rel="external">vous recommande de définir une politique de <i lang="en">referrer</i></a>.</p> <h2>Conclusion</h2> <p>Cette question des <i lang="en">referrers</i> dépasse de loin le simple cadre des statistiques des sites, et peut devenir un enjeu de sécurité ou de vie privée selon l'activité des sites.</p> <p>Ce n'est bien évidemment pas un hasard si des outils comme <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a> ou <a href="https://securityheaders.io/" class="spip_out" hreflang="en" title="en" rel="external">Security Headers</a> invitent et recommandent d'utiliser cet en-tête de sécurité.</p> <p>Maintenant que vous en connaissez les enjeux et le contexte, vous n'avez plus d'excuse pour ne pas le déployer en toute connaissance de cause à votre tour.</p> <h2>Références, compléments</h2><ul class="spip" role="list"><li> <a href="https://www.w3.org/TR/referrer-policy/" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Referrer Policy</span> (spécification <abbr title="World Wide Web Consortium" lang="en">W3c</abbr>)</a></li><li> <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Referrer-Policy (Mozilla Developer Network)</span></a></li><li> <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Mozilla Observatory</span></a></li><li> <a href="https://securityheaders.io/" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Security Headers</span></a></li><li> <a href="https://blog.fastmail.com/2016/06/20/everything-you-could-ever-want-to-know-and-more-about-controlling-the-referer-header/" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Everything you could ever want to know (and more) about controlling the Referer header</span></a></li></ul></div> <hr /> <div class='rss_notes'><div id="nb1"> <p><span class="spip_note_ref">[<a href="#nh1" class="spip_note" title="Notes 1" rev="appendix">1</a>] </span>La graphie exacte de ce mot est en réalité <i lang="en">Referrer</i>, avec deux « r ». Mais l'erreur est si courante dans la langue anglaise, qu'elle a été commise au sein même des spécifications officielles du protocole <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> (!). La forme erronée est par conséquent devenue standard dans l'industrie de l'informatique, lorsqu'il est question des référents.</p> </div><div id="nb2"> <p><span class="spip_note_ref">[<a href="#nh2" class="spip_note" title="Notes 2" rev="appendix">2</a>] </span>J'ai travaillé sur un site de ce genre : <a href="https://www.violencequefaire.ch/" class="spip_out" rel="external">Violence que faire</a>, et je peux vous assurer que le scénario évoqué est tout à fait plausible.</p> </div></div> HTTPS : de SSL à TLS 1.3 https://openweb.eu.org/articles/https-de-ssl-a-tls-1-3 https://openweb.eu.org/articles/https-de-ssl-a-tls-1-3 2017年02月28日T13:22:05Z text/html fr Frédéric Kayser Sécurité Expert Gourou <p>Un changement de numéro de version, même mineur, est rarement anodin lorsqu'il s'agit d'un protocole de sécurité. Alors qu'une importante partie de l'écosystème qui gravite autour de SSL/TLS persiste à l'appeler SSL, aujourd'hui, c'est bel et bien uniquement TLS qu'il faut utiliser et avec une large préférence pour TLS 1.2 et TLS 1.3. <br class='autobr' /> HTTPS est apparu dans Netscape Navigator en 1995 pour accompagner l'essor du commerce en ligne alors naissant. Initialement c'est le protocole SSL —Secure (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/securite" rel="tag">Sécurité</a>, <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/gourou" rel="tag">Gourou</a> <div class='rss_chapo'><p>Un changement de numéro de version, même mineur, est rarement anodin lorsqu'il s'agit d'un protocole de sécurité. Alors qu'une importante partie de l'écosystème qui gravite autour de SSL/TLS persiste à l'appeler SSL, aujourd'hui, c'est bel et bien uniquement TLS qu'il faut utiliser et avec une large préférence pour TLS 1.2 et TLS 1.3.</p></div> <div class='rss_texte'><p>HTTPS est apparu dans <a href="https://fr.wikipedia.org/wiki/Netscape_Navigator" class="spip_out" rel="external">Netscape Navigator</a> en 1995 pour accompagner l'essor du commerce en ligne alors naissant. Initialement c'est le protocole SSL —<i lang="en">Secure Sockets Layer</i>— qui était intercalé entre TCP et HTTP. Depuis lors, SSL a bien évolué et a même changé de nom pour devenir TLS —<i lang="en">Transport Layer Security</i>—, on dénombre désormais six versions : SSLv2, SSLv3, TLS 1.0, TLS 1.1, TLS 1.2 et TLS 1.3. Elles apportent chacune des améliorations parfois subtiles mais qui peuvent se révéler cruciales. 2018 a été marquée par l'avènement de TLS 1.3. Dix ans après TLS 1.2, cinq ans après les révélations d'Edward Snowden, cette nouvelle version apporte plus de simplicité, de vitesse et de sécurité.</p> <p>Cet article est relativement long car il aborde des aspects historiques en plus de la technique, mais d'un point de vue purement pratique il peut se résumer en quelques points :</p> <ul class="spip" role="list"><li> TLS 1.2 est une nécessité, à activer si ce n'est déjà fait ;</li><li> SSLv2 et SSLv3 sont des calamités, à désactiver ;</li><li> TLS 1.0 est en sursis, planifier sa désactivation ;</li><li> TLS 1.1 ne sert pratiquement à rien ;</li><li> TLS 1.3 est l'avenir, considérer son adoption dès que possible.</li></ul> <p>Ces recommandations sont en phase avec celles de l'ANSSI —Agence Nationale de la Sécurité des Systèmes d'Information— : <a href="https://www.ssi.gouv.fr/guide/recommandations-de-securite-relatives-a-tls/" class="spip_out" rel="external">Recommandations de sécurité relatives à TLS</a> (si ce n'est que l'agence française n'aborde pas encore TLS 1.3) ou le wiki de Mozilla concernant la configuration TLS : <a href="https://wiki.mozilla.org/Security/Server_Side_TLS" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">Security/Server Side TLS</i></a> (destiné à la base au seul usage interne au sein de Mozilla, mais le guide <a href="https://support.google.com/webmasters/answer/6073543?hl=fr" class="spip_out" rel="external">Sécuriser votre site à l'aide du protocole HTTPS</a> de Google et le <a href="https://www.ncsc.gov.uk/guidance/tls-external-facing-services" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">National Cyber Security Centre</i></a> britannique le recommandent).</p> <p>Il arrive qu'on ne dispose que d'un contrôle partiel sur le paramétrage de TLS qui est souvent lié à un composant proche du système d'exploitation comme <a href="https://www.openssl.org" class="spip_out" hreflang="en" title="en" rel="external">OpenSSL</a> ou <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123(v=vs.85).aspx" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">Secure Channel</i></a><span class="spip_note_ref"> [<a href="#nb2-1" class="spip_note" rel="appendix" title="Écrire le code informatique qui gère la cryptographie est une affaire de (…)" id="nh2-1">1</a>]</span>, il faut donc éventuellement s'adresser à son administrateur système ou son hébergeur pour parvenir à mettre en place certaines évolutions.</p> <p>Il est en revanche assez facile de s'équiper d'outils pour analyser la configuration SSL/TLS d'un serveur ou d'un client web. <a href="https://www.ssllabs.com/ssltest/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">SSL Labs</i></a> (en ligne) et son quasi équivalent pour <i lang="en">shell bash</i> <a href="https://github.com/drwetter/testssl.sh" class="spip_out" hreflang="en" title="en" rel="external">testssl.sh</a> génèrent un rapport relativement complet sur la configuration d'un serveur web sécurisé quelconque et indiquent donc quelles versions de SSL/TLS sont actives, on trouve par exemple pour <a href="https://www.ssllabs.com/ssltest/analyze.html?d=cfspart.impots.gouv.fr" class="spip_out" hreflang="en" title="en" rel="external">un domaine de la DGFiP</a>.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH234/https-sslv3-tls1-415a2c7b-dd3ec.png?1763128933' alt="Versions de SSL/TLS actives" width='500' height='234' /></p> <p>Avoir TLS 1.0, 1.1 et 1.2 comme seules versions actives est une situation encore courante actuellement. En effet, tous les navigateurs sont dotés de TLS 1.2 depuis plusieurs années (voir <a href="http://caniuse.com/#feat=tls1-2" class="spip_out" hreflang="en" title="en" rel="external">Can I use : TLS 1.2</a>), mais le parc mondial n'est malheureusement pas constitué uniquement de navigateurs récents, c'est pourquoi TLS 1.0 et 1.1 restent encore souvent activés aux côtés de TLS 1.2 sur de nombreux serveurs. Quant à TLS 1.3 la diffusion de bibliothèques adaptées n'est effective que depuis peu.</p> <p>On trouve sur <a href="https://www.ssllabs.com/ssl-pulse/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">SSL Pulse</i></a> un ensemble de statistiques relatives aux éléments clés de la configuration SSL/TLS côté serveur, celles-ci proviennent de l'analyse mensuelle d'un large panel de sites web. Ce qui permet de prendre régulièrement le pouls de l'état de la crypto sur le web et d'éventuellement se situer par rapport aux autres sites.<br class='autobr' /> Le graphique ci-dessous représente l'évolution des versions de SSL/TLS acceptées par les serveurs scrutés par <i lang="en">SSL Pulse</i> sur une période de quatre ans (les colonnes représentent les mesures d'octobre 2015, 2016, 2017, 2018 et 2019).</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH330/https-sslv3-tls1-30bcefca-fc9d0.png?1763128933' alt="évolution des versions de SSL/TLS acceptées par les serveurs scrutés par SSL Pulse" width='500' height='330' /></p> <p>On observe la disparition (toute relative) de SSLv3, le déclin de TLS 1.0, le retournement de tendance de TLS 1.1 qui suit désormais TLS 1.0 vers la sortie alors que TLS 1.2 est proche des sommets et TLS 1.3 bénéficie d'un départ canon. En se basant sur les tendances on peut déduire que les sites en pointe acceptent TLS 1.2 voire 1.3 mais refusent d'ores et déjà TLS 1.0 et 1.1, que le gros des troupes accepte indifféremment TLS 1.2, 1.1 et 1.0 et que les sites à la traîne ne peuvent traiter que TLS 1.0 parfois encore secondé par SSLv3. Ce découpage en trois populations correspond grosso modo à ce que propose Mozilla sur <a href="https://wiki.mozilla.org/Security/Server_Side_TLS" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">Security/Server Side TLS</i></a> avec ses trois configurations : moderne, intermédiaire et vieillot ou la classification R3, R3&minus; et R3&minus;&minus; de l'ANSSI.</p> <p>Il faut en effet faire preuve de pragmatisme, la même configuration SSL/TLS ne peut pas convenir à tout le monde. De façon un peu caricaturale, un site orienté <i lang="en">B2B</i> sera certainement bien plus confronté à de vieux Internet Explorer pour qui TLS 1.0 reste nécessaire, alors qu'un site dont la confidentialité est une priorité ou doté d'un design qui repose sur des fonctionnalités CSS ou Flexbox récentes pourrait, au contraire, se passer de TLS 1.0 et des vieux clients web qui en dépendent. Une refonte peut être une occasion intéressante de réviser une configuration TLS, à condition de bien en mesurer les conséquences —ce qui implique que le front-end discute avec le back-end et le système. Si un site est prévu pour au minimum IE 11 et que son niveau de dégradation avec IE 9 ou plus ancien est tel qu'il vaudrait mieux ne pas l'afficher… la configuration TLS offre une solution radicale.</p> <h2 class="spip">Le client web propose, le serveur web dispose</h2> <p>Le client et le serveur web négocient certains éléments lors de l'établissement de la liaison sécurisée. Il faut en effet qu'ils s'assurent de disposer d'algorithmes en commun pour signer, échanger des clés et chiffrer, mais la version du protocole SSL/TLS à utiliser est le tout premier point sur lequel ils doivent nécessairement s'entendre, car le reste de l'établissement de la liaison sécurisée (le <i lang="en">handshake</i>) varie légèrement d'une version à l'autre, ce sont surtout des initialisations, transmissions d'aléas et calculs de sommes de contrôle qui changent.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH267/https-sslv3-tls1-6c7af4ae-78e75.png?1763128933' alt="Proposition des capacités par le client" width='500' height='267' /></p> <p>La règle de base est que le client propose, il va donc faire étalage de toutes ses capacités, parfois dans un ordre préférentiel. Puis c'est le serveur qui dispose vu que c'est lui qui va retenir quels algorithmes seront utilisés en fonction de ses propres capacités.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH267/https-sslv3-tls1-8d10a844-73df1.png?1763128933' alt="Réponse du serveur selon ses capacités" width='500' height='267' /></p> <p>Il va sans dire qu'il se produit quelques problèmes intergénérationnels lorsque de vieux clients essayent de communiquer avec des serveurs qui cherchent à renforcer la sécurité des données en transit, car ceci s'oppose à une rétrocompatibilité très poussée, ou inversement lorsque des clients récents croisent un serveur resté figé à une autre époque.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH419/https-sslv3-tls1-f9792be3-27ffc.png?1763128933' alt="Echec de négociation TLS avec IE8" width='500' height='419' /></p> <p>IE 8 sur Windows XP n'arrive pas à négocier l'ouverture de la connexion sécurisée avec un site qui nécessite au minimum TLS 1.1.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH137/https-sslv3-tls1-22fd623b-6c58e.png?1763128933' alt="Détail réseau de la discussion entre le navigateur et le serveur" width='500' height='137' /></p> <p>Les traces réseau révèlent que le navigateur a fait deux tentatives, une fois en TLS 1.0 et une fois en SSLv3, le serveur n'a pas même daigné lui répondre, le navigateur se retrouve alors déboussolé et ne peut afficher qu'un message d'erreur assez générique. Ce point est à prendre en compte lorsque l'on planifie de désactiver TLS 1.0 sur un site existant, il faut en effet prévenir les derniers utilisateurs qui se présentent encore avec de vieux clients web du changement à venir bien avant la désactivation effective.</p> <h2 class="spip">Le client web propose, le serveur web… explose</h2> <p>Dans le « <i lang="en">Client Hello</i> », qui correspond au premier message adressé par le client au serveur, figurent la version la plus élevée et la plus basse du protocole que le client propose d'utiliser, de nos jours on y trouve très souvent TLS 1.2 et TLS 1.0, mais ceci n'est qu'une convention qui laisse d'ailleurs planer un doute quant au fait que TLS 1.1 puisse être utilisé ou non.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH229/https-sslv3-tls1-a78b55f1-c0690.png?1763128933' alt="Détail d'un Client Hello" width='500' height='229' /></p> <p>Pour des raisons historiques et de nombreuses mises en œuvres bancales, cet aspect est un brin moins trivial qu'il ne devrait l'être. En effet lorsque les premiers clients aptes à utiliser TLS 1.0 ont entamé le dialogue avec des serveurs qui ne connaissaient que SSLv3, les négociations ne se sont pas déroulées exactement comme prévues… En théorie les serveurs en question auraient dû décliner la proposition d'utiliser TLS 1.0 et se rabattre sur SSLv3 à la place, en pratique certains serveurs se sont figés d'effroi et dans le mutisme le plus total.</p> <p>Ce phénomène porte le nom d'intolérance de version et a forcé les clients web à émettre une première tentative de négociation pour TLS 1.0 puis, en cas d'échec ou en l'absence de réponse, une seconde tentative pour SSLv3, exactement comme on le voit sur les traces réseau d'IE 8 ci-dessus.</p> <p>Sans grande surprise le même phénomène, un peu atténué, s'est produit lorsque les premiers clients TLS 1.1/1.2 se sont adressés à des serveurs qui ne connaissaient que TLS 1.0 et SSLv3. Certains sites ont alors conseillé à leurs utilisateurs de désactiver TLS 1.2 et TLS 1.1 dans les « Options Internet » de Windows, les privant donc de ces versions sur tous les autres sites !</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH457/https-sslv3-tls1-716d517c-8c73d.png?1763128933' alt="TLS 1.2 et 1.1 désactivés sous IE" width='500' height='457' /></p> <p>Si les deux cases « Utiliser TLS 1.2 » et « Utiliser TLS 1.1 » sont décochées Internet Explorer devient incapable de négocier les versions de TLS les plus récentes. Du coup il n'est pas tout à fait possible de faire le lien entre un <i lang="en">User Agent</i> et le support de TLS 1.2 vu que celui-ci peut être désactivé par ailleurs, ce qui implique de se pencher directement sur les logs de négociations TLS pour, par exemple, déterminer la part exacte des clients qui nécessitent TLS 1.0 sur un site donné.</p> <p>La bonne nouvelle est que ce problème d'intolérance ne se produira pas avec TLS 1.3. En effet, lors de la conception de ce dernier, il a été évalué qu'environ 2% des serveurs web sécurisés seraient intolérants aux clients qui chercheraient à négocier TLS 1.3 d'entrée de jeu. De ce fait, les clients TLS 1.3 se présentent en définitive comme de simples clients TLS 1.2 mais arborent en plus une nouvelle extension qui permet une énumération claire des versions du protocole que le client souhaite utiliser. Les extensions inconnues étant proprement ignorées par les serveurs web, il ne devrait plus y avoir de problème d'intolérance.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH176/https-sslv3-tls1-fa3885f7-b68a9.png?1763128933' alt="Versions de TLS supportées" width='500' height='176' /></p> <p>Firefox 51.0.1 indique clairement qu'il souhaite utiliser TLS 1.3 (sur la base du <i lang="en">draft</i> 18).</p> <h2 class="spip">Des temps anciens à l'ère post NIST</h2> <p>Ces dernières années la majorité des failles de sécurité ou faiblesses rendues publiques comme <i lang="en">BEAST, POODLE, DROWN, SWEET32…</i> concernent les versions les plus anciennes du protocole SSL/TLS. En compilant sur plus de 20 ans les différentes évolutions de ce protocole, on comprend mieux pourquoi TLS 1.3 devenait nécessaire et représente une étape significative vers un Internet plus sûr.</p> <p>Un des objectifs de cette partie est de montrer que ce qui définit SSL/TLS n'est pas une spécification monolithique unique mais plutôt un patchwork de RFC apparues progressivement et dans lesquelles les différentes mises en œuvres logicielles vont piocher plus ou moins d'éléments ; les explications détaillées concernant certains concepts (auxquels sont souvent associé des acronymes : CBC, GCM, ECDHE…) ne seront fournies que dans les articles relatifs aux certificats et aux suites cryptographiques.</p> <h2 class="spip">SSLv2 (1995)</h2> <p>SSL version 2 constitue la version initiale proposée par Netscape, la version 1 n'ayant jamais servi. SSLv2 présente des lacunes importantes et ne devrait plus être utilisé depuis très longtemps, très très longtemps même, l'IETF s'est clairement prononcé sur ce sujet en 2011 dans la <a href="https://tools.ietf.org/html/rfc6176" class="spip_out" hreflang="en" title="en" rel="external">RFC 6176</a>. Toutefois, au début 2016, l'attaque <a href="https://drownattack.com/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">DROWN</i></a> a mis en lumière sa présence sur de nombreux serveurs HTTPS et SMTP alors que les clients web pouvant se connecter de la sorte ont disparu depuis belle lurette, et plus aucune autorité de certification ne peut émettre de « certificat SSL » avec des caractéristiques adaptées aux clients web qui ne connaîtraient que SSLv2. Ceci est malheureusement symptomatique de négligences de sécurité élémentaires : défaut de mise à jour et reconduction de paramètres par méconnaissance.</p> <h2 class="spip">SSLv3 (1996, <a href="https://tools.ietf.org/html/rfc6101" class="spip_out" hreflang="en" title="en" rel="external">RFC 6101</a>)</h2> <p>Conscient des faiblesses de SSLv2, Netscape propose SSLv3 dès l'année suivante. Cette version est restée active et très largement utilisée pendant près de 18 ans (le long règne d'IE 6 et la prédominance de Windows XP y sont pour quelque chose). En septembre 2014, l'attaque <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">POODLE</i></a> scelle le sort de SSLv3 car la seule contre-mesure possible est sa désactivation au profit de TLS. Mais cette version était déjà décriée depuis des années comme en témoigne les tutoriels de <a href="http://disablessl3.com/" class="spip_out" hreflang="en" title="en" rel="external">désactivation de SSLv3</a>, la <a href="https://tools.ietf.org/html/rfc7568" class="spip_out" hreflang="en" title="en" rel="external">RFC 7568</a> de 2015 en interdit l'usage et préconise TLS 1.2 à la place. Il est à noter qu'en raison de <i lang="en">POODLE</i>, la majorité des navigateurs ont définitivement désactivé SSLv3 vers la fin 2014.</p> <p class="remarque_important">À moins de vouloir à tout prix être compatible avec Internet Explorer sur Windows XP Service Pack 2 (le SP3 apporte TLS 1.0 qu'il faut toutefois activer manuellement dans « Options Internet ») il n'y a strictement aucune raison d'activer SSLv3 côté serveur.</p> <h2 class="spip">TLS 1.0 (1999, <a href="https://tools.ietf.org/html/rfc2246" class="spip_out" hreflang="en" title="en" rel="external">RFC 2246</a>)</h2> <p>Pour concilier les divergences entre Microsoft et Netscape concernant l'évolution de SSL, le protocole est confié à l'IETF —<i lang="en">Internet Engineering Task Force</i>— et renommé TLS —<i lang="en">Transport Layer Security</i>— au passage. À cette époque, TLS 1.0 ne constituait qu'une évolution assez légère de SSLv3 (en interne l'identification de version est d'ailleurs 3.1). TLS révise cependant une partie de l'établissement de la liaison (le <i lang="en">handshake</i>) et apporte de la flexibilité avec l'introduction d'extensions optionnelles qui permettent de faire évoluer le protocole sans revoir ses bases et constamment réviser son numéro de version.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH248/https-sslv3-tls1-5649b84e-aac29.png?1763128933' alt="Exemple de Client Hello avec des extensions" width='500' height='248' /></p> <p>Les premières années l'utilisation des extensions est restée très limitée, le <i lang="en">Client Hello</i> produit par IE sur Windows XP ne dépassera jamais cette forme rudimentaire.</p> <h2 class="spip">AES —<i lang="en">Advanced Encryption Standard</i>— (2002, <a href="https://tools.ietf.org/html/rfc3268" class="spip_out" hreflang="en" title="en" rel="external">RFC 3268</a>)</h2> <p>Le chiffrement symétrique AES a été intégré dans TLS quelques années après la parution de TLS 1.0, il est aujourd'hui très largement répandu et restera vraisemblablement indispensable encore de nombreuses années.</p> <p class="remarque_important">Parmi les améliorations apportées à Secure Channel dans Windows Vista par rapport à Windows XP figurent la mise en œuvre de suites cryptographiques qui proposent le chiffrement AES et dans un autre domaine le SNI…</p> <h2 class="spip">SNI —<i lang="en">Server Name Indication</i>— (2003, <a href="https://tools.ietf.org/html/rfc3546" class="spip_out" hreflang="en" title="en" rel="external">RFC 3546</a>)</h2> <p>SNI est une extension TLS qui revêt désormais une importance toute particulière ! En effet, précédemment SSL partait du principe qu'un seul domaine était hébergé par adresse IP et à aucun moment le protocole ne faisait mention du domaine visé… Un peu à l'image de HTTP/1.1 qui a permis l'hébergement virtuel avec l'en-tête « <i lang="en">host</i> », TLS donne la possibilité d'indiquer le nom du serveur via l'extension SNI, ce qui permet donc d'héberger plusieurs sites sécurisés sur une même adresse IP sans avoir à mutualiser le certificat et la clé privée.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH176/https-sslv3-tls1-511644e5-631db.png?1763128933' alt="Extensions SNI (exemple sur Openweb)" width='500' height='176' /></p> <p>Les clients web incapables de gérer SNI sont en voie de disparition (voir <a href="http://caniuse.com/#feat=sni" class="spip_out" hreflang="en" title="en" rel="external">Can I use : SNI</a>) et les hébergeurs ont donc désormais massivement recours à SNI pour offrir HTTPS à tout le monde.</p> <p>Aujourd'hui TLS 1.0 montre de sérieux signes de fatigue, car les suites cryptographiques qui y sont communément associées reposent sur des méthodes de chiffrement dont la cryptanalyse révèle désormais les faiblesses, on notera :</p> <ul class="spip" role="list"><li> l'interdiction du chiffrement RC4 dans la <a href="https://tools.ietf.org/html/rfc7465" class="spip_out" hreflang="en" title="en" rel="external">RFC 7465</a> voir également <a href="http://www.rc4nomore.com/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">RC4 NOMORE</i></a> ;</li><li> un problème de chaînage et d'initialisation des blocs CBC <a href="http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art027" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">BEAST Attack</i></a> ;</li><li> ou encore les blocs de 64 bits qui fragilisent le Triple DES <a href="https://sweet32.info/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">SWEET32</i></a>.</li></ul> <p>De ce fait, configurer TLS 1.0 correctement est un exercice de plus en plus périlleux, le PCI SSC —<i lang="en">Payment Card Industry Security Standards Council</i>— (Visa, Mastercard et les autres réseaux de cartes) a banni cette version des paiements CB en ligne et par là même des sites d'e-commerce dans PCI DSS 3.2 depuis la <a href="https://blog.pcisecuritystandards.org/migrating-from-ssl-and-early-tls" class="spip_out" hreflang="en" title="en" rel="external">mi-2018</a>. Le 15 octobre 2018, <a href="https://webkit.org/blog/8462/deprecation-of-legacy-tls-1-0-and-1-1-versions/" class="spip_out" rel="external">Apple</a>, <a href="https://security.googleblog.com/2018/10/modernizing-transport-security.html" class="spip_out" rel="external">Google</a>, <a href="https://blogs.windows.com/msedgedev/2018/10/15/modernizing-tls-edge-ie11/" class="spip_out" rel="external">Microsoft</a> et <a href="https://blog.mozilla.org/security/2018/10/15/removing-old-versions-of-tls/" class="spip_out" rel="external">Mozilla</a> ont annoncé conjointement la fin de la prise en charge des versions 1.0 et 1.1 de TLS dans leurs navigateurs à compter de mars 2020 (la pandémie de Covid-19 a toutefois introduit un sursis de quelques mois). Pour satisfaire aux exigences de PCI DSS, certains hébergeurs proposent en option des configurations uniquement basées sur TLS 1.2.</p> <p class="remarque_important">Désactiver TLS 1.0 revient à tourner le dos à environ 3 % des navigateurs utilisés et plus particulièrement IE 8 et antérieurs sur Windows XP et IE 9 et antérieurs sur Windows Vista, les versions de Safari antérieures à la 7 sur OS X ainsi que le navigateur intégré (pas Chrome) des appareils Android antérieurs à 5.0.</p> <p> Avec l'arrêt de la branche <a href="https://support.mozilla.org/fr/kb/fin-support-windows-xp-vista" class="spip_out" rel="external">ESR 52.9.0 de Firefox</a>, Windows XP et Vista se retrouvent sans navigateur maintenu, Chrome ayant déjà jeté l'éponge (<a href="https://chrome.googleblog.com/2015/11/updates-to-chrome-platform-support.html" class="spip_out" hreflang="en" title="en" rel="external">notification de Chrome 49</a>), il devient donc de plus en plus dangereux d'utiliser ces systèmes.</p> <h2 class="spip">TLS 1.1 (2006, <a href="https://tools.ietf.org/html/rfc4346" class="spip_out" hreflang="en" title="en" rel="external">RFC 4346</a>)</h2> <p>TLS 1.1 est une version de transition qui consolide certaines RFC intermédiaires et inclut une modification de l'initialisation des blocs CBC (suite à un signalement fait en 2001) qui prévient l'attaque <i lang="en">BEAST</i> qui n'apparaitra toutefois qu'en 2011. Cette attaque a révélé à quel point la cryptographie sur le web était en retard, en effet en 2011 aucun navigateur ne peut traiter TLS 1.1 ou 1.2 et il en va pratiquement de même pour les serveurs (OpenSSL évolue alors malheureusement très lentement).</p> <p>Le rattrapage brutal effectué depuis lors explique pourquoi TLS 1.1 est une version que l'on peut pratiquement oublier, en effet la gestion de TLS 1.1 est très souvent apparue simultanément avec celle de TLS 1.2. La question qui se pose au niveau de la configuration d'un serveur est donc de savoir jusqu'à quand il doit encore accepter TLS 1.0 avant de passer exclusivement à TLS 1.2 et plus récent.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH290/httpd-ssl-conf-887ca8bf-94e52.png?1763128933' alt="Commentaires du fichier de configuration Apache 2.4.x à propos de TLS" width='500' height='290' /></p> <p class="remarque_important">Les commentaires du fichier de configuration httpd-tls.conf d'Apache 2.4.x suggèrent de désactiver TLS 1.0 dès que possible et de ne conserver que TLS 1.2 d'actif à compter de la fin 2016.</p> <h2 class="spip">ECC —<i lang="en">Elliptic Curve Cryptography</i>— (2006, <a href="https://tools.ietf.org/html/rfc4492" class="spip_out" hreflang="en" title="en" rel="external">RFC 4492</a>)</h2> <p>La cryptographie à base de courbes elliptiques est une rupture technologique (enfin mathématique) par rapport aux algorithmes précédents qui reposent souvent sur de grands nombres entiers et la difficulté de les factoriser (type RSA). Utiliser les équivalents ECxxx présente quelques avantages :</p> <ul class="spip" role="list"><li> la description d'un point sur une courbe est un objet bien plus petit ;</li><li> les calculs sont globalement plus rapides ;</li><li> les plus petites clés EC offrent déjà un niveau de sécurité un cran au-dessus de ce qui se fait communément (équivalent à 3072 bits en asymétrique).</li></ul> <p>Utiliser en priorité l'algorithme d'échange de clé ECDHE est désormais unanimement conseillé.</p> <p>En revanche, l'utilisation de clés et de signatures ECDSA est encore rare dans les certificats par rapport à l'omniprésent RSA mais celle-ci devrait connaitre un regain d'intérêt dans les prochaines années avec la disparition des clients web incompatibles (principalement IE et Chrome sur Windows XP).</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH389/https-sslv3-tls1-4a7befc9-b4d11.png?1763128933' alt="Extensions à base de courbes elliptiques dans un client hello" width='500' height='389' /></p> <p>L'intérêt de l'ECC est tel qu'il a souvent été intégré dans des composants par ailleurs limités à TLS 1.0 comme ici IE sur Windows Vista mais également les anciennes versions d'Android et les systèmes d'Apple.</p> <h2 class="spip">TLS 1.2 (2008, <a href="https://tools.ietf.org/html/rfc5246" class="spip_out" hreflang="en" title="en" rel="external">RFC 5246</a>)</h2> <p>TLS 1.2 apporte une évolution importante : AEAD —<i lang="en">Authenticated Encryption with Associated Data</i>— le chiffrement authentifié (défini en propre dans la <a href="https://tools.ietf.org/html/rfc5116" class="spip_out" hreflang="en" title="en" rel="external">RFC 5116</a>) sous la forme des modes GCM et CCM. Malheureusement TLS 1.2 autorise l'usage de vieilles suites cryptographiques ce qui permet de réaliser des mélanges de modernité et d'archaïsme potentiellement dangereux.</p> <p class="remarque_important">Le simple fait activer TLS 1.2 côté serveur ne garantit pas d'avoir une configuration de qualité, c'est nécessaire mais pas suffisant. Le choix et l'ordre des suites cryptographiques utilisables ainsi que, dans une moindre mesure, le certificat employé vont également jouer un rôle déterminant.</p> <h2 class="spip">AES-GCM (2008, <a href="https://tools.ietf.org/html/rfc5288" class="spip_out" hreflang="en" title="en" rel="external">RFC 5288</a>)</h2> <p>GCM —<i lang="en">Galois Counter Mode</i>— est le premier mode de chiffrement authentifié défini et le plus utilisé de nos jours…</p> <h2 class="spip">HMAC SHA2, ECC et AES-GCM (2008, <a href="https://tools.ietf.org/html/rfc5289" class="spip_out" hreflang="en" title="en" rel="external">RFC 5289</a>)</h2> <p>…mais l'échange de clé ECDHE étant à privilégier, les suites cryptographiques considérées comme étant les plus sûres proviennent de cette seconde RFC, qui définit également les HMAC en SHA-2 pour les modes CBC.</p> <h2 class="spip">AES-CCM (2012, <a href="https://tools.ietf.org/html/rfc6655" class="spip_out" hreflang="en" title="en" rel="external">RFC 6655</a>)</h2> <p>L'autre mode de chiffrement authentifié n'a été ajouté que quelques années après sous la forme de CCM —<i lang="en">Counter with CBC-MAC</i>— ce qui a comme effet qu'aucun navigateur web ne l'utilise actuellement, il est disponible dans OpenSSL depuis la version 1.1.0.</p> <h2 class="spip">ALPN —<i lang="en">Application-Layer Protocol Negotiation</i>— (2014, <a href="https://tools.ietf.org/html/rfc7301" class="spip_out" hreflang="en" title="en" rel="external">RFC 7301</a>)</h2> <p>Cette extension permet d'indiquer dès la négociation TLS que le client web est disposé à faire transiter autre chose que HTTP, c'est-à-dire HTTP/2 (h2) ou éventuellement son ancêtre SPDY (spdy/3), si le serveur en est capable il va donc basculer vers le nouveau protocole. Il est à noter que pour assurer un niveau de sécurité minimal HTTP/2 prohibe une grande quantité de suites cryptographiques dont la liste d'exclusion figure dans l'annexe A : TLS 1.2 <i lang="en">Cipher Suite Black List</i> de la <a href="https://tools.ietf.org/html/rfc7540" class="spip_out" hreflang="en" title="en" rel="external">RFC 7540</a>.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH194/https-sslv3-tls1-c48bc1ee-dc1ac.png?1763128933' alt="Protocole ALPN dans un client hello" width='500' height='194' /></p> <h2 class="spip"><i lang="en">Encrypt then MAC</i> (2014, <a href="https://tools.ietf.org/html/rfc7366" class="spip_out" hreflang="en" title="en" rel="external">RFC 7366</a>)</h2> <p>Les opérations disjointes de chiffrement et de contrôle d'intégrité opérées lors de l'utilisation du mode CBC se font dans un ordre qui n'est plus considéré comme le plus sûr. Cette RFC introduit une subtile modification pour remettre ces opérations dans le bon ordre à l'aide d'une énième extension… mais ceci arrive quelque peu tardivement car les clients et serveurs susceptibles de la mettre en œuvre disposent déjà du chiffrement authentifié sous la forme du mode GCM qui n'est pas confronté à ce problème. En définitive il semble qu'aucun client web n'intègre cette modification et TLS 1.3 réserve un sort tout particulier au mode CBC…</p> <h2 class="spip"><i lang="en">TLS Fallback SCSV</i> (2015, <a href="https://tools.ietf.org/html/rfc7507" class="spip_out" hreflang="en" title="en" rel="external">RFC 7507</a>)</h2> <p>Comme les versions les plus anciennes de TLS/SSL sont également les moins sûres, pour perpétrer une attaque un assaillant pouvant s'interposer entre le client et le serveur (on parle de MITM —<i lang="en">Man In The Middle</i>— en anglais) pourrait procéder à une attaque par repli qui consiste à proprement éliminer les demandes de négociations pour TLS 1.2 et TLS 1.0 et ne laisser passer que celle pour SSLv3.</p> <p>Le serveur ne voyant arriver que cette dernière il négocierait donc cette version sans avoir la moindre notion qu'il s'est passé quelque chose sur le réseau. Mais si le client insère la SCSV —<i lang="en">Signaling Cipher Suite Value</i>— à la fin de la liste des suites cryptographiques qu'il souhaite utiliser lors de ses tentatives en mode dégradé, le serveur aura la possibilité que se rendre compte qu'il n'a pas affaire à un vieux client mais au contraire à un client récent dont les précédentes demandes ne lui sont pas parvenues, il pourra donc l'alerter en retour.</p> <h2 class="spip"><i lang="en">Extended Master Secret</i> (2015, <a href="https://tools.ietf.org/html/rfc7627" class="spip_out" hreflang="en" title="en" rel="external">RFC 7627</a>)</h2> <p>Pour lutter contre une forme d'attaque par interposition dite <i lang="en">Triple Handshake</i> cette RFC propose d'améliorer le calcul du secret partagé en y incorporant une empreinte portant sur l'ensemble des données échangées lors de l'établissement de la liaison.</p> <h2 class="spip">Curve25519 et Curve448 (2016, <a href="https://tools.ietf.org/html/rfc7748" class="spip_out" hreflang="en" title="en" rel="external">RFC 7748</a>)</h2> <p>Une pierre d'achoppement qui a retardé l'adoption de la cryptographie à base de courbes elliptiques est le choix des courbes en question, en effet certains redoutaient que les courbes proposées par le NIST —<i lang="en">National Institute of Standards and Technology</i>— comme P-256, P-384 et P-521 ne présentent des propriétés douteuses mais de prime abord bien cachées. Les nouvelles courbes 25519 et 448 issues des travaux de <a href="https://fr.wikipedia.org/wiki/Daniel_J._Bernstein" class="spip_out" rel="external">Daniel J. Bernstein</a> devraient soulever bien moins d'objections.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH193/https-sslv3-tls1-08fa2500-eed43.png?1763128933' alt="Courbe 25519 dans un client hello" width='500' height='193' /></p> <p>Chrome et Firefox proposent déjà d'utiliser la fonction x25519 pour les échanges de clé ECDHE. Au passage : tout ce qui apparaît ici comme « <i lang="en">Unknown</i> » ne reflète pas une lacune de Wireshark, mais correspond à des valeurs fictives de type GREASE —<i lang="en">Generate Random Extensions And Sustain Extensibility</i>— dont le but est de stresser en permanence les implémentations TLS côté serveur pour voir si elles résistent a des données inattendues, ce système n'est qu'un brouillon à l'heure actuelle, voir <a href="https://tools.ietf.org/html/draft-ietf-tls-grease-00" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">draft-ietf-tls-grease</i></a>.</p> <h2 class="spip">ChaCha20-Poly1305 (2016, <a href="https://tools.ietf.org/html/rfc7905" class="spip_out" hreflang="en" title="en" rel="external">RFC 7905</a>)</h2> <p>ChaCha20 est un nouvel algorithme de chiffrement par flux assez simple et rapide dérivé des travaux de Daniel J. Bernstein. Comme il est particulièrement adapté aux processeurs ARM (ceux qu'on trouve communément dans les téléphones et autres tablettes), il s'est très vite retrouvé dans Chrome et sur les serveurs de Google. Firefox n'est pas en reste, de même pour Safari depuis macOS High Sierra, mais il faut OpenSSL 1.1.0 ou une version récente de LibreSSL pour en disposer côté serveur.</p> <h2 class="spip">EdDSA —<i lang="en">Edwards-curve Digital Signature Algorithm</i>— (2017, <a href="https://tools.ietf.org/html/rfc8032" class="spip_out" hreflang="en" title="en" rel="external">RFC 8032</a>)</h2> <p>EdDSA est un algorithme de signature que l'on doit à… Daniel J. Bernstein et son équipe, il est relativement similaire à ECDSA mais est plus rapide et fait exclusivement usage des courbes Ed25519 et Ed448.</p> <h2 class="spip">TLS 1.3 (2018, <a href="https://tools.ietf.org/html/rfc8446" class="spip_out" rel="external">RFC 8446</a>)</h2> <p>TLS 1.3 est une évolution très importante, elle apporte :</p> <ul class="spip" role="list"><li> une vitesse accrue (en accélérant la négociation en réduisant les allers-retours entre le client et le serveur) ;</li><li> une sécurité renforcée (en désactivant ou améliorant tout ce qui pouvait être abusé dans TLS 1.2 et en incluant de nouveaux algorithmes).</li></ul> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH452/https-sslv3-tls1-16a2ebbf-c7a4b.png?1763128933' alt="Processus complet d'établissement de la liaison sécurisée sous TLS 1.2" width='500' height='452' /></p> <p>Le processus complet d'établissement de la liaison sécurisée ressemble le plus souvent à ces deux vagues d'aller-retour avec TLS 1.2.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH390/https-sslv3-tls1-2f22a650-67e86.png?1763128933' alt="Processus complet d'établissement de la liaison sécurisée sous TLS 1.3" width='500' height='390' /></p> <p>Avec TLS 1.3 l'ordre change, des anticipations ont lieu pour réduire les échanges au minimum, comme le client à encore la main après le « <i lang="en">Finished</i> » il peut transmettre une requête HTTP GET dans la foulée, réduisant en pratique l'échange complet à un seul aller-retour (1 RTT), ce qui devrait produire un gain conséquent lorsque le client et le serveur sont très éloignés ou lorsque le client passe par un réseau de communication mobile, la latence étant dans ces deux cas importante.</p> <p>Il est à noter que le mécanisme de reprise de session a également été complètement remanié pour être plus rapide. L'implication de Google dans le développement et la promotion de HTTP/2 et TLS 1.3 et la large diffusion de HTTPS est considérable. Il n'est donc pas impossible qu'à l'avenir ils cherchent à accélérer l'adoption de TLS 1.3 en lui donnant un petit coup de pouce au niveau du classement des résultats de recherche, pour l'instant il n'y a rien de tel mais « plus sûr et plus rapide » est un bon facteur de différentiation qui peut être associé à TLS 1.3.</p> <p>TLS 1.3 a la particularité d'être la première version à largement s'affranchir des recommandations du NIST et de ce fait d'une éventuelle influence de la NSA (dont certaines pratiques visant à <a href="https://www.scientificamerican.com/article/nsa-nist-encryption-scandal/" class="spip_out" hreflang="en" title="en" rel="external">affaiblir les systèmes cryptographiques</a> ont été mises en lumière). Cela se traduit par l'adoption d'algorithmes dérivés des travaux de Daniel J. Bernstein (x25519, EdDSA, ChaCha20…), de ce fait on pourra à l'avenir basculer du tout NIST vers du tout DJB. Il est toujours possible d'utiliser les courbes NIST, ECDSA et AES avec TLS 1.3, mais il existe désormais une alternative pour chacun.</p> <p>Par ailleurs un sacré coup de balai a été donné dans les vieilles suites cryptographiques, le mécanisme d'échange de clé le plus simple (celui chiffrant le secret partagé avec la clé RSA publique du serveur et qui n'offrait donc pas de confidentialité persistante) n'est plus utilisable, le mode CBC disparait de même que les vieux algorithmes de chiffrement comme Triple DES. L'élimination de tout ce qui n'a pas fait preuve de robustesse contribue à rendre TLS 1.3 sûr par défaut (contrairement à TLS 1.2 qui restait tourné vers le passé) et simplifie grandement sa configuration. Le seul point sensible, a priori, est la possibilité de faire du 0 RTT mais qui ne devrait pas être activé par défaut.</p> <h2 class="spip">Mettre fin aux erreurs du passés</h2> <p>Le fait que l'on trouve encore autant de serveurs configurés avec une rétrocompatibilité bien trop étendue ou des suites cryptographiques dépassées a probablement plusieurs origines, configurer SSL/TLS n'a pas toujours été simple et clairement documenté (encore moins en français) et, une fois que cela fonctionne (les clients arrivent à se connecter), il peut être tentant de ne plus y toucher pendant quelques années… c'était d'autant plus facile lorsqu'il existait des certificats valables quatre ou même cinq ans. Les outils comme <a href="https://www.ssllabs.com/ssltest/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">SSL Server Test</i></a> de <i lang="en">SSL Labs</i> ou le redoutable <a href="https://tls.imirhil.fr/" class="spip_out" rel="external">CryptCheck</a> d'Aeris qui attribuent des notes et proposent des améliorations ou <a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/" class="spip_out" hreflang="en" title="en" rel="external">le générateur de configuration de Mozilla</a> qui s'efforce de simplifier la configuration de différents serveurs sont encore trop méconnus.</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH124/https-sslv3-tls1-9601b68b-8f3f3.png?1763128933' alt="générateur de configuration de Mozilla" width='500' height='124' /></p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH151/https-sslv3-tls1-039b7d78-2f759.png?1763128934' alt="Notes SSL Labs" width='500' height='151' /></p> <p class="remarque_important">Le système de notation de <i lang="en">SSL Labs</i> évolue régulièrement pour s'adapter aux nouvelles failles ou bonnes pratiques. Le A obtenu aujourd'hui pourrait fort bien ne plus être qu'un B dans quelques mois.</p> <p> En se fixant pour règle de n'utiliser que deux ou trois configurations TLS types (les configurations « moderne » et « intermédiaire » proposées par Mozilla sont un bon début), il est bien plus simple de s'assurer régulièrement que tous les sites que l'on contrôle restent dans les clous.</p> <p>La sécurité informatique est un processus qui implique de remettre l'ouvrage sur le métier fréquemment et d'assurer un minimum de veille, sur ce sujet je ne peux que conseiller de s'abonner à la lettre mensuelle « <a href="https://www.feistyduck.com/bulletproof-tls-newsletter/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">Bulletproof TLS Newsletter</i></a> » compilée par l'éditeur du livre qui fait office de référence dans le domaine : « <a href="https://www.feistyduck.com/books/bulletproof-ssl-and-tls/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">Bulletproof SSL and TLS</i></a> » d'Ivan Ristić.</p> <p>Seuls des électrochocs comme <i lang="en">BEAST, POODLE</i> ou <a href="https://fr.wikipedia.org/wiki/Heartbleed" class="spip_out" rel="external"><i lang="en">Heartbleed</i></a> et certaines des révélations d'Edward Snowden ont eu pour effet d'accélérer l'adoption de technologies plus récentes. Le fait que la crypto sur le web n'évolue qu'en réaction à des incidents majeurs est plutôt inquiétant, on est loin d'une situation d'amélioration continue.</p> <p>Le lancement de TLS 1.3 se fait dans un contexte totalement différent de celui de TLS 1.2, car TLS 1.3 a vocation à accompagner le passage au tout HTTPS lié aux craintes de piratages et de collectes massives d'informations sur le réseau. Cette nouvelle version est de plus soutenue par des acteurs de tout premier plan (des éditeurs de navigateurs et des opérateurs de CDN —<i lang="en">Content Delivery Network</i>—) qui ont produit le code nécessaire pour tester les versions préliminaires, ce qui promet une adoption très rapide par quelques acteurs qui génèrent un trafic conséquent.</p> <p>Il faudra cependant de longues années avant que TLS 1.3 ne devienne la version la plus répandue sur l'ensemble des serveurs web (il faudra entre autres attendre une large diffusion d'OpenSSL 1.1.1 disponible depuis septembre 2018 et qui dispose d'un support à long terme). Il est cependant possible de s'inspirer des recommandations et des changements qui accompagnent TLS 1.3 pour mieux configurer TLS 1.2, se qui se traduit souvent par la désactivation de suites cryptographiques qui datent de SSLv3 et TLS 1.0 et un peu d'audace pour adopter plus de cryptographie basée sur les courbes elliptiques, y compris dans les certificats.</p></div> <hr /> <div class='rss_notes'><div id="nb2-1"> <p><span class="spip_note_ref">[<a href="#nh2-1" class="spip_note" title="Notes 2-1" rev="appendix">1</a>] </span>Écrire le code informatique qui gère la cryptographie est une affaire de spécialistes, de ce fait les logiciels qui en ont l'usage (y compris les clients et les serveurs web) utilisent des bibliothèques spécialisées comme : OpenSSL (souvent utilisé par Apache via mod_ssl), LibreSSL (<i lang="en">fork</i> d'OpenSSL par l'équipe d'OpenBSD, facilement utilisable avec Nginx), BoringSSL (fork d'OpenSSL par Google se trouve dans Chrome et sur les serveurs de Google), <i lang="en">Network Security Services</i> / NSS (de Netscape puis Mozilla se trouve dans Firefox, peut être utilisé par Apache via mod_nss), <i lang="en">Secure Channel</i> / <i lang="en">SChannel</i> (de Microsoft, se trouve dans Windows et est utilisé par IE/Edge et IIS) ou encore <i lang="en">Secure Transport</i> (d'Apple, se trouve dans macOS et iOS et est utilisé par Safari). Ceci entraîne parfois des imprécisions, c'est notamment le cas avec Internet Explorer pour lequel il faudrait distinguer IE 8 sur XP d'IE 8 sur Vista car les versions de <i lang="en">Secure Channel</i> qui équipent ces deux systèmes n'ont pas exactement les mêmes capacités.</p> </div></div> SubResource Integrity https://openweb.eu.org/articles/subresource-integrity https://openweb.eu.org/articles/subresource-integrity 2017年01月20日T07:55:55Z text/html fr Nicolas Hoffmann Expert Débutant Sécurité Qualité <p>Le Web devient une plateforme de plus en plus complète, et sa globalisation ou certains aspects de sa distribution (notamment via des CDNs) posent de nouvelles questions de sécurité. Qu'à cela ne tienne, de nouvelles spécifications offrent de nouvelles réponses à ces questions. Celle qui va être présentée dans cet article se nomme SubResource Integrity. <br class='autobr' /> Introduction <br class='autobr' /> Utiliser un CDN pour distribuer des contenus est dans certains cas une très bonne pratique, cela permet : de mutualiser (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/debutant" rel="tag">Débutant</a>, <a href="https://openweb.eu.org/securite" rel="tag">Sécurité</a>, <a href="https://openweb.eu.org/qualite" rel="tag">Qualité</a> <div class='rss_chapo'><p>Le Web devient une plateforme de plus en plus complète, et sa globalisation ou certains aspects de sa distribution (notamment via des <abbr title="Content Delivery Network" lang="en">CDN</abbr>s) posent de nouvelles questions de sécurité. Qu'à cela ne tienne, de nouvelles spécifications offrent de nouvelles réponses à ces questions. Celle qui va être présentée dans cet article se nomme <em lang="en">SubResource Integrity</em>.</p></div> <div class='rss_texte'><h2>Introduction</h2> <p>Utiliser un <abbr title="Content Delivery Network" lang="en">CDN</abbr> pour distribuer des contenus est dans certains cas une très bonne pratique, cela permet :</p> <ul class="spip" role="list"><li> de mutualiser des ressources utilisées sur plusieurs sites ;</li><li> de permettre de les distribuer « au plus près » des visiteurs de vos sites ;</li><li> et également d'économiser de la bande passante pour tous les sites concernés.</li></ul> <p>Toutefois, cela comporte un risque. Si un attaquant prenait le contrôle du <abbr title="Content Delivery Network" lang="en">CDN</abbr> et en profitait pour insérer du code malveillant dans certaines bibliothèques… instantanément, des centaines voire des milliers de sites pourraient :</p> <ul class="spip" role="list"><li> être soit eux-mêmes attaqués par ce code malveillant ;</li><li> ou contribuer malgré eux à « infecter » leurs visiteurs.</li></ul> <p>Certaines bibliothèques ou <i lang="en">frameworks</i> sont massivement utilisées sur les sites web<span class="spip_note_ref"> [<a href="#nb2-1" class="spip_note" rel="appendix" title="Voir par exemple le défaçage du site de jQuery en 2014." id="nh2-1">1</a>]</span>, ce risque est donc bien réel : la question de la confiance en un <abbr title="Content Delivery Network" lang="en">CDN</abbr> externe est légitime<span class="spip_note_ref"> [<a href="#nb2-2" class="spip_note" rel="appendix" title="Imaginez simplement votre site mis sur de nombreuses listes noires et le (…)" id="nh2-2">2</a>]</span>.</p> <p>Ce risque peut toutefois être bien atténué grâce à une spécification du <abbr title="World Wide Web Consortium" lang>W3c</abbr>.</p> <h2><i lang="en">SubResource Integrity</i></h2> <p>C'est là qu'entre en jeu <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr>, pour <i lang="en">SubResource Integrity</i>, en bon français le « <em>contrôle d'intégrité des sous-ressources</em> ». L'idée – comme son nom l'indique – est de vérifier l'intégrité de ressources, et ce, qu'elles soient sur un <abbr title="Content Delivery Network" lang="en">CDN</abbr> ou ailleurs. L'objectif est de veiller à ce qu'aucun tiers n'injecte de contenu ou n'effectue aucune modification sur les ressources en question.</p> <p>Historiquement, les discussions sur <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> ont commencé début 2014, <a href="https://www.w3.org/TR/2015/WD-SRI-20151006/" class="spip_out" rel="external">le premier brouillon public de travail</a> est sorti le 6 octobre 2015, et <a href="https://www.w3.org/TR/SRI/" class="spip_out" rel="external">la spécification</a> est devenue une recommandation officielle du <abbr title="World Wide Web Consortium" lang="en">W3c</abbr> le 23 juin 2016.</p> <p>Le concept de vérifier l'intégrité de ressources n'est vraiment pas nouveau dans le milieu de l'informatique, les personnes habituées des téléchargements des distributions Linux voient depuis très longtemps ce genre d'informations lors d'<a href="http://doc.ubuntu-fr.org/tutoriel/comment_verifier_l_integrite_de_son_image_cd" class="spip_out" rel="external">un téléchargement d'une image <abbr title="International Organization for Standardization" lang="en">ISO</abbr></a> :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH94/sha256-ubuntu-d600412f-693ee.png?1763128934' alt="Intégrité d'une image ISO de la distribution Ubuntu" width='500' height='94' /></p> <p>Voyons donc comment mettre cela en œuvre maintenant sur nos sites.</p> <h3>Mise en œuvre de <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr></h3> <p>Mettre en place <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> est très simple : il suffit d'indiquer un attribut <code class='spip_code spip_code_inline' dir='ltr'>integrity</code> sur les balises <code class='spip_code spip_code_inline' dir='ltr'>script</code> et/ou <code class='spip_code spip_code_inline' dir='ltr'>link</code> – les seules supportées pour le moment – qui contiendra la valeur de contrôle d'intégrité du fichier (via une « fonction de hachage cryptographique », que nous appellerons un <i lang="en">hash</i> pour simplifier).</p> <p>Cette valeur commence par au moins une chaîne (il peut y avoir plusieurs valeurs d'intégrité spécifiées, séparées par des espaces), chaque chaîne comprenant :</p> <ul class="spip" role="list"><li> un préfixe indiquant l'algorithme utilisé (actuellement, les préfixes autorisés sont <code class='spip_code spip_code_inline' dir='ltr'>sha256</code>, <code class='spip_code spip_code_inline' dir='ltr'>sha384</code> et <code class='spip_code spip_code_inline' dir='ltr'>sha512</code>) ;</li><li> suivi d'un tiret…</li><li> …et se terminant par le <i lang="en">hash</i> proprement dit (encodé en base64).</li></ul> <p>Par exemple, cela nous donnerait :</p> <pre><code>integrity="sha384-yC7kyQdHbdC5s22r6nKzQXwcHKCLKBeg/XRG6mPMTyAUyT8f3htNhtQdFQnhBld5"</code></pre> <p>et cela s'intègrerait donc ainsi :</p> <pre><code><script src="un-script.js" integrity="sha384-yC7kyQdHbdC5s22r6nKzQXwcHKCLKBeg/XRG6mPMTyAUyT8f3htNhtQdFQnhBld5"></script></code></pre> <p>Cette valeur peut se calculer de plusieurs manières. Soit à la ligne de commande :</p> <pre><code>cat FILENAME.js | openssl dgst -sha384 -binary | openssl enc -base64 -A</code></pre> <p>Ou par exemple en <abbr title="PHP Hypertext Preprocessor" lang="en">PHP</abbr> en supposant que <code class='spip_code spip_code_inline' dir='ltr'>$input</code> soit le contenu du fichier :</p> <pre><code>echo base64_encode(hash('sha384', $input, true));</code></pre> <p>Note : pour calculer l'intégrité avec d'autres langages, <a href="https://tenzer.dk/generating-subresource-integrity-checksums/" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Generating Subresource Integrity Checksums</span></a> liste quelques exemples. Des outils permettent également de le calculer comme <a href="https://srihash.org/" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> hash</a> ou de tester leur présence, comme <a href="https://sritest.io/" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> test</a>, <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a> ou encore <a href="https://www.hardenize.com/" class="spip_out" hreflang="en" title="en" rel="external">Hardenize</a>.</p> <p>Note : si vous êtes familier de <a href='https://openweb.eu.org/articles/content-security-policy' class="spip_in"><i lang="en">Content Security Policy</i></a>, c'est sensiblement le même principe pour les <i lang="en">hash</i>.</p> <h3>Exemples simples en pratique</h3> <p>Voici deux exemples volontairement très simples :</p> <ul class="spip" role="list"><li> <a href="http://codepen.io/nico3333fr/pen/OXYWmm" class="spip_out" rel="external">Un test correct de contrôle d'intégrité d'une feuille de style</a></li><li> <a href="http://codepen.io/nico3333fr/pen/QERdvQ" class="spip_out" rel="external">le même test incorrect</a></li></ul> <p>En détail, voila ce qu'il s'est passé :</p> <ul class="spip" role="list"><li> le navigateur télécharge les ressources ;</li><li> il détecte l'utilisation de <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> sur la feuille de style ;</li><li> il calcule donc l'intégrité du fichier en question, et la compare aux valeurs proposées dans les deux exemples :</li><li> dans le premier cas, <strong>la valeur correspond, la feuille de styles est appliquée</strong>…</li><li> …et dans le second <strong>la valeur ne correspond pas, la feuille de style est purement et simplement ignorée</strong>.</li></ul><h3>Quelques exemples de bibliothèques proposant <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr></h3> <p>Si vous utilisez par exemple <a href="http://getbootstrap.com/getting-started/#download" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Bootstrap</span> via un <abbr title="Content Delivery Network" lang="en">CDN</abbr></a>, vous utilisez peut-être <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> sans même le savoir :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH296/sri-boutestrappe-3a2238c7-bbe67.png?1763128934' alt="Intégration de Bootstrap via un CDN, avec SRI" width='500' height='296' /></p> <p>JQuery propose aussi <a href="https://code.jquery.com/" class="spip_out" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> sur son <abbr title="Content Delivery Network" lang="en">CDN</abbr></a> :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH139/sri-jquery-b05261a0-de704.png?1763128934' alt="Intégration de jQuery via un CDN, avec SRI" width='500' height='139' /></p> <p>Vous noterez sur ces exemples l'utilisation de l'attribut <code class='spip_code spip_code_inline' dir='ltr'>crossorigin="anonymous"</code>. Cet attribut permet d'indiquer que les requêtes <abbr title="Cross-Origin Resource Sharing" lang="en">CORS</abbr> pour cet élément auront la balise de certificat vide<span class="spip_note_ref"> [<a href="#nb2-3" class="spip_note" rel="appendix" title="Vous pouvez lire à ce sujet Attributs de réglage du CORS." id="nh2-3">3</a>]</span>. De son côté, le <abbr title="Content Delivery Network" lang="en">CDN</abbr> pourra indiquer avec un en-tête <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> <code class='spip_code spip_code_inline' dir='ltr'>Access-Control-Allow-Origin: *</code> que la ressource peut être accédée de n'importe quel domaine de manière croisée (<i lang="en">cross-site</i>).</p> <h2>Support</h2> <p>Au moment de la mise à jour de cet article (soit le 11 Janvier 2018), le <a href="https://caniuse.com/#feat=subresource-integrity" class="spip_out" rel="external">support de <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> selon « <i lang="en">Can I use</i> »</a> est le suivant :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH188/support-sri-cani-28a09115-9381e.png?1763128934' alt="Support de SRI sur Can I Use" width='500' height='188' /></p> <p>Chrome, Opera, Safari et Firefox le supportent pleinement, cela arrive dans la prochaine version d'Edge et certains Webkits sont en train de le prendre en considération (sous iOS cela peut être activé, sans toutefois l'être par défaut). Toujours selon <i lang="en">Can I use</i>, <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> est donc supporté par environ 65% du parc des navigateurs, et son emploi ne gênera pas les navigateurs qui ne le supportent pas.</p> <p>Il n'y a donc <strong>aucun souci pour le déployer massivement</strong>.</p> <h2>Avenir de <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr></h2> <p>Comme indiqué dans <a href="https://www.w3.org/TR/SRI/#verification-of-html-document-subresources" class="spip_out" rel="external">la spécification</a> :</p> <blockquote lang="en">A future revision of this specification is likely to include integrity support for all possible subresources, i.e., <code class='spip_code spip_code_inline' dir='ltr'>a</code>, <code class='spip_code spip_code_inline' dir='ltr'>audio</code>, <code class='spip_code spip_code_inline' dir='ltr'>embed</code>, <code class='spip_code spip_code_inline' dir='ltr'>iframe</code>, <code class='spip_code spip_code_inline' dir='ltr'>img</code>, <code class='spip_code spip_code_inline' dir='ltr'>link</code>, <code class='spip_code spip_code_inline' dir='ltr'>object</code>, <code class='spip_code spip_code_inline' dir='ltr'>script</code>, <code class='spip_code spip_code_inline' dir='ltr'>source</code>, <code class='spip_code spip_code_inline' dir='ltr'>track</code>, and <code class='spip_code spip_code_inline' dir='ltr'>video</code> elements.</blockquote> <p>Traduit en français, cela donne :</p> <blockquote>Une prochaine révision de cette spécification est susceptible d'inclure le support du contrôle d'intégrité pour toutes les sous-ressources possibles, c'est-à-dire pour les éléments <code class='spip_code spip_code_inline' dir='ltr'>a</code>, <code class='spip_code spip_code_inline' dir='ltr'>audio</code>, <code class='spip_code spip_code_inline' dir='ltr'>embed</code>, <code class='spip_code spip_code_inline' dir='ltr'>iframe</code>, <code class='spip_code spip_code_inline' dir='ltr'>img</code>, <code class='spip_code spip_code_inline' dir='ltr'>link</code>, <code class='spip_code spip_code_inline' dir='ltr'>object</code>, <code class='spip_code spip_code_inline' dir='ltr'>script</code>, <code class='spip_code spip_code_inline' dir='ltr'>source</code>, <code class='spip_code spip_code_inline' dir='ltr'>track</code>, et <code class='spip_code spip_code_inline' dir='ltr'>video</code>.</blockquote> <p>Ajoutons à cela que <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> va bientôt proposer dans son niveau 3 de <strong>définir explicitement votre politique de sécurité concernant les ressources</strong>, par exemple, il sera possible d'indiquer au navigateur :</p> <pre><code>Content-Security-Policy: require-sri-for script style; </code></pre> <p>Autrement dit, il sera possible de dire au navigateur de <strong>refuser l'exécution de scripts ou de styles qui n'ont pas de contrôle d'intégrité des ressources</strong> ! Même si l'idée de <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> est à la base destinée aux contenus chargés via <abbr title="Content Delivery Network" lang="en">CDN</abbr>s, pourquoi ne pas étendre cette idée ? Une fois la page envoyée chez l'agent utilisateur, on ne contrôle pas nécessairement ce qu'il peut s'y passer<span class="spip_note_ref"> [<a href="#nb2-4" class="spip_note" rel="appendix" title="Lire à ce sujet More proof we don't control our web pages." id="nh2-4">4</a>]</span>, dans des cas avancés de besoins de sécurité, <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> et <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> pourraient être utilisés conjointement pour garantir que ce qui va s'exécuter chez l'agent utilisateur n'ait pas été modifié.</p> <p>Bien entendu, cela suppose que la page en question fonctionne en <strong>amélioration progressive</strong> avec JavaScript désactivé, et que le processus de <i lang="en">hash</i> soit exécuté de manière indépendante de l'affichage de la page… à bon entendeur !</p> <h2>Conclusion</h2> <p><i lang="en">SubResource Integrity</i> apporte une sécurité non négligeable, ce n'est pas un hasard si des outils comme <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a> ou <a href="https://www.hardenize.com/" class="spip_out" hreflang="en" title="en" rel="external">Hardenize</a> recommandent son utilisation. Comme les navigateurs ne le supportant pas n'en auront cure, et que bon nombre de projets le proposent sur divers <abbr title="Content Delivery Network" lang="en">CDN</abbr>s, vous n'avez plus d'excuse pour ne pas l'adopter, l'utiliser et/ou même le déployer vous-mêmes.</p> <h2>Ressources, compléments</h2><ul class="spip" role="list"><li> <a href="https://www.w3.org/TR/SRI/" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> Specification</a></li><li> <a href="https://github.com/w3c/webappsec-subresource-integrity/" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr>, spécification sur Github</a></li><li> <a href="https://developer.mozilla.org/fr/docs/Web/Security/Subresource_Integrity" class="spip_out" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> sur le <abbr title="Mozilla Developer Network" lang="en" xml:lang="en">MDN</abbr></a></li><li> <a href="https://www.youtube.com/watch?v=PYBMnCq2kqs" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Video: Web Application Security with Subresource Integrity</span></a></li><li> <a href="https://www.youtube.com/watch?v=JOcpIF047xs" class="spip_out" hreflang="en" title="en" rel="external"><span lang="en">Video: Frederik Braun – Using a <abbr title="Content Delivery Network" lang="en">CDN</abbr> that can not <abbr title="Cross Site Scripting" lang="en">XSS</abbr> you – with Subresource Integrity</span></a></li><li> <a href="https://sritest.io" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> Test</a></li><li> <a href="https://srihash.org/" class="spip_out" hreflang="en" title="en" rel="external"><abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr> hash</a></li><li> <a href="https://github.com/w3c/webappsec-subresource-integrity/wiki/Links" class="spip_out" hreflang="en" title="en" rel="external">Autres ressources sur <abbr title="SubResource Integrity" lang="en" xml:lang="en">SRI</abbr></a></li></ul></div> <hr /> <div class='rss_notes'><div id="nb2-1"> <p><span class="spip_note_ref">[<a href="#nh2-1" class="spip_note" title="Notes 2-1" rev="appendix">1</a>] </span>Voir par exemple <a href="http://www.securityweek.com/jquery-confirms-website-hacked-again" class="spip_out" hreflang="en" title="en" rel="external">le défaçage du site de jQuery en 2014</a>.</p> </div><div id="nb2-2"> <p><span class="spip_note_ref">[<a href="#nh2-2" class="spip_note" title="Notes 2-2" rev="appendix">2</a>] </span>Imaginez simplement votre site mis sur de nombreuses listes noires et le temps (et donc le coût) pour l'en désinscrire…</p> </div><div id="nb2-3"> <p><span class="spip_note_ref">[<a href="#nh2-3" class="spip_note" title="Notes 2-3" rev="appendix">3</a>] </span>Vous pouvez lire à ce sujet <a href="https://developer.mozilla.org/fr/docs/Web/HTML/Reglages_des_attributs_CORS" class="spip_out" rel="external">Attributs de réglage du <abbr title="Cross-Origin Resource Sharing" lang="en">CORS</abbr></a>.</p> </div><div id="nb2-4"> <p><span class="spip_note_ref">[<a href="#nh2-4" class="spip_note" title="Notes 2-4" rev="appendix">4</a>] </span>Lire à ce sujet <a href="https://www.aaron-gustafson.com/notebook/more-proof-we-dont-control-our-web-pages/" class="spip_out" hreflang="en" title="en" rel="external"><i lang="en">More proof we don't control our web pages</i></a>.</p> </div></div> Content Security Policy https://openweb.eu.org/articles/content-security-policy https://openweb.eu.org/articles/content-security-policy 2016年12月06日T08:14:58Z text/html fr Nicolas Hoffmann Expert Gourou Sécurité <p>De nombreuses initiatives tendent à amener plus de sécurité sur les sites Internet. La généralisation de HTTPS avec des initiatives comme Let's Encrypt, la restriction de l'utilisation de certaines API avec HTTPS, de nombreux outils permettant de tester et d'améliorer la sécurité des sites, etc. <br class='autobr' /> Parmi ce vaste effort de sécurisation des sites, une technologie offre de nouvelles possibilités surprenantes sur le front-end. Son petit nom est « Content Security Policy ». <br class='autobr' /> Introduction (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/gourou" rel="tag">Gourou</a>, <a href="https://openweb.eu.org/securite" rel="tag">Sécurité</a> <div class='rss_chapo'><p>De nombreuses initiatives tendent à amener plus de sécurité sur les sites Internet. La généralisation de <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> avec des initiatives comme <em lang="en" xml:lang="en">Let's Encrypt</em>, la restriction de l'utilisation de certaines <abbr title="Application Programming Interface" lang="en" xml:lang="en">API</abbr> avec <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>, de nombreux outils permettant de tester et d'améliorer la sécurité des sites, etc.</p> <p>Parmi ce vaste effort de sécurisation des sites, une technologie offre de nouvelles possibilités surprenantes sur le <em lang="en" xml:lang="en">front-end</em>. Son petit nom est « <em lang="en" xml:lang="en">Content Security Policy</em> ».</p></div> <div class='rss_texte'><h2>Introduction</h2> <p>Actuellement, quand un navigateur reçoit des contenus (images, <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>, JavaScript, etc.), son travail est de rendre la page le plus vite et le mieux possible. Hormis quelques mécanismes de sécurité qui seront abordés ici-même dans un futur proche, à aucun moment, ce dernier ne se pose ce genre de questions :</p> <ul class="spip" role="list"><li> Est-ce que les concepteurs du site considèrent tel élément comme légitime ?</li><li> Dois-je bien exécuter ou prendre en compte tel élément ?</li></ul> <p>Ajoutons à cela que le <em lang="en" xml:lang="en">front-end</em> est souvent considéré comme un milieu extrêmement hostile :</p> <ul class="spip" role="list"><li> il est de bon usage dans le <em lang="en" xml:lang="en">back-end</em> de <strong>ne jamais faire confiance</strong> à ce qui peut venir du <em lang="en" xml:lang="en">front-end</em> (formulaire, etc.) ;</li><li> l'agent utilisateur a toujours <strong>le dernier mot</strong> vis-à-vis d'un site qu'il consulte (styles utilisateurs, etc.), les concepteurs d'un site n'ont que peu de garanties de ce qu'il sera fait des pages qu'ils envoient ;</li><li> et une fois la page envoyée chez l'agent utilisateur, on ne contrôle pas nécessairement ce qu'il peut s'y passer<span class="spip_note_ref"> [<a href="#nb3-1" class="spip_note" rel="appendix" title="Lire à ce sujet More proof we don't control our web pages." id="nh3-1">1</a>]</span>.</li></ul> <p>Et pourtant, il existe bien des moyens de sécuriser certains aspects du <em lang="en" xml:lang="en">front-end</em>, et notamment via une technologie nommée <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>.</p> <h2>Des directives de sécurité <em lang="en" xml:lang="en">front-end</em></h2> <p><abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> signifie « <em lang="en" xml:lang="en">Content Security Policy</em> », en bon français « Politique de Sécurité des Contenus ». L'idée est simple : en envoyant un en-tête <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr>, des directives de sécurité sont données au navigateur, et ce dernier les appliquera à la lettre. En clair, ces directives vont dire au navigateur ce qu'il est autorisé à exécuter… ou non.</p> <p>Historiquement, <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> a été pensé pour <strong>réduire la surface d'attaque</strong> sur le <em lang="en" xml:lang="en">front-end</em> vis-à-vis des attaques dites de Cross-Site-Scripting (en anglais : <em lang="en" xml:lang="en">mitigate <abbr title="Cross Site Scripting" lang="en" xml:lang="en">XSS</abbr></em>). En pratique, <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> permet d'aller beaucoup plus loin et offre de nombreux outils.</p> <h2>Fonctionnement et possibilités</h2><h3>Principes</h3> <p>Le principe est très simple : un en-tête <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> est envoyé au navigateur contenant des directives de sécurité <em lang="en" xml:lang="en">front-end</em>. En voici un exemple via <abbr title="PHP Hypertext Preprocessor" xml:lang="en" lang="en">PHP</abbr> :</p> <pre><code>header("Content-Security-Policy: <ici vos directives>");</code></pre> <p>Voici quelques exemples de directives :</p> <pre><code>default-src 'self' ;</code></pre> <p><code class='spip_code spip_code_inline' dir='ltr'>default-src</code> sera la directive appliquée si aucune directive n'est définie pour un élément. Le mot-clé <code class='spip_code spip_code_inline' dir='ltr'>'self'</code> indique que tout ce qui sera sur le même <em>port</em>, même protocole et même nom de domaine sera autorisé.</p> <pre><code>script-src 'self' www.piwik.com ;</code></pre> <p>Dans cet exemple, la directive <code class='spip_code spip_code_inline' dir='ltr'>script-src</code> indique donc <code class='spip_code spip_code_inline' dir='ltr'>'self'</code>, et également que tous les fichiers JavaScript provenant de <code class='spip_code spip_code_inline' dir='ltr'>www.piwik.com</code> seront autorisés à s'exécuter.</p> <pre><code>img-src 'self' data: ;</code></pre> <p>Cette directive <code class='spip_code spip_code_inline' dir='ltr'>img-src</code> indique également <code class='spip_code spip_code_inline' dir='ltr'>'self'</code>, le mot-clé <code class='spip_code spip_code_inline' dir='ltr'>data:</code> autorise quant à lui les contenus dit embarqués (via data-uri).</p> <h3>Liste des directives</h3> <p><abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> niveau 1 permet de spécifier des directives pour les éléments suivants :</p> <ul class="spip" role="list"><li> <code class='spip_code spip_code_inline' dir='ltr'>script-src</code> : les sources autorisées pour les scripts <abbr lang="en" xml:lang="en" title="JavaScript">JS</abbr></li><li> <code class='spip_code spip_code_inline' dir='ltr'>styles-src</code> : les sources autorisées pour les styles <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr></li><li> <code class='spip_code spip_code_inline' dir='ltr'>img-src</code> : les sources autorisées pour les images</li><li> <code class='spip_code spip_code_inline' dir='ltr'>connect-src</code> : s'applique pour XMLHttpRequest (<abbr lang="en" xml:lang="en" title="Asynchronous JAvascript and XML">AJAX</abbr>), WebSocket ou EventSource</li><li> <code class='spip_code spip_code_inline' dir='ltr'>font-src</code> : les sources pour les <em lang="en" xml:lang="en">web fonts</em></li><li> <code class='spip_code spip_code_inline' dir='ltr'>object-src</code> : les sources des plug-ins (par exemple : <code class='spip_code spip_code_inline' dir='ltr'><object></code>, <code class='spip_code spip_code_inline' dir='ltr'><embed></code>, <code class='spip_code spip_code_inline' dir='ltr'><applet></code>)</li><li> <code class='spip_code spip_code_inline' dir='ltr'>media-src</code> : les sources pour les balises <code class='spip_code spip_code_inline' dir='ltr'><audio></code> et <code class='spip_code spip_code_inline' dir='ltr'><video></code></li><li> etc.</li></ul> <p><abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> niveau 2 ajoute de nouvelles directives :</p> <ul class="spip" role="list"><li> <code class='spip_code spip_code_inline' dir='ltr'>child-src</code> : les sources valides pour les <em lang="en">web workers</em> et les éléments comme <code class='spip_code spip_code_inline' dir='ltr'><frame></code> et <code class='spip_code spip_code_inline' dir='ltr'><iframe></code> (remplace <code class='spip_code spip_code_inline' dir='ltr'>frame-src</code> déprécié de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> niveau 1)</li><li> <code class='spip_code spip_code_inline' dir='ltr'>base-uri</code> : les sources valides pour l'élément <code class='spip_code spip_code_inline' dir='ltr'>base</code> qui indique l'adresse à utiliser pour recomposer toutes les adresses relatives contenues dans la page (<code class='spip_code spip_code_inline' dir='ltr'><base href="…"></code>)</li><li> <code class='spip_code spip_code_inline' dir='ltr'>form-action</code> : les sources autorisées utilisées dans l'attribut <code class='spip_code spip_code_inline' dir='ltr'>action</code> d'un formulaire</li><li> <code class='spip_code spip_code_inline' dir='ltr'>frame-ancestors</code> : les sources autorisées à embarquer la ressource dans <code class='spip_code spip_code_inline' dir='ltr'><frame></code>, <code class='spip_code spip_code_inline' dir='ltr'><iframe></code>, <code class='spip_code spip_code_inline' dir='ltr'><object></code>, <code class='spip_code spip_code_inline' dir='ltr'><embed></code> ou <code class='spip_code spip_code_inline' dir='ltr'><applet></code></li><li> <code class='spip_code spip_code_inline' dir='ltr'>upgrade-insecure-requests</code> : indique à l'agent utilisateur de réécrire l'<abbr title="Uniform Resource Locator" lang="en">URL</abbr> en changeant <abbr title="HyperText Transfer Protocol" lang="en">HTTP</abbr> en <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr> (pour les sites avec beaucoup d'anciennes <abbr title="Uniform Resource Locator" lang="en">URL</abbr>s qui ont besoin d'être réécrites).</li><li> etc.</li></ul> <p>Pour une meilleur rétro-compatibilité avec les directives dépréciées, il suffit de copier le contenu d'une directive dans la version dépréciée. Par exemple, il est possible de copier le contenu de <code class='spip_code spip_code_inline' dir='ltr'>child-src</code> et de le coller dans <code class='spip_code spip_code_inline' dir='ltr'>frame-src</code>.</p> <h3>Exemple</h3> <p>Voici <a href="https://rocssti.net/exemple-csp-codeurs-seine" class="spip_out" rel="external">un exemple</a> présenté lors de la conférence « Codeurs en Seine » de cette année, cette page contient des éléments indésirables. Sans <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>, voici le résultat :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH288/sans-csp-c38c2e15-cf3fd.jpg?1763128934' alt="exemple de page sans CSP (page défacée)" width='500' height='288' /></p> <p>Pas terrible. Envoyons des directives <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> au navigateur, voici un résumé <a href="https://openweb.eu.org/IMG/png/security-csp-exemple.png">des directives complètes</a>.</p> <pre><code>content-security-policy: default-src 'none' ; script-src 'self' www.google-analytics.com ; style-src 'self' ; img-src 'self' www.google-analytics.com data: ; font-src 'self'; frame-ancestors 'none' ; </code></pre> <p>Que va-t-il se passer ? Le navigateur les reçoit et va les appliquer à la lettre selon la règle suivante : <strong>tout ce qui n'est expressément autorisé dans les directives <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> sera interdit</strong>. Par interdit, comprenez : bloqué, non exécuté, non affiché.</p> <p>Point important : par défaut, le JavaScript en ligne n'est <strong>pas autorisé</strong>. Autrement dit, les balises <code class='spip_code spip_code_inline' dir='ltr'>script</code>, attributs <code class='spip_code spip_code_inline' dir='ltr'>onclick</code>, etc. dans le HTML ne seront pas autorisés. Cela peut se faire avec <code class='spip_code spip_code_inline' dir='ltr'>script-src 'unsafe-inline'</code> et via <code class='spip_code spip_code_inline' dir='ltr'>script-src 'unsafe-eval'</code>, toutefois, c'est déconseillé (n'oublions pas que le but de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est de limiter les failles <abbr title="Cross Site Scripting" lang="en" xml:lang="en">XSS</abbr>).</p> <p>Et il en va de même pour la fonction <code class='spip_code spip_code_inline' dir='ltr'>eval</code> de JavaScript, ainsi que pour les styles en ligne. Autrement dit, ces directives qui semblaient être gentilles sont en fait plutôt strictes et autorisent le minimum nécessaire.</p> <p>Le navigateur reçoit donc des éléments, les fichiers JavaScript/<abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> sur le même nom de domaine/port/protocole seront donc autorisés, et un script dont la provenance n'a pas été autorisée sera bloqué. Idem pour le JavaScript et les <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> en ligne.</p> <p>Le navigateur va indiquer dans la console les éléments bloqués et le pourquoi de ce blocage, exemple :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH226/notifs-csp-87e21980-38135.jpg?1763128934' alt="Notifications CSP dans la console du navigateur" width='500' height='226' /></p> <p>Et voici le résultat de la même page protégée par <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH309/avec-csp-452c1e9b-c3b52.jpg?1763128934' alt="exemple de la même page avec CSP (page normale)" width='500' height='309' /></p> <p>Mieux, n'est-ce pas ?</p> <p>Note : <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> ne « désinfectera » pas vos pages, il évitera juste l'exécution des contenus non autorisés.</p> <h2>Déployer <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr></h2> <p>Un premier conseil : <strong>ne foncez pas tête baissée</strong> pour déployer <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> sur un site en production en vous disant que cela sera facile. C'est probablement la meilleure façon si vous souhaitez… vous dégoûter de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>. Ne faites pas ainsi sur un site en production, vous avez de grandes chances d'y laisser des plumes, vous êtes prévenus !</p> <p>Comme vu précédemment, vous êtes entre des directives très précises et le navigateur, qui les appliquera de manière stricte et disciplinée. Le point faible sera donc très souvent… <strong>vous</strong> ! Il est très facile d'oublier une source de contenu, qu'un script a besoin de JavaScript en ligne pour fonctionner, etc. Et il n'est clairement pas dans la nature de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> d'être indulgent.</p> <p>Selon votre situation, cela peut être plus ou moins aisé, néanmoins il convient de prendre des précautions. Heureusement, plusieurs outils de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> permettent de s'y préparer sans risque.</p> <h3 lang="en">Report-URI</h3> <p>Les notifications envoyées dans la console du navigateur peuvent être envoyées sur une adresse, et donc traitées. Cela s'indique dans les directives via :</p> <pre><code>report-uri /csp-parser.php ;</code></pre> <p>Sur cette adresse, le navigateur enverra les notifications au format <abbr title="JavaScript Object Notation" lang="en">JSON</abbr>. Voici un exemple volontairement minimaliste de script en <abbr title="PHP Hypertext Preprocessor" xml:lang="en" lang="en">PHP</abbr> pouvant le traiter :</p> <pre><code>$data = file_get_contents('php://input'); if ($data = json_decode($data, true)) { $data = json_encode( $data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); mail(EMAIL, SUBJECT, $data); } </code></pre> <p>En clair :</p> <ul class="spip" role="list"><li> le script reçoit les données ;</li><li> il vérifie que le format est bien du <abbr title="JavaScript Object Notation" lang="en">JSON</abbr> ;</li><li> il aplatit les informations au format <abbr title="JavaScript Object Notation" lang="en">JSON</abbr> en texte…</li><li> …et envoie par mail ce texte.</li></ul> <p>Ce genre de script est parfait pour un développement avec peu de fréquentation, où <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est pris en compte depuis le début.</p> <p><strong>Important :</strong> attention sur une production beaucoup plus visitée ! Pour prendre un exemple, si une page génère 100 erreurs <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>, et que cette page est visitée 100 fois par jour, rien que cette page vous enverra 10 000 notifications par jour ! Pensez à filtrer sur votre adresse de report<span class="spip_note_ref"> [<a href="#nb3-2" class="spip_note" rel="appendix" title="Voir à ce sujet quelques exemples de scripts pour report-uri." id="nh3-2">2</a>]</span>, ou le cas échéant à utiliser un service dédié à cette tâche, comme <a href="https://report-uri.io/" class="spip_out" hreflang="en" title="en" rel="external">Report-URI</a>.</p> <h3 lang="en">Report-only</h3> <p>Comme vu précédemment, un des soucis de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est son côté binaire : on l'active… ou non. Une possibilité vient résoudre ce problème : <code class='spip_code spip_code_inline' dir='ltr'>Report-only</code>.</p> <p>Comme son nom l'indique, on va indiquer au navigateur de seulement rapporter les erreurs générées par les directives spécifiées, <strong>sans bloquer quoi que ce soit</strong> côté navigateur.</p> <pre><code>header("Content-Security-Policy-Report-Only: <vos directives>");</code></pre> <p>Cela permet de <strong>tester des directives sans danger</strong> : soit en cas de premier déploiement de directives <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>, soit dans le cadre d'un renforcement de vos directives. Si par exemple des directives fonctionnent en production et que l'on souhaite les rendre plus strictes, on peut garder les directives et tester les directives plus dures sans risquer de bloquer quoi que ce soit.</p> <p>En résumé, avec <em lang="en" xml:lang="en">Report-URI</em> et <em lang="en" xml:lang="en">Report-only</em>, vous pouvez <strong>tester des directives sans danger</strong>, et <strong>monitorer</strong> tout ce qu'il se passe d'un point de vue <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>.</p> <p>Dans notre exemple donné plus haut, il est donc tout à fait possible d'être prévenu de suite que quelque chose d'anormal se passe sur la page.</p> <h3><em lang="en" xml:lang="en">Hashes</em> et <em lang="en" xml:lang="en">Nonces</em></h3> <p>Souvent le problème qui se pose vient des scripts en ligne : l'idéal est de ne pas les autoriser, mais les aléas d'un projet peuvent le nécessiter. C'est là qu'entrent en scène les <em lang="en" xml:lang="en">hashes</em> et les <em lang="en" xml:lang="en">nonces</em>. Même si ces deux possibilités sont amenées par <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> niveau 2 (et donc pour le moment pas supportées partout), en voici une présentation rapide.</p> <h4><em lang="en" xml:lang="en">Hashes</em></h4> <p>Sans autoriser tous les scripts en ligne, il est possible d'en autoriser certains, via un contrôle sur leur intégrité (via une « fonction de hachage cryptographique », que nous appellerons un <em lang="en" xml:lang="en">hash</em> pour simplifier). En pratique, cela se précise dans les directives :</p> <pre><code>script-src 'sha256-d08VMHuG2SHhy9Tk5IX7cA6bYafas7GiX/Fo9/hzDsY=' ;</code></pre> <p>Ce calcul d'intégrité correspond à ce script : <code class='spip_code spip_code_inline' dir='ltr'><script>alert('bonjour le monde.');</script></code>. Il s'obtient ainsi : (exemple en <abbr title="PHP Hypertext Preprocessor" xml:lang="en" lang="en">PHP</abbr>)</p> <pre><code>echo base64_encode(hash('sha256', "alert('bonjour le monde.');", true)); // donne : d08VMHuG2SHhy9Tk5IX7cA6bYafas7GiX/Fo9/hzDsY= </code></pre> <p><strong>Attention :</strong> le moindre espace change le résultat du calcul !</p> <h4><em lang="en" xml:lang="en">Nonces</em></h4> <p><em lang="en" xml:lang="en">Nonce</em> signifie : <em lang="en" xml:lang="en">Number used Once</em> (« numéro utilisé une seule fois »). Encore une fois, cela se définit dans les directives :</p> <pre><code>script-src 'nonce-12345666789' ; </code></pre> <p>Et cela s'utilisera ainsi :</p> <pre><code><script nonce="12345666789">…</script></code></pre> <p>Cela revient à dire au navigateur de ne rien bloquer pour ce qui correspond à ce <em lang="en" xml:lang="en">nonce</em>.</p> <p>Attention : comme son nom l'indique, un <em lang="en" xml:lang="en">nonce</em> doit être <strong>unique</strong>, <strong>re-généré à chaque fois</strong>, et bien entendu doit être <strong>non trivial</strong> et <strong>non devinable</strong> !</p> <h2>Des spécifications plutôt bien stabilisées</h2> <p>Un point important à mentionner : <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> n'est pas une technologie qui fonctionne uniquement sur certains navigateurs en version alpha avec 5 <em lang="en" xml:lang="en">flags</em> à activer. <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> niveau 1 et 2 sont des <i lang="en" xml:lang="en">Candidate Recommendations</i> au <abbr title="World Wide Web Consortium" lang="en">W3c</abbr>, les travaux sur la standardisation de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> sont donc raisonnablement avancés.</p> <p>Côté support, <a href="http://caniuse.com/#feat=contentsecuritypolicy" class="spip_out" hreflang="en" title="en" rel="external">le support du niveau 1</a> est excellent, comme le confirme le site « <em lang="en" xml:lang="en">Can I Use</em> » :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH262/caniuse-csp-dd40cf6d-c82f7.jpg?1763128934' alt="Support de CSP niveau 1 selon Can I Use" width='500' height='262' /></p> <p>Le niveau 2 est plus récent, au moment de la mise à jour de cet article, <a href="http://caniuse.com/#feat=contentsecuritypolicy2" class="spip_out" hreflang="en" title="en" rel="external">le support en est plutôt bon sur les navigateurs récents</a> :</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH228/caniuse-csp2-201-98e7c56f-c50c8.jpg?1763128934' alt="Support de CSP niveau 2 selon Can I Use" width='500' height='228' /></p> <p>Quoi qu'il en soit, le niveau 1 est tout à fait utilisable en production, le 2 aussi peut être envisagé pour des navigateurs récents. Le seul défaut de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> consiste en de petits défauts d'implémentation chez les navigateurs : les soucis sont souvent des faux-positifs dans les notifications. On peut aussi noter que <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est parfois trop efficace : par exemple les <em>bookmarklets</em> peuvent être bloqués par les directives <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> d'un site, alors qu'ils ne devraient pas l'être. Les divers navigateurs travaillent activement à régler ces soucis.</p> <h3>Pourquoi utiliser <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> ?</h3> <p>Il ne vous aura pas échappé que de nombreuses initiatives incitent à amener plus de sécurité en standard sur les sites internet. <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> en est un maillon particulièrement intéressant, ce n'est pas un hasard si des outils comme <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a>, <a href="https://www.dareboost.com/" class="spip_out" rel="external">Dareboost</a>, <a href="https://www.hardenize.com/" class="spip_out" hreflang="en" title="en" rel="external">Hardenize</a>, <a href="https://securityheaders.io/" class="spip_out" hreflang="en" title="en" rel="external">Security headers</a>, etc. testent précisément son utilisation et vous incitent à le déployer.</p> <p>La priorité : <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est là avant tout <strong>pour la sécurité des utilisateurs</strong>. <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> aide à limiter les dégâts potentiels des failles de type <abbr title="Cross Site Scripting" lang="en" xml:lang="en">XSS</abbr>, et même plus largement sur les contenus que l'on peut qualifier d'indésirables. Un point important : toute la mécanique de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> qui a été décrite ici… est <strong>totalement transparente</strong> pour l'utilisateur. Vous naviguez probablement quotidiennement sur des sites qui utilisent <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> (Twitter, Github, Facebook, etc.), et vous ne vous en êtes probablement pas rendu compte avant de lire cette phrase.</p> <p>Ensuite, <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est <strong>un outil extrêmement puissant pour les concepteurs/gestionnaires de sites</strong>, c'est à ce titre qu'on le qualifie souvent « de couteau suisse du <em lang="en" xml:lang="en">front-end</em> »<span class="spip_note_ref"> [<a href="#nb3-3" class="spip_note" rel="appendix" title="Voir à ce sujet l'excellente présentation de Scott Helme sur CSP." id="nh3-3">3</a>]</span>. De par la nature de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>, pour faire fonctionner quelque chose sur votre <em lang="en" xml:lang="en">front-end</em>, vous <strong>devez</strong> savoir ce dont cela a besoin comme sources de contenus et comment cela va fonctionner (styles/JavaScript en ligne, fonction <code class='spip_code spip_code_inline' dir='ltr'>eval</code>, etc.)<span class="spip_note_ref"> [<a href="#nb3-4" class="spip_note" rel="appendix" title="Et cela va parfois vous surprendre lors de l'utilisation de scripts tiers…" id="nh3-4">4</a>]</span>.</p> <p>De facto, l'activation de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> vous invite à respecter de bonnes pratiques :</p> <ul class="spip" role="list"><li> éviter les fonctions posées à la va-vite en <em lang="en">inline</em>, qui seront déportées vers des fichiers externes ;</li><li> connaître le fonctionnement intrinsèque d'un script ou d'un plugin ;</li><li> maîtriser vos sources de contenus et pouvoir poser une politique stricte en la matière ;</li><li> etc.</li></ul> <p>Si vous appréciez le concept de l'orthogonalité abordé dans <a href='https://openweb.eu.org/articles/l-orthogonalite-en-css' class="spip_in">L'orthogonalité en <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr></a>, avec <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>, vous avez trouvé le meilleur allié pour le respecter !</p> <p>Ce principe est d'ailleurs évoqué en tant que bonne pratique Opquast : <a href="http://checklists.opquast.com/webperf/criteria/les-scripts-manipulent-des-classes-plutot-que-les-styles-en-ligne" class="spip_out" rel="external">les scripts manipulent des classes plutôt que les styles en ligne</a>.</p> <p>On peut même parler d'éco-conception : on ne s'autorise que le nécessaire, ce qui n'est pas un mal en soi. C'est extrêmement bien illustré par exemple dans Firefox si vous faites <kbd>Maj</kbd> + <kbd>F2</kbd> et si vous tapez <code class='spip_code spip_code_inline' dir='ltr'>security CSP</code>, on vous encourage à réduire la surface d'attaque autant que possible sur vos directives : (exemple sur Twitter)</p> <p><img src='https://openweb.eu.org/local/cache-vignettes/L500xH206/security-csp-twi-03aa2784-8f5e1.png?1763128934' alt="Affichage des directives CSP de Twitter sous Firefox" width='500' height='206' /></p> <p>De plus, constatant que le poids moyen des pages ne fait qu'augmenter ces dernières années, s'appliquer un peu de frugalité ne fera de mal à personne !</p> <h2>Le futur de <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr></h2> <p>En l'état actuel des choses, le niveau 1 est tout à fait utilisable en production. Le niveau 2 peut être plus délicat à déployer, du fait du support moins large de ses possibilités (seulement les navigateurs les plus récents).</p> <p>Les travaux ont commencé sur le niveau 3, qui devrait amener de nouvelles directives. Toutefois, comme ce niveau est actuellement à l'état de brouillon de travail, il n'est pas nécessaire d'aller plus avant. Si le sujet vous intéresse, vous pouvez consulter des ressources sur le sujet en bas de cet article.</p> <h2>Conclusion</h2> <p><abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr> est un outil absolument fantastique pour le <em lang="en" xml:lang="en">front-end</em> qui permet :</p> <ul class="spip" role="list"><li> de limiter les effets d'attaques <abbr title="Cross Site Scripting" lang="en" xml:lang="en">XSS</abbr> et de contenus indésirables ;</li><li> de servir de trousse à outils pour des opérations importantes (migration <abbr title="HyperText Transfer Protocol Secure" lang="en">HTTPS</abbr>, etc.) ;</li><li> d'organiser une maîtrise globale de votre <em lang="en" xml:lang="en">front-end</em> tout en servant de garde-fou pour des bonnes pratiques ;</li><li> mais en plus de surveiller et de monitorer ce qu'il se passe sur le <em lang="en" xml:lang="en">front-end</em>.</li></ul> <p>Cette technologie a tout pour retenir votre attention, et vaut la peine d'être essayée et déployée à grande échelle.</p> <h2>Ressources, compléments</h2><ul class="spip" role="list"><li> <a href="https://www.w3.org/TR/CSP/" class="spip_out" hreflang="en" title="en" rel="external">CSP Level 1</a> ;</li><li> <a href="https://www.w3.org/TR/CSP2/" class="spip_out" hreflang="en" title="en" rel="external">CSP Level 2</a> ;</li><li> <a href="https://www.w3.org/TR/CSP3/" class="spip_out" hreflang="en" title="en" rel="external">CSP Level 3</a> ;</li><li> <a href="https://cspvalidator.org/" class="spip_out" hreflang="en" title="en" rel="external">CSP Validator</a> ;</li><li> <a href="https://csp.withgoogle.com/docs/index.html" class="spip_out" hreflang="en" title="en" rel="external">CSP with Google</a> ;</li><li> <a href="https://www.smashingmagazine.com/2016/09/content-security-policy-your-future-best-friend/" class="spip_out" hreflang="en" title="en" rel="external">Content Security Policy, Your Future Best Friend</a> ;</li><li> <a href="https://www.aaron-gustafson.com/notebook/more-proof-we-dont-control-our-web-pages/" class="spip_out" hreflang="en" title="en" rel="external">More proof we don't control our web pages</a> ;</li><li> <a href="https://github.com/nico3333fr/CSP-useful" class="spip_out" hreflang="en" title="en" rel="external">CSP useful, a collection of scripts, tips, thoughts about CSP</a> ;</li><li> <a href="https://speakerdeck.com/mikispag/making-csp-great-again-michele-spagnuolo-and-lukas-weichselbaum" class="spip_out" hreflang="en" title="en" rel="external">Making CSP great again</a> ;</li><li> <a href="https://www.paris-web.fr/2015/conferences/csp-content-security-policy.php" class="spip_out" rel="external">Content Security Policy, Paris Web 2015</a> ;</li><li> <a href="https://observatory.mozilla.org/" class="spip_out" hreflang="en" title="en" rel="external">Mozilla Observatory</a>.</li></ul></div> <hr /> <div class='rss_notes'><div id="nb3-1"> <p><span class="spip_note_ref">[<a href="#nh3-1" class="spip_note" title="Notes 3-1" rev="appendix">1</a>] </span>Lire à ce sujet <a href="https://www.aaron-gustafson.com/notebook/more-proof-we-dont-control-our-web-pages/" class="spip_out" hreflang="en" title="en" rel="external">More proof we don't control our web pages</a>.</p> </div><div id="nb3-2"> <p><span class="spip_note_ref">[<a href="#nh3-2" class="spip_note" title="Notes 3-2" rev="appendix">2</a>] </span>Voir à ce sujet <a href="https://github.com/nico3333fr/CSP-useful/tree/master/report-uri" class="spip_out" hreflang="en" title="en" rel="external">quelques exemples de scripts pour report-uri</a>.</p> </div><div id="nb3-3"> <p><span class="spip_note_ref">[<a href="#nh3-3" class="spip_note" title="Notes 3-3" rev="appendix">3</a>] </span>Voir à ce sujet l'<a href="https://www.youtube.com/watch?v=d0D3d0ZM-rI" class="spip_out" rel="external">excellente présentation de Scott Helme sur CSP</a>.</p> </div><div id="nb3-4"> <p><span class="spip_note_ref">[<a href="#nh3-4" class="spip_note" title="Notes 3-4" rev="appendix">4</a>] </span>Et cela va parfois vous surprendre lors de l'utilisation de scripts tiers…</p> </div></div> HTTPS : introduction https://openweb.eu.org/articles/https-introduction https://openweb.eu.org/articles/https-introduction 2016年11月14日T10:29:50Z text/html fr Frédéric Kayser Expert Gourou Sécurité <p>Disposer d'un web intégralement sécurisé par défaut, avec HTTPS utilisé en lieu et place de HTTP, est le souhait de certains acteurs majeurs du net depuis quelques années. Cette nouvelle série d'articles traite différents aspects du fonctionnement de TLS (anciennement SSL) pour mieux comprendre les enjeux associés et aborder sereinement la configuration de ce protocole. <br class='autobr' /> Cet article d'introduction explique le rôle et le fonctionnement global de HTTPS, les articles spécifiques se focalisent (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/gourou" rel="tag">Gourou</a>, <a href="https://openweb.eu.org/securite" rel="tag">Sécurité</a> <div class='rss_chapo'><p>Disposer d'un web intégralement sécurisé par défaut, avec HTTPS utilisé en lieu et place de HTTP, est le souhait de certains acteurs majeurs du net depuis quelques années. Cette nouvelle série d'articles traite différents aspects du fonctionnement de TLS (anciennement SSL) pour mieux comprendre les enjeux associés et aborder sereinement la configuration de ce protocole.</p></div> <div class='rss_texte'><p>Cet article d'introduction explique le rôle et le fonctionnement global de HTTPS, les articles spécifiques se focalisent plus en profondeur sur un point précis.</p> <ol class="spip" role="list"><li> <a href='https://openweb.eu.org/articles/https-de-ssl-a-tls-1-3' class="spip_in">De SSL à TLS 1.3</a></li><li> Le certificat PKIX (parution à venir)</li><li> Les suites cryptographiques (parution à venir)</li><li> À double tour (parution à venir)</li></ol> <p>En raison de la diversité des hébergeurs, serveurs, autorités de certification et besoins de compatibilité avec des clients web plus ou moins anciens, ces articles ne sont toutefois que des guides et non des tutoriels pour configurer un logiciel particulier.</p> <h2 class="spip">Bien au-delà du cadenas</h2> <p>Pour le grand public HTTPS est souvent associé à la présence rassurante du petit cadenas verrouillé à proximité de la barre d'URL et malheureusement également à quelques clics rapides sur des boutons OK lorsqu'une alerte relative à un problème de certificat surgit.</p> <p><img src='https://openweb.eu.org/IMG/jpg/howsmyssl-2.jpg' alt="URL sécurisée par HTTPS" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Le S qui signifie sécurisé dans HTTPS provient de TLS —Transport Layer Security— qui est un protocole supplémentaire et indépendant qui se positionne entre TCP et HTTP qui demeurent pratiquement inchangés.<br class='autobr' /> La sécurisation de la connexion répond à trois besoins principaux : authentifier le serveur, garantir la confidentialité et l'intégrité des données échangées.<br class='autobr' /> Cela ne concerne donc que les données en transit et n'améliore que marginalement la sécurisation du serveur lui-même, mais rendre bien plus difficile la récupération de cookies ou d'identifiants de connexion peut éviter quelques mauvaises surprises.</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-layers.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>L'annonce de Google de signaler, dès le début 2017, comme <a href="https://security.googleblog.com/2016/09/moving-towards-more-secure-web.html" class="spip_out" rel="external">non sécurisée</a> toute page web qui propose un formulaire de saisie de mot de passe ou de carte bancaire hors HTTPS devrait encore accélérer le mouvement de migration de HTTP vers HTTPS, de nombreux sites ayant déjà fait le saut suite aux révélations d'Edward Snowden en 2013.<br class='autobr' /> Par ailleurs HTTP/2 (ou h2), la nouvelle version de HTTP, nécessite en pratique la présence de TLS. Pour mettre en place HTTP/2 et bénéficier de ses accélérations une étape préliminaire est donc de passer intégralement en HTTPS.<br class='autobr' /> Il y a toujours plus de raisons techniques d'utiliser HTTPS, comme accéder à l'<a href="https://developers.google.com/web/updates/2016/04/geolocation-on-secure-contexts-only" class="spip_out" rel="external">API de géolocalisation</a> avec les navigateurs modernes, mais la première raison devrait être le respect de l'utilisateur et de ses données.</p> <h2 class="spip">Premier contact</h2> <p>Voici comment se déroule typiquement l'établissement d'une connexion HTTPS lors d'une première visite d'un site.<br class='autobr' /> Le client a tout d'abord besoin de déterminer l'adresse IP associée au nom de domaine du site web, si cette information n'est pas disponible dans une mémoire cache locale (suite à une requête antérieure) une demande de résolution est émise vers un serveur DNS.</p> <p><img src='https://openweb.eu.org/IMG/gif/tls-intro-dns.gif' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Malheureusement les données locales du client pourraient avoir été altérées, le résolveur DNS pourrait avoir été <a href="https://fr.wikipedia.org/wiki/Empoisonnement_du_cache_DNS" class="spip_out" rel="external">empoisonné</a> par des informations erronées ou tout simplement <a href="http://www.bortzmeyer.org/censure-francaise.html" class="spip_out" rel="external">mentir</a> et, pour finir, un élément actif du réseau pourrait intercepter la demande et retourner une réponse falsifiée… Cela tromperait le client et l'orienterait en direction d'un serveur probablement malveillant, d'où la nécessité pour un serveur HTTPS légitime de pouvoir s'authentifier en prouvant qu'il a été préalablement reconnu par un tiers de confiance comme étant bien celui attendu.</p> <p>Une fois en possession de l'IP du serveur le client peut le contacter avec le protocole HTTP sur le port 80. Dans le cas présent le client demande simplement l'élément du site situé à sa racine, celle-ci est symbolisée par un simple caractère /.</p> <p><img src='https://openweb.eu.org/IMG/gif/tls-intro-http.gif' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Le serveur ne renvoie pas au client les données qu'il attendait mais lui indique avec une redirection HTTP 301 que ce qu'il cherche est désormais disponible à un autre emplacement accessible en HTTPS (techniquement parlant le protocole fait partie de l'URL, la redirection correspond donc à <a href="https://support.google.com/webmasters/answer/6033049?hl=fr" class="spip_out" rel="external">un déplacement de site</a>). Le site HTTP ne sert donc plus qu'à rediriger automatiquement ses visiteurs vers la version HTTPS. Ceci constitue également une bonne pratique SEO pour éviter que les moteurs de recherche ne détectent du contenu dupliqué et donc dévalorisé.</p> <div class="remarque_important">Il existe toutefois deux cas qui pousseraient le client à communiquer directement en HTTPS lors d'une première visite :<ul class="spip" role="list"><li> l'URL précise explicitement le protocole sécurisé et commence donc par https://</li><li> le domaine est inscrit sur la liste de préchargement HSTS </div></li></ul> <p>Le client délaisse temporairement le protocole HTTP car il a en premier lieu besoin d'établir la connexion sécurisée. Pour ce faire il s'adresse au port 443, qui est communément dédié à TLS, il énumère alors tout un inventaire de ses capacités relatives à ce protocole (algorithmes de signature acceptés, courbes elliptiques connues, suites cryptographiques préférées…).</p> <p><img src='https://openweb.eu.org/IMG/gif/tls-intro-tls.gif' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>En fonction des desiderata du client le serveur va retourner un certificat contenant une clé publique qui permettront de l'authentifier, il indique également quelle suite cryptographique il a retenu pour chiffrer les données. Celle-ci va déterminer le mécanisme d'échange de la clé de chiffrement, ainsi que l'algorithme de chiffrement symétrique et la méthode de vérification d'intégrité qui seront mis en œuvre par la suite.</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-ocsp.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Une fois le client en possession du certificat il va s'assurer de sa conformité en vérifiant plusieurs points dont les principaux sont :</p> <ul class="spip" role="list"><li> la présence du nom du domaine visité parmi ceux présents sur le certificat</li><li> la période de validité</li><li> la signature apposée par l'AC —Autorité de Certification— qui a émis le certificat</li><li> la possibilité de remonter la chaîne de confiance d'AC en AC jusqu'à une AC racine reconnue</li><li> l'absence de publication sur des listes de révocation de type CRL et/ou OCSP.</li></ul><p class="remarque_important">Les raisons pour déclencher une alerte de sécurité relative au certificat sont donc nombreuses et parfois obscures. Le grand public ayant tendance à vouloir passer outre, les navigateurs ont commencé à modifier la présentation des alertes pour rendre l'accès au contournement moins facile, de plus certains en-têtes HTTP peuvent désormais inhiber cette possibilité.</p> <p> Une fois l'échange (ou construction) de la clé de chiffrement symétrique réalisé, un canal de communication chiffré est établi, le client et le serveur ne communiqueront désormais plus qu'à travers celui-ci, rendant de ce fait leurs échanges inintelligibles au reste du monde.</p> <p><img src='https://openweb.eu.org/IMG/gif/tls-intro-ok.gif' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Le client transmet alors une nouvelle requête HTTP GET mais en passant cette fois par le canal chiffré, le serveur lui répond désormais pleinement par cette même voie, couramment le serveur précise via un en-tête HTTP STS —Strict Transport Security— qu'il exige d'être contacté en HTTPS à l'avenir.</p> <p>Il est parfaitement possible de capturer et décortiquer ces premiers échanges avec un analyseur de paquets réseau comme <a href="https://www.wireshark.org/" class="spip_out" rel="external">Wireshark</a>, une fois la connexion chiffrée le résultat est bien sûr un peu plus opaque…</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-wireshark.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>En l'absence de connexion sécurisée le contenu des échanges peut être consulté et même modifié en tout point du réseau, cependant les points d'accès WiFi gratuits sont particulièrement sensibles, car n'importe qui peut en monter un et il est très facile de les écouter.</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-bb.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>La NSA —National Security Agency— (et très probablement d'autres agences gouvernementales tout autour de la planète) collecte massivement et sans distinction toutes sortes de données sur le net. Certains des documents divulgués par Edward Snowden ont été mis en relation avec des recherches universitaires qui laissent peu de doutes quant aux capacités dont dispose la NSA pour <a href="https://freedom-to-tinker.com/2015/10/14/how-is-nsa-breaking-so-much-crypto/" class="spip_out" rel="external">casser le chiffrement</a> d'une partie du trafic Internet mal protégé, en particulier en raison de l'utilisation de clés asymétriques trop petites ou basées sur des primitives trop communes. Il est donc devenu crucial de veiller sur ces points car ce qui aujourd'hui encore n'est qu'à la portée d'agences gouvernementales pourrait devenir le business quotidien d'organisations criminelles d'ici quelques années.</p> <h2 class="spip">2016 année de transition</h2> <p>Extérieurement on pourrait croire que rien n'a changé en 20 ans, en fait c'est en partie vrai, avec des certificats régulièrement renouvelés un serveur correctement configuré à la fin des années 90 aurait pu fonctionner sans problème visible jusqu'en novembre 2014… c'est-à-dire jusqu'au moment où les navigateurs ont commencé à désactiver SSLv3 en leur sein pour contrer l'attaque POODLE. En pratique depuis 2011 et plus encore suite aux révélations d'Edward Snowden en 2013 le petit monde de la crypto sur le web est en ébullition et tente de rattraper des années de retard et d'immobilisme.</p> <p>2016 est clairement une année charnière, Let's Encrypt a distribué de manière automatisée plus de 10 millions de « certificats SSL » gratuits depuis son lancement fin 2015, ce qui contribue très concrètement à l'adoption généralisée de HTTPS. Cela permet à un nombre croissant d'hébergeurs de proposer HTTPS au même coût qu'un hébergement classique et sans nécessairement avoir besoin d'une IP en propre pour chaque domaine grâce au support de l'extension TLS nommée SNI —Server Name Indication— qui est <a href="http://caniuse.com/#feat=sni" class="spip_out" rel="external">très largement répandue</a>, ce qui tombe à pic avec la pénurie d'IPv4 qui est devenue une réalité.</p> <p><img src='https://openweb.eu.org/IMG/png/le-10millions.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Depuis le 1er janvier 2016 les autorités de certifications n'ont plus le droit d'émettre de certificats dont la signature repose sur un condensat SHA-1, SHA-256 s'est donc largement généralisé et les navigateurs vont commencer à <a href="https://blog.mozilla.org/security/2016/10/18/phasing-out-sha-1-on-the-public-web/" class="spip_out" rel="external">rejeter les vieux certificats</a> encore en SHA-1 début 2017.</p> <p>Depuis le début de l'année la méthode de chiffrement RC4 (le fleuron des années 90) est progressivement retirée des navigateurs modernes et à la place Chrome, Firefox et Opera acceptent désormais ChaCha20 ; de son côté le chiffrement AES est couramment accéléré matériellement y compris sur les processeurs d'entrée de gamme chez Intel et AMD.</p> <p>HTTP/2 qui impose de nombreuses restrictions quant à la configuration TLS sous-jacente est désormais activable avec Apache 2.4.17, Nginx 1.10.0 et IIS 10 sur Windows Server 2016.</p> <p>Les spécifications finales de TLS 1.3 devraient être publiées d'ici quelques mois, mais il faudra de toute façons de longues années avant que cette version ne devienne prédominante (pour autant une importante part du trafic web mondial devrait en bénéficier très rapidement du fait de son adoption quasiment acquise sur les serveurs de Google et Cloudflare d'une part et dans Chrome et Firefox de l'autre). Mais on peut d'ores et déjà s'inspirer de TLS 1.3 pour mieux configurer TLS 1.2.</p> <p>De plus la large diffusion d'OpenSSL 1.0.2 au sein des dernières distributions GNU/Linux et l'ancrage de LibreSSL à sa place dans certains systèmes *BSD devraient également faciliter l'obtention de configurations TLS correctes, sans parler d'OpenSSL 1.1.0 qui vient de faire ses premiers pas avec quelques nouveautés très intéressantes.</p> <h2 class="spip">HTTPS partout, sécurité NULL(part)</h2> <p>HTTPS partout c'est bien, mais avec un S de qualité c'est encore mieux. Les navigateurs affichent toujours le même cadenas (parfois affublé d'un petit complément pour signaler un soucis comme du contenu mixte) mais il faut bien comprendre que les différents mécanismes en œuvre pour établir la liaison sécurisée vont produire une connexion plus ou moins robuste en fonction des capacités respectives du client et du serveur. Il est possible d'avoir une estimation de cette robustesse avec des extensions comme <a href="https://addons.mozilla.org/en-us/firefox/addon/calomel-ssl-validation/" class="spip_out" rel="external">Calomel SSL Validation</a> ou <a href="https://addons.mozilla.org/en-US/firefox/addon/ssleuth/" class="spip_out" rel="external">SSleuth</a> pour Firefox, le premier est quelque peu plus simple d'accès avec un simple code couleur visible dans un premier temps et des indications plus détaillées disponibles au besoin, je vous conseille de l'installer car il permet d'accéder rapidement à des informations précieuses pendant la phase de configuration et plus généralement au quotidien voir du jaune ou du rouge à son niveau devrait vous alerter.</p> <p><img src='https://openweb.eu.org/IMG/jpg/tls-intro-calomel.jpg' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Sur cette page du site de test <a href="https://badssl.com/" class="spip_out" rel="external">badssl.com</a> on voit que le blason est bleu alors que c'est la couleur verte qui est associée aux meilleures notes, ici la note globale n'est que de 89%.</p> <p>Les navigateurs peuvent éventuellement indiquer les paramètres TLS en cours d'utilisations mais ces informations ne sont pas toujours accessibles facilement et souvent incomplètes.</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-chrome.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Google Chrome donne les informations les plus détaillées et qualifie individuellement le protocole, l'échange de clé ainsi que la méthode de chiffrement soit de robuste soit d'obsolète. Sur la même page de test on voit que Chrome considère le chiffrement AES 256 bits en mode CBC avec un HMAC SHA-1 comme étant obsolète… Il y a de quoi froncer un sourcil car AES 256 bits est considéré comme étant ce qui se fait de mieux en matière de chiffrement, mais comme souvent en sécurité le diable est dans les détails et pour Chrome ce sont le mode CBC et le HMAC SHA-1 qui posent problème. Pour autant le cadenas est tout ce qu'il y a de plus normal et en apparence tout va bien, mais il n'est pas inenvisageable que d'ici 3 ou 4 ans certains navigateurs refusent de se connecter sur un site configuré de la sorte car techniquement on peut d'ores et déjà faire mieux et à l'avenir l'usage du mode CBC pourrait être découragé.<br class='autobr' /> Les phrases précédentes contiennent quelques acronymes qui ne sont pas détaillés dans cette introduction. Il y a beaucoup d'acronymes en cryptographie, ce qui ne facilite pas vraiment la compréhension du sujet lorsqu'on l'aborde en néophyte. Il y a une vingtaine d'années Netscape 4 proposait à ses utilisateurs d'activer ou non certaines suites cryptographiques (y compris une sans chiffrement, également connue sous le nom de chiffrement NULL), le grand public était alors directement exposé à de tels acronymes.</p> <p><img src='https://openweb.eu.org/IMG/png/tls-intro-netscape4sslv3.png' alt="" style='max-width: 500px;max-width: min(100%,500px); max-height: 10000px' /></p> <p>Aujourd'hui Safari ne restitue strictement aucune information concernant le protocole ou la suite cryptographique en service, on voit le cadenas et on peut consulter le certificat c'est tout. Toute la « culture » cryptographique est occultée, a posteriori on sait que la majorité des utilisateurs de Netscape et leurs descendants n'ont retenu que deux vagues notions : SSL ça crypte (sic) et plus il y a de bits mieux c'est crypté (sic), traumatisme très certainement lié à la première « crypto war » et ses restrictions à l'export hors US.<br class='autobr' /> Les articles spécifiques font le tour d'une bonne partie des concepts et des acronymes liés à cette culture cryptographique bien au-delà du cadenas donc, leur parution devrait avoir lieu progressivement dans les prochains mois. En attendant si vous souhaitez commencer à creuser le sujet et décortiquer la configuration SSL/TLS d'un site déjà existant l'incontournable <a href="https://www.ssllabs.com/ssltest/analyze.html?viaform=on&d=cbc.badssl.com" class="spip_out" rel="external">SSL Labs</a> devrait se révéler très précieux.</p></div> Comment le Web est devenu illisible… https://openweb.eu.org/ailleurs/comment-le-web-est-devenu-illisible https://openweb.eu.org/ailleurs/comment-le-web-est-devenu-illisible 2016年10月24日T13:35:55Z text/html fr Gilles Chagnon Accessibilité <p>Il y a de cela quelques années, nous avions publié un article sur les contrastes de texte. <br class='autobr' /> Malheureusement, force est de constater que le temps ne fait rien à l'affaire. Kevin Marks le déplore dans son billet intitulé How the Web Became Unreadable. Selon lui, les dernières modes en design poussent à l'adoption de contrastes de plus en plus faibles. Si cela ne pose pas (trop) de problème sur les excellents écrans high-tech que les designers, n'ayant par ailleurs pas besoin de lunettes, (…)</p> - <a href="https://openweb.eu.org/ailleurs/" rel="directory">Voir ailleurs</a> / <a href="https://openweb.eu.org/accessibilite" rel="tag">Accessibilité</a> <div class='rss_texte'><p>Il y a de cela quelques années, nous avions publié un article sur les <a href='https://openweb.eu.org/articles/accessibilite_contrastes_textes_sites' class="spip_in">contrastes de texte</a>.</p> <p>Malheureusement, force est de constater que le temps ne fait rien à l'affaire. Kevin Marks le déplore dans son billet intitulé <a href="https://backchannel.com/how-the-web-became-unreadable-a781ddc711b6" class="spip_out" hreflang="en" rel="external">How the Web Became Unreadable</a>. Selon lui, les dernières modes en design poussent à l'adoption de contrastes de plus en plus faibles. Si cela ne pose pas (trop) de problème sur les excellents écrans high-tech que les designers, n'ayant par ailleurs pas besoin de lunettes, utilisent pour concevoir leurs interfaces, il n'en est pas de même dans le monde réel, où les conditions de consultation et les situations de chacun varient énormément.</p> <blockquote lang="en">When you build a site and ignore what happens afterwards — when the values entered in code are translated into brightness and contrast depending on the settings of a physical screen — you're avoiding the experience that you create. And when you design in perfect settings, with big, contrast-rich monitors, you blind yourself to users. To arbitrarily throw away contrast based on a fashion that “looks good on my perfect screen in my perfectly lit office” is abdicating designers' responsibilities to the very people for whom they are designing. </blockquote> <p>En guise de complément, et en plus de ceux que nous avons indiqués dans notre <a href='https://openweb.eu.org/articles/accessibilite_contrastes_textes_sites' class="spip_in">billet de 2012 mentionné plus haut</a>, voici quelques outils :</p> <ul class="spip" role="list"><li> <span lang="en"><a href="https://khan.github.io/tota11y/" class="spip_out" hreflang="en" rel="external">tota11y, an accessibility visualization toolkit</a></span></li><li> <a href="https://squizlabs.github.io/HTML_CodeSniffer/" class="spip_out" hreflang="en" rel="external">HTML Code Sniffer</a></li></ul></div> Paris Web 2016 https://openweb.eu.org/blog/paris-web-2016 https://openweb.eu.org/blog/paris-web-2016 2016年09月02日T11:46:05Z text/html fr Le collectif Openweb <p>L'édition 2016 de Paris Web approche à pas de géant (« Paris Web is coming, you know nothing » disait ce cher Tim Berners Snow) : c'est dans moins d'un mois ! <br class='autobr' /> Cette onzième édition se déroulera du 29 septembre au 1er octobre et explorera selon le célèbre motto « les thèmes de l'accessibilité Web, du design numérique et des standards ouverts ». <br class='autobr' /> En fait, des sujets extrêmement divers et variés vous attendent : internationalisation, CSS, surveillance du Web, UX, crypto-parties, sécurité, (…)</p> - <a href="https://openweb.eu.org/blog/" rel="directory">Blog</a> <div class='rss_chapo'><p>L'édition 2016 de Paris Web approche à pas de géant (« <em lang="en">Paris Web is coming, you know nothing</em> » disait ce cher Tim Berners Snow) : c'est dans moins d'un mois !</p></div> <div class='rss_texte'><p>Cette onzième édition se déroulera du 29 septembre au 1er octobre et explorera selon le célèbre motto « les thèmes de l'accessibilité Web, du design numérique et des standards ouverts ».</p> <p>En fait, des sujets extrêmement divers et variés vous attendent : internationalisation, CSS, surveillance du Web, UX, crypto-parties, sécurité, éthique, JavaScript, retour d'expérience, accessibilité, qualité, bonnes pratiques, etc. sans compter les informelles qui s'improviseront durant les journées des conférences, et probablement aussi durant les ateliers.</p> <p>Pour ceux qui étaient là aux éditions précédentes, le lieu vous est désormais connu : le magnifique Beffroi de Montrouge. Les ateliers seront quant à eux à la Web School Factory.</p> <p>Le thème de cette année est : <strong>nous avons tous et toutes un rôle à jouer</strong>.</p> <p>Plus que jamais, la propre veille technologique est une question importante dans nos métiers, parfois délicate, et Paris Web est manifestement le lieu idéal pour cela, notamment grâce à la richesse des échanges sur place, qui nous donne toujours l'impression <i>d'en savoir plus qu'hier, et moins que demain</i>.</p> <p>Si vous venez pour la première fois, n'hésitez pas à nous contacter, nous nous ferons un plaisir de discuter avec vous. Dites-vous bien que cet événement est tout sauf impersonnel.</p> <p>Encore une fois, un effort remarquable est fait pour l'accessibilité de l'événement : vélotypie, LSF, lieux accessibles, doublage francophone pour les conférences en anglais, etc. Autant le dire clairement, Paris Web est sûrement l'un des événements en pointe sur ce sujet (si ce n'est le meilleur).</p> <p>Bref, dépêchez-vous de vous inscrire, vous auriez à notre humble avis tort de manquer cela !</p> <ul class="spip" role="list"><li> <a href="https://www.paris-web.fr/" class="spip_out" rel="external">Paris Web 2016</a></li><li> <a href="http://www.paris-web.fr/2016/conferences/" class="spip_out" rel="external">Les conférences</a></li><li> <a href="http://www.paris-web.fr/2016/ateliers/" class="spip_out" rel="external">Les ateliers</a></li><li> <a href="https://inscriptions.paris-web.fr/" class="spip_out" rel="external">Pour vous inscrire</a></li></ul> <p>Post-scriptum : peut-être votre(vos) sujet(s) n'a(n'ont) pas été retenu(s) ? Si nous n'avions qu'un conseil à donner : ne vous arrêtez pas là, et parlez de vos sujets. Lors d'autres événements, à Paris Web, sur d'autres sites, sur le vôtre, sur votre blog, etc. ou pourquoi pas ici-même : qui sait où cela pourra vous mener ? ;)</p></div> Humeur : chers services tiers, et si vous vous associez à nous ? https://openweb.eu.org/blog/humeur-chers-services-tiers-et-si-vous-vous-associez-a https://openweb.eu.org/blog/humeur-chers-services-tiers-et-si-vous-vous-associez-a 2016年08月01日T13:14:21Z text/html fr Nicolas Hoffmann Qualité Décideur Débutant Expert Industrialisation <p>Ou : de l'importance de ne « pas trop déconner ». Explications. <br class='autobr' /> Il existe une offre pléthorique de services web : hébergement, analyses diverses, polices de caractères, modules divers et variés de réseaux sociaux, zones de chaleur (heatmaps) sur nos pages, publicité (si si !), services de vidéo, services de commentaires, etc. <br class='autobr' /> Ces services – permettez-moi ce truisme – nous rendent bien service dans notre relation avec nos clients, en tant que prestataires de sites Web, nous devons sans (…)</p> - <a href="https://openweb.eu.org/blog/" rel="directory">Blog</a> / <a href="https://openweb.eu.org/qualite" rel="tag">Qualité</a>, <a href="https://openweb.eu.org/decideur" rel="tag">Décideur</a>, <a href="https://openweb.eu.org/debutant" rel="tag">Débutant</a>, <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/industrialisation" rel="tag">Industrialisation</a> <div class='rss_chapo'><p>Ou : de l'importance de ne « pas trop déconner ». Explications.</p></div> <div class='rss_texte'><p>Il existe une offre pléthorique de services web : hébergement, analyses diverses, polices de caractères, modules divers et variés de réseaux sociaux, zones de chaleur (heatmaps) sur nos pages, publicité (si si !), services de vidéo, services de commentaires, etc.</p> <p>Ces services – permettez-moi ce truisme – nous rendent bien service dans notre relation avec nos clients, en tant que prestataires de sites Web, nous devons sans cesse conseiller et orienter pour offrir des informations à nos clients, répondre à leurs besoins, et ce toujours dans le but d'améliorer nos prestations, et par extension d'améliorer l'efficacité, la performance, etc. de leurs sites.</p> <p>Un fait récent nous a particulièrement marqué : l'IAB (<span lang="en">Interactive Advertising Bureau</span>) écrit un <em lang="la">mea culpa</em> franc et massif à propos des abus de la publicité en ligne intitulé <a href="http://www.iab.com/news/lean/" lang="en" hreflang="en">We messed up</a> (littéralement, « on a déconné »). Certes, au point que les utilisateurs, ulcérés de nombreux abus, se mettent à utiliser des contre-mesures (bloqueurs de pubs ou de <em ang="en">trackers</em>) ou tout simplement à ignorer des sites devenus impraticables. Certes, « ils ont vraiment déconné ».</p> <p>Mais si l'on regarde en perspective, ils n'ont pas été les premiers à déconner, et ils ne seront sûrement pas les derniers. Élargissons notre regard sur le domaine. Exemples :</p> <p>La guerre des navigateurs entre Netscape et Microsoft, qui rivalisaient d'implémentations non-standards et non interopérables, parfois en dépit du bon sens : à l'époque, IE4 proposait comme une évolution de permettre par exemple de <a href="https://fr.wikipedia.org/wiki/%C3%89volution_de_l%27usage_des_navigateurs_web#Netscape_contre_Internet_Explorer" class="spip_out" rel="external">jouer des fichiers de musique MP3 en arrière-plan</a>. (quoi qu'on en dise, lancer de la musique non-sollicitée n'a jamais été une bonne pratique, et ce n'est pas près de le devenir)</p> <p>Suite directe de cette guerre des navigateurs, <a href="https://fr.wikipedia.org/wiki/%C3%89volution_de_l%27usage_des_navigateurs_web#L.27.C3.A8re_Internet_Explorer" class="spip_out" rel="external">IE6 en position d'ultra-dominance</a> qui n'a pas évolué entre 2001 et 2006 : les problèmes de sécurité s'amoncelaient, les besoins de standards et des nouvelles normes qui mirent encore des années pour arriver. <br class='autobr' /> Encore dans cette période, les mythiques popups : à priori, une possibilité pratique, mais dont nombre de sites ont tellement abusé… que les utilisateurs ulcérés ont fini par tuer totalement à grands coups de bloqueurs de popups.</p> <p>Toujours dans cette période, l'<a href="https://fr.wikipedia.org/wiki/Bulle_Internet" class="spip_out" rel="external">explosion de la bulle internet</a> : l'effet « nouvelle économie » qui déborde sur tous les secteurs, des investissements/endettements qui atteignent des niveaux records et des perspectives largement sur-évaluées.</p> <p>Plus proche de nous, le poids moyen des pages qui continue de grimper : <a href="http://httparchive.org/trends.php?s=All&minlabel=Sep+1+2014&maxlabel=Jun+1+2016#bytesTotal&reqTotal" class="spip_out" rel="external">les pages s'alourdissent régulièrement</a>.</p> <p>Etc.</p> <p>Bref, nous pourrions énoncer une loi empirique : <strong>tout système qui « déconne » un peu trop finit par se prendre un sévère retour de bâton</strong>. Plus gênant, souvent le retour de bâton est tel… qu'on va vers un autre extrême. C'est exactement ce qu'il se passe avec la publicité actuellement. Néanmoins, hors de tout manichéisme anti ou pro-publicité, certains sites ont réellement <strong>besoin</strong> de la publicité en ligne.</p> <p>Revenons à nos clients. Comme vous pouvez l'imaginer sans problème, ils sont toujours plus exigeants, et l'exigence de qualité de nos clients nous invite à leur proposer des services qui répondent à ces souhaits. Nous ne ménageons pas nos efforts pour trouver les meilleurs services, lorsqu'ils existent.</p> <p>Et malheureusement, si un service a une qualité globale plutôt mauvaise, nous pouvons être amenés à le retoquer et à ne même pas le proposer. Pour rester dans le sujet de la publicité, si le client a ce que l'on appelle un <a href="https://medium.com/@DamienJubeau/budget-de-performance-indispensable-rapidite-sites-web-a771922e89e8" class="spip_out" rel="external">budget de performance</a>, vous vous doutez bien qu'il ne va accepter qu'une publicité ruine ses efforts à ce sujet.</p> <p>Nous en arrivons au titre de ce billet, cette invitation à nous associer. <strong>Nous avons besoin de vous, et vous avez besoin de nous</strong>. Nous testons la performance, l'accessibilité, la sécurité, l'empreinte écologique, etc. bref, des tas de points de qualité, car nous voulons bichonner les sites de nos clients.</p> <p>Suivez-nous dans cette démarche.</p> <ul class="spip" role="list"><li> <strong>testez</strong> vos propres services intégrés sur un site ;</li><li> <strong>observez</strong> les résultats ;</li><li> <strong>améliorez</strong> vos services ;</li><li> le cas échéant <strong>écoutez et répondez</strong> aux demandes de vos utilisateurs, qui peuvent être de bon conseil.</li></ul> <p>Certains le font très bien, et nous en sommes ravis. Continuez :)</p> <p>À bon entendeur !</p></div> La troisième guerre des navigateurs est terminée et c'est un bain de sang https://openweb.eu.org/ailleurs/la-troisieme-guerre-des-navigateurs-est-terminee-et-c https://openweb.eu.org/ailleurs/la-troisieme-guerre-des-navigateurs-est-terminee-et-c 2016年07月07日T11:43:26Z text/html fr Nicolas Hoffmann Industrialisation Débutant Expert Gourou <p>Daniel Glazman, que nous avions déjà eu le plaisir d'interviewer ici-même, a récemment présenté une conférence à Web2Day sobrement intitulée « La troisième guerre des navigateurs est terminée et c'est un bain de sang ». <br class='autobr' /> Autant ne pas tourner autour du pot, vous devez voir cette vidéo. <br class='autobr' /> Morceaux choisis : <br class='autobr' /> On est tous là (au W3C) pour faire avancer le Web dans une direction générale, mais avec beaucoup de petites directions particulières qui sont les intérêts stratégiques de chacun des (…)</p> - <a href="https://openweb.eu.org/ailleurs/" rel="directory">Voir ailleurs</a> / <a href="https://openweb.eu.org/industrialisation" rel="tag">Industrialisation</a>, <a href="https://openweb.eu.org/debutant" rel="tag">Débutant</a>, <a href="https://openweb.eu.org/expert" rel="tag">Expert</a>, <a href="https://openweb.eu.org/gourou" rel="tag">Gourou</a> <div class='rss_texte'><p>Daniel Glazman, que nous avions déjà eu le plaisir d'interviewer ici-même, a récemment présenté une conférence à Web2Day sobrement intitulée « <i>La troisième guerre des navigateurs est terminée et c'est un bain de sang</i> ».</p> <p>Autant ne pas tourner autour du pot, <strong>vous devez voir cette vidéo</strong>.</p> <p>Morceaux choisis :</p> <blockquote class="spip"> <p>On est tous là (au W3C) pour faire avancer le Web dans une direction générale, mais avec beaucoup de petites directions particulières qui sont les intérêts stratégiques de chacun des industriels présents.</p> </blockquote><blockquote class="spip"> <p>Quand on a 58,7% (à propos de Chrome), on a un poids majeur dans la standardisation, on fait ce qu'on veut.</p> </blockquote><blockquote class="spip"> <p>Les standards sont un acquis dans le paysage du Web (…), et pourtant, (Google) ils continuent de faire des daubes, vu que c'est pour eux-mêmes, et les autres n'ont qu'à suivre et implémenter.</p> </blockquote><blockquote class="spip"> <p>On est revenus à un monopole d'un vendeur de navigateur… qui en profite.</p> </blockquote> <p>Non seulement, vous ferez un impressionnant tour sur l'histoire du Web, le fonctionnement du W3C, les navigateurs… mais en plus ce tour sera certifié sans langue de bois, grâce à la verve désormais légendaire de l'orateur.</p> <p>La vidéo est ici : <a href="https://www.youtube.com/watch?v=ceMLuRBn--M" class="spip_out" rel="external">La troisième guerre des navigateurs est terminée et c'est un bain de sang</a></p> <p>(Bien que le titre soit en anglais, la vidéo est en français)</p></div> D-Day : ending or milestone? https://openweb.eu.org/articles/d-day-ending-or-milestone https://openweb.eu.org/articles/d-day-ending-or-milestone 2016年03月22日T09:26:04Z text/html en Elie Sloïm Décideur Qualité Méthodes <p>So you've been working for months on the new version of your Website? I guess you're pretty sure that the day this new version will go online will be a very important date for the users, for your customers, or for the Web, maybe. But it won't. The day your new version goes online is not an ending but the beginning of a story with your users. <br class='autobr' /> (Note: this article was previously published in French –if you have any feedback on the translation made by Nicolas Hoffmann and Coralie Mercier, (…)</p> - <a href="https://openweb.eu.org/articles/" rel="directory">Articles</a> / <a href="https://openweb.eu.org/decideur" rel="tag">Décideur</a>, <a href="https://openweb.eu.org/qualite" rel="tag">Qualité</a>, <a href="https://openweb.eu.org/methodes" rel="tag">Méthodes</a> <div class='rss_chapo'><p>So you've been working for months on the new version of your Website? I guess you're pretty sure that the day this new version will go online will be a very important date for the users, for your customers, or for the Web, maybe. But it won't. The day your new version goes online is not an ending but the beginning of a story with your users.</p></div> <div class='rss_texte'><p>(Note: <a href="http://blog.temesis.com/post/2009/04/20/jour-j-aboutissement-ou-jalon" class="spip_out" rel="external">this article was previously published in French</a> –if you have any feedback on the translation made by Nicolas Hoffmann and Coralie Mercier, please let us know.)</p> <p>Today, I'm going to address one of the <strong>most significant challenges</strong> in managing a web project. A common error is to consider the official date of release of the site as the end date of the project. This <strong>perception is wrong</strong>, and it has major consequences not only on the quality of the site, but also on the motivation of the teams. This is why I speak of this matter to you today.</p> <p>Considering the release date of a site as the end of a web project is a <strong>quite natural mistake</strong>. The teams responsible for the production of the site are indeed <strong>judged by their hierarchy at this time</strong> and not necessarily on the next phase, that is to say, when the site takes life and evolves. Moreover, focusing on creating the site is much more attractive, as it's a very varied step, often exciting, than focusing on the life phase of the site, which is much less rewarding. And yet.</p> <p>The official release date of a site, always long awaited, is often <strong>disappointing for the teams of the Web project</strong>. Certainly for project teams and their managers who are waiting for a new version, whose production takes several months, this date actually marks a completion.</p> <p>However, for the site itself and its users, it is a date that marks the <strong>beginning of an even more important phase</strong>. In fact, the release date of the website marks the beginning of the life phase, of adjustments and production of new contents and services.</p> <p>Whatever your efforts, your rigor and competence during the site creation phase, nothing will replace the feedback of real users of the site that will come during the life of the site. Sure, you can anticipate a lot of things, but if you choose to offer at the official release date a complete and perfect site, you make a beeline for <strong>failure and disappointment</strong>.</p> <p><strong>The success of an online service comes in the long run</strong>. Whatever your skills, the volume and quality of your content, the feedback and congratulations that you may have when releasing the site will only be temporary, and bear very little importance after years following the release date.</p> <p>It is indeed in the months and years that follow the release date of the site you can show that your site is not a set of content and services introduced one time at a particular date, but a <strong>set of content and services in constant evolution</strong>.</p> <p>Operationally, this vision can lead to apply major rules to drive your Web project. And since nothing beats a recipe, here are seven ;-)</p> <ul class="spip" role="list"><li> <strong>Accept imperfection</strong>: As I have often written, it is the first fundamental step in the Web business. This acceptance is a required step to adopt a continuous improvement process and not perpetually suffer the inherent imperfections of Web business.</li><li> <strong>Do not dream</strong>: If you do not want to be disappointed, do not expect too much out of your site release, and get ready to work for a long time.</li><li> <strong>Anticipate updates</strong>: separate fundamental contents from those that can be published later on. The impression that will be left by a large amount of information will never be as good for your site as a regular publication of new content.</li><li> <strong>Limit your ambitions</strong>: plan changes after the site release, and if the project seems too heavy, move optional components intended for the first version to future publications.</li><li> <strong>Plan ahead</strong>: allocate the budget of your site on the long term and integrate costs related to its further development. Do not bury your head in the sand. Right from the design of the functional specifications, it is possible to detect items and identify human resources necessary to maintain the site.</li><li> <strong>Be careful</strong>: remember that each feature, each section, each content mentioned in the specifications of your future site implies costs. Those costs will be spent much later.</li><li> <strong>Standards are for you, not for the others</strong>: compliance with web standards, best quality practices, accessibility rules are not just constraints, they will lead you to improve the scalability of your site. You will make mistakes. You will! Standards should especially be used to ensure that these mistakes are easy to correct and do not cost you too much.</li></ul> <p>There you go! <strong>Good luck for the release of your site</strong>. If you can grasp the D-day as a milestone and not as the end, <strong>you will not be disappointed</strong> ;-)</p></div>

AltStyle によって変換されたページ (->オリジナル) /