Einleitung

MySQL ist ein Open-Source-Datenbankverwaltungssystem, das üblicherweise als Teil des beliebten LAMP-Stacks (Linux, Apache, MySQL, PHP/Python/Perl) installiert wird. Es implementiert das relationale Modell und verwendet die Structured Query Language (besser bekannt als SQL), um seine Daten zu verwalten.

In diesem Tutorial erfahren Sie, wie Sie MySQL Version 8.0 auf einem Ubuntu 22.04 Server installieren. Am Ende werden Sie eine funktionierende relationale Datenbank haben, die Sie für Ihre nächste Website oder Anwendung verwenden können.

Voraussetzungen

  • Ein Ubuntu 22.04 Server mit einem administrativen Benutzer ohne Root-Rechte und einer mit UFW konfigurierten Firewall (optional).

Schritt 1 – Installation von MySQL

Unter Ubuntu 22.04 können Sie MySQL über das APT-Paket-Repository installieren. Zum Zeitpunkt der Erstellung dieses Artikels ist die Version von MySQL, die im Standard-Ubuntu-Repository verfügbar ist, Version 8.0.28.

Um sie zu installieren, aktualisieren Sie den Paketindex auf Ihrem Server, falls Sie dies nicht kürzlich getan haben:

sudo apt update

Installieren Sie dann das Paket mysql-server:

sudo apt install mysql-server

Stellen Sie mit dem Befehl systemctl start sicher, dass der Server läuft:

sudo systemctl start mysql.service

Diese Befehle installieren und starten MySQL, fordern Sie aber nicht auf, ein Passwort zu setzen oder andere Konfigurationsänderungen vorzunehmen. Da dies Ihre MySQL-Installation unsicher macht, werden wir uns als nächstes damit befassen.

Schritt 2 – MySQL konfigurieren

Bei Neuinstallationen von MySQL sollten Sie das mitgelieferte Sicherheitsskript des Datenbankmanagementsystems ausführen. Dieses Skript ändert einige der weniger sicheren Standardoptionen für Dinge wie das Verbot von Remote-Root-Anmeldungen und das Entfernen von Beispielbenutzern.

Führen Sie das Sicherheitsskript mit sudo aus:

sudo mysql_secure_installation

Dies führt Sie durch eine Reihe von Eingabeaufforderungen, in denen Sie einige Änderungen an den Sicherheitsoptionen Ihrer MySQL-Installation vornehmen können. Die erste Eingabeaufforderung fragt Sie, ob Sie das Validate Password Plugin einrichten möchten, das verwendet werden kann, um die Passwortstärke neuer MySQL-Benutzer zu testen, bevor sie als gültig eingestuft werden.

Wenn Sie das Validate Password Plugin einrichten, muss jeder MySQL-Benutzer, den Sie erstellen und der sich mit einem Kennwort authentifiziert, ein Kennwort haben, das der von Ihnen gewählten Richtlinie entspricht:

HIER KOMMT DER OUTPUT REIN

Unabhängig davon, ob Sie sich für die Einrichtung des Validate Password Plugin entscheiden, werden Sie als Nächstes aufgefordert, ein Passwort für den MySQL-Root-Benutzer festzulegen. Geben Sie ein sicheres Passwort Ihrer Wahl ein und bestätigen Sie es anschließend:

Output
Please set the password for root here.
New password:
Re-enter new password:

Beachten Sie, dass, obwohl Sie ein Passwort für den MySQL-Benutzer root festgelegt haben, dieser Benutzer derzeit nicht so konfiguriert ist, dass er sich mit einem Passwort authentifiziert, wenn er sich mit der MySQL-Shell verbindet.

Sobald das Skript abgeschlossen ist, ist Ihre MySQL-Installation gesichert. Sie können nun mit dem MySQL-Client einen eigenen Datenbankbenutzer erstellen.

Schritt 3 – Erstellen eines eigenen MySQL-Benutzers und Erteilen von Berechtigungen

Bei der Installation erstellt MySQL ein Root-Benutzerkonto, das Sie zur Verwaltung Ihrer Datenbank verwenden können. Dieser Benutzer hat volle Rechte auf dem MySQL-Server, d. h. er hat die vollständige Kontrolle über jede Datenbank, jede Tabelle, jeden Benutzer und so weiter. Aus diesem Grund sollten Sie es vermeiden, dieses Konto außerhalb von Verwaltungsfunktionen zu verwenden. In diesem Schritt wird beschrieben, wie Sie den MySQL-Benutzer root verwenden, um ein neues Benutzerkonto zu erstellen und ihm Berechtigungen zu erteilen.

