WordPress beveiligen tegen hacks, dat is een steeds terugkerend onderwerp onder gebruikers en ontwikkelaars van dit CMS. Wij geven jou graag tekst en uitleg over de mogelijkheden rond WordPress beveiliging op Windows Server hosting. Daarnaast geven wij je ook 11 extra WordPress beveiligingstips, waarmee je voor een nóg betere beveiliging van jouw website zorgt.

Het is vooral belangrijk om te beseffen op welke wijze hackers een site kunnen binnendringen. Wij zien voornamelijk vier methodes voorbij komen:

  1. De populairste werkwijze verloopt via lekken in thema’s en plugins die worden gebruikt.
  2. Hackers maken ook dankbaar gebruik van websites die draaien op verouderde versies van WordPress.
  3. Hackers houden van zwakke wachtwoorden, zoals ‘geheim’, ‘password’ of ‘12345’.
  4. Tot de overige oorzaken behoort onder andere de configuratie van de server zelf.

Maar hoe kun je nou zèlf WordPress beveiligen?

WordPress beveiligen

De eerste stappen om jouw WordPress website te beveiligen neem je in WordPress zelf.

Je kunt beginnen met het installeren en activeren van een beveiligingsplugin. Enkele voorbeelden hiervan zijn iThemes, WordFence en Sucuri. Het is wel belangrijk dat deze beveiligingsplugin op de juiste manier wordt ingesteld.

Zo lijkt het op het eerste gezicht uitermate handig om jezelf steeds een mailtje te laten sturen als er een inlogpoging met verkeerde gegevens wordt uitgevoerd. Maar zodra je te maken krijgt met een brute force-aanval, waarbij enkele honderden pogingen per minuut worden uitgevoerd, blijkt deze instelling ineens niet meer zo handig.

En dat geldt ook voor logging ervan naar een database.

De beste configuratie is dus sterk afhankelijk van de gebruikte plugin, de opbouw van je site, plugin instellingen en andere factoren. Zoek dus altijd goed uit wat in jouw specifieke situatie de beste resultaten zijn.

Gebruik ook niet twee plugins met (bijna) dezelfde functionaliteit. Dat bijt elkaar en komt zelden de performance ten goede.

Beveilig de wp-login.php inlogmethode

Naast het gebruik van een beveiligingsplugin moet je ook zorgen voor veilige en dus sterke wachtwoorden. Gebruik je een goed, sterk wachtwoord en wordt er een hackpoging ondernomen, dan zorgt dat vaak voor het verschil tussen een werkende site of een virus-verspreidende site.

Ten tweede is het van belang om voor de hoofdgebruiker in elk geval geen voor de hand liggende gebruikersnaam te kiezen. Zo is ‘admin’ of ‘administrator’ af te raden. Deze gebruikersnamen zijn dusdanig ingeburgerd op het internet dat ze als eerste worden geprobeerd.

Het is verstandig om ervoor kiezen om het hoofdaccount binnen WordPress niet te gebruiken voor het aanmaken van posts. De gebruikersnaam van de hoofdgebruiker is hierdoor altijd te herleiden. Maak hiervoor in de plaats een gebruikersaccount aan dat alleen posts mag aanmaken en bewerken.

Dit is een kleine moeite. En je zorgt er op die manier voor dat via het gehackte account alleen berichten kunnen worden aangemaakt of bewerkt.

Gebruik two factor authentication (2FA) voor het inloggen. Dit zorgt ervoor dat er naast je gebruikersnaam en wachtwoord nog een tweede stap nodig is om in te loggen, zoals een code dat via je telefoon wordt gegenereerd. Twee voorbeelden van 2FA-plugins die je hiervoor kunt gebruiken zijn Google Authenticator (door Henrik Schack) en Google Authenticator – Two Factor Authentication (door miniOrange). Een heel nieuwe is UNLOQ.io.

Wist je dat WordPress login hints gebruikt om jouw te vertellen of de gebruikersnaam of het wachtwoord foutief ingevuld was? Voor een aanvaller is dit heel waardevolle informatie om te bepalen welk gegeven fout is tijdens een bruteforce-aanval. Je kunt dit eenvoudig uitschakelen met de PD Login Security plugin van onze eigen Pieter Daalder.

In het artikel WordPress wp-login.php toegang beveiligen vind je meer manieren om jouw wp-login.php te beveiligen tegen kwaadwillenden.

Inactieve plugins en thema’s

Inactieve plugins en thema’s zijn voor hackers eveneens potentiële achterdeurtjes. Veel gebruikers laten deze staan. Ze zijn geheel onterecht in de veronderstelling dat dit geen kwaad kan, zolang deze plugins en thema’s zijn uitgeschakeld. Maar zolang de bestanden nog op je site aanwezig zijn, kunnen zwakheden hierin worden misbruikt.

