phpMyAdmin beveiligen tegen hackers

  •  
  •  

phpMyAdmin is waarschijnlijk de meestgebruikte — volgens velen de beste — management tool voor MySQL databases. Hierdoor wordt deze tool meestal standaard geleverd bij een hostingpakket of bij controlpanels als Plesk, DirectAdmin of CPanel. Wanneer er een lek in PMA ontstaat, dan zijn kwaadwillenden er als de kippen bij met hun pogingen om in te breken op databases op verschillende servers.

Hackers gebruiken de setup die bij schone downloads van PMA aanwezig is om op die manier toegang tot databases te verkrijgen of ze gebruiken simpelweg brute-forcing, waar phpMyAdmin helaas geen beveiliging tegen biedt. Het uiteindelijke doel moge voor de hand liggen: 

Security Trough Obscurity

Een veelgebruikte methode om PMA te beveiligen is door de URL aan te passen naar iets alternatiefs als "sqladmin" of iets totaal willekeurigs. Helaas heeft dit hooguit als effect dat je de hacker vertraagt in zijn pogingen. Deze manier van beveiligen wordt vaak "Security Trough Obscurity" genoemd, kortom schijnveiligheid.

Daarom onderstaand een aantal stappen die je kunt zetten om phpMyAdmin wel juist te beveiligen:

Beveiligingsmaatregelen

1. Installeer phpMyAdmin vanaf de packagemanager

Download niet zelf een kopie van phpMyAdmin maar gebruik de versie die aangeboden wordt via de standaard packagemanager. Wellicht heb je dan niet perse de laatste versie, maar wel een versie die de laatste beveiligingspatches heeft. Met APT — de meestgebruikte packagemanager — kun je PMA als volgt installeren:

apt-get install phpmyadmin

Vervolgens kun je de rest van de configuratie terugvinden in /etc/phpmyadmin.

2. Een sterk wachtwoord dat je periodiek veranderd

Hoe voor de hand liggend ook, maar kies altijd een zeer sterk wachtwoord. Wachtwoorden die onder de koppen "Strong Passwords" of "Ft. Knox Passwords" staan op de Random Key Generator-site zijn sterk genoeg.

Pas vervolgens je wachtwoord ook vaak genoeg aan, eens in de drie maanden bijvoorbeeld (is geen industry standard of iets dergelijks). Een jaartal in je wachtwoord gebruiken is een absolute no-go en als je vervolgens het jaartal elk jaar aanpast ben je gewoon af.

3. Apache Access Control

Deze methode zorgt dat je alleen bepaalde ip-adressen (of hostnames) kunt toestaan op PMA. Alle 'onbekende' ip-adressen worden dan standaard geblokkeerd. De exacte syntax verschilt tussen Apache 2.2 en Apache2.4, maar spreekt verder voor zich. Onderstaand een simpel voorbeeld voor beide versies, welke je aan het bestand /etc/phpmyadmin/apache.conf kunt toevoegen:

# Apache 2.4

Require ip 8.7.6.5
# Apache 2.2

Order deny,allow
Deny from all
Allow from 8.7.6.5

 

 

Gebruik in het geval van Apache2.4 liever niet de Allow host methode gezien deze relatief makkelijk te spoofen is. Houdt tevens de IP-adressen die je toevoegt beperkt en gebruik vooral geen ranges, gezien dit de beveiliging alleen maar verzwakt.

4. Vermeid phpMyAdmin's 'HTTP'-authenticatie, gebruik 'Cookie'-authenticatie

Wanneer je een recente versie van PMA gebruikt dan staat standaard de 'cookie authentication' aan en hoef je aan te passen. Wanneer je echter een wat oudere versie hebt kan het zijn dat de 'http authentication' ingeschakeld is, welke helaas zeer onveilig is omdat deze gebruik maakt van het verouderde basic access authentication-mechanisme van HTTP.

Om er echt zeker van te zijn dat jouw configuratie juist is, zorg je dat in het bestand /etc/phpmyadmin/config.inc.php de volgende instellingen terug te vinden zijn:

