LINUXMAKER, OpenSource, Tutorials

Problem beim Root-Login zusammen mit MariaDB

In MariaDB gibt es das Authentifizierungs-Plugin unix_socket (siehe auch Dokumentation). Unter einer Ubuntu- und Debian-Installation (ab Stretch) ist dieses Plugin bei einer MariaDB-Installation standardmäßig aktiviert.

Das macht aus Sinn, da es unterschiedliche Start-Up-Skripte gibt, die ohne diese passwortlose Authentifizierung nicht mehr funktionieren würden. Denn solange man als root bzw. mit sudo arbeitet, kann man sich ohne Passwort beim MySQL-Server anmelden:

# mysql -u root
         
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 48
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> status;
Current user:           root@localhost
...

Allerdings sobald Sie nicht als root eingeloggt sind, wird der Login scheitern.

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

Somit ist MariaDB generell nun auch ohne Passwort abgesichert. Problematisch wird es erst, wenn Sie MariaDB administrieren möchten , wenn Sie nicht als root oder mit sudo abeiten sollten. Das geht nämlich nicht, auch nicht wenn Sie dem root ein Passwort vergeben würden.

Nicht empfehlenswert, die Entfernung des unix_socket

Wenn Sie unter Linux nicht als root eingeloggt sind, funktioniert der Login nachwievor noch nicht, sofern Sie das alte Verhalten mit dem Rootpasswort eingerichtet haben sollten.

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üssten Sie das unix_socket-Plugin deaktivieren.

Allerdings hiervon ist definitiv abzuraten, da ansonsten viele Scripte des Start-Ups angepasst werden müssten. Das kann durchaus wieder ein Sicherheitsrisiko darstellen. Also ist diese Lösung die Schlechtere.

MariaDB [(none)]> select user,host,password,plugin from mysql.user;
+------+-----------+-------------------------------------------+-------------+
| user | host      | password                                  | plugin      |
+------+-----------+-------------------------------------------+-------------+
| root | localhost | secrethashcode                            | unix_socket |
+------+-----------+-------------------------------------------+-------------+
1 row in set (0.00 sec)

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

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

Jetzt funktioniert der Login wieder wie in der Vergangenheit,

wovon allerdings definitiv abzuraten ist.

Zweiten Admin unter MariaDB mit administrativen Rechten setzen

Anstatt diese Annehmlichkeiten des root unter MariaDB wieder zu entfernen, legen wir unser besser einen weiteren Datenbank-Administrator an.

# mysql -u root
MariaDB [(none)]> CREATE USER 'adminsql'@'localhost' IDENTIFIED BY 'secrect';
GRANT ALL PRIVILEGES ON *.* TO 'adminsql'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

Für eine Remote-Verbindung - was unsicher ist - sieht das so aus:

MariaDB [(none)]> CREATE USER 'adminsql'@'%' IDENTIFIED BY 'secret';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'adminsql'@'%' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

Besonderheiten (Update 7.3.2016)

MariaDB wird unter Debian Jessie 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 'secret' with grant option;