Verbeter Drupal's beveiliging

29 april 2015

Standaard is Drupal een veilig Content Management Systeem, maar ik neem altijd wat extra maatregelen om de beveiliging van Drupal te verbeteren. Hier dus 10 tips om je Drupal site veiliger te maken.

1. Documentatie bestanden

Standaard wordt Drupal geleverd met documentatie bestanden die in de root van de installatie staan. Een van die bestanden is CHANGELOG.txt. In dit bestand staan alle wijzigingen die in alle versies van Drupal zijn gedaan. Dit bestand is publiekelijk opvraagbaar. Iedereen kan dit bestand dus opvragen en zien wat de huidig geinstalleerde versie van Drupal is. Dit is heel boeiende informatie want zo kan heel makkelijk bepaald worden of er bekende beveilingsproblemen in de geinstalleerd Drupal versie aanwezig zijn.

De oplossing is om in ieder geval dit bestand gewoon te verwijderen. Een andere mogelijkheidis  om in het .htaccess bestand in de root van de Drupal installatie de toegang tot de documentatiebestanden te verbieden met de volgende code:

<FilesMatch "CHANGELOG.txt | COPYRIGHT.txt | INSTALL.mysql.txt | INSTALL.pgsql.txt | INSTALL.sqlite.txt | INSTALL.txt | LICENSE.txt | MAINTAINERS.txt | README.txt | UPGRADE.txt">
deny from all
</FilesMatch>

2. Foutmeldingen

Op een productie omgeving wil je geen foutmeldingen tonen. Foutmeldingen bevatten informatie die erg nuttig is voor aanvallers. Het is altijd handig te zien wat de fout is en waar deze optreedt. In Drupal kun je het tonen van foutmelding uitzetten op /admin/config/development/logging. Er zijn echter twee problemen met deze instelling.

Iemand kan het tonen van foutmeldingen per ongeluk weer aanzetten. Het tweede probleem is wat serieuzer. Zelfs als je opgegeven hebt geen foutmeldingen te willen zien zullen fatale foutmeldingen altijd getoond worden. Een fatale fout treedt bijvoorbeeld op als Drupal geen verbinding met de database kan maken. Om er voor te zorgen dat er geen fatale foutmeldingen getoond worden kun je de volgende instelling in de settings.php opgeven.

$conf['error_level'] = 0;

Een bijkomend voordeel hiervan is dat de instelling op /admin/config/development/logging vastgezet wordt op 'geen'.

3. install.php

Zoals je uit de bestandsnaam kunt afleiden wordt het bestand install.php gebruikt om Drupal te installeren. Zodra dat gedaan is, is dit bestand niet meer nodig. Als een anonieme gebruiker het bestand toch aanroept zal Drupal de gebruiker geen toegang geven.

In bepaalde situaties is het echter toch mogelijk dat een anonieme gebruiker toegang krijgt tot de installatie functies. Om verdere misbruik van deze krachtige functionaliteit te voorkomen is het handig om het bestand install.php helemaal te verwijderen of de toegang helemaal te verbieden in het .htaccess bestand.

4. Update jQuery

De jQuery library die standaard met Drupal wordt meegeleverd bevat een kwetsbaarheid. Bij het gebruik van bepaalde jQuery functies kan hierdoor een beveiligingsprobleem ontstaan. Dit probleem kan opgelost worden door een nieuwere versie van jQuery te gebruiken. De kwetsbaarheid is opgelost in jQuery versie 1.6.3. De jQuery library in Drupal kan geupdate worden door de jQuery update module te installeren. Stel de module in op versie 1.7 of hoger.

5. Clickjacking

Clickjacking is een aanvalsmethode waarbij de aan te vallen website wordt getoond aan een gebruiker met daar overheen een extra layer. De gebruiker denkt de functionaliteit op de layer te gebruiken, maar is in werkelijkheid om de onderliggende website bezig. Op deze manier kan een gebruiker verleidt worden om een actie uit te voeren op een bepaalde website, zonder dat hij dat door heeft.

Zo ziet de gebruiker bijvoorbeeld een scherm waar hij onder het mom van een beveiligingsmaatregel een getal over moet typen en vervolgens op een knop moet drukken. Zijn handelingen worden echter doorgesluist naar het onderliggende scherm wat van Facebook is. Door een getal in te typen en op de knop te klikken heeft hij in werkelijkheid een comment op zijn tijdlijn gezet met een link naar de evil site.

Dit is te voorkomen door Drupal een HTTP response header te laten versturen naar de browser waarin wordt aangegeven dat de site niet in een frame geladen mag worden. Dit kan gedaan worden door onderstaande code te gebruiken in een hook_init() functie in een module of een hook_preprocess_page() functie in een template. Hiermee mag de site alleen in een frame geladen worden op de eigen site en niet op andere sites.

