Einführung
Zugriffskontrolle und Benutzerverwaltung sind zwei Bereiche, die schnell komplex werden können, wenn die Anzahl der Benutzer und unterschiedlichen Datenbankentitäten in Ihrem System zunimmt. Das Verwalten vieler verschiedener Berechtigungen für verschiedene Datenbankobjekte, das Sicherstellen, dass Benutzer mit den gleichen Verantwortlichkeiten die gleiche Zugriffsebene haben, und das Auditieren und Einschränken des Zugriffs werden mit der Zeit immer schwieriger.
Um dem entgegenzuwirken, verfügt MySQL über ein Konzept namens „Rollen“, mit dem Sie Bündel von Berechtigungen unter einem bestimmten Namen gruppieren können, sodass Sie Einstellungen massenhaft zuweisen und ändern können. In diesem Leitfaden gehen wir darauf ein, wie Rollen in MySQL funktionieren und wie Sie sie verwenden, um die Verwaltung des Datenzugriffs für Ihre Benutzer zu vereinfachen.
Befehle
Hier sind die wichtigsten SQL-Befehle, die wir in Bezug auf die Verwaltung von MySQL-Rollen besprechen werden.
CREATE ROLE
:DieCREATE ROLE
Befehl definiert eine neue Rolle innerhalb des Datenbanksystems.DROP ROLE
:DieDROP ROLE
Der Befehl macht das Gegenteil und löscht eine vorhandene Rolle.GRANT
:DerGRANT
Der Befehl hat zwei unterschiedliche Zwecke in Bezug auf Rollen:das Hinzufügen von Berechtigungen zu Rollen und das Hinzufügen von Benutzerkonten als Mitglieder von Rollen.REVOKE
:Im Kontext von Rollen derREVOKE
Der Befehl entfernt Berechtigungen von einer Rolle und entfernt auch die Rollenmitgliedschaft von Benutzerkonten.SHOW GRANTS
:DieSHOW GRANTS
Der Befehl zeigt die Berechtigungen des angegebenen Benutzerkontos oder der Rolle an.SET ROLE
:DieSET ROLE
Der Befehl ändert die Rollen, die ein Benutzerkonto aktiv verwendet. Auf diese Weise können Sie festlegen, welche Berechtigungssätze für das Konto für die Sitzung gelten.SET DEFAULT ROLE
:DieSET DEFAULT ROLE
Der Befehl definiert die Rollen, die automatisch angewendet werden, wenn sich ein Client mit einem bestimmten Benutzerkonto anmeldet.
Erforderliche Berechtigungen
Um diesem Leitfaden folgen zu können, benötigen Sie die folgenden Berechtigungen:
CREATE ROLE
GRANT OPTION
CREATE USER
(um die Standardrollen für einen anderen Benutzer festzulegen)ROLE_ADMIN
(um Systemvariablen festzulegen, die das Rollenverhalten ändern)SYSTEM_VARIABLES_ADMIN
(um Systemvariablen festzulegen, die das Rollenverhalten ändern)
Die CREATE ROLE
Privileg ist eine geringere Version von CREATE USER
Privileg, mit dem Sie Rollen erstellen und verwalten können. Konten, die bereits den CREATE USER
haben verfügen automatisch über alle Funktionen, die zum Verwalten von Rollen erforderlich sind.
Die GRANT OPTION
Berechtigung ist erforderlich, um einer Rolle Berechtigungen zuzuweisen. Sie müssen über GRANT OPTION
verfügen aktiviert für alle Privilegien, die Sie einer Rolle zuweisen möchten.
Was sind Rollen?
In MySQL ist eine Rolle eine Entität, die als Container oder Sammlung von Berechtigungen fungiert. Administratoren können Rollen Berechtigungen auf die gleiche Weise zuweisen, wie sie Benutzerkonten Berechtigungen zuweisen. Anschließend können Sie Benutzerkonten als Mitglieder der Rolle hinzufügen und diesen Konten Zugriff auf die mit der Rolle verbundenen Berechtigungen gewähren.
Grundsätzlich dienen Rollen dazu, verschiedene verwandte Berechtigungen zu bündeln, um die Berechtigungsverwaltung zu vereinfachen. Anstatt sicherzustellen, dass jeder Benutzer genau die Zugriffsebene hat, die er benötigt, indem er einzelne Berechtigungen zuweist, können Sie durch die Verwendung von benannten Gruppierungen von Berechtigungen weniger und leichter verständliche Zuweisungen verwalten.
Dies hat einen klaren Vorteil bei der Zuweisung von Zugriffsebenen, da es einfacher ist, einen developer
zuzuweisen , sysadmin
, oder financeteam
Rolle für einen Benutzer, als Dutzende von Privilegien einzeln zu verwalten. Es macht es auch schnell, den Zugriff auf mehrere Konten gleichzeitig zu optimieren. Wenn Sie eine neue Datenbank für das Verkaufsteam erstellen, können Sie den salesteam
angeben Rollenzugriff darauf, anstatt jedes Konto aufzuspüren, das Zugriff haben sollte.
Rollen erstellen
Wenn Sie ein Konto mit der CREATE ROLE
haben Berechtigung können Sie Rollen mit CREATE ROLE
verwalten Befehl.
Was ist MySQLs Syntax für Rollen?
Rollennamen müssen einem bestimmten Format folgen, damit MySQL sie als gültig betrachtet. In vielerlei Hinsicht spiegeln sie das Format wider, das zum Definieren von MySQL-Benutzerkonten verwendet wird, jedoch mit einigen wichtigen Unterschieden.
Rollen haben das folgende Format:
'<role>'@'<host>'
Rollen bestehen wie Benutzer aus zwei Komponenten:dem Rollennamen und dem Host, von dem aus der Client eine Verbindung herstellt. Die Art und Weise, wie MySQL diese Komponenten interpretiert, unterscheidet sich jedoch.
Bei Rollen der '<role>'
Teil des Namens darf niemals leer sein. Es gibt kein „anonymes“ Rollenkonzept wie bei Benutzern. Weglassen des '<host>'
andererseits Teil ist weiterhin erlaubt, und MySQL verwendet %
als Gastgeber. Der %
wird in diesem Zusammenhang als wörtliches Zeichen interpretiert, nicht als Platzhalter.
Effektiv bedeutet dies, dass Rollennamen zwar oberflächlich das Format der Benutzerkontennamen teilen, aber keiner Art von Bewertung unterzogen werden wie Benutzerkonten und nur eine Bezeichnung mit zwei Komponenten sind. Der Grund, warum sie es tun zwei Namen haben, ist, dass Sie Benutzerkonten erstellen können, die sowohl als Benutzer als auch als Rollen fungieren können. Bei der Verwendung als Benutzer unterliegen die Komponenten den speziellen Auswertungsregeln, die im Artikel zur Benutzerverwaltung beschrieben sind, und bei der Verwendung als Rolle wird der Name einfach direkt anhand der wörtlichen Komponentennamen abgeglichen.
Aufgrund dieser Regeln entscheiden sich Administratoren in vielen Fällen dafür, Rollen nur mit '<role>'
zu definieren Komponente. Dies veranlasst MySQL, ein wörtliches %
zu ersetzen Zeichen für den '<host>'
Komponente, wodurch dieser Teil des Namens unsichtbar und belanglos wird. Wenn Sie nicht beabsichtigen, dass ein Name sowohl als Benutzerkonto als auch als Rolle verwendet wird, können Sie dasselbe tun.
Wie erstellt man Rollen?
Um neue Rollen zu erstellen, verwenden Sie CREATE ROLE
Befehl.
Die grundlegende Syntax sieht folgendermaßen aus:
CREATE ROLE '<role>'@'<host>';
Sie können auch mehrere Rollen gleichzeitig erstellen, indem Sie jeden Rollennamen durch ein Komma trennen:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Wenn eine der von Ihnen angegebenen Rollen bereits auf dem System vorhanden ist, schlägt der Befehl mit einem Fehler fehl.
Um dies zu vermeiden und MySQL dazu zu bringen, nur eine Warnung auszugeben, können Sie den IF NOT EXISTS
einfügen -Klausel nach CREATE ROLE
Befehl vor den Rollennamen:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';
Wie oben erwähnt, lassen Administratoren oft den '<host>'
weg Teil des Rollennamens der Einfachheit halber, indem Sie ihn implizit auf den wörtlichen %
setzen Charakter. In der Praxis sehen viele Ihrer Befehle zum Erstellen von Rollen also eher so aus:
CREATE ROLE '<role>';
Wie gewähren Sie einer Rolle Privilegien?
Nachdem Sie neue Rollen erstellt haben, besteht Ihre nächste Priorität normalerweise darin, ihnen Bedeutung zu verleihen, indem Sie ihnen Berechtigungen gewähren.
Sie erteilen Rollen Berechtigungen auf die gleiche Weise, wie Sie Benutzerkonten Berechtigungen erteilen. Sie geben die genauen Privilegien an, die Sie gewähren möchten, geben einen Bereich an, indem Sie die Datenbank und das Datenbankobjekt angeben, in denen die Privilegien gültig sind, sowie die Entität, der die Privilegien gewährt werden sollen – in diesem Fall eine Rolle:
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';
Zum Beispiel, um den SELECT
zu erteilen Privileg einer Rolle namens readapp
auf der appdb
Datenbank und allen darin enthaltenen Objekten, könnten Sie Folgendes eingeben:
GRANT SELECT ON appdb.* TO 'readapp';
Auf ähnliche Weise können Sie einer Rolle namens writeapp
Schreibrechte für dieselbe Datenbank erteilen indem Sie Folgendes eingeben:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';
Sie können Rollen Berechtigungen erteilen und sie entziehen, genauso wie Sie es direkt mit Benutzerkonten tun würden. Sie können also jederzeit die mit einer Rolle verbundenen Berechtigungen ändern, wenn Sie die Zugriffsebene anpassen müssen, die Sie bereitstellen möchten.
Wie gewähren Sie Benutzern die Mitgliedschaft in einer Rolle?
Nachdem Sie Ihren Rollen Berechtigungen hinzugefügt haben, können Sie damit beginnen, Mitglieder zu der Rolle hinzuzufügen, um ihnen die zugehörigen Berechtigungen zu gewähren.
Dazu verwendet MySQL eine andere Form desselben GRANT
wir verwenden, um Benutzern und Rollen Berechtigungen zu erteilen. Dieses neue Formular fügt einem Benutzer jedoch Rollen hinzu und ermöglicht dem Benutzerkonto den Zugriff auf alle Rechte, die der Rolle zugeteilt wurden.
Die grundlegende Syntax sieht folgendermaßen aus:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';
Wenn beispielsweise 'reports'@'localhost'
Benutzer muss in der Lage sein, Daten aus der appdb
zu lesen Datenbank zum Generieren von Berichten können wir die readapp
hinzufügen Rolle für das Benutzerkonto, indem Sie ihm ausgewählte Privilegien geben:
GRANT 'readapp' TO 'reports'@'localhost';
Ebenso geben Sie den 'appuser'@'localhost'
an die Möglichkeit, die Daten innerhalb derselben Datenbank zu verwalten, können wir diesen Benutzer zu einem Mitglied der writeapp
machen Rolle:
GRANT 'writeapp' TO 'appuser'@'localhost';
Der 'appuser'@'localhost'
Das Konto hat jetzt die Möglichkeit, Daten in die Datenbank einzufügen, zu aktualisieren und zu entfernen. Wenn der writeapp
neue Berechtigungen hinzugefügt werden Rolle, der 'appuser'@'localhost'
Konto erhält diese Privilegien sofort.
Wie weisen Sie jedem Benutzer automatisch bestimmte Rollen zu?
Manchmal kann es Rollen geben, auf die jeder Benutzer auf Ihrem System Zugriff haben soll. Sie können definieren, welche Rollen jedem Konto automatisch zugewiesen werden, indem Sie die mandatory_roles
festlegen Variable.
Zum Ändern der mandatory_roles
Variable muss Ihr Benutzer den ROLE_ADMIN
haben und SYSTEM_VARIABLES_ADMIN
Privilegien. Sie können die Rollen festlegen, die Sie jedem Benutzer zuweisen möchten, indem Sie Folgendes eingeben:
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';
Hier weisen wir jedem Benutzer im System automatisch drei Rollen zu. Beim Setzen der Systemvariable der Wert von mandatory_roles
muss eine Zeichenfolge sein, also kapseln wir die gesamte Rollenliste in einfache Anführungszeichen und verwenden Backticks, um einzelne Rollenkomponenten zu zitieren.
Sie können den mandatory_roles
keine Rolle hinzufügen Liste mit dem SYSTEM_USER
Privileg. Dies ist eine Sicherheitsmaßnahme, um sicherzustellen, dass nicht alle Sitzungen auf dem System automatisch Systemsitzungen sind.
Wie verwenden Sie Berechtigungen von Rollen?
Wie verwenden Sie die Rollen, nachdem Sie Benutzerkonten die Mitgliedschaft gewährt haben? Um auf die Privilegien zugreifen zu können, die einem Konto durch eine Rolle gewährt werden, muss diese aktiviert werden.
Anzeige der aktuell aktiven Rollen
Bevor Sie neue Rollen aktivieren, können Sie überprüfen, welche Rollen derzeit für Ihre Benutzersitzung aktiv sind.
Um die aktiven Rollen für Ihre Sitzung anzuzeigen, geben Sie Folgendes ein:
SELECT CURRENT_ROLE()
Die Ausgabe zeigt null oder mehr Rollen an, die in Ihrer aktuellen Sitzung aktiv sind. Die mit diesen Rollen verbundenen Berechtigungen erweitern die Aktionen, die Sie ausführen dürfen.
So aktivieren Sie Rollen für die Sitzung
Um zu ändern, welche Rollen während Ihrer Sitzung aktiv sind, verwenden Sie SET ROLE
Befehl. Sie können diesen Befehl auf verschiedene Arten verwenden.
Die grundlegende Syntax sieht folgendermaßen aus:
SET ROLE '<rolename>'@'<host>';
Dadurch wird die betreffende Rolle aktiviert. Es ist wichtig zu beachten, dass alle zuvor aktiven Rollen nicht in SET ROLE
erwähnt werden Befehl wird nun deaktiviert.
Um mehr als eine Rolle gleichzeitig zu aktivieren, trennen Sie jede Rolle durch ein Komma:
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Um alle Rollen zu aktivieren, die Ihrem Konto zugewiesen wurden, können Sie ALL
angeben anstelle einer bestimmten Rolle:
SET ROLE ALL;
Sie können MySQL auch anweisen, alle Ihre Rollen mit bestimmten Ausnahmen zu aktivieren, indem Sie ALL EXCEPT
verwenden :
SET ROLL ALL EXCEPT '<role_1>'@'<host>';
Eine weitere Option besteht darin, alle Rollen in Ihrem Konto zu deaktivieren, indem Sie NONE
angeben :
SET ROLE NONE
Dadurch werden alle Ihre Benutzerrollen für die Sitzung deaktiviert, sodass Sie nur die Berechtigungen erhalten, die speziell Ihrem Benutzerkonto zugewiesen sind.
Um zur Standardliste der für Ihr Konto definierten Rollen zurückzukehren, verwenden Sie DEFAULT
Stichwort:
SET ROLE DEFAULT
So definieren Sie Standardrollen für ein Benutzerkonto
Die Rollen, die automatisch aktiviert werden, wenn Sie sich als Benutzer anmelden, und diejenigen, die wieder aktiviert werden, wenn Sie SET ROLE DEFAULT
verwenden sind konfigurierbar.
Um die Rollen zu definieren, die standardmäßig aktiviert werden, verwenden Sie SET DEFAULT ROLE
Befehl ähnlich wie bei der Verwendung von SET ROLE
Befehl:
SET DEFAULT ROLE '<role_1>'@'<host>';
Dadurch werden die Standardrollen festgelegt, die für Ihr eigenes Konto bei der Anmeldung oder bei Verwendung von SET ROLE DEFAULT
aktiviert werden .
Wenn Ihr Benutzer den CREATE USER
hat Berechtigung können Sie die Standardrollen für andere Konten festlegen:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';
Hier geben wir an, dass der '<user>'@'<host>'
Das Konto sollte bei der Authentifizierung automatisch alle seine Rollen aktivieren.
Diese Syntax kann auch verwendet werden, um die Standardrollen für mehr als ein Konto zu definieren, indem Sie jeden Benutzer durch ein Komma trennen:
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';
Standardmäßig alle Rollen für alle Benutzer aktivieren
Wenn Sie möchten, dass jedes Konto auf Ihrem MySQL-Server standardmäßig alle seine Rollen aktiviert, können Sie eine Systemeinstellung ändern, um dies zu tun.
Wenn die activate_all_roles_on_login
auf true gesetzt ist, aktiviert MySQL beim Anmelden automatisch alle mit einem Konto verknüpften Rollen. Dies ersetzt die durch SET DEFAULT ROLE
festgelegten Einstellungen .
Um diese Funktion zu aktivieren, müssen Sie über den SYSTEM_VARIABLES_ADMIN
verfügen und ROLE_ADMIN
Privilegien. Aktivieren Sie die Funktion, indem Sie Folgendes eingeben:
SET PERSIST activate_all_roles_on_login = ON;
Dadurch aktivieren Benutzerkonten automatisch alle Rollen bei der Anmeldung. Jedoch SET ROLE DEFAULT
erlaubt Ihnen weiterhin, nur die mit einem Konto verknüpften Standardrollen zu aktivieren.
Vorhandene Berechtigungen anzeigen, die durch Rollen erlangt wurden
Um zu verstehen, welche Privilegien für Ihr Konto verfügbar sind, können Sie SHOW GRANTS
verwenden Befehl.
Geben Sie Folgendes ein, um die für einen Benutzer aktivierten Berechtigungen zu überprüfen:
SHOW GRANTS FOR '<user>'@'<host>';
Die Ausgabe zeigt Ihnen alle Berechtigungen, die dem Benutzerkonto direkt zugewiesen sind, sowie alle Rollen, denen der Benutzer angehört.
Nachdem Sie erfahren haben, welchen Rollen ein Konto angehört, können Sie überprüfen, welche Berechtigungen diese Rolle dem Benutzer bietet, indem Sie Folgendes eingeben:
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';
Zum Beispiel, um die Privilegien von 'reports'@'localhost'
zu überprüfen Benutzer, einschließlich derjenigen, die ihm durch seine Mitgliedschaft in der readapp
gewährt werden Rolle können Sie Folgendes verwenden:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';
Dies zeigt Ihnen alle Privilegien, die 'reports'@'localhost'
explizit gewährt wurden Benutzerkonto sowie die von der readapp
hinzugefügten Rolle.
Widerrufen einer Rolle von einem Benutzer
Was passiert also, wenn Sie eine Rolle von einem Benutzer entfernen möchten? Ähnlich wie beim GRANT
Der Befehl REVOKE
kann entweder einem Benutzer oder einer Rolle neue Berechtigungen hinzufügen oder einem Benutzer Rollen hinzufügen Der Befehl kann Berechtigungen von einem Benutzer oder einer Rolle entfernen und kann auch die Rollenmitgliedschaft von einem Benutzer entfernen.
Die grundlegende Syntax zum Entfernen einer Rolle aus einem Benutzerkonto sieht folgendermaßen aus:
REVOKE '<role>' FROM '<user>'@'<host>';
Nach dem Ausführen einer solchen Anweisung hat der Benutzer keinen Zugriff mehr auf die Berechtigungen, die ihm über die Rolle gewährt wurden.
Als Beispiel können wir die writeapp
widerrufen Rolle von 'appuser'@'localhost'
Benutzerkonto durch Eingabe von:
REVOKE 'writeapp' FROM 'appuser'@'localhost';
Wenn dem Benutzer jedoch auf andere Weise ein Privileg gewährt wurde (entweder direkt gewährt oder durch die Mitgliedschaft mit einer anderen Rolle gewährt), hat er immer noch Zugriff auf dieses Privileg. Wenn also der 'appuser'@'localhost'
Benutzer war auch Mitglied der readapp
Rolle, die wir zuvor gewährt haben, hätten sie immer noch SELECT
Privilegien auf der appdb
Datenbank.
Fazit
Die Verwendung von Rollen zur Verteilung von Berechtigungen in Ihren MySQL-Datenbanken kann dazu beitragen, den Verwaltungsaufwand und die Komplexität Ihres Zugriffskontrollsystems zu vereinfachen. Es ist viel einfacher, mithilfe von Rollen sicherzustellen, dass Benutzer mit denselben Verantwortlichkeiten dieselben Berechtigungen haben, als viele verschiedene Berechtigungen direkt zu gewähren.
In ähnlicher Weise können Sie mit Rollen die Absicht hinter der Gewährung von Berechtigungen deutlich machen. Anstatt Konten eine große Anzahl von Privilegien ohne Kommentar zu gewähren, können sorgfältig gewählte Rollennamen helfen, zwischen verschiedenen Zugriffsgründen zu unterscheiden. Indem Sie sich die Zeit nehmen, Rollen im Voraus zu erstellen und zu organisieren, wird Ihre Fähigkeit, den Benutzerzugriff auf verschiedene Teile Ihrer Daten zu verwalten, auf lange Sicht einfacher.