In Ubuntu-Systemen mit MySQL 5.7 (und späteren Versionen) ist der Root-MySQL-Benutzer so eingestellt, dass er sich standardmäßig mit dem auth_socket-Plugin und nicht mit einem Passwort authentifiziert. Dieses Plugin erfordert, dass der Name des Betriebssystembenutzers, der den MySQL-Client aufruft, mit dem Namen des im Befehl angegebenen MySQL-Benutzers übereinstimmt:

sudo mysql

Sobald Sie Zugriff auf die MySQL-Eingabeaufforderung haben, können Sie einen neuen Benutzer mit einer CREATE USER-Anweisung erstellen. Diese folgen dieser allgemeinen Syntax:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

Nach CREATE USER geben Sie einen Benutzernamen an. Direkt danach folgt ein @-Zeichen und dann der Hostname, von dem aus sich dieser Benutzer verbinden wird. Wenn Sie diesen Benutzer nur lokal von Ihrem Ubuntu-Server aus ansprechen wollen, können Sie localhost angeben. Es ist nicht immer notwendig, sowohl den Benutzernamen als auch den Hostnamen in einfache Anführungszeichen zu setzen, aber es kann helfen, Fehler zu vermeiden.

Führen Sie den folgenden Befehl aus, um einen Benutzer zu erstellen, der sich mit caching_sha2_password authentifiziert. Stellen Sie sicher, dass Sie noah in Ihren bevorzugten Benutzernamen und das Passwort in ein sicheres Passwort Ihrer Wahl ändern:

CREATE USER 'noah'@'localhost' IDENTIFIED BY 'Temp12345!';

Nachdem Sie den neuen Benutzer erstellt haben, können Sie ihm die entsprechenden Rechte erteilen. Die allgemeine Syntax für die Gewährung von Benutzerprivilegien lautet wie folgt:

GRANT PRIVILEGE ON database.table TO 'username'@'host';

Der Wert PRIVILEGE in dieser Beispielsyntax legt fest, welche Aktionen der Benutzer in der angegebenen Datenbank und Tabelle durchführen darf. Sie können demselben Benutzer in einem Befehl mehrere Privilegien erteilen, indem Sie diese durch ein Komma trennen. Sie können einem Benutzer auch global Privilegien erteilen, indem Sie Sternchen (*) anstelle der Datenbank- und Tabellennamen eingeben. In SQL sind Sternchen Sonderzeichen, die für «alle» Datenbanken oder Tabellen stehen.

Zur Veranschaulichung: Der folgende Befehl gewährt einem Benutzer globale Berechtigungen zum CREATE, ALTER und DROP von Datenbanken, Tabellen und Benutzern sowie die Befugnis zum INSERT, UPDATE und DELETE von Daten in jeder Tabelle des Servers. Es gewährt dem Benutzer auch die Möglichkeit, Daten mit SELECT abzufragen, Fremdschlüssel mit dem Schlüsselwort REFERENCES zu erstellen und FLUSH-Operationen mit dem RELOAD-Recht durchzuführen. Sie sollten den Benutzern jedoch nur die Berechtigungen gewähren, die sie benötigen, also können Sie die Berechtigungen Ihres eigenen Benutzers nach Bedarf anpassen.

Führen Sie diese GRANT-Anweisung aus und ersetzen Sie noah durch den Namen Ihres eigenen MySQL-Benutzers, um Ihrem Benutzer diese Rechte zu gewähren:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'noah'@'localhost' WITH GRANT OPTION;

Beachten Sie, dass diese Anweisung auch WITH GRANT OPTION enthält. Damit kann Ihr MySQL-Benutzer anderen Benutzern im System alle Berechtigungen erteilen, die er hat.

Danach ist es ratsam, den Befehl FLUSH PRIVILEGES auszuführen. Dadurch wird der Speicher freigegeben, den der Server als Ergebnis der vorangegangenen CREATE USER- und GRANT-Anweisungen zwischengespeichert hat:

FLUSH PRIVILEGES;

Dann können Sie den MySQL-Client beenden:

exit

