Mysql Datenbank Backup via mysqldump ohne Root Passwort

Datenbank-Backups gehören zum täglich Brot eines Systemadministrators. Gerne werden hierfür kleine Shell-Skripte auf Basis von mysqldump gebastelt, die via Cronjob angestoßen werden.

Leider finden sich in der Praxis immer wieder Skripte folgender Art:

#!/bin/bash
/usr/bin/mysqldump -uroot -pSecretPassword mydatabase > backup`date +%Y-%m-%d`.sql

Nicht nur unnötig, sondern auch ein Sicherheitsrisiko stellt hier die Verwendung des Root-Users dar.

Zur Laufzeit von mysqldump kann theoretisch das Passwort ausgelesen werden, da es direkt als Shell-Argument angegeben wurde (auch wenn mysqldump sich davor mittlerweile schützt).

Noch schlimmer wird es, wenn der Befehl manuell im Terminal eingegeben wird. Ein einfacher Aufruf von “history” würde jedem, der entsprechenden Shell-Zugang hat, das Passwort anzeigen.

Ein weiteres denkbares Szenario ist, dass dieses Skript unbeabsichtigt für andere Shell-User des gleichen Systems lesbar ist. Schlimmster Fall wäre hier sicher, wenn der User www-data Lesezugriff auf dieses Backup-Skript hätte und es auch noch in einem Verzeichnis liegen würde, das von dem Web-Server ausgeliefert wird.

All diese Szenarien sind natürlich höchst kritisch. Fällt einem Angreifer durch diese Leichtsinnigkeit das Root-Passwort in die Hände, dann stehen ihm alle Türen offen, da der Root-User absolut keinen Einschränkungen hinsichtlich der Berechtigungen unterliegt.

 

Besser:

  1. Es sollte ein eigener Mysql-Benutzer angelegt werden, der nur Leserechte erhält.
    Sollte dieser Account einem Angreifer in die Hände fallen, so kann er “nur” die Daten, die gesichert werden, lesen. Dies ist natürlich auch nicht wünschenswert, allerdings “weniger schlimm” als wenn ein Angreifer freien Zugriff auf alle Daten des Mysql-Servers (über alle Datebanken hinweg) erhält und Daten beliebig löschen und manipulieren kann (evtl. sogar unbemerkt).
    Ein eigener Backup-User mit Leserechten auf alle Tabellen aller Datenbanken kann via SQL wie folgt angelegt werden:

    CREATE USER 'backup'@'localhost' IDENTIFIED BY 'mRQZCMNd4fb79mtLB8';
    GRANT SELECT ON *.* TO 'backup'@'localhost';

    Die Befehle können natürlich leicht abgewandelt werden, je nach entsprechendem Anwendungsfall.

    Siehe:
    http://dev.mysql.com/doc/refman/5.7/en/create-user.html
    http://dev.mysql.com/doc/refman/5.7/en/grant.html

     

  2. Ein eigener Backup-User ist schonmal der erste richtige Schritt. Allerdings sollte auch dieser keiner unbefugten Person in die Hände fallen, denn Lesezugriff auf die Datenbank ist in den meisten Fällen kritisch genug. Um nun diesen Backup-User möglichst abzusichern, sollte das Passwort auch hier nicht als Shell-Argument an mysqldump übergeben werden. Alle wichtigen mysql-Binaries (mysql, mysqldump, mysqladmin usw.) unterstützen es einen Standard-Account (inkl. Passwort) in einer Config-Datei (“.my.cnf“) zu hinterlegen. Diese muss im Home-Verzeichnis des Shell-Users angelegt werden, unter dem später mysqldump (oder das entsprechende Shell-Skript, das mysqldump aufruft) ausgeführt wird.
    Hier ein Beispiel für den Shell-User root

    root@db:~# cat /root/.my.cnf
    [mysqldump]
    user=backup
    password=mRQZCMNd4fb79mtLB8

    Der Wert in den eckigen Klammern gibt an, für welche Binary die nachfolgenden Angaben gelten. Der Rest sollte selbsterklärend sein.

    Wichtig:
    Die Dateirechte für die .my.cnf müssen unbedingt überprüft werden und so angepasst werden, dass niemand außer der Shell-User, in dessen Home-Verzeichnis die Datei liegt, Lesezugriff auf die Datei hat.

    Folgendes Beispiel würde dies bei unserer Datei sicherstellen:

    root@db:~# chmod 0600 /root/.my.cnf
    root@db:~# ls -la /root/.my.cnf
    -rw------- 1 root root 118  4. Jul 2012  /root/.my.cnf

 

Wurden diese Steps umgesetzt, kann in Zukunft mysqldump ohne Logindaten aufgerufen werden.

Das eingangs erwähnte Backup-Skript könnte dann so aussehen:

#!/bin/bash
/usr/bin/mysqldump mydatabase > backup`date +%Y-%m-%d`.sql

So lange kein Unbefugter Zugriff auf den entsprechenden Shell-User erlangt, sollte der MySQL-Backupvorgang mit deutlich verbesserter Sicherheit laufen.

 

Fazit:
Mit 2 einfachen Schritten (eigener Backup-User nur mit Leserechten + Passwort das Users nicht direkt angeben) kann die Sicherheit des Mysql-Servers doch erheblich gesteigert werden.

1 thought on “Mysql Datenbank Backup via mysqldump ohne Root Passwort”

  1. Hallo Pascal,
    tolle Lösung, danke für den Tipp. Ich bekomme allerdings die Meldung:
    Got error: 1044: “Access denied for user ‘backup’@’localhost’ to database ‘nextcloud'” when using LOCK TABLES
    Nach meinem Verständnis fehlt in deiner Beschreibung noch ein
    FLUSH PRIVILEGES;
    Das habe ich aber auch gemacht. Irgend eine Idee, woran es liegt? Bin nicht so bewandert mit SQL

Leave a Reply

Your email address will not be published. Required fields are marked *