Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So verwalten Sie Berechtigungen mit Rollen in MySQL


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 :Die CREATE ROLE Befehl definiert eine neue Rolle innerhalb des Datenbanksystems.
  • DROP ROLE :Die DROP ROLE Der Befehl macht das Gegenteil und löscht eine vorhandene Rolle.
  • GRANT :Der GRANT 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 der REVOKE Der Befehl entfernt Berechtigungen von einer Rolle und entfernt auch die Rollenmitgliedschaft von Benutzerkonten.
  • SHOW GRANTS :Die SHOW GRANTS Der Befehl zeigt die Berechtigungen des angegebenen Benutzerkontos oder der Rolle an.
  • SET ROLE :Die SET 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 :Die SET 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.