Mijn eerste, eigen blog-site (upd)

Ik schrijf al jaren nieuwsbrieven, blogs e.d. Die kwamen echter altijd terecht op sites van andere organisaties. Er was nergens een enkele plaats waar al mijn schrijfsels bij elkaar stonden. Dat moest anders. Met hulp van Pauline is deze blog-site er gekomen.

Hugo

Nadat de eerste beslissing over de locatie - thuis natuurlijk - was genomen, was het de beurt aan de te gebruiken software. Het was als snel duidelijk dat we een statische website wilden hebben. Vergelijkbaar met IAF, maar dan zonder dat we veel aandacht aan het opzetten van de layout zouden moeten besteden. Ik zou gewoon Markdown willen gebruiken zonder me te hoeven bekommeren om alle HTML code. Tegelijk wil ik wel af en toe zelf wat code kunnen toevoegen.

Na onderzoek van een paar template-based omgevingen, kwamen we uit op Hugo en niet alleen vanwege het feit dat het geschreven is in Go. Nee, de flexibiliteit en eenvoud van configuratie deed ons besluiten om voor Hugo te kiezen.

Redlounge

Nadat de keuze voor de generator was bepaald, kwam de - moeilijkere - keuze voor het thema. Beiden zijn we geen webdesigners, dus we gaan voornamelijk uit van wat we zelf mooi vinden en niet wat 'men' mooi vindt. We hebben ze dus allemaal geprobeerd op een paar proefpaginas. Langzaam maar zeker vielen er steeds meer af. Vooral de keuze tussen de laatste twee was moeilijk.

Uiteindelijk viel de keuze echter op Redlounge van Shift8Creative. Het is een simpel thema, maar wel met genoeg mogelijkheden om de instellingen te tweaken. Dat is te zien als mijn blog met die van Shift8Creative wordt vergeleken.

insec.nl

De volgende stap is het configureren van de webserver. Ik heb al gedurende een lange tijd de domeinnaam InSec.nl. De naam is bedacht met Internet Security in gedachte. Ik was gevraagd om wat risk assessments uit te voeren en daar hoorde, wat mij betreft, een eigen domein bij. Omdat veel van mijn postings over beveiling gaan, was insec.nl een logische keuze.

De eerste stap was dan ook om een aparte VM in te richten. Veiligheid, weet je nog? Dat biedt een goede locatie voor de blog, maar ook eventuele andere zaken die ik eventueel nog met InSec wil gaan doen.

TLS

Voor een site met als hoofdonderwerp 'security' is een goede beveiliging natuurlijk ook van belang. Dat begint met een goede configuratie voor TLS. Een configuratie waarmee we bij SSL Labs een goede score kunnen halen. En een A+ is volgens mij wel een goede score.

Het begint natuurlijk met een certificaat van een bekende CA. En dat zoiets helemaal niet duur hoeft te zijn, bewijst Startcom. Als je een simpel certificaat nodig hebt, voor een enkele site, is dit een goede keuze.

De volgende stap is Apache opvoeden wat betreft de TLS configuratie.

SSLProtocol ALL -SSLv2 -SSLv3
SSLCipherSuite "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK"
SSLHonorCipherOrder On
  1. Zorg ervoor dat alle SSL protocollen uit staan. Daarom prefereer ik tegenwoordig de term TLS.
  2. Definieer de gewenste Cipher Suites en zorg ervoor dat slechte suites expliciet uitgeschakeld zijn, zodat ze ook niet per ongeluk of middels een aanval ingeschakeld kunnen worden.

Website

Het heeft geen zin om veel aandacht aan TLS en certificaten te besteden als toch iedereen de http site benadert. Dat automatisch als iemand de naam van de site intikt. De eerste stap is dus aangeven, ook aan search robots, dat gebruik gemaakt moet worden van de https versie.

<VirtualHost [2001:610:600:8a49:5054:ff:fede:f71a]:80>
  ServerName blog.insec.nl
  Redirect permanent "/" "https://blog.insec.nl/"
</VirtualHost>

Daarna kan begonnen worden met het configureren van de gewenste parameters van de https variant van de site.

<VirtualHost [2001:610:600:8a49:5054:ff:fede:f71a]:443>
    (...)
    SSLEngine On
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header set Content-Security-Policy "\
default-src 'self'; \
script-src 'self' https://cdnjs.cloudflare.com; \
style-src 'self' https://fonts.googleapis.com https://cdnjs.cloudflare.com https://maxcdn.bootstrapcdn.com 'unsafe-inline'; \
font-src https://fonts.gstatic.com https://maxcdn.bootstrapcdn.com
https://cdnjs.cloudflare.com;"
    (...)
