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 :
- 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.
- 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
Navigateurs supportant HSTS
- 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
- (en) https://dev.chromium.org/sts
- « HSTS arrive dans Firefox 4 », sur linuxfr.org (consulté le ).
- (en) « HTTP Strict Transport Security â Mozilla Security Blog », sur Mozilla Security Blog (consultĂ© le ).
- (en) « Preloading HSTS â Mozilla Security Blog », sur Mozilla Security Blog (consultĂ© le ).
- (en) https://www.eff.org/https-everywhere sur le site de l'Electronic Frontier Foundation
- (en) « How can we help you? - Opera Help », sur Opera Help (consulté le ).
- (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
- (en) RFC 6797
- RFC 6797: HTTP Strict Transport Security (HSTS) sur le site de Stéphane Bortzmeyer