Houd je installatie dus altijd zo schoon mogelijk. Zodra een plugin of thema niet meer wordt gebruikt, kun je deze het beste direct uitschakelen en verwijderen. Dit maakt jouw website tevens sneller.

Wijzigingen in de WordPress Core

Het kan zijn dat je bepaalde wijzigingen wilt doorvoeren aan de werking van de WordPress Core zelf. Het is verleidelijk om dit rechtstreeks in de core zelf te doen. Doe dit niet! Het is uit den boze om WordPress Core bestanden aan te passen.

Note: It is not recommended to change core WordPress files other than wp-config.php. If you must change anything else, take notes and store them in a text file in your WordPress root directory and make a backup copy of them for future reference and upgrades.

Niet alleen moet je de wijzigingen na elke update opnieuw doorvoeren. Ook bestaat de kans dat je door de wijzigingen onbedoeld zwakheden in je site introduceert, zwakheden die niet zo eenvoudig te verwijderen zijn. Als je functionaliteit wilt aanpassen, doe dit dan door middel van plugins.

Updates, updates, UPDATES…

Het laatste puntje is meteen ook een van de belangrijkste: installeer altijd de laatste updates die voorhanden zijn. Updates worden niet uitgebracht omdat de schrijver van een plugin hier blij van wordt. Updates bevatten vrijwel altijd belangrijke beveiligingsoplossingen waarmee lekken worden gedicht. Daarnaast wordt ook nieuwe functionaliteit door middel van updates verspreid.

Ook dit is dus een belangrijke stap waarmee je WordPress beveiligt.

Wist je ook dat een nieuwe WordPress Core-, Plugin-, of Thema-versie ook vaak beter geoptimaliseerde code bevat en daardoor net iets sneller is? Heel handig, door te updaten wordt jouw website veiliger én sneller!

Ken de zwakheden

In het eerste deel spraken we al even over beveiligingsplugins iThemes, WordFence en Sucuri. Ook al doen ze hun werk redelijk goed, verwacht geen wonderen. Het is helaas onmogelijk om PHP te gebruiken om PHP te beveiligen.

Stel, je gebruikt een plugin om jouw site te beschermen tegen WordPress xmlrpc.php-aanvallen. Nu is dat prima te doen met een beveiligingsplugin, maar als er teveel requests tegelijkertijd binnenkomen zal PHP nog steeds stagneren. PHP kan de hoeveelheid requests tegelijkertijd simpelweg niet aan. Conclusie: jouw website is onbereikbaar, de vele bruteforce-pogingen hebben een Denial of Service tot gevolg gehad.

Tony Perez van beveiligingsbedrijf Sucuri heeft hierover een interessante post geschreven: Defense in Depth in Website Security. En dat brengt ons bij beveiliging op server-niveau.

WordPress beveiligen op server-niveau

Niet alleen binnen WordPress kun je de beveiliging aanscherpen. WordPress beveiligen is ook op serverniveau mogelijk. Denk aan de verschillende aanpassingen van je wp-config.php-bestand, het correct instellen van de lees- en schrijfrechten op je site, het gebruik van robots.txt en het aanpassen van je web.config– of .htaccess-bestand.

Een van de eerste wijzigingen die je kunt doorvoeren is het toevoegen van de volgende regel in je wp-config.php-bestand:

define( 'DISALLOW_FILE_EDIT', true );

Dit zorgt ervoor dat vanuit het WordPress Dashboard (de admin-omgeving) geen wijzigingen kunnen worden doorgevoerd aan bestanden op de site. Zowel in het thema als de plugins heb je hierdoor geen mogelijkheid meer om bestanden te wijzigen.

Mocht iemand toegang tot het Dashboard verkrijgen, dan zorgt dit er in elk geval voor dat diegene geen schadelijke code meer aan de bestaande bestanden kan toevoegen.

Je kunt ook de volgende regels nog toevoegen:

define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

Deze toevoeging forceert de automatische updates van zowel WordPress als de aanwezige plugins en thema’s.

Als je gebruik maakt van Vevida WordPress Hosting, dan is dit al netjes voor jou geregeld.

Toegang blokkeren op belangrijke mappen en bestanden

Je kunt rechtstreeks het aanroepen van de include-mappen blokkeren. Reguliere gebruikers moeten hiervan geen hinder ondervinden. Tegelijkertijd maken we het kwaadwillenden weer een stapje lastiger.

Neem hiervoor de volgende regels op in je web.config-bestand:

