Apache2, HTTP2, SPDY, HSTS, OSCP et SSL hardening

apache2 24 mai 2016

 

Puisque j’ai récemment été incité à déménager mon blog, ce que je repoussais depuis un bail, j’en ai profité pour tester Apache2 que je ne connais pas ou très peu. Et ma 1ère leçon fut que ça ne fonctionne vraiment pas comme Nginx, ni dans la configuration ni dans l’écriture de celle-ci…

Pour un blog comme le mien, avec moins de 200 400 visiteurs uniques/jour, Apache2 fait très bien le boulot. Nginx est à préférer pour les sites à fort trafic et ceux voulant héberger plusieurs services sur un même serveur. Nginx est à la fois plus performant mais aussi plus simple à configurer une fois qu’on a compris comment marche un bloc.

Voici quelques notions de renforcement du degré de confidentialité des échanges de votre site avec ses visiteurs au travers du moteur Web Apache2 et de la configuration SSL :

  • HTTP2 (TL;DR) : HTTP bis, nouveau protocole de transfert (uniquement en SSL) visant à accélérer les échanges et développé suite à la création de SPDY par Google. Meilleure compression et chiffrement plus performant,
  • SPDY : Protocole de transfert développé donc Google pour accélérer les échanges, expérimental (surtout sur Apache2…),
  • PFS (Perfect Forward Secrecy avec DHparam) : (en trèès simplifié) Création de clés de chiffrement/déchiffrement éphémères ce qui rend impossible le déchiffrement d’un échange passé,
  • HSTS : Permet au serveur de forcer l’accès du navigateur avec le certificat en place uniquement, pendant X secondes. Donc si le certificat change, le navigateur affiche une erreur. Le but étant de se prémunir contre un changement inopiné de certificat SSL d’un site Web, en cas de piratage par exemple. Attention à passer HSTS à 0 quelques temps avant de changer votre certificat SSL… (cf souci LTL à l’époque)
  • OSCP stapling : Vérification de la validité du certificat SSL en temps réel auprès de l’autorité émettrice,
  • TLS/SSL & Ciphers : Protocoles & algorithmes de chiffrement des communications,
  • Headers (Apache2) : Quelques règles de sécurité basique.

Il est possible de faire plus et mieux (HPKP, DNSSEC, CSP…) mais je considère que pour un simple blog c’est déjà pas mal. Surtout qu’il ne faut pas perdre de vue que renforcer la sécurité signifie aussi “se passer de visiteurs” dont les OS/navigateurs ne sont pas à jour. Personnellement je me moque de perdre des visiteur mais comprenez bien que dans le cas d’une banque en ligne c’est à double-tranchant. Si on peut reprocher à la SG d’être par exemple mal classée niveau sécurisation de son site client on peut tout de même se dire que si elle était A+ alors sans doute que de nombreux clients ne pourraient tout simplement pas s’y connecter.

Hyper sécurité ou concessions et accessibilité, il faut parfois choisir.

 

 

HTTP2

En BETA et il faut pour en profiter passer sur l’une des dernière moutures du moteur Web (comme pour Nginx), à partir de là 2.4.17 plus précisément.

Pour l’activer dans Apache2

sudo a2enmod http2
sudo service apache2 restart

Et pour le mettre en place pour votre site (SSL uniquement, donc port 443) il vous faut éditer votre configuration du virtualhost concerné et ajouter cette ligne

<VirtualHost *:443>
 Protocols h2 http/1.1

Testez

 

 

SPDY

Comme je vous le disais SPDY est un protocole créé par Google. Rien de mal à ça mais HTTP2 a pour vocation de le remplacer et d’être plus largement usité. La logique veut donc qu’on active l’un ou l’autre.

Pour l’activer c’est la croix et la bannière sur Apache2 (>2.4.x) en comparaison avec Nginx.

cd /usr/local/
wget https://www.rivy.org/static/mod_spdy.tar.gz
tar zxf mod_spdy.tar.gz
cd /usr/lib/apache2/modules
mv /usr/local/mod-spdy/mod-spdy/src/mod_ssl.so .
mv /usr/local/mod-spdy/mod-spdy/src/out/Release/libmod_spdy.so mod_spdy.so
echo "LoadModule spdy_module /usr/lib/apache2/modules/mod_spdy.so" | tee /etc/apache2/mods-available/spdy.load
echo "SpdyEnabled on" | tee /etc/apache2/mods-available/spdy.conf