$cfg['blowfish_secret'] = 'your-fort-knox-password-here';
$cfg['Servers'][$i]['auth_type'] = 'cookie';

5. Maak gebruik van HTTPS

Zorg dat phpmyadmin alleen toegankelijk is via een SSL verbinding. Je kunt hier natuurlijk een certificaat voor kopen, een gratis LetsEncrypt certificaat gebruiken maar een self-signed certificaat is het gemakkelijkst en werkt even goed. De enige uitzondering is dat je een keer een uitzondering moet toevoegen aan je webbrowser.

In onderstaand voorbeeld gebruik ik het standaard snakeoil-certificaat dat geïnstalleerd is op bijna alle Linux distributies. Mocht dit niet het geval zijn dan kun je het certificaat genereren:

make-ssl-cert generate-default-snakeoil

Eventueel kun je ook handmatig een certificaat genereren:

openssl req -x509 -nodes -days 2048 -newkey rsa:2048 -keyout /etc/ssl/private/phpmyadmin.key -out /ets/ssl/certs/phpmyadmin.pem

Vervolgens dien je de SSL-module in Apache in te schakelen, indien dat nog niet gebeurd is:

a2enmod ssl
service apache2 restart

Vervolgens kun je een default-host met het standaard certificaat toevoegen. Maak hiervoor een nieuw bestand in /etc/apache2/sites-available/000-defaults-ssl.conf met de volgende inhoud:

<VirtualHost _default_:443>
ServerAdmin your@webmaster.address

DocumentRoot /var/www
<Directory /var/www/>
Options -Indexes

# For apache 2.4:
Require all granted
# For apache 2.2:
# Order allow,deny
# Allow from all
</Directory>

SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

Pas bovenstaand eventueel de paden en het admin adres aan en schakel vervolgens de site in:

a2ensite 000-default-ssl.conf
service apache2 reload

Controleer eventueel of de andere sites nog werken. Door deze instelling wordt voor alle standaard SSL verbindingen hetzelfde certificaat gebruikt, dit kun je later eventueel per VirtualHost nog aanpassen.

Als laatste zorg je dat in /etc/phpmyadmin/config.inc.php — of een in een nieuw php-bestand in de map /etc/phpmyadmin/conf.d als deze map bestaat — waardoor phpMyAdmin http redirect naar https:

$cfg['ForceSSL'] = true;

Conclusie

Bovenstaand worden slechts een aantal methoden genoemd om phpMyAdmin goed te beveiligen, er bestaan zeker meer mogelijkheden om je beveiliging sterker of anders te realiseren. Bijvoorbeeld door phpMyAdmin op een niet standaard poort te installeren — met een VirtualHost in Apache — en alleen jouw ip-adres toe te staan via een iptables firewall, echter vereist deze methode relatief veel configuratie.

Genoemde punten zijn gebaseerd op standaarden die meestal al op servers aanwezig zijn waar phpMyAdmin op geïnstalleerd is. Daarnaast geven deze punten een beveiliging die ruimvoldoende is voor de meeste configuraties.

Zo lang systemen in ontwikkeling zijn, ontwikkelen kwaadwillenden zich mee. Hierdoor dient elke beveiliging continu bijgehouden te worden en wordt een beveiliging altijd minder sterk na verloop van tijd. Blijf daarom op de hoogte van veranderingen en probeer waar mogelijk constant verbeteringen in te bouwen. Wanneer een server  bijvoorbeeld zeer gevoelige informatie bevat is het simpelweg de beste oplossing om phpMyAdmin in zijn geheel te vermijden. 

Gebruikte bronnen

  1. Een goed wachtwoord
    1. http://stackoverflow.com/questions/2631269/how-to-secure-phpmyadmin#comment2657512_2632020
  2. phpMyAdmin authentication mechanismes
    1. http://howtolamp.com/lamp/phpmyadmin/4.2/authentication-modes/
  3. phpMyAdmin over SSL
    1. http://askubuntu.com/questions/49196/how-do-i-create-a-self-signed-ssl-certificate
    2. https://www.digitalocean.com/community/tutorials/how-to-set-up-ssl-certificates-with-phpmyadmin-on-an-ubuntu-12-04-vps