Es ist immer ein Problem ... Sie müssen eine neue Benutzerrolle hinzufügen oder einige Berechtigungen ändern, und Sie müssen sie einzeln ... nach ... zuweisen. Dies ist eine regelmäßige Pflicht, insbesondere in großen Organisationen oder in einem Unternehmen, in dem Sie eine komplexe Berechtigungsstruktur haben, oder selbst wenn Sie eine große Anzahl von Datenbankbenutzern verwalten müssen.
Nehmen wir zum Beispiel an, Sie müssen das UPDATE-Privileg zu einer bestimmten Datenbank für das gesamte QA-Team hinzufügen, wenn es sich um ein fünfköpfiges Team handelt, gibt es kein Problem, aber wenn sie 50 ... oder 100 ... sind, ist das möglich werde stark. Natürlich können Sie immer ein Skript dafür schreiben, aber auf diese Weise besteht immer ein Risiko.
In diesem Blog werden wir sehen, wie wir dieses Problem mit der Verwaltung von Datenbankbenutzern lösen können, indem wir Rollen verwenden und spezifische Tipps zu ihrer Verwendung mit MariaDB geben.
Was ist eine Rolle?
In der Datenbankwelt ist eine Rolle eine Gruppe von Rechten, die einem oder mehreren Benutzern zugewiesen werden können, und einem Benutzer können eine oder mehrere Rollen zugewiesen werden. Um einen Vergleich anzustellen, es ist wie eine Gruppe unter Linux OS.
Wenn wir das vorherige Beispiel über die UPDATE-Berechtigung im QA-Team sehen, wenn wir die QA-Rolle erstellt haben und allen QA-Mitgliedern diese Rolle zugewiesen ist, spielt die Anzahl der Mitglieder keine Rolle, Sie müssen nur die Berechtigung ändern auf dieser QA-Rolle und es wird für alle QA-Benutzer weitergegeben.
Rollen auf MariaDB
Um Rollen auf MariaDB zu verwalten, müssen Sie die Rolle mit der CREATE ROLE-Anweisung erstellen, dieser Rolle das Privileg mit einer GRANT-Anweisung zuweisen und dann dem Benutzer das Privileg zuweisen, um diese Rolle verwenden zu können. Sie können auch eine Standardrolle festlegen, damit der Benutzer diese übernimmt, wenn er sich verbindet.
Als Datenbankbenutzer müssen Sie die Rolle festlegen, wenn Sie auf die Datenbank zugreifen (wenn es keine Standardrolle gibt), und Sie können die Rolle bei Bedarf mit einer SET ROLE-Anweisung ändern.
Von der Anwendungsseite aus sollten Sie in der Lage sein, die Rolle festzulegen (oder die Standardeinstellung zu verwenden), bevor Sie eine Abfrage durchführen, damit dies funktioniert, sodass die Implementierung in alten Anwendungen komplex sein könnte.
Sehen wir uns einige Spezifikationen für Rollen in MariaDB an.
- Für den aktuellen Benutzer kann immer nur eine Rolle aktiv sein.
- Seit MariaDB 10.1 haben wir eine Standardrolle. Diese Rolle wird automatisch aktiviert, wenn der Benutzer eine Verbindung herstellt.
- Rollen werden im Speicher gespeichert.
So überprüfen Sie Rollen
Auf MariaDB gibt es mehrere Möglichkeiten, dies zu überprüfen:
- ERTEILUNGEN ANZEIGEN [ FÜR (Benutzer | Rolle) ]:Listet die Berechtigungen für den aktuellen Benutzer oder für einen bestimmten Benutzer auf.
MariaDB [testing]> SHOW GRANTS for [email protected]'%'; +----------------------------------------------------------------------------------------------------------+ | Grants for [email protected]% | +----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' | +----------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec)
- SELECT user FROM mysql.user WHERE is_role='Y':Listen Sie die in der Datenbank erstellten Rollen auf.
MariaDB [testing]> SELECT user FROM mysql.user WHERE is_role='Y'; +--------+ | user | +--------+ | qateam | +--------+ 1 row in set (0.000 sec)
- SELECT * FROM information_schema.applicable_roles:Dies ist eine Liste verfügbarer Rollen für den aktuellen Benutzer.
MariaDB [testing]> SELECT * FROM information_schema.applicable_roles; +-------------+-----------+--------------+------------+ | GRANTEE | ROLE_NAME | IS_GRANTABLE | IS_DEFAULT | +-------------+-----------+--------------+------------+ | [email protected]% | qateam | NO | NO | +-------------+-----------+--------------+------------+ 1 row in set (0.000 sec)
- SELECT * FROM information_schema.enabled_roles:Listen Sie die aktuell aktiven Rollen auf.
MariaDB [testing]> SELECT * FROM information_schema.enabled_roles; +-----------+ | ROLE_NAME | +-----------+ | qateam | +-----------+ 1 row in set (0.000 sec)
- SELECT * FROM mysql.roles_mapping:Listen Sie die Beziehungen zwischen Rollen und Benutzerberechtigungen auf.
MariaDB [testing]> SELECT * FROM mysql.roles_mapping; +-----------+-----------+--------+--------------+ | Host | User | Role | Admin_option | +-----------+-----------+--------+--------------+ | localhost | root | qateam | Y | | % | testuser | qateam | N | +-----------+-----------+--------+--------------+ 2 rows in set (0.000 sec)
So verwalten Sie Rollen in MariaDB
Sehen wir uns ein Beispiel an, wie man es auf MariaDB verwaltet. In diesem Fall verwenden wir die Version MariaDB 10.3, die auf CentOS 7 ausgeführt wird.
Lassen Sie uns zuerst einen neuen Datenbankbenutzer erstellen:
MariaDB [testing]> CREATE USER [email protected]'%' IDENTIFIED BY 'PASSWORD';
Wenn wir die Grants für diesen neuen Nutzer prüfen, sehen wir etwa Folgendes:
MariaDB [testing]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
Versuchen wir nun, uns mit diesem Benutzer anzumelden und eine Verbindung zur Testdatenbank herzustellen:
$ mysql -utestuser -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 54
Server version: 10.3.16-MariaDB-log MariaDB Server
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)]> use testing
ERROR 1044 (42000): Access denied for user 'testuser'@'%' to database 'testing'
Wie wir sehen konnten, können wir mit diesem Benutzer keine Verbindung zur Testing-Datenbank herstellen, also erstellen wir jetzt eine „qateam“-Rolle mit den Privilegien und weisen diese Rolle diesem neuen Benutzer zu.
MariaDB [testing]> CREATE ROLE qateam;
Query OK, 0 rows affected (0.001 sec)
MariaDB [testing]> GRANT SELECT,INSERT,UPDATE,DELETE ON testing.* TO qateam;
Query OK, 0 rows affected (0.000 sec)
Wenn wir versuchen, diese Rolle ohne GRANT zu verwenden, sehen wir den folgenden Fehler:
MariaDB [(none)]> SET ROLE qateam;
ERROR 1959 (OP000): Invalid role specification `qateam`
Also führen wir jetzt GRANT aus, damit der Benutzer es verwenden kann:
MariaDB [(none)]> GRANT qateam TO [email protected]'%';
Query OK, 0 rows affected (0.000 sec)
Stellen Sie die Rolle auf den aktuellen Benutzer ein:
MariaDB [(none)]> SET ROLE qateam;
Query OK, 0 rows affected (0.000 sec)
Und versuchen Sie, auf die Datenbank zuzugreifen:
MariaDB [(none)]> use testing;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [testing]>
Wir können die Berechtigungen für den aktuellen Benutzer überprüfen:
MariaDB [(none)]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT qateam TO 'testuser'@'%' |
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
Und die aktuelle Rolle:
MariaDB [testing]> SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| qateam |
+--------------+
1 row in set (0.000 sec)
Hier sehen wir die Gewährung für die qateam-Rolle, und das war’s, wir haben das Privileg nicht direkt dem Benutzer zugewiesen, wir haben die Privilegien für die Rolle, und der Benutzer übernimmt die Privilegien von dort.
Schlussfolgerung
Die Verwaltung von Rollen kann uns das Leben in großen Unternehmen oder Datenbanken mit einer großen Anzahl von Benutzern erleichtern, die darauf zugreifen. Wenn wir es von unserer Anwendung aus verwenden möchten, müssen wir berücksichtigen, dass die Anwendung es auch verwalten können muss.