root-Login-Problem mit MariaDB

In MariaDB gibt es das Authentifizierungs-Plugin unix_socket (Dokumentation). Heute bin ich das erste Mal darüber gestolpert, weil dieses Plugin bei einer MariaDB-Installation unter Ubuntu 15.10 standardmäßig aktiv ist.

An sich ist das eine feine Sache: Solange Sie als root bzw. mit sudo arbeiten, können Sie sich ohne Passwort beim MySQL-Server anmelden:

sudo mysql -u root
  Welcome to the MariaDB monitor.  Commands end with ; or \g.
  Your MariaDB connection id is 60
MariaDB [(none)]> status;
  Current user:     root@localhost
  ...

Wenn Sie gerade nicht root sind, scheitert der Login.

mysql -u root
  ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Insofern ist MariaDB nun auch ohne Passwort abgesichert. Probleme treten nur dann auf, wenn Sie MariaDB auch dann administrieren möchten, ohne unter Linux als root oder mit sudo zu arbeiten.

MariaDB-root-Passwort setzen

Erfahrene Benutzer werden sagen: Kein Problem, es muss in der mysql.user-Datenbank eben ein Passwort für root definiert werden.

sudo mysql -u root
MariaDB [(none)]> update mysql.user set password=password('geheim') where user='root';
MariaDB [(none)]> flush privileges;

Von nun an müssen Sie sich wieder, wie in der Vergangenheit üblich , mit einem Passwort authentifizieren:

sudo mysql -u root -p
Enter password: *******

MySQL-Login als gewöhnlicher Benutzer

Das Problem ist nur: Wenn Sie unter Linux nicht als root eingeloggt sind bzw. sudo nicht verwenden, funktioniert der Login weiterhin nicht.

mysql -u root -p
Enter password: ******
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

MariaDB führt jetzt nämlich zwei Authentifizierungsverfahren parallel aus: Der DB-Server überprüft, ob Sie als Linux-Benutzer root-Rechte haben UND ob Sie das korrekte Passwort angeben. Das Passwort alleine reicht nicht mehr.

Wenn sich MariaDB so verhalten soll wie früher, d.h., dass Sie sich nach einer Passwort-Angabe auch als gewöhnlicher Benutzer als MariaDB-root anmelden können, dann müssen Sie das unix_socket-Plugin deaktivieren. Werfen Sie zuerst einen Blick in die Tabelle mysql.user

sudo mysql -u root -p
  Enter password: *******
select user,host,password,plugin from mysql.user;
  +------+-----------+------------------------+-------------+
  | user | host      | password               | plugin      |
  +------+-----------+------------------------+-------------+
  | root | localhost | *geheimerhashcode      | unix_socket |
  | root | e320      | *geheimerhashcode      | unix_socket |
  | root | 127.0.0.1 | *geheimerhashcode      | unix_socket |
  | root | ::1       | *geheimerhashcode      | unix_socket |
  +------+-----------+------------------------+-------------+

… und setzen Sie die plugin-Spalte dann auf '':

update mysql.user set plugin='' where user='root';
flush privileges;

Von nun an funktioniert der Login wieder wie in der Vergangenheit.

Nebenwirkungen (Update 7.3.2016)

MariaDB wird unter Ubuntu 15.10 durch das Init-V-Script /etc/init.d/mysql gestartet und wieder beendet. Zum Beenden greift dieses Script auf mysqladmin zurück und verlässt sich dabei darauf, dass mysqladmin mit root-Rechten ohne Passwort funktioniert. Nach den obigen Änderungen ist das aber nicht mehr der Fall.

Damit das Init-Script wieder funktioniert, müssen Sie in /etc/mysql/debian.cnf zweimal Ihr MySQL-root-Passwort im Klartext eintragen (jeweils in der schon vorgesehenen Zeile password = ...). Das ist sicherheitstechnisch natürlich nicht wünschenswert.

Insofern ist es vermutlich besser, die Default-Konfiguration für den MySQL-root-Benutzer zu belassen, wie sie nach einer MariaDB-Neuinstallation ist. Damit Sie auch ohne root-Login MySQL-Administrationsarbeiten durchführen können, richten Sie den MySQL-Benutzer root2 mit uneingeschränkten Rechten ein:

sudo -s
mysql 
  grant all on *.* to root2@localhost 
  identified by 'geheim' with grant option;

7 Gedanken zu „root-Login-Problem mit MariaDB“

  1. Hallo,

    nach Upgrade von MariaDB 10.0.1 auf 10.1.14+ funktioniert nach dem Start der Datenbankzugriff erst mal. Wenn der automatische Anmeldeprozess des Benutzers unter Ubuntu 16.04 abgeschlossen ist, muss ich für den Datenbankzugriff das Passwort neu vergeben:

    sudo /etc/init.d/mysql stop
    sudo mysqld_safe --skip-grant-tables &
    mysql -u root
      update mysql.user set password=password('xxxxxxx') where user='root';
      flush privileges;
      exit 
    

    Dann funktioniert es wieder.
    Weder der Kniff mit der Debian.cnf oder mit root2@localhost greift aber anscheinend für die automatische Anmeldung?

  2. Ist geklärt:
    Datenbanken gesichert!
    sudo /etc/init.d/mysql stop
    sudo apt-get purge mariadb-server mariadb* mysql*
    sudo apt-get autoremove
    sudo apt-get install mariadb-server
    sudo mysql_secure_installation
    sudo mysql_upgrade -p –force

    ALLES SUPER?

  3. Uff, vielen Dank für die Infos! Ein schräges Problem, das ich so niemals verstanden hätte.

  4. Das Tutorial bezieht sich auf das Problem, welches ich habe, allerdings ist es für mich nicht verständlich. Ich bin neu in dieser Materie und hätte mir eine bessere Beschreibung gewünscht wie ich zu den verschiedenen Einstellungen komme. Welche Dateien muss ich anpassen, ich kann die, die ich vermute welche es sein sollen nicht finden. Ist die Beschreibung auch für eine Installation auf Windows oder bezieht sich alles auf Linux?

Kommentare sind geschlossen.