Die Neuinstallation von MariaDB 10.5.12 auf Debian 11 wurde mit dem Skript „mysql_secure_installation“ gesichert, die Frage „Zur Unix_Socket-Authentifizierung wechseln [J/n]“ wurde mit „Ja“ beantwortet.
Jetzt erlaubt MariaDB die Anmeldung des lokalen Root-Benutzers, wenn der Host gleich „localhost“ ist:
mysql --host=localhost
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 40
Server version: 10.5.12-MariaDB-0+deb11u1-log Debian 11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
lehnt aber ab, wenn eine IP-Adresse verwendet wurde:
mysql --host=127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'127.0.0.1'
Nach einigem Duckducking wurden folgende Änderungen an der Datenbank durchgeführt:
CREATE USER 'root'@'::1' IDENTIFIED VIA unix_socket;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'::1' WITH GRANT OPTION;
CREATE USER 'root'@'127.0.0.1' IDENTIFIED VIA unix_socket;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
flush privileges;
Der Parameter „skip-name-resolve“ ist in der Serverkonfiguration nicht vorhanden:
show variables like '%skip_name%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| skip_name_resolve | OFF |
+-------------------+-------+
Die relevanten Root-Konten sind nun:
MariaDB [mysql]> select user, password, host, plugin from user where user='root';
+------+----------+-----------+-------------+
| User | Password | Host | plugin |
+------+----------+-----------+-------------+
| root | | localhost | unix_socket |
| root | | ::1 | unix_socket |
| root | | 127.0.0.1 | unix_socket |
+------+----------+-----------+-------------+
Aus irgendeinem Grund darf der lokale Root auf „localhost“ zugreifen, nicht jedoch auf die Datenbank, weder bei einer Verbindung über „127.0.0.1“ noch bei einer Verbindung über „::1“.
Warum ?
Antwort1
Kurz gesagt localhost
wird behandelt alsSockel verwenden.Diese Antwortauf StackOverflow wird es erklärt:
Der MariaDB-Server (auch MySQL) behandelt localhost auf besondere Weise. Während andere Software es wie einen Alias der Loopback-Adresse 127.0.0.1 behandelt, interpretiert MariaDB es als eine UNIX-Domain-Socket-Verbindung zum Server. Standardmäßig befindet sich diese Socket-Datei in /var/lib/mysql/mysql.sock.
Da Sie bei Verwendung keine Verbindung über den Socket herstellen 127.0.0.1
, funktioniert die Socket-Authentifizierung nicht. Sie müssen entweder localhost
oder verwenden --socket=/path/to/socket
.