a2enmod spdy
service apache2 restart

Testez

 

 

PFS

Concrètement, un échange de clés éphémères Diffie-Hellman (DH) rend impossible le déchiffrement d’une information déjà passée. Notamment utilisé par OTR (sécurisation d’un conversation à 2 sur IRC/XMPP).

Il faut donc commencer par générer un clé DH 4096 bits. Pourquoi 4096 bits ? Parce que 1024 bits ne sert à rien (cf LogJam) et quitte à chiffrer fortement autant être complet. Sachant que plus de 4096 bits, comme pour une clé GPG relève de la parano pure et dure ou de l’anticipation du déchiffrement par des ordinateurs quantiques.

openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Et il faut ensuite l’indiquer dans votre configuration SSL

SSLOpenSSLConfCmd       DHParameters "/etc/ssl/certs/dhparam.pem"

 

 

HSTS

Pour l’activer commencez par activer le module headers d’Apache2

sudo a2enmod headers
sudo service apache2 restart

Pour éditez votre configuration Virtualhost (/etc/apache2/sites-enabled/monsiteweb.conf) et ajoutez cette ligne. Avec le nombre de secondes que vous voulez (convertissez en mois par exemple). Dans mon cas 2592000 secondes soit 30 jours.

<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=xxxxxx; includeSubdomains; preload"

Testez à la main ou via l’un des sites que je mentionnerai à la fin de l’article.

┬─[ayx@Aerya:~]─[02:42:49]                                                      
╰─>$ curl -s -D- https://upandclear.org | grep Strict
Strict-Transport-Security: max-age=2592000

 

 

OSCP stapling

Éditez votre fichier de configuration SSL pour y ajouter cette ligne

SSLUseStapling On

Puis éditez votre Virtualhost et ajoutez-y ces lignes, après le Vhost justement.

</VirtualHost>

SSLStaplingResponderTimeout             5
SSLStaplingReturnResponderErrors        off
SSLStaplingCache                        shmcb:/var/run/ocsp(128000)

Ou suivez ce guide. Testez à la main ou via l’un des sites que je mentionnerai à la fin de l’article.

openssl ...

┬─[ayx@Aerya:~]─[02:52:39]
╰─>$ openssl s_client -connect upandclear.org:443 -tlsextdebug  -status
CONNECTED(00000003)
TLS server extension "renegotiation info" (id=65281), len=1
0001 - <SPACES/NULS>
TLS server extension "EC point formats" (id=11), len=4
0000 - 03 00 01 02                                       ....
TLS server extension "status request" (id=5), len=0
TLS server extension "heartbeat" (id=15), len=1
0000 - 01                                                .
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = upandclear.org
verify return:1
OCSP response: 
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
    Produced At: May 23 14:07:00 2016 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D
      Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1
      Serial Number: 03F771BBB8D78F4A3EB369ACE32B065F52AC
    Cert Status: good
    This Update: May 23 14:00:00 2016 GMT
    Next Update: May 30 14:00:00 2016 GMT

    Signature Algorithm: sha256WithRSAEncryption
         05:2e:45:b6:ce:cf:80:41:64:7b:f2:b5:bd:30:4e:b4:51:5d:
         2d:ed:7c:82:af:c4:a2:75:b1:a4:f7:71:23:0e:bd:66:a6:d0:
         fc:21:26:49:aa:bd:38:e0:f3:b0:bf:fa:3c:95:a5:17:3a:d7:
         99:e5:c8:69:8e:55:f3:e9:01:a2:f4:6a:f2:5c:74:95:35:3c:
         c6:a5:bd:a7:93:ad:59:32:f3:d4:83:14:ca:bf:5f:68:8e:c7:
         a7:9e:47:da:ef:dd:1f:e0:6b:31:7d:db:2b:04:e2:70:1f:64:
         a7:2b:4e:71:0e:c2:52:e0:ca:e5:b3:01:52:8c:f8:46:4f:a3:
         7f:5e:12:00:26:64:c7:3e:43:d7:85:ea:27:2a:2a:8c:f9:d7:
         cb:1a:6f:d4:3f:88:cd:8a:49:f9:81:91:0d:c6:61:06:7a:4e:
         75:22:d6:33:68:32:ab:95:16:62:2f:e9:2f:66:ed:81:b6:ec:
         d6:56:5a:db:2c:65:5f:70:5e:b7:b0:55:12:bf:34:c1:01:9a:
         cc:6b:6c:7b:67:86:5d:71:00:9f:e3:4c:df:b1:a3:b4:a5:34:
         ba:ec:dc:85:46:98:a9:9f:f5:33:f8:b7:ed:5c:f3:91:ca:88:
         08:fc:9b:3a:7a:a2:37:2e:b0:46:30:95:70:22:f3:f4:63:d5:
         34:1b:3e:c7
======================================
---
Certificate chain
 0 s:/CN=upandclear.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFFDCCA/ygAwIBAgISA/dxu7jXj0o+s2ms4ysGX1KsMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjA1MjMxMzA4MDBaFw0x
NjA4MjExMzA4MDBaMBkxFzAVBgNVBAMTDnVwYW5kY2xlYXIub3JnMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmiuYZ/BsRwwtLBTN5a2NB9tSmsKS7IcT
ssVVsm2ogmpC7KqHfexKKn+t5qPavGav4Cw/JmhCaT39LqlkKXG8glJv8cBbpCPJ
lRBkrBG61BGUUS2EdAIRaKJAj7cPidqohLAJAeXpCZIuMec4y+/OnsvNMHtfosi4
mn+Tmy/lDUkM9sX9WbkCX20OMTCZSG+2t2DdWBED10lrSOz2luXxp/XXo4WB+uXK
gLOY0Nmu0PLqbRzBnGdG4psMvOH3ywhXc314UpP/etIgQtOogY/9dwswT9cMneFp
omPf13u3wZjX7SObjKWOSQD+G6Gnru7pdP2oCBYspGERMt0KAjUgowIDAQABo4IC
IzCCAh8wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRoMNxFaY35ExIt+PcD1JlnFuNf
ujAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRk
MGIwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlwdC5v
cmcvMC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQu
b3JnLzAtBgNVHREEJjAkgg51cGFuZGNsZWFyLm9yZ4ISd3d3LnVwYW5kY2xlYXIu
b3JnMIH+BgNVHSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAm
BggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUF
BwICMIGeDIGbVGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBv
biBieSBSZWx5aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRo
IHRoZSBDZXJ0aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5j
cnlwdC5vcmcvcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBABiBmq+FUcPi
TF1Gz4lbcqyBzC1pAHLTnXgJ55kyEelLT/LsYj1k7QWR6qPKAHBO5bPIflVAmdYg
crXJnYLc3waO2oIZw2Z47lgKPPn7oLCHN+6ws67r1OuICCexGiSjIZDNJb/lGb+M
pQC2DcUCQhuT3MYmmMAHOwUl+Gvh7cvBxQ/UR222BMJVW5DTZG0i/ddsU0FAE4eo
Hsv8LOATZBO5eesPMzEoWhK5c2xNl/1d6TGRPl+aItHP+lMA2J24dwuIbViGyQgs
2oyfK+Nd4dZ3GgrAmbY76zFG7LrOYFzBoW9qGPgXoxnptK53PRoTXA5Zvk+OXevG
v/adif0JDHA=
-----END CERTIFICATE-----
subject=/CN=upandclear.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3542 bytes and written 442 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: A7E31F685DA4C648CE2BAD31AEBBCDB94BDCB022B942712BD039298EE47B3FCB
    Session-ID-ctx: 
    Master-Key: 1E09D26C8D098978D91E9250777254159F294BB536614CF1FDDAF543D523CB24D1B93BA9A2F356541E17CB045B140CE5
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1464051173
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
closed

[collapse]

Dans ce cas, seule la dernière partie nous intéresse.

OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
    Produced At: May 23 14:07:00 2016 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D
      Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1
      Serial Number: 03F771BBB8D78F4A3EB369ACE32B065F52AC
    Cert Status: good

Mais vous pouvez voir également, à la fin, quels protocole & algorithme de chiffrement sont utilisés par mon PC pour se connecter au site Web.

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384

 

 

SSL/TLS & Ciphers

Pour chiffrer/déchiffrer il faut un outil de chiffrement, l’algo, et un moyen de transport, le protocole.

On, je, parle souvent de SSL plus que de TLS. C’est une déformation de langage puisque TLS est le successeur de SSL. Pour la faire simple, il n’y a que TLS dans sa version 1.2 qui soit encore sécurisé, les autres souffrant de failles (SSL à TLSv1.1) et TLS1.3 étant toujours en développement. Même si TLS v1.1 est encore largement utilisé par des sites Web pour une meilleure accessibilité de l’ensemble des navigateurs/OS. Pour info le TLSv1 (tout comme TLS_RSA) est même obligatoire selon les recommandations du NIST

Niveau algorithmes, force est de constater qu’ils sont eux aussi en grande parie obsolètes. Je vous laisse lire l’excellent article, heureusement plus vulgarisateur que “technico-technique”, d’Aeris sur TLS/HTTPS.

Concernant U&C j’ai décidé de n’accepter que TLS v1.2/1.3 et ECDHE qui reprend le principe des clés éphémères de PFS. Mon HTTPS peut donc être noté A (max A+) bien que justement il soit contraignant et puisse empêcher certains OS/navigateurs d’accéder à mon site comme on le voit dans la partie Handshkae simulation.

# Config SSL U&C.org
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder     on
SSLCompression          off
SSLSessionTickets       off

SSLProtocol : protocoles autorisés, “tous sauf”

SSLCipherSuite : algo autorisés

SSLHonorCipherOrder : Respecter l’ordre des algo (le navigateur tente le 1er, puis le 2nd etc jusqu’à ce qu’il tombe sur 1 qu’il comprend)

SSLCompression : Compression SSL, à désactiver par sécurité

SSLSessionTickets : Sessions SSL, sécurité accrue si activés mais contraignant.

 

 

Headers

C’est l’en-tête d’un fichier informatique. On en entend plus souvent parler à propos des emails ou de HTML que de HTTP. Mettre des règles de Headers dans votre configuration HTTP (fichier de conf Apache2 ou .htaccess) contribue à façonner la manière dont les navigateurs pourront accéder à et traiter vos pages. C’est un élément de sécurité comme un autre à la fois pour votre site mais aussi pour vos visiteurs. Voici quelques exemples :

  1. Header always set Strict-Transport-Security “max-age=2592000”
  2. Header set X-XSS-Protection “1; mode=block”
  3. Header set X-Content-Type-Options nosniff
  4. Header set Connection keep-alive
  5. Header always append X-Frame-Options “SAMEORIGIN”
  1. Le HSTS déjà vu,
  2. Protection contre le cross-site-scripting (XSS),
  3. Protection contre l’analyse de type MIME,
  4. Une connexion TCP, par défaut, se ferme dès la fin d’un échange (requête/réponse). Ceci permet de la maintenir active dans le but d’accélérer les communications,
  5. Protection contre le détournement de clic.

Par exemple dans votre .htaccess

<IfModule mod_headers.c>
Header set Connection keep-alive
Header set X-XSS-Protection "1; mode=block"
Header always append X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options: "nosniff"
</IfModule>

Dans votre Virtualhost

<VirtualHost *:443>
        Protocols h2 http/1.1
        Include /etc/apache2/ssl/options-ssl-apache2.conf

        Header always set Strict-Transport-Security "max-age=2592000; includeSubdomains; preload"
        Header set X-XSS-Protection "1; mode=block"
        Header set X-Content-Type-Options nosniff

...

</VirtualHost>

Testez

 

 

Site d’évaluation

Le but n’est évidemment pas de savoir qui a la plus grosse mais de s’informer et/ou tester ses propres configurations. Tous ces liens sont ceux des “Testez” de cet article et/ou des sites que j’affectionne pour l’analyse de sites/certificats.

 

 

 

 

Mots clés