<rewrite>
    <rules>
        <rule name="Blokkeer includes" stopProcessing="true">
            <match url="^wp-admin/includes" ignoreCase="false" />
            <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
            <conditions>
                <add input="{REQUEST_URI}" pattern="^wp-includes" />
            </conditions>
        </rule>
        <rule name="Blokkeer includes 2" stopProcessing="true">
          <match url="^wp-includes/[^/]+\.php$" ignoreCase="false" negate="true" />
          <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="^wp-includes" />
          </conditions>
        </rule>
        <rule name="Blokkeer includes 3" stopProcessing="true">
          <match url="^wp-includes/js/tinymce/langs/.+\.php" ignoreCase="false" negate="true" />
          <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="^wp-includes" />
          </conditions>
        </rule>
        <rule name="Blokkeer includes 4" stopProcessing="true">
          <match url="^wp-includes/theme-compat/" ignoreCase="false" negate="true" />
          <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
        </rule>
    </rules>
</rewrite>

WordPress bruteforce-aanvallen tegengaan
De volgende stap is het beschermen van WordPress tegen bruteforce-aanvallen. We doen dit door in het web.config bestand het volgende op te nemen, onderaan net boven </configuration>:

<location path="wp-login.php">
  <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="123.45.67.89" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
</location>

Vervang hierbij het genoemde ipAddress door jouw eigen IP-adres, zodat je zelf wel gewoon toegang blijft houden tot deze map. Wat jouw IP-adres is vind je eenvoudig via mijnip6.nl. Hiermee maak je dus eenvoudig een wp-login.php IP whitelist voor jouw website.

Afschermen van methodes en vindbaarheid

Een andere aanvalsmethode die op de site kan worden uitgevoerd, verloopt via de HTTP TRACE methode. Om te voorkomen dat je site hiervoor wordt gebruikt, blokkeer je deze specifieke http-methode met de volgende URL Rewrite-regel:

<rule name="Trace rule">
    <match url=".*" ignoreCase="false" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_METHOD}" pattern="^TRACE" ignoreCase="false" />
    </conditions>
    <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>

Alle verzoeken die via deze methode naar je site worden gestuurd, worden nu geweigerd door middel van een HTTP 403 status code.

Er zijn nog meer verzoeken die we preventief kunnen blokkeren. Zo wordt standaard de gehele site door diverse robots geïndexeerd. Op die manier is de site ook terug te vinden in de diverse zoekmachines.

Met de volgende regels in het robots.txt-bestand kunnen we bepaalde gevoelige mappen afschermen van dit gedrag. Hierdoor is het wat lastiger om zomaar gegevens van je site te achterhalen:

User-agent: *

Disallow: /feed/
Disallow: /trackback/
Disallow: /wp-admin/
Disallow: /wp-content/
Disallow: /wp-includes/
Disallow: xmlrpc.php
Disallow: /wp-

Een robot als BaiduSpider blokkeer je hiermee helaas niet. Je vindt meer informatie in de blogpost Block BaiduSpider bot User-Agent, mocht je de Baidu robot graag willen blokkeren op jouw site.

Let op: Deze methode heeft invloed op de wijze waarop je site wordt geïndexeerd. Dit kan dus negatieve gevolgen hebben voor de ranking in de zoekresultaten. Ook kan het zijn dat bepaalde SEO-plugins hierdoor hun werk niet goed kunnen uitvoeren. Denk dus eerst goed na over hetgeen je wilt blokkeren en probeer zelf een balans te vinden tussen vindbaarheid en veiligheid.

Blokkeren uitvoer PHP code

In sommige mappen verwachten we geen PHP-code. Een voorbeeld hiervan is de folder wp-content/uploads/. Uit veiligheidsoogpunt kunnen we daarom het beste het uitvoeren van PHP-scripts in deze map geheel uitschakelen.

Je schakelt de PHP-uitvoer eenvoudig uit door de volgende code te plaatsen in een web.config-bestand in de map wp-content/uploads/:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers accessPolicy="Read" />
    </system.webServer>
</configuration>

Hiermee zorg je ervoor dat alle scripthandlers (waaronder PHP) in deze én onderliggende mappen alleen leesrechten hebben.

Ook dit is in het WordPress Hosting pakket al voor jou ingesteld.

Meer weten over beveiliging?

Als je na het lezen van dit artikel graag meer informatie wilt over WordPress beveiliging, of het WordPress Hosting pakket, neem dan gerust contact op met onze klantenservice. Wij helpen je graag.

Wat vond je van dit antwoord?

Bedankt voor je feedback!

Er is een fout opgetreden. Probeer het later opnieuw.