Secure TLS Configuratie

Voor het beveiligen van de webservers is een van de middelen een TLS (opvolger van SSL) en versleutelde verbinding aanbieden aan de gebruikers. Naast de browsers wordt TLS ook gebruikt tussen servers en met API verbindingen.
De veiligheid van deze verbinding hangt en staat aan een goede configuratie die tevens ook gebruikt kan worden door de meest gebruikte browsers. De beveiliging van TLS ligt voor groot deel aan de kant van de webserver en de DNS. . Hierin zitten een aantal configuratie mogelijkheden om de verbinding veiliger te maken dan de standaard installatie.

Er wordt in dit security blog uitgelegd hoe je deze verbinding beter kunt beveiligen.

TLS versie

Voor het gebruik van TLS zijn verschillende versies beschikbaar. Voor TLS zijn de versies 1.0, 1.1 en 1.2 de meest gebruikte. Inmiddels is 1.3 ook beschikbaar maar de ondersteuning in de software is nog te minimaal om deze te gebruiken. TLS 1.1 of hoger is vereiste en zal op elke server separaat moeten worden geconfigureerd.

Key Exchange

Het eerste deel van de configuratie (bv ECDHE-ECDSA-AES256-GCM-SHA384) is de sleutel uitwisseling. Alle opties met Ephemeral (de E achter het protocol) ondersteunen standaard Perfect Forward Secrecy (PFS) en dat is een vereiste om de verbinding optimaal te beveiligen.

De volgende settings zijn goed

  • ECDHE - Eliptic Curve Diffie Helmann Ephemeral
  • DHE - Diffie Helmann Ephemeral

Optioneel en alleen voor backward compatibiliteit. Mits deze als laatste in de configuratie staan.

  • RSA

Authentication

Het tweede deel van de configuratie (bv ECDHE-ECDSA-AES256-GCM-SHA384) is de authenticatie.

Deze mag de volgende settings bevatten

  • ECDSA
  • DSA
  • RSA

Bulk Encryption and MAC

Het derde en vierde deel van de configuratie (bv ECDHE-ECDSA-AES256-GCM-SHA384) is de encryptie van de data.

Deze mag de volgende settings bevatten (AEAD compatible protocollen, zie note).

  • AES128-GCM
  • AES256-GCM
  • CHACHA20-POLY1305

Optioneel en alleen voor backward compatibiliteit. Mits deze als laatste in de configuratie staan want dit zijn geen AEAD compatible protocollen.

  • AES-CBC
  • AES256-CBC

NOTE: Authenticated Encryption with Additional Data cipher (AEAD) provides both authenticated encryption (confidentiality and authentication) and the ability to check the integrity and authentication of additional authenticated data (AAD) that is sent in the clear.

Hashing

Het vijfde deel van de configuratie (bv ECDHE-ECDSA-AES256-GCM-SHA384) is hashing van het message authentication code.

Deze mag de volgende waarden  bevatten

  • SHA256
  • SHA384
  • SHA512

Optioneel en alleen voor backward compatibiliteit. Mits deze als laatste in de configuratie staan.

  • SHA

OCSP stapling

Voor veilig gebruik van digitale certificaten is een zorgvuldige controle op de geldigheid van de certificaten erg belangrijk. Voor deze controle kan gebruik gemaakt worden van een CRL of van OCSP. Een snelle en veilige variant van de laatste is OCSP stapling. Dit hoort ingeschakeld te zijn voor servers die publiek benaderbaar zijn en/of waar certificaten gecontroleerd moeten worden.

Session Resumption

Omdat je in een TLS sessie niet wilt dat deze opnieuw gebruikt worden, moet Session Resumption uitgeschakeld worden. Dit maakt de server wel wat trager maar is qua beveiliging van de TLS verbinding een goede stap.

HSTS en preloading

