Uitschakelen oude TLS-versies op Apache
Transport Layer Security (TLS) en zijn voorganger Secure Sockets Layer (SSL) zijn encryptie-protocollen voor de beveiging van verbindingen tussen computers. Een van de meest zichtbare toepassingen is het gebruik van HTTPS en het slotje in de adresbalk van een webbrowser. Op de achtergrond wordt de verbinding tussen je pc en de webserver dan beveiligd door middel van TLS.
Met een oorsprong in 1994, zijn er door de jaren heen diverse updates doorgevoerd aan deze encryptieprotocollen:
- 1994 - Eerste ontwikkling van Secure Sockets Layer
- 1995 - Uitbrengen SSL 2.0
- 1996 - Uitbrengen SSL 3.0, omdat 2.0 veel kwetsbaarheden bevatte
- 1999 - Uitbrengen Transport Layer Security (TLS) 1.0
- 2006 - Uitbrengen TLS 1.1
- 2008 - Uitbrengen TLS 1.2, met betere hashes (op basis van SHA-256) en AES-ondersteuning
- 2011 - Update van TLS 1.2, waarbij SSL 2.0 definitief onbruikbaar werd
- 2018 - Uitbrengen TLS 1.3
Binnen de Apache HTTPD wordt TLS/SSL ondersteuning aangeboden vanuit de module mod_ssl. Mod_ssl bevat diverse instructies om TLS/SSL in Apache te configureren.
Detecteren huidige TLS/SSL-ondersteuning
Meten is weten! Je kunt door middel van de tool Nmap eenvoudig controleren welke TLS/SSL versies jouw webserver
ondersteund. Voer hiervoor het volgende commando uit, waarbij je domain.tld
uiteraard vervangt door de naam van je
website/webserver:
nmap -sV --script ssl-enum-ciphers -p 443 domain.tld | grep -E 'SSLv|TLSv'
Je krijgt als het goed is nu een knipsel uit het volledige rapport, wat er ongeveer uit kan zien als:
| SSLv3:
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| TLSv1.0:
| TLSv1.1:
| TLSv1.2:
Hierin is zichtbaar dat webserver in dit voorbeeld ondersteuning biedt voor SSL 3.0, TLS 1.0, TLS 1.1 en TLS 1.2. Op basis van de korte geschiedenis dit hierboven in de intro is geschetst zul je al snel tot de conclusie komen dat alles ouder dan TLS 1.2 ongewenst is. Dit kun je echter vrij eenvoudig oplossen in de configuratiebestanden van je webserver.
Uitschakelen oude TLS/SSL-versies in Apache HTTPD
In onderstaande voorbeelden ga ik uit van een webserverconfiguratie op basis van Apache 2.4 op CentOS Linux 7. Andere Linux-distributies gaan hier vergelijkbaar mee om, maar zullen configuratiebestanden wellicht net op een andere locatie hebben staan.
De TLS/SSL-functionaliteit binnen Apache HTTPD wordt aangeboden via module mod_ssl. Standaard vind je de configuratie
daarvan in: /etc/httpd/conf.d/ssl.conf
. De belangrijkste regels die je gebruikt bij het uitschakelen van oude
TLS/SSL-versies zijn:
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
SSLHonorCipherOrder on
Pas deze regels aan, zodat we er als volgt uitzien:
SSLEngine on
SSLProtocol TLSv1.2
SSLCipherSuite HIGH:!3DES:!aNULL:!MD5:!SEED:!IDEA
SSLHonorCipherOrder on
Wat hebben we zojuist gedaan?
SSLProtocol
is aangepast zodat er alleen ondersteuning is voor TLS 1.2. De eerdere configatie gaf aan dat alle beschikbare protocollen worden ondersteund, behalve SSL 2.0.SSLCipherSuite
is verder beperkt door ook de 3DES-suites uit te schakelen.
Je dient het webserverproces wel even te herstarten om deze nieuwe configuratie te activeren:
systemctl restart httpd.service
Controleer nu nog even of het helemaal goed is gegaan, door dezelfde Nmap check nogmaals uit te voeren:
nmap -sV --script ssl-enum-ciphers -p 443 domain.tld | grep -E 'SSLv|TLSv'
Help! #1: TLS/SSL-versies worden niet uitgeschakeld
In sommige gevallen zijn bovenstaande stappen niet genoeg. Eén van die gevallen is wanneer je Let's Encrypt gebruikt in
combinatie met de tool certbot
. In dat geval is er namelijk nog wat extra configuratie van mod_ssl actief in het
configuratiebestand /etc/letsencrypt/options-ssl-apache.conf
. Hier pas je dezelfde wijzigingen toe als hierboven, en
dan werkt het wel.
Meer info
- Website mod_ssl: https://httpd.apache.org/docs/current/mod/mod_ssl.html