Tech Blog.

Thoughts, stories, ideas.

Sécurité du serveur

7. April 2017

Dans le domaine des serveurs web, il existe de nombreuses possibilités pour mieux sécuriser les connexions, mais aussi pour prévenir les attaques intersites.

SSL

Les configurations SSL/TLS simples sont montrées ici en premier, suivies des fonctions SSL/TLS étendues telles que HSTS et OCSP. En principe, il est recommandé de toujours copier les protocoles et suites de chiffrement actuels, par exemple à partir du Mozilla Wiki. Celles-ci sont souvent mises à jour et non seulement les différentes suites de chiffrement sont listées, mais la liste de compatibilité correspondante est également ajoutée.

Bien que la configuration “Moderne” soit souhaitable, les clients plus âgés ne pourront souvent plus se connecter aux serveurs en conséquence. Il est donc préférable d’utiliser la configuration “Intermédiaire”. Dans le Mozilla Wiki et sur Cipherli.st les configurations des différents logiciels sont toujours données. Cipherli.st peut être plus clair et montrer plus d’exemples, mais les suites de chiffrement ne sont pas aussi bien pensées que dans le wiki Mozilla. Par conséquent, les suites de chiffrement doivent être extraites du wiki de Mozilla.

Nginx

server {
listen 80 default_server;
listen [::]:80 default_server;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# Certs sent to the client in SERVER HELLO are concatenated
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;
# Intermediate configuration, tweak to your needs
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling
# Fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
## Verify chain of trust of OCSP responses
ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
resolver <IP DNS resolver>;
[...]
}

Nginx attend comme certificat CA (paramètre ssl_certificate) le certificat de toutes les AC intermédiaires et le propre certificat de serveur (tous au format PEM). Ceux-ci peuvent simplement être copiés ensemble (le premier certificat dans le fichier doit être le certificat du serveur).

Apache

<VirtualHost *:443>
[...]
SSLEngine on
SSLCertificateFile /path/to/signed_certificate_followed_by_intermediate_certs
SSLCertificateKeyFile /path/to/private/key
 
# Uncomment the following directive when using client certificate authentication
#SSLCACertificateFile /path/to/ca_certs_for_client_authentication
 
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000"
[...]
</VirtualHost>
# Intermediate configuration, tweak to your needs
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)

Test

Pour tester les serveurs HTTPS, Qualys SSL Labs est la meilleure solution. Il y a aussi des tests intégrés rapidement pour les nouvelles attaques, qui testent les serveurs pour les vulnérabilités. On peut aussi utiliser Hardenize. Cependant, ce système est encore en phase de test.

Il est possible de tester manuellement avec `openssl’, le test suivant peut facilement être étendu avec vos propres paramètres. Il ne s’agit que d’une commande de base, qui affiche le contenu du certificat du serveur sous forme de texte. Il peut également être utilisé pour tester la suite de chiffrement, mais comme il s’agit de commandes longues et nombreuses, il est recommandé de le faire avec les services existants. Si cela n’est pas souhaité ou techniquement impossible, par exemple Décodeur SSL peut être installé et exécuté localement, les sources se trouvent sur GitHub.

$ openssl s_client -connect example.com:443 2>/dev/null </dev/zero | openssl x509 -noout -text

Les autres paramètres sont documentés dans la page de manuel s_client et x509.

Autres fonctionnalités dans le domaine du SSL/TLS

Les serveurs Web peuvent également fournir des en-têtes pour Strict-Transport-Security et Public-Key-Pins. Ce qui est désiré et ce qui ne l’est pas dépend de l’application.

La sécurité des transports – RFC 6797

L’idée derrière cela est que si un navigateur a déjà eu une connexion à un site Web, il saura à l’avenir que HTTPS devrait toujours être utilisé. La valeur envoyée par le serveur web est le nombre de secondes pendant lesquelles ce paramètre doit être valide.

Épinglettes à clé publique – RFC 7469

Avec l’épinglage à clé publique (HPKP), les ” Infos sur la clé publique du sujet ” sont spécifiées dans le certificat (déjà dans la demande de signature de certificat), que le serveur Web doit fournir. Avec la croissance rapide de la distribution de Let’s Encrypt, ce n’est plus aussi simple qu’avant, puisque les certificats y sont automatiquement renouvelés. Si toujours la même demande de signature de certificat est utilisée, HPKP fonctionne, mais cela doit être implémenté par le client Let’s Encrypt. La compréhension du HPKP est extrêmement importante pour une mise en œuvre correcte. Si des erreurs sont commises, les sites Web peuvent ne pas pouvoir être utilisés par certains clients pendant une période plus longue. Les clés de sauvegarde sont obligatoires et sont également requises par RFC. Bien sûr, les sauvegardes du serveur ne doivent pas être oubliées.

Poursuivant

Les serveurs Web devraient également fournir certains en-têtes, par exemple contre les scripts intersites. Ce qui est désiré et ce qui ne l’est pas dépend de l’application. securityheaders.io offre la possibilité de tester des en-têtes communs :

  • Politique de sécurité du contenu
  • Options X-frame
  • Protection X-XSS
  • Options de type de contenu X

Ces options peuvent avoir un impact sur le site Web et nécessiter des ajustements spécifiques.

Une configuration possible de Nginx ressemble à ceci (dans la section serveur) :

add_header Strict-Transport-Security "max-age=15768000 ; includeSubDomains ; preload" ;

add_header Content Security Policy "script-src'self'" ;

add_header X-Frame-Options "SAMEORIGIN" ;

add_header X-XSS-Protection "1 ; mode=block" ;

add_header X-Content-Type-Options "nosniff" ;

Les valeurs correspondantes sont configurées par défaut et doivent être ajustées pour que la page fonctionne également. Les navigateurs courants dans les outils de développement montrent ce qui a été empêché lors du chargement de la page. Ceci vous permet de déduire quelles valeurs doivent encore être ajoutées.

Liens