HSTS staat voor HTTP Strict Transport Security en zorgt er voor dat de website altijd met TLS geladen wordt. Dit is een security maatregel om er voor te zorgen dat Non-TLS wel kan maar overruled wordt door TLS (HTTPS). Met de directive preload kunnen websites worden gemarkeerd voor preloading om het “First-Visit-Problem” te voorkomen. HSTS en preloading kun je aanzetten door een header op te nemen in de website zelf.

Hoe je domeinen redirect van non-TLS naar TLS heeft ook invloed op HSTS. De juiste manieren zijn:

Deze setting kun je opnemen in de header configuratie:

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

Nadat je de setting hebt opgenomen kun je het domain registreren voor preloading op de volgende website: https://hstspreload.org/

Certificate Transparency

Certificate Transparency is een relatief nieuwe functie binnen de PKI. CA’s publiceren al hun uitgegeven certificaten en je kunt op de webserver een header meegeven die dat afdwingt.

Deze setting kun je opnemen in de header configuratie:

Expect-CT: max-age=7776000; enforce

Je kun zoeken op de uitgegeven certificaten op de website https://crt.sh/

DNS

Ook DNS heeft TLS gerelateerde onderwerpen. En om dat goed te doen is DNSSec eigenlijk wel een vereiste. DNSSEC is een uitbreiding op het Domain Name System (DNS). Het verhelpt een aantal kwetsbaarheden in DNS waardoor de 'bewegwijzering' van het internet veiliger en vertrouwder wordt. De DNSSEC mogelijkheid voegt een digitale handtekening toe aan de DNS-informatie. Daardoor weet je zeker dat, als mensen naar jouw site zoeken, ze ook bij jouw site uitkomen. 

Voor TLS verbindingen zijn twee records belangrijk.

CAA Record: Hierin staan de toegestane CA’s voor het domein.

Voorbeeld van drie CAA records:

  • 0 iodef Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.
    Mailadres wat gebruikt wordt indien er problemen zijn
  • 0 issue "digicert.com"
    De toegestaande CA’s. Dit kunnen meerdere records zijn en kunnen ook per subdomein geconfigureerd worden
  • 0 issuewild ";"
    Verbieden van wildcard certificaten

DANE TLSA Record: Hierin staat de hash van het certificaat. Dit kan een CA zijn maar ook het server certificaat. Je hebt per server (subdomein, poort nummer en protocol) een seperaat DNS records.

Voorbeelden (Hash is de Let's Encrypt CA)

  • _443._tcp: “2 1 1 60b87575447dcba2a36b7d11ac09fb24a9db406fee12d2cc90180517616e8a18”
  • _25._tcp.smtp: “2 1 1 60b87575447dcba2a36b7d11ac09fb24a9db406fee12d2cc90180517616e8a18”

Configuratie

https://mozilla.github.io/server-side-tls/ssl-config-generator/           

https://wiki.mozilla.org/Security/Server_Side_TLS

Testen

Om je configuratie te testen zijn verschillende website beschikbaar.

Voor deze website (https://cryptophobia.nl/) heb ik alle punten ingeregeld.

Afkortingen:

  • EC: ELliptic Curve cryptography
  • DH: Diffie Hellman sleuteluitwisselingsprotocol
  • E (aan einde): Ephemeral. Zorgt voor perfect forward secrecy.
  • RSA: Rivest, Shamir, Adleman. De drie bedenkers van RSA
  • SHA: Secure Hash Algorithm
  • AES: Advanced Encryption Standard
  • CBC: Cipher Block Chaining
  • GCM: Galois/Counter Mode, Authenticated encryption mode
  • DSA: Digital Signature Algorithm
  • CHACHA20: Stream cipher protocol, bedacht door Daniel J. Bernstein
  • POLY1305: Message authentication code, bedacht door Daniel J. Bernstein
  • CAA: Certificate Authority Authorization
  • HSTS: HTTP Strict Transport Security
  • DANE: DNS-based Authentication of Named Entities. TLSA records in de DNS
  • CRL: Certificate Revocation List
  • OCSP: Online Certificate Status Protocol