Brute force attacks op WordPress
De afgelopen dagen ging steeds mijn webserver down tezamen met een aantal sites die er op draaien. Helaas was ik veel onderweg of druk bezig om het aan te pakken. Vandaag had ik dan eindelijk tijd om hier wat aan te doen. Waarom ging mijn server down? Door allerlei pogingen om in te loggen in mijn website. Ik gebruik WordPress en men probeerde hierop in te loggen om zo spam of andere troep er op te zetten. Gelukkig gebruik ik moeilijke wachtwoorden dus de pogingen mislukte, maar mijn server kreeg zoveel inlog-pogingen voor zijn kiezen dat hij het werk niet meer aankon en crashte.
Het werd tijd om wat achterstallige beveiligingen aan te brengen.
Ik heb twee dingen op mijn lijst staan:
1. Een extra authenticatielaag invoeren zodat men alleen bij de inlogpagina kan komen met een username en wachtwoord. Daarna kunnen ze met hun gebruikelijke inlog gegevens in WordPress komen.
2. Alle permissies van WordPress op de bestanden goed zetten zodat men wel plaatjes kan uploaden, maar WordPress niet open staat voor allerlei aanvallen.
Extra authenticatie laag
Hiervoor heb ik de .htaccess file aangepast zodat er een wachtwoord gevraagd wordt als het bestand ./wp-login.php wordt aangeroepen. Dit bestand is nodig om in te loggen en je zag in mijn Apache logfiles dat deze ook veel (10-20x per seconde) werd aangeroepen.
Tijd om deze te blokkeren. In de .htaccess heb ik opgenomen:
# BEGIN WordPress brute force AuthUserFile /etc/apache2/[een htpassword file] AuthName "Inloggen in het CMS" AuthType Basic require user [een username] # END WordPress brute force
Nu moest ik alleen nog het wachtwoord opslaan:
sudo htpasswd -c /etc/apache2/[een htpassword file] [een username]
En dan het bijbehorende wachtwoord.
Rechten op bestanden goed zetten
Leuk dat men de eigen plug-ins kan updaten of plaatjes kan uploaden, maar het is niet de bedoeling dat bezoekers de website-folders ook kunnen beschrijven. Hoe probeer je dit zoveel mogelijk te voorkomen? Gelukkig heeft iemand anders daar over nagedacht en heb ik het volgende script gebruikt: WordPress Permissions Configuration Script
#!/bin/bash # # This script configures WordPress file permissions based on recommendations # from http://codex.wordpress.org/Hardening_WordPress#File_permissions # # Author: Michael Conigliaro # WP_OWNER=changeme # <-- wordpress owner WP_GROUP=changeme # <-- wordpress group WP_ROOT=/home/changeme # <-- wordpress root directory WS_GROUP=changeme # <-- webserver group # reset to safe defaults find ${WP_ROOT} -exec chown ${WP_OWNER}:${WP_GROUP} {} \; find ${WP_ROOT} -type d -exec chmod 755 {} \; find ${WP_ROOT} -type f -exec chmod 644 {} \; # allow wordpress to manage wp-config.php (but prevent world access) chgrp ${WS_GROUP} ${WP_ROOT}/wp-config.php chmod 660 ${WP_ROOT}/wp-config.php # allow wordpress to manage .htaccess touch ${WP_ROOT}/.htaccess chgrp ${WS_GROUP} ${WP_ROOT}/.htaccess chmod 664 ${WP_ROOT}/.htaccess # allow wordpress to manage wp-content find ${WP_ROOT}/wp-content -exec chgrp ${WS_GROUP} {} \; find ${WP_ROOT}/wp-content -type d -exec chmod 775 {} \; find ${WP_ROOT}/wp-content -type f -exec chmod 664 {} \;
Het enige wat ik nog moest doen was het op een bepaalde plek opslaan en uitvoeren. Ik sloeg het op als een permissies.sh script in Ubuntu ergens. Paste de changeme velden aan. En met:
chmod +x ~/permissies.sh
zorgde ik er voor dat het uitvoerbaar werd. Eenmaal het bestand uitvoerbaar kan je het uitvoeren en het zet alle rechten goed.