WordPress veilig installeren in tien stappen

Een van de keerzijdes van de populariteit van WordPress is dat het een fijn doelwit is voor hackers. Een enkele beveiligingsgaatje kan immers talloze lekke sites veroorzaken, waar je als hacker op kunt schieten met geautomatiseerde kraakpogingen. Er zijn dan ook talloze veiligheidsplug-ins voor WordPress (zoek onder ‘secure’ in de plug-in sectie van je dashboard, twee goede zijn Better WP Security en BulletProof Security).

Eentje daarvan installeren kan beslist geen kwaad, maar het nadeel is wel dat je niet goed weet wat de bedreigingen en remedies eigenlijk zijn. Vandaar onderstaande tien tips, waarvan een deel ook door een veiligheidsplug-in ondervangen wordt.

1. Bedenk je wachtwoorden vooraf

De meeste mensen bedenken pas een wachtwoord als de computer zegt dat ze er een moeten aanmaken. Dat leidt niet tot veilig gedrag. Bedenk daarom voordat je WordPress installeert wat je met je wachtwoorden gaat doen. Bedenk ingewikkelde wachtwoorden en schrijf ze op (op papier). Als je op een plek zit waar meerdere mensen toegang toe hebben, codeer je wachtwoorden dan (bijvoorbeeld: zet standaard op de derde plek een willekeurig teken dat niet bij het wachtwoord hoort, zodat de lijst alleen voor jezelf leesbaar is).

Voor een WordPress installatie heb je vier wachtwoorden nodig:

  1. Het wachtwoord waarmee WordPress en jij zelf toegang krijgen tot de MySQL database. Deze krijg je van je provider.
  2. Het wachtwoord voor ftp-toegang tot de server. Ook deze krijg je van je provider.
  3. Het wachtwoord voor de beheerder van de WordPress installatie. Deze moet je aanmaken tijdens de installatie.
  4. Het wachtwoord voor WordPress.com. Het is niet strikt noodzakelijk om een account op WordPress.com te hebben om WordPress te installeren, maar sommige plug-ins vragen erom.

2. Verander de database prefix

Tijdens de installatie maakt WordPress een aantal tabellen aan in de MySQL database. Daarin komen de teksten van berichten te staan, maar ook de namen en wachtwoorden van gebruikers en andere instellingen. Wanneer je de standaard tabelnamen handhaaft, kan een hacker er eenvoudiger toegang toe krijgen (bijvoorbeeld via een schijnbaar kekke plug-in of thema die je zelf nietsvermoedend installeert) dan wanneer hij eerst de nieuwe naam moet raden.

Meestal krijg je tijdens de installatie al de mogelijkheid de standaard prefix ‘wp_’ te vervangen door iets anders (bijvoorbeeld ‘ujeny6djhk29_’), maar zo niet, onderneem dan de volgende actie. Je kunt dit ook doen bij een reeds bestaand blog, maar maak dan eerst een back-up, voor het geval je de boel vernaggelt.

  1. Zoek via het beheerspaneel van je provider toegang tot de MySQL database waar je WordPress installatie in staat, door op het ikoontje ‘phpMyAdmin’ te klikken. Je krijgt als het goed is een beeld met de elf standaard WordPress tabellen.

    Deel van de interface van phpMyAdmin met nieuwe WordPress installatie

  2. Deze elf tabellen moeten hernoemd worden met een SQL-query, dus klik op de knop SQL. Je krijgt dan een invulveld voor de queries. Knip en plak onderstaande queries naar het invulveld , verander de prefix in iets anders en druk op start.
    RENAME table `wp_commentmeta` TO `ujeny6djhk29_commentmeta`;RENAME table `wp_comments` TO `ujeny6djhk29_comments`;RENAME table `wp_links` TO `ujeny6djhk29_links`;RENAME table `wp_options` TO `ujeny6djhk29_options`;RENAME table `wp_postmeta` TO `ujeny6djhk29_postmeta`;RENAME table `wp_posts` TO `ujeny6djhk29_posts`;RENAME table `wp_terms` TO `ujeny6djhk29_terms`;RENAME table `wp_term_relationships` TO `ujeny6djhk29_term_relationships`;RENAME table `wp_term_taxonomy` TO `ujeny6djhk29_term_taxonomy`;RENAME table `wp_usermeta` TO `ujeny6djhk29_usermeta`;RENAME table `wp_users` TO `ujeny6djhk29_users`;

  3. In twee tabellen staan referenties naar andere tabellen, die dus ook aangepast moeten worden. De eerste is de options tabel. Je vindt de gezochte onderdelen met de query:
    SELECT * FROM `ujeny6djhk29_options` WHERE `option_name` LIKE '%wp_%'


    Alle referenties 'wp_' moet je nu handmatig veranderen. Dezelfde procedure herhaal je voor de usermeta tabel, waar je de betreffende tabelrijen vindt met:

    SELECT * FROM `ujeny6djhk29_usermeta` WHERE `meta_key` LIKE '%wp_%':

  4. De database is nu klaar. Alleen moet WordPress nog op de hoogte gesteld worden van de wijziging. Daarvoor moet je je server met ftp benaderen. In de hoogste directory zie je een bestand staan met de naam wp-config.php. Open dit in een editor, zoek de regel $table_prefix = 'wp_' en verander ook deze prefix. Klaar.

3. Bescherm wp-config met .htaccess

Toen je daarnet wp-config geopend hebt om de database prefix te veranderen, heb je waarschijnlijk ook gezien dat daar open en bloot het wachtwoord van je database in staat. Als een hacker dit bestand te pakken krijgt, is hij spekkoper. En het staat zomaar in je openbare directory!

