AccueilđŸ‡«đŸ‡·Chercher

HTTP Strict Transport Security

HTTP Strict Transport Security (HSTS) est un mĂ©canisme de politique de sĂ©curitĂ© proposĂ© pour HTTP, permettant Ă  un serveur web de dĂ©clarer Ă  un agent utilisateur (comme un navigateur web), compatible, qu'il doit interagir avec lui en utilisant une connexion sĂ©curisĂ©e (comme HTTPS). La politique est donc communiquĂ©e Ă  l'agent utilisateur par le serveur via la rĂ©ponse HTTP, dans le champ d'en-tĂȘte nommĂ© « Strict-Transport-Security ». La politique spĂ©cifie une pĂ©riode de temps durant laquelle l'agent utilisateur doit accĂ©der au serveur informatique uniquement de façon sĂ©curisĂ©e.

Généralités

Lorsque la politique HSTS est active pour un site web, l'agent utilisateur compatible opĂšre comme suit :

  1. Remplace automatiquement tous les liens non sécurisés par des liens sécurisés. Par exemple, http://www.exemple.com/une/page/ est automatiquement remplacé par https://www.exemple.com/une/page/ avant d'accéder au serveur.
  2. Si la sĂ©curitĂ© de la connexion ne peut ĂȘtre assurĂ©e (par exemple, le certificat TLS est autosignĂ©), celui-ci affiche un message d'erreur et interdit Ă  l'utilisateur l'accĂšs au site Ă  cause de cette erreur.

La politique HSTS aide Ă  protĂ©ger les utilisateurs de sites web contre quelques attaques rĂ©seau passives (Ă©coute clandestine) et actives. Une attaque du type man-in-the-middle ne peut pas intercepter de requĂȘte tant que le HSTS est actif pour ce site.

Syntaxe

Activer HSTS pour un an :

Strict-Transport-Security "max-age=31536000"

L'activer aussi pour les sous-domaines :

Strict-Transport-Security "max-age=31536000; includeSubDomains"

Autoriser aussi l'ajout du site dans les listes préchargées :

Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Bonnes pratiques

  • HSTS doit ĂȘtre dĂ©clarĂ© sur le domaine. Par exemple, https://sub.example.com doit aussi utiliser HSTS sur https://example.com
  • Les pages de https://www.example.com devraient inclure une requĂȘte vers une ressource sur https://example.com pour s'assurer que le domaine principal est protĂ©gĂ©. Avec la directive includeSubDomains, cela permet de protĂ©ger l'intĂ©gralitĂ© des sous-domaines.

Liste préchargés

HSTS ne protÚge qu'aprÚs la premiÚre connexion. Afin de corriger ce défaut les navigateurs proposent un mécanisme de pré-chargement : Les sites peuvent s'enregistrer sur (en) https://hstspreload.org/ pour demander leur inclusion dans cette liste. La présence du paramÚtre preload permet de s'assurer de leur consentement.

Support

  • Google Chrome et Chromium[1] supportent HSTS depuis la version 4.0.211.0.
  • Le support de HSTS est activĂ© dans les sources de Firefox depuis le , il est disponible depuis Firefox 4.0[2] - [3]. La version 17 du navigateur possĂšde en interne, une liste prĂ©dĂ©finie de sites web dont la connexion devra se faire en HSTS, ceci afin d'Ă©viter un dĂ©tournement lors de la premiĂšre connexion oĂč le navigateur ignore si le site demandera HSTS ou pas[4].
  • L'extension pour Firefox « NoScript Â» impose HSTS depuis la version 1.9.8.9
  • L'extension pour Chrome/Firefox/Opera « HTTPS Everywhere Â», dĂ©rivĂ©e de NoScript, gĂ©nĂ©ralise le concept de HSTS en incluant des sous-ensembles de chemins pour certains domaines, et rĂ©Ă©crit les URI non sĂ©curisĂ©es http:// d'un domaine en URI https:// d'un domaine relatif (Par exemple, de http://en.wikipedia.org Ă  https://en.wikipedia.org)[5].
  • Opera 12[6]
  • Internet Explorer 11[7]

Implémentation

Les en-tĂȘtes Strict-Transport-Security doivent ĂȘtre envoyĂ©s via des rĂ©ponses HTTPS. L'implĂ©mentation du cĂŽtĂ© client ne doit pas respecter les en-tĂȘtes HSTS qui ne sont pas envoyĂ©es via des rĂ©ponses HTTPS, ou par le biais de rĂ©ponses HTTPS qui ne sont pas configurĂ©es proprement, et sans certificat de confiance. Les bribes de configuration de serveur suivantes doivent ĂȘtre effectuĂ©es dans un contexte de bloc de configuration d'un site SSL, et les exemples de codes ne doivent ĂȘtre effectuĂ©s que dans un contexte de rĂ©ponses HTTPS.

Le temps maximum (max-age) est donnĂ© en secondes. Les 31536000 secondes (soit 365 jours) dans les exemples ci-dessous peuvent ĂȘtre remplacĂ©es par des valeurs plus grandes ou petites en fonction des besoins du gestionnaire du serveur web.

Implémentation Apache

# load module (example using [RHEL])
LoadModule headers_module modules/mod_headers.so
# redirect all HTTP to HTTPS (optional)
<VirtualHost *:80>
       ServerAlias *
       RewriteEngine On
       RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
# HTTPS-Host-Configuration
<VirtualHost 10.0.0.1:443>
      # Use HTTP Strict Transport Security to force client to use secure connections only
      Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
      # Further Configuration goes here
      [...]
</VirtualHost>

