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;