De snelste oplossing is wp-config een directory hoger zetten, waar hij voor anderen minder zichtbaar is. Dit werkt echter niet als je meerdere WordPress installaties in subdirectory's hebt draaien. Een zekerder aanpak is daarom om toegang tot het bestand te blokkeren met het .htaccess filter. Dit is een bestand dat ook in de hoofddirectory van je WordPress installatie staat. Open het met een editor en voeg helemaal bovenaan (nog voor de regel '# BEGIN WordPress') toe:

<files wp-config.php>order allow,denydeny from all</files>

Houd altijd het oude .htaccess bestand achter de hand. Als je een fout maakt in .htaccess kun je je site helemaal op slot gooien en dan is het handig om de oude versie terug te kunnen zetten. Wanneer je een veiligheidsplug-in installeert, zul je zien dat het .htaccess bestand enorm in omvang toeneemt, omdat nog een heleboel andere bestanden en directory's afgesloten worden.

Als het goed is, vraag je je nu af: kan een hacker bij mijn .htaccess bestand komen? Het antwoord is nee, althans als je provider je server goed heeft ingesteld. Mocht je daaraan twijfelen, dan kun je de volgende code aan .htaccess toevoegen

<Files .htaccess>order allow,denydeny from all</Files>

Je ziet het patroon: als je wilt, kun je ook andere bestanden in de directory afsluiten voor buitenstaanders. Zet in elk geval ook de volgende regel in .htaccess om te voorkomen dat buitenstaanders je mappenstructuur kunnen bekijken:

Options All -Indexes

Ook hiervoor geldt dat je provider de mappenstructuur al geblokkeerd hoort te hebben, maar better safe than sorry.

4. Verander de keys en salts

Nog even terug naar wp-config. Tijdens de installatie wordt een aantal 'keys' en 'salts' gegenereerd, waarmee informatie wordt versleuteld (lees bij Codeseekah hoe belangrijk dat is). Een nieuwe set keys en salts haal je op bij de WordPress API en knip en plak je in je wp-config.

5. Verwijder de admin gebruiker

De gebruikersnaam van de beheerder is standaard 'admin'. Dat is fijn voor hackers, want dan hoeven ze alleen nog het wachtwoord te raden. Kies bij het installeren dus een andere naam voor de beheerder. Krijg je daartoe niet de mogelijkheid, maak dan in de voltooide installatie een nieuwe gebruiker met beheersrechten aan, en verwijder dan 'admin'.

6. Verwijder het versienummer

Voor hackers is het handig om het versienummer van het gebruikte WordPress te weten: als het een oudere versie is, zijn er allicht bekende zwakheden die misbruikt kunnen worden om binnen te dringen. Het standaard thema dat WordPress voor je installeert, zet het versienummer in de head sectie van je pagina en je rss feed. Veel oplossingen halen het versienummer alleen uit de head. Voeg deze code toe aan het bestand functions.php in de folder wp-content/themes/jouwthema om het versienummer overal te verwijderen:

<?php /* Remove the version number from both document head and feed */function remove_wp_version() {return '';}add_filter('the_generator', 'remove_wp_version');?>

Let er bij het bewerken van functions.php op dat er geen spaties of witregels voor of na de php-code belanden. Daarvan raakt WordPress zo in de war dat je site het niet meer doet.

7. Gebruik een whitelist

Wanneer je WordPress slechts vanaf een beperkt aantal plekken beheert, kun je de .htacess file in je wp-admin directory zodanig aanpassen dat de beheersdirectory alleen benaderd kan worden vanaf een of meer gespecificeerde ip-adressen. Als er geen .htaccess bestand in die directory staat (standaard), maak er dan eentje aan en zet daar het volgende in:

order deny,allowdeny from all# Mijn thuisadresallow from xx.xx.xx.xxx# Mijn kantooradresallow from xx.xx.xx.xxx

Vervang xx.xx.xx.xxx door je eigen IP-adres. Uiteraard kun je zoveel toegestane adressen toevoegen als je wilt.

8. Gebruik een blacklist

Sommige mensen hebben niks te zoeken op je website en sommige verzoeken zijn alleen bedoeld om je site te laten crashen. Het ligt dan ook voor de hand een blacklist van ongewenste bezoekers en verzoeken te onderhouden.

Specifieke bezoekers (ip-adressen) kun je blokkeren in je .htaccess bestand, maar dat is nogal een gedoe, dus dit kun je beter aan een plug-in overlaten: zoek op 'ban' in de WordPress plug-in database.

Malicieuze informatieverzoeken kun je het best afvangen in .htaccess. WordPress-oudgediende Jeff Star houdt een goede lijst met gebruiksinstructie bij op zijn site Perishable Press (let op: deze link zal verouderen, doorzoek Jeffs site naar de nieuwste versie van zijn lijst).

9. Blokkeer herhaalde login pogingen

Standaard mag je van WordPress zo vaak achter elkaar als je wilt proberen in te loggen. Dat is niet zo'n goed idee. Als je veiligheidsplug-in er niet voor zorgt dat je na drie mislukte pogingen een uur wordt geblokkeerd, installeer dan een speciale plug-in hiervoor, zoals Simple Login Lockdown.

10. Maak periodieke backups

Veel mensen vinden back-ups maken gedoe. Dat is het ook. Maar het moet wel gebeuren. Er zijn ruwweg twee manieren om dit goed te regelen. Je kunt zelf myPHPAdMin induiken en zorgen dat je periodiek een back-up toegemaild krijgt. Of je kunt een van de talloze plug-ins installeren die dit voor je regelt.

11. Bonustip: je bent nog niet klaar

Denken aan de veiligheid van je site houdt niet op bij het veilig installeren. Je zult de site ook in veiligheidsopzicht moeten onderhouden. Daarover meer in een volgende post.