Implémentation Lighttpd

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=31536000; includeSubDomains; preload")
}

Implémentation Nginx

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

# Use HTTP Strict Transport Security to force client to use secure connections only
add_header Strict-Transport-Security max-age=31536000;

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

# Use HTTP Strict Transport Security to force client to use secure connections only with includeSubdomains 
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload;";

Implémentation Varnish

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

// Add the following line to your vcl_deliver
// Note: Varnish MUST be used with a frontend TLS proxy (e.g Hitch) for SSL/TLS support
sub vcl_deliver {
 	set resp.http.Strict-Transport-Security = "max-age=31536000; includeSubDomains";
}

Implémentation NodeJS

// Avec l' utilisation du paquet NPM helmet.
var helmet = require('helmet')
    ... 
    app.use(helmet.hsts({
          maxAge: 31536000000,
          includeSubdomains: true,
          force: true
    }));

Implémentation IIS

L'en-tĂȘte peut ĂȘtre ajoutĂ© en modifiant le fichier web.config.

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
            	<add name="Strict-Transport-Security" value="max-age=31536000"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Implémentation PHP

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;
// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

Implémentation Perl

# Use HTTP Strict Transport Security to force client to use secure connections only
use CGI;
use URI;
my $q   = new CGI;
my $url = URI->new($cgi->request_uri)
my $use_sts = 1;
if ($use_sts and $url->scheme eq 'https') {
    print $q->header('Strict-Transport-Security' => 'max-age=31536000; includeSubDomains; preload'); 
} elsif ($use_sts) {
    $url->scheme('https');
    print $q->redirect(status => 301, location => $url);
}

Implémentation Ruby on Rails

config.force_ssl = true

Implémentation ASP

Dim use_sts
use_sts = True
If use_sts = True And Request.Url.Scheme = "https" Then
    Response.AddHeader "Strict-Transport-Security","max-age=31536000"
ElseIf use_sts = True And Request.Url.Scheme = "http" Then
    Response.Status="301 Moved Permanently"
    Response.AddHeader "Location", "https://" + Request.Url.Host + Request.Url.PathAndQuery
End If

Implémentation ASP.NET Core

//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddHsts(opts =>
    {
        opts.MaxAge = TimeSpan.FromSeconds(31536000);
        // Activer pour les sous-domaines, et autoriser l'ajout du site dans les listes préchargées
        opts.IncludeSubDomains = true;
        opts.Preload = true;
    });
    // Configuration des autres services
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (!env.IsDevelopment())
    {
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    // Configuration de l'application
}

Implémentation ColdFusion Markup Language (CFML)

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

<cfset use_sts = true>
<cfif use_sts is "True"> 
  <cfheader name="Strict-Transport-Security" value="max-age=31536000">
<cfelseif use_sts is "True"> 
  <cfheader statuscode="301" statustext="Moved permanently">
  <cfheader name="Location" value="https://" + CGI.SERVER_NAME + CGI.SCRIPT_NAME + CGI.QUERY_STRING>
</cfif>

Implémentation JavaServer Pages (JSP)

use_sts = true;
if(use_sts) {
  if(request.getScheme().equals("https")) {
    // Envoi de l'en-tĂȘte HSTS
    response.setHeader("Strict-Transport-Security", "max-age=31536000");
  } else {
    response.setStatus(301);
    url = "https://" + request.getServerName() + request.getPathInfo() + request.getQueryString();
    response.setHeader("Location", url);
  }
}

Implémentation Visual Basic .NET

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

Dim use_sts As Boolean = True
If use_sts = True Then
    Response.AppendHeader("Strict-Transport-Security", "max-age=31536000")
ElseIf use_sts = True Then
    Response.AppendHeader("Status-Code", "301")
    Response.AppendHeader("Location", "https://")
End If

Implémentation F5 BIG-IP LTM

Créer une iRule et l'appliquer à votre Virtual Server HTTPS.

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

# iRule "Insert_HTTP_Strict_Transport_Security" 
when HTTP_RESPONSE {
   HTTP::header insert Strict-Transport-Security "max-age=31536000 ; includeSubDomains ; preload"
}

Implémentation HAProxy

Ajouter cette ligne dans la partie frontend HTTPS du fichier de configuration.

Cette implémentation du protocole est partielle et ne propose pas la redirection à partir d'un environnement non sécurisé.

http-response set-header Strict-Transport-Security max-age=31536000;\ includeSubDomains;\ preload;

Implémentation OpenBSD httpd

server "example.com" {
  listen on 10.0.0.1 port 80
  block return 301 "https://$HTTP_HOST$REQUEST_URI"
}
server "example.com" {
  listen on 10.0.0.1 tls port 443
  hsts max-age 31536000
  hsts subdomain
  hsts preload
  # Further Configuration goes here
}

Notes et références

  1. (en) https://dev.chromium.org/sts
  2. « HSTS arrive dans Firefox 4 », sur linuxfr.org (consulté le ).
  3. (en) « HTTP Strict Transport Security – Mozilla Security Blog », sur Mozilla Security Blog (consultĂ© le ).
  4. (en) « Preloading HSTS – Mozilla Security Blog », sur Mozilla Security Blog (consultĂ© le ).
  5. (en) https://www.eff.org/https-everywhere sur le site de l'Electronic Frontier Foundation
  6. (en) « How can we help you? - Opera Help », sur Opera Help (consulté le ).
  7. (en) « HTTP Strict Transport Security comes to Internet Explorer 11 on Windows 8.1 and Windows 7 », sur Microsoft Edge Blog, (consulté le ).

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.