Um sich in Zukunft als Ihr neuer MySQL-Benutzer anzumelden, verwenden Sie einen Befehl wie den folgenden:

mysql -u noah -p

Das Flag -p veranlasst den MySQL-Client, Sie nach dem Passwort Ihres MySQL-Benutzers zu fragen, um sich zu authentifizieren.

Zum Schluss testen wir die MySQL-Installation.

Schritt 4 – Testen von MySQL

Unabhängig davon, wie Sie es installiert haben, sollte MySQL automatisch gestartet werden. Um dies zu prüfen, überprüfen Sie den Status.

systemctl status mysql.service

Die Ausgabe sieht in etwa wie folgt aus:

Output
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-04-11 16:04:39 UTC; 2h 36min ago
    Process: 2593 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 2601 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 1119)
     Memory: 354.3M
        CPU: 19.944s
     CGroup: /system.slice/mysql.service
             └─2601 /usr/sbin/mysqld

Wenn MySQL nicht läuft, können Sie es mit sudo systemctl start mysql starten.

Fehlerbehebung

mysql_secure_installation

Ab Juli 2022 tritt ein Fehler auf, wenn Sie das Skript mysql_secure_installation ohne weitere Konfiguration ausführen. Der Grund dafür ist, dass dieses Skript versucht, ein Passwort für das Root-MySQL-Konto der Installation zu setzen, aber dieses Konto ist bei Ubuntu-Installationen standardmäßig nicht für die Verbindung mit einem Passwort konfiguriert.

Vor Juli 2022 schlug dieses Skript nach dem Versuch, das Passwort für das Root-Konto zu setzen, stillschweigend fehl und fuhr mit den restlichen Aufforderungen fort. Ab diesem Zeitpunkt gibt das Skript jedoch die folgende Fehlermeldung aus, nachdem Sie ein Kennwort eingegeben und bestätigt haben:

Output
 ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.

New password:

Dies führt das Skript in eine rekursive Schleife, aus der Sie nur durch Schließen des Terminalfensters herauskommen.

Da das mysql_secure_installation-Skript eine Reihe anderer Aktionen durchführt, die für die Sicherheit Ihrer MySQL-Installation nützlich sind, wird trotzdem empfohlen, dass Sie es ausführen, bevor Sie MySQL zur Verwaltung Ihrer Daten verwenden. Um jedoch zu vermeiden, dass Sie in diese rekursive Schleife geraten, müssen Sie zunächst die Art und Weise anpassen, wie sich Ihr MySQL-Root-Benutzer authentifiziert.

Öffnen Sie zunächst die MySQL-Eingabeaufforderung:

sudo mysql

Führen Sie dann den folgenden ALTER USER-Befehl aus, um die Authentifizierungsmethode des Root-Benutzers in eine Methode zu ändern, die ein Passwort verwendet. Im folgenden Beispiel wird die Authentifizierungsmethode in mysql_native_password geändert:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Nachdem Sie diese Änderung vorgenommen haben, beenden Sie die MySQL-Eingabeaufforderung:

exit

Danach können Sie das Skript mysql_secure_installation ohne Probleme ausführen.

Sobald das Sicherheitsskript abgeschlossen ist, können Sie MySQL erneut öffnen und die Authentifizierungsmethode des Root-Benutzers wieder auf die Standardmethode auth_socket zurücksetzen. Um sich als Root-MySQL-Benutzer mit einem Passwort zu authentifizieren, führen Sie diesen Befehl aus:

mysql -u root -p

Wechseln Sie dann mit diesem Befehl zur Standardauthentifizierungsmethode zurück:

ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;

Dies bedeutet, dass Sie sich wieder als root-Benutzer mit dem Befehl sudo mysql mit MySQL verbinden können.

Falsches Authentifizierungsplugin

Es gibt ein bekanntes Problem mit einigen PHP-Versionen, das Probleme mit caching_sha2_password verursacht. Wenn Sie vorhaben, diese Datenbank mit einer PHP-Anwendung – z. B. phpMyAdmin – zu verwenden, sollten Sie stattdessen einen Benutzer anlegen, der sich mit dem älteren, aber immer noch sicheren mysql_native_password-Plugin authentifiziert.

Wenn Sie sich nicht sicher sind, können Sie jederzeit einen Benutzer anlegen, der sich mit caching_sha2_plugin authentifiziert, und ihn später mit diesem Befehl ALTER ändern:

ALTER USER 'noah'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';