</VirtualHost>
  1. Natuurlijk staat de SSLEngine aan. Anders heeft gebruik van https geen enkele zin.
  2. HSTS (HTTP Strict Transport Security) is bedoeld om aanvallen te voorkomen waarbij omgeschakeld wordt naar http om bij de onversleutelde gegevens te komen. HSTS vertelt de browser dat de website alleen maar benaderbaar is over https.
  3. Om XSS aanvallen te voorkomen is er de CSP (Content Security Policy) header. Die vertelt de browser welke bronnen vertrouwd worden om door deze pagina. Dat zijn voornamelijk externe bronnen van styles, fonts en scripts. Iets wat tegenwoordig veelvuldig voorkomt. Door expliciet bronnen te noemen, die toegestaan zijn, zorgt de browser ervoor niets van onbetrouwbare sites te accepteren.
    • https zorgt er voor dat externe resources ook alleen maar gebruik maken van https.
    • unsafe-inline zorgt ervoor dat ook inline styles geaccepteerd worden. Normaal gesproken gebruik je dit liever niet, maar met externe themes is dat zeer lastig. Bij styles kan het wel, als je goed uitkijkt wat je doet. Het komt uiteindelijk wel van je eigen site, die je vertrouwt.

IPv4

Misschien is het je opgevallen, maar in alle configuraties is alleen het IP adres 2001:610:600:8a49:5054:ff:fede:f71a te zien. Ja, we hebben een eigen IPv6 range, waarop we sites als deze plaatsen. Iedereen met een eigen IPv6 adres kan dus eenvoudig deze blog komen lezen.

"Maar mijn provider heeft alleen nog maar IPv4." zul je misschien zeggen. "Hoe komt het dan dat ik de site nu aan het lezen ben?" Toen ik voor de keuze tussen IPv4 en IPv6 stond en het er op leek dat de site alleen via IPv6 benaderbaar zou zijn. was mijn reactie "Jammer dan". Maar gelukkig voor de zielige mensen, wiens provider nog geen IPv6 biedt, vond Pauline dat we dit niet konden maken.

We hadden onze router al verteld om port-forwarding te gebruiken om alle webverkeer naar onze centrale webserver door te sturen. Een extra port-forwarding, zonder gebruik te maken van niet-standaard poorten, was dus niet meer mogelijk.

Dat houdt Pauline echter in het geheel niet tegen. Het opzetten van een reverse-proxy is voor haar een fluitje van een cent. En met onderstaand voorbeeld geldt dat nu voor iedereen.

<Virtualhost 192.168.10.9:443>
  ServerName blog.insec.nl
  (...)
  ProxyPass / https://[2001:610:600:8a49:5054:ff:fede:f71a]/
</VirtualHost>

Natuurlijk moet de proxy ook ingesteld worden dat er een permanente redirect plaats vindt van http naar https. Omdat https op de proxy net zo goed moet zijn als die op de echte site, zullen ook zaken als certificaat en ciphersuites identiek ingesteld moeten worden. Zaken als HSTS en CSP krijgt de browser echter van de echte website. Die hoeven op de proxy niet ingesteld te worden.

Conclusie

Het opzetten van een eigen blog is helemaal niet zo lastig. Datzelfde geldt voor het opzetten van een veilige site. Zelfs het opzetten van een reverse-proxy is zo te realiseren. Het lastigste is waarschijnlijk het plaatsen en inrichten van de server waar dit allemaal op moet draaien. Misschien kom ik daar later nog een keer op terug. Voor mij was de oplossing: Vind een schat van een vriendin als Pauline.

En nee, ze is niet beschikbaar. Tenminste niet als vriendin, maar misschien wil ze voor jou wel een server inrichten en een blog configureren. Als je maar een geschikte bezemkast hebt.

Het simpele werk is nu dus gedaan. Nu moet ik de ruim 250 postings die ik geschreven heb, converteren naar Markdown formaat. Het grote vraagstuk daarbij is “Wat doe ik met oude, niet meer actieve, URL's?”. Voorlopig neem ik ze grotendeels ongewijzigd over. Misschien dat ik later een aparte pagina maak of zelfs verwijs naar het internetarchief.

Update 27 mei 2015

Op de site van internet.nl kun je zelf testen hoe goed je domein scoort op het gebied van "moderne internet protocollen", zoals IPv6, DNSSEC en TLS. TLSA wordt jammer genoeg niet getest, maar ook zonder dat scoort mijn site 100%.

Het schijnt zo te zijn dat ze ook DKIM, SPF en DMARC testen, maar die heb ik nog niet gezien. Wat een link lijkt in de FAQ, is dat niet. Ik houd jullie op de hoogte als ik nieuwe testen zie en hoe onze score is.

More Reading
Newer// Blog