Security, encryptie, letsencrypt! *updated*

Excuses

Eerst en vooral zijn excuses op zijn plaats, door wat experimenten van mij is deze site gisteren enige uren niet bereikbaar geweest. Ook heeft het mobiele domein de afgelopen 24 uur een SSL foutmelding gegeven door een onoplettendheid van mij. Hiervoor excuses aan de mensen die hier last van ondervonden hebben.

Security

Zoals de meeste mensen die deze site wat regelmatiger lezen waarschijnlijk doorhebben ben ik een systeembeheerder van beroep en ben ik nogal fan van security. Helaas was ik daar met deze website niet zo mee bezig. Ik vond het te veel geld kosten om een betaald certificaat op deze site te zetten en een gratis of zelf signed certificaat wordt niet door alle browsers geaccepteerd helaas. Dus, geen SSL encryptie op verbindingen met deze website. Iets wat ik toch graag overal op het internet zie. Voor een Engelstalige uitleg over hoe SSL werkt en wat certificaten zijn klik hier.

Het begon allemaal toen ik gisteren een artikel las op security.nl over een tool die SSL gebruik op websites scant. Natuurlijk was ik nieuwsgierig dus heb ik deze tool even bekeken en zag ik dat deze op meer scant dan alleen SSL, zo scant hij ook op bepaalde HTTP headers die helpen om een zogenaamde Man In The Middle attack te voorkomen. Deze website scoorde op die tool maar 10 uit 100 punten! Natuurlijk had ik geen hoge score verwacht, ik had tenslotte geen SSL beveiliging op deze website maar ik was hier toch niet tevreden mee. Ik ben dus eens gaan zitten nadenken of ik niet toch een SSL certificaat kon aanvragen.

Letsencrypt

Sinds enige tijd was ik mij al bewust van het initiatief van letsencrypt, deze mensen willen graag dat elke website met verbindingen met encryptie worden uitgerust zodat het internet een veiligere plek word. Ook zij beseften dat dit best veel geld kost dus zijn ze gratis certificaten gaan aanbieden. Ze leveren zelfs een aantal tools om het installeren van je SSL certificaten makkelijk te maken. Helaas werkt dit tootlje niet heel goed samen met een op shared hosting ingerichte apache web server. Gelukkig kun je ook de 'certonly' optie gebruiken waardoor verificatie van je domein via een scriptje op je website kan. Het was natuurlijk wel even puzzelen om dit ook op mijn Drupal installatie voor elkaar te krijgen maar gelukkig vond ik al snel een artikel wat mij hier een simpele oplossing voor bood.

Nadat ik de letsencrypt tools dus had geïnstalleerd en na wat experimenteren met hoe het werkte heb ik een certificaat gegenereerd voor alle sites in deze Drupal installatie en dit in apache geconfigureerd. Dit was echt super makkelijk dus was zo gedaan.

Meer Security

Natuurlijk wou ik het liefste een score van de volle 100 halen in de scan tool dus ik ben daarna gaan kijken naar de seurity headers. Ik kende eerlijk gezegd beide varianten van de headers niet dus ik ben eens gaan googelen op deze namen en heb een beetje uitgezocht waar ze voor dienden en hoe ze in elkaar zaten. Vervolgens ben ik gaan zoeken hoe ik deze in Drupal kon configureren en vond ik hiervoor 2 modules: HTTP Strict Transport Security en Security Kit. Eerlijk gezegd was ik over beide niet zo enthousiast. Security Kit zorde er voor dat allerlei scripts die deze site nodig heeft alswel alle style sheets die voor de layout zorgen geblokkeerd werden. Ik heb geprobeerd deze module goed af te richten maar het leek er sterk op dat hij mijn input niet goed oppikte waardoor alles geblokkeerd werd.

Uiteindelijk ben ik gaan zoeken over hoe ik deze headers via apache zelf kon toevoegen en heb ik voor die weg gekozen en de volgende headers opgenomen in mijn apache configuratie:

# Header settings
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Met deze settings scoorde ik in ieder geval 60 van de 100, Dit komt voornamelijk door de setting 'unsafe-inline' maar zonder deze setting was het noodzakelijk geworden om alle externe scripts, plaatjes, filmpjes, etc.. op deze site in een whitelist te zetten. Dit is helaas zoveel werk door de hoeveelheid, vooral de filmpjes, dat ik de 20 minpunten maar voor lief neem en het zo heb gelaten.

Het enige nadeel was dat hierdoor mijn statistieken script niet meer werkte omdat dit niet via een SSL verbinding binnen kwam en de security headers de browser vertelde dit niet uit te voeren. Inmiddels heb ik dit ook verholpen door ook voor de statistieken site met SSL uit te rusten. Voor de mensen die bang zijn, nee er gebeurd niets met deze statistieken, die zijn hooguit voor mij om te kunnen zien dat ik daadwerkelijk bezoekers heb en dat zien motiveert mij om deze site te blijven runnen.

Update: Ik heb geconstateerd dat er nog 20 minpunten zijn omdat mijn XFO (X-Frame-Options) header niet goed zou zijn, volgens alle handleidingen die ik kan vinden is deze header correct gezet maar de tool van mozilla verteld mij dat deze 'malformed' zou zijn. Ik hoop er nog achter te komen waarom dit is en wat dan wel de goede implementatie is.

Conclusie

In ieder geval is er dus weer een stukje security toegevoegd op deze site, misschien leuk voor mensen die bang zijn dat iemand hun comment post snift of ziet dat ze hier inloggen en leuk voor mij doordat ik hierdoor letsencrypt heb leren kennen.

Toekomst

Aangezien ik veel problemen heb gehad met de site Share waarop ik mijn code projects hoste en andere mensen wou aanmoedigen ook hun code te hosten en waarop ik dus vooral spam bots kreeg is die site al behoorlijk lang uit de lucht. Ik ben van plan om binnenkort de projecten die ik op Share had op deze site te gaan zetten en ook de Howto's die ik geschreven heb weer uit de oude database van Share te puzzelen en deze ook op deze site te gaan zetten. Mij kennende gaat dit nog enige tijd duren voor ik hier tijd en zin in heb maar vroeger of later zal dit gebeuren en zal ook deze sectie beschikbaar worden voor het publiek.