WordPress-site beveiligen: de routes die bots gebruiken, en hoe je ze afsluit
De vier routes waarlangs WordPress-sites gehackt worden, hoe je ze afsluit en wat je doet als het toch misgaat.
Niemand hackt jouw site omdat het jouw site is. Bots lopen dag en nacht het internet af, op zoek naar WordPress-sites met een bekend lek, een zwak wachtwoord of een vergeten plugin. Vinden ze er een, dan maakt het niet uit of het een webshop is of de site van een loodgietersbedrijf.
Het goede nieuws: de meeste inbraken gaan via een handvol voorspelbare routes. Sluit je die af, dan ben je voor bijna al die bots niet interessant meer. In dit artikel lees je welke routes dat zijn, in de volgorde waarin ik ze zou aanpakken, en wat je doet als het toch misgaat.
Waar inbraken echt vandaan komen
WordPress zelf is goed beveiligd. Beveiligingslekken in de kern zijn zeldzaam en worden snel gedicht, en kleine updates installeert WordPress standaard zelf. De zwakke plekken zitten bijna altijd ergens anders:
- Plugins en thema’s met een bekend lek die niet zijn bijgewerkt. Verreweg de grootste groep.
- Zwakke of hergebruikte wachtwoorden, vaak van een account dat al lang niet meer gebruikt wordt.
- Gekraakte premium plugins, met een achterdeur erin.
- De hosting: een oude PHP-versie, of een andere site op hetzelfde account die al besmet is.
Een beveiligingsplugin helpt, maar lost geen van deze vier op als de basis niet klopt. Daarom begin ik bij de basis.
1. Bijwerken, en weg met wat je niet gebruikt
Komt er in een plugin een lek aan het licht, dan verschijnt er een update en wordt het lek openbaar beschreven. Vanaf dat moment weten de makers van die bots ook precies waar ze moeten zoeken. Het venster tussen de update en de eerste aanvallen is soms maar een paar dagen.
- Werk elke week bij, met een back-up vooraf. Hoe je dat aanpakt zonder dat je site omvalt, lees je in je WordPress-site onderhouden.
- Verwijder plugins en thema’s die je niet gebruikt. Gedeactiveerd is niet genoeg: de bestanden staan nog op de server en een lek erin blijft bereikbaar. Houd wel één standaardthema van WordPress, zodat er iets is om op terug te vallen.
- Vervang plugins die niet meer onderhouden worden. Op wordpress.org zie je wanneer een plugin voor het laatst is bijgewerkt. Stilstand van een jaar of langer is een signaal.
- Gebruik geen gekraakte plugins of thema’s. Een “nulled” versie van een premium plugin krijgt geen beveiligingsupdates, en je weet niet wat er verder aan de code is veranderd. Een achterdeur meeleveren is precies waarom ze gratis worden aangeboden.
2. De voordeur: inloggen
Sterke, unieke wachtwoorden
Een wachtwoord is zo sterk als het moeilijkste deel om te raden. Korte wachtwoorden worden gewoon uitgeprobeerd. Bestaande woorden met een @ voor de a en een ! erachter staan al jaren in de lijsten die aanvallers gebruiken. En een wachtwoord dat je ook ergens anders gebruikt, ligt mogelijk al op straat via een datalek bij die andere dienst. Op Have I Been Pwned zie je of je e-mailadres in een bekend lek voorkomt.
Gebruik daarom een wachtwoordmanager. Die maakt voor elke site een lang, willekeurig wachtwoord en vult het voor je in. WordPress zelf stelt ook een sterk wachtwoord voor als je een gebruiker aanmaakt. Laat dat staan.
Tweestapsverificatie
Met tweestapsverificatie heb je naast je wachtwoord een code nodig van een app op je telefoon. Ook als je wachtwoord uitlekt, komt niemand er zonder je telefoon in. WordPress heeft het niet standaard, maar vrijwel elke beveiligingsplugin biedt het aan, en er is een losse plugin Two Factor van de makers van WordPress zelf. Zet het in elk geval aan voor iedereen met de rol beheerder.
Beperk inlogpogingen
Een bot die wachtwoorden probeert, doet dat duizenden keren. Na vijf foute pogingen een uur blokkeren maakt dat zinloos. Ook dat zit in elke beveiligingsplugin. Zet je eigen IP-adres op de uitzonderingenlijst, dan sluit je jezelf niet buiten.
Geen voor de hand liggende gebruikersnaam
WordPress vraagt bij de installatie zelf om een gebruikersnaam, maar op oudere sites bestaat vaak nog een account admin. Dat is de eerste naam die elke bot probeert. Maak een nieuw beheerdersaccount, zet de berichten over naar dat account en verwijder het oude.
Gebruikersnamen lekken ook via je site zelf, bijvoorbeeld via de auteurspagina’s op /author/. Heb je die niet nodig, schakel de auteurarchieven dan uit.
Een andere inlog-URL, en wat het wel en niet doet
Je inlogpagina verplaatsen van /wp-admin naar een eigen adres scheelt veel ruis in je logboeken, omdat de meeste bots alleen het standaardadres proberen. Maar het is geen beveiliging op zich: met een sterk wachtwoord en tweestapsverificatie maakt het weinig uit of iemand je inlogpagina kan vinden. Zie het als extra, niet als vervanging.
Inloggen alleen vanaf bekende adressen
Het sterkst is de inlogpagina helemaal afsluiten voor iedereen behalve een paar vaste IP-adressen. Dat werkt goed als jij en je collega’s vanaf een vast adres werken. Werk je onderweg of verandert je adres vaak, dan sluit je jezelf geregeld buiten.
3. Wie wat mag
- Geef iedereen de laagste rol die volstaat. Iemand die alleen berichten schrijft, heeft de rol auteur of redacteur nodig, geen beheerder. Een beheerder kan plugins installeren, en daarmee alles.
- Ruim accounts op. Oud-medewerkers, een stagiair van twee jaar geleden, het bureau dat de site ooit bouwde. Elk account dat er nog staat, is een wachtwoord dat kan uitlekken.
- Zet de bestandseditor uit. Onder Weergave en Plugins zit een editor waarmee je vanuit het dashboard code kunt aanpassen. Komt iemand binnen met een beheerdersaccount, dan is dat de makkelijkste plek om kwaadaardige code neer te zetten. Met deze regel in
wp-config.phpis hij weg:
define( 'DISALLOW_FILE_EDIT', true );
4. Zet uit wat je niet gebruikt
- XML-RPC. Een oude koppeling waarmee apps konden publiceren. Bijna niemand gebruikt hem nog, maar bots wel, omdat ze er veel wachtwoorden tegelijk mee kunnen proberen. Gebruik je de Jetpack-app of een oude publicatietool niet, zet hem dan uit.
- Reacties. Gebruik je ze niet, zet ze dan echt helemaal uit. Het scheelt spam en een formulier minder om te misbruiken.
- De REST API niet helemaal. Je komt het advies tegen om die volledig uit te schakelen. Doe dat niet: de blokeditor, veel plugins en formulieren hebben hem nodig. Een beveiligingsplugin kan wel de gebruikerslijst erin afschermen.
5. De hosting en de verbinding
- Https overal. Een certificaat is tegenwoordig gratis en wordt automatisch verlengd. Zorg dat alle varianten van je adres naar https doorsturen en dat er geen oude http-links meer in je content staan.
- Een actuele PHP-versie. Oude versies krijgen geen beveiligingsupdates meer. Dat stel je in bij je hoster.
- Elke site apart. Staan er meerdere sites in hetzelfde hostingaccount, dan kan een besmetting van de ene site overspringen naar de andere. Een vergeten testsite naast je echte site is daar een klassiek voorbeeld van.
- Back-ups buiten de server. Een back-up die op dezelfde server staat als je site, is bij een hack of een kapotte server net zo weg. Bewaar ze ergens anders, en lang genoeg. Een hack wordt soms pas na weken ontdekt, en dan wil je terug naar een moment van daarvoor.
- Een firewall voor je site. Een dienst als Cloudflare zit tussen je bezoekers en je server en houdt veel kwaadaardig verkeer tegen voordat het je site bereikt. Een beveiligingsplugin doet iets vergelijkbaars, maar pas als het verkeer al op je server is.
6. Een beveiligingsplugin, als sluitstuk
Een goede beveiligingsplugin regelt veel van het bovenstaande op één plek: tweestapsverificatie, een limiet op inlogpogingen, een firewall en een scan die meldt als er bestanden zijn veranderd die niet hadden mogen veranderen. Bekende zijn Wordfence, Solid Security en Defender. Op de sites die ik onderhoud gebruik ik Defender. Kies er één. Twee tegelijk zitten elkaar in de weg.
Als het toch misgaat
Hoe je merkt dat je site gehackt is
- Google toont een rode waarschuwing in plaats van je site, of zet “deze site is mogelijk gehackt” bij je zoekresultaten.
- In Google verschijnen pagina’s die je nooit gemaakt hebt, vaak met Japanse of Chinese tekst, of over medicijnen en loterijen.
- Bezoekers op hun telefoon worden doorgestuurd naar een andere site, terwijl jij op je laptop niets ziet.
- Je hoster meldt dat er vanaf je account spam wordt verstuurd, of je mail komt ineens in de spamfilters terecht.
- Er staan beheerders in je gebruikerslijst die je niet kent.
Opschonen of terugzetten
Je hebt twee opties: een back-up terugzetten of de site opschonen. Een back-up terugzetten lijkt het snelst, maar kies er dan een van voor de inbraak. Aanvallers zitten vaak al dagen of weken binnen voordat je iets merkt. Zet je de back-up van gisteren terug, dan zet je de achterdeur mee terug. En alles wat er na die back-up is gebeurd, zoals bestellingen en formulierinzendingen, ben je kwijt.
Opschonen betekent elk bestand en de database nalopen op code die er niet hoort, en daarna WordPress, je plugins en je thema opnieuw installeren vanuit een schone bron. Een beveiligingsscanner vindt veel, maar niet alles. Wordt er één achterdeur gemist, dan ben je binnen een paar dagen weer terug bij af.
Wat je in beide gevallen daarna doet:
- Verander alle wachtwoorden: WordPress-gebruikers, de database, FTP of SFTP en je hostingaccount.
- Vervang de beveiligingssleutels in
wp-config.php. Nieuwe genereer je op api.wordpress.org. Iedereen wordt dan uitgelogd, ook de aanvaller. - Zoek uit hoe ze binnenkwamen, en sluit dat gat. Anders komen ze terug.
- Vraag in Search Console om een nieuwe beoordeling als Google je site heeft gemarkeerd.
- Zijn er persoonsgegevens buitgemaakt, bijvoorbeeld klantgegevens uit je webshop? Dan is het een datalek. Dat meld je binnen 72 uur bij de Autoriteit Persoonsgegevens als het een risico vormt voor de mensen om wie het gaat.
Waar het meestal misgaat
- Een beveiligingsplugin als vervanging voor updates. De plugin houdt veel tegen, maar een lek in een verouderde plugin blijft een lek.
- Het vergeten account. Het beheerdersaccount van een oud-medewerker met een wachtwoord dat in een datalek voorkomt.
- De testsite in hetzelfde account. Niemand werkt hem nog bij, en via die site komt de besmetting binnen.
- Te recente back-up teruggezet. De site is schoon, en drie dagen later weer besmet.
- Alleen de zichtbare schade opgeruimd. De vreemde pagina’s zijn weg, de achterdeur niet.
Tot slot
Een veilige WordPress-site is geen kwestie van één plugin, maar van een paar vaste gewoontes. Bijwerken, opruimen, sterke wachtwoorden met tweestapsverificatie, en back-ups buiten de server. Daarmee ben je voor bijna alle bots niet de moeite waard.
Wil je dat iemand dit voor je bijhoudt? Met WordPress onderhoud werk ik je site elke week bij en houd ik de beveiliging in de gaten. En is je site al gehackt, dan help ik je als WordPress specialist hem op te schonen en het gat te dichten.