drupal_add_http_header('X-Frame-Options', 'SAMEORIGIN');

6. Wachtwoord onthouden uitschakelen

Standaard zullen veel browsers bij het invullen van een wachtwoord de optie bieden om deze te onthouden. Het wachtwoord wordt dan samen met de gebruikersnaam en de url van het inlogscherm opgeslagen. Deze gegevens worden onversleuteld opgeslagen op de computer van de gebruiker. Dit is een extra beveiligingsrisico. Als een kwaadwillend persoon toegang tot deze gegevens krijgt, zijn deze onversleutelde gegevens direct te gebruiken om in te loggen op de site.

Het is mogelijk om een browser de instructie te geven om deze gegevens nooit te onthouden. In het inlogscherm van Drupal wordt de extra instructie autocomplete='off' meegegeven. Door het installeren van de pci update module wordt dit automatisch geregeld.

Vanuit beveiligingsoogpunt is dit een effectieve maatregel. Gebruikers kunnen er echter moeite mee hebben dat ze bij het inloggen elke keer hun gegevens in moeten vullen. Voer deze maatregel dus alleen door als er bij de gebruikers draagvlak voor is.

7. Security review

Een zeer handig module is de security review module. Deze module controleert diverse beveilingsaspecten van de Drupal installatie.  Er wordt onder andere gecontroleerd of er toegangscontrole op views geactiveerd is, of de rechten voor niet vertrouwde rollen correct zijn ingesteld, of er geen onveilige bestanden geupload kunnen worden en of de Drupal upload directory correct beveiligd is.

8. Views Contextuele Filter

Met views is het mogelijk om overzichten van gegevens te configureren. Eén van de mogelijkheden van views is om een contextueel filter toe te voegen. Met een contextueel filter worden het aantal gegevens die getoond worden beperkt. Op basis van een waarde in de url worden de resultaten bepaald die getoond moeten worden. Een contextueel filter is vaak gekoppeld aan rechten. Zo kan er een contextueel filter zijn voor de gebruikers id. De id van de gebruiker staat in de url en alleen resultaten voor die gebruiker worden getoond. Een gebruiker mag alleen gegevens zien die horen bij zijn gebruikers id.

Echter zit er in views een erg nare uitzonderingsmogelijkheid. In het instellingenscherm van een contextueel filter staat het linkje 'uitzonderingen'. Als je daar op klikt, wordt er een extra veld getoond. In het extra veld kan een waarde opgegeven worden die het filter uitschakeld en er voor zorgt dat alle resultaten getoond worden. Deze waarde kan in de url ingevuld worden, in plaats van de reguliere waarde. Deze waarde staat standaard op 'all'. Hiermee kan iemand dus alle gegevens in een overzicht opvragen en dus ook de gegevens waar hij geen toegang toe mag hebben.

Views contextuele filter uitzonderingswaarde

Een voorbeeldje: Een gebruiker met id 2387 kan op /rekeningen/2387 zijn rekeningen inzien. Als hij zijn gebruikers id in de url vervangt door een andere krijgt hij geen toestemming om die gegevens te zien. Als hij echter de uitzonderingswaarde van het contextuele filter invoert krijgt hij op /rekeningen/all de gegevens te zien van alle gebruikers.

Controleer dus altijd bij het gebruik van een contextueel filter in views de bijbehorende uitzonderingswaarde.

9. Generator informatie

Standaard zal Drupal zich identificieren als Drupal 7. Drupal doet dat door de volgende html tag in de broncode van de pagina op te nemen.

<meta name="generator" content="Drupal 7 (http://drupal.org)" />

Ook zal Drupal bij elke response een header meesturen met dezelfde informatie.

X-Generator: Drupal 7 (http://drupal.org)

Voor aanvallers is het natuurlijk handig om te weten op welke software een website draait. Zo kan de website gerichter aangevallen worden. Er zijn heel veel manieren om een site als Drupal site te herkennen, maar het moet ook niet te makkelijk gemaakt worden.

De generator informatie kan heel makkelijk verwijderd worden door het installeren van de Remove Generator META tag module.

10. Updates

Er komen regelmatig updates uit van Drupal core en van community modules en thema's. Sommige daarvan zijn security updates. Het is belangrijk om deze te installeren om zo je Drupal site veilig te houden. De basis module Update manager helpt je hierbij. De module geeft je een overzicht van alle updates die er voor je site beschikbaar zijn. Ook kan deze module je met een mailtje op de hoogte stellen van nieuwe (beveiligings)updates voor je site.

Beveilingsupdates worden elke woensdagavond Nederlandse tijd uitgebracht. Om op de hoogte te blijven van de beveilingsupdates kun je je in je Drupal.org profiel abonneren op deze security announcements. Je krijgt dan voor elke update een mailtje met daarin de gehele security advisory. Deze advisories worden ook direct getweet door het het Drupal security team.