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
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
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.
┬─[[email protected]:~]─[02:42:49] ╰─>$ curl -s -D- https://wp.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.
┬─[[email protected]:~]─[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
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 :
- Header always set Strict-Transport-Security « max-age=2592000 »
- Header set X-XSS-Protection « 1; mode=block »
- Header set X-Content-Type-Options nosniff
- Header set Connection keep-alive
- Header always append X-Frame-Options « SAMEORIGIN »
- Le HSTS déjà vu,
- Protection contre le cross-site-scripting (XSS),
- Protection contre l’analyse de type MIME,
- 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,
- 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>
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.
- https://www.ssllabs.com/ssltest Test SSL complet,
- https://www.htbridge.com/ssl/ Tests SSL mais aussi Headers etc, tenant compte des recommandations PCI/NIST,
- https://tls.imirhil.fr/ Tests SSL, TLS, SSH axés sur leur degré de sécurité,
- http://www.webconfs.com/http-header-check.php Test des Headers,
- https://tools.keycdn.com/http2-test Test HTTP2,
- https://spdycheck.org/ Test SPDY.