sql >> Database >  >> RDS >> Mysql

Hoe privileges te beheren met rollen in MySQL


Inleiding

Toegangscontrole en gebruikersbeheer zijn twee gebieden die snel complex kunnen worden naarmate het aantal gebruikers en verschillende database-entiteiten binnen uw systeem toeneemt. Het beheren van veel verschillende privileges voor verschillende database-objecten, ervoor zorgen dat gebruikers met dezelfde verantwoordelijkheden hetzelfde toegangsniveau hebben, en het controleren en beperken van toegang wordt met de tijd allemaal moeilijker.

Om dit aan te pakken, heeft MySQL een concept genaamd "rollen", waarmee u bundels privileges onder een bepaalde naam kunt groeperen, zodat u massaal instellingen kunt toewijzen en wijzigen. In deze handleiding bespreken we hoe rollen werken binnen MySQL en hoe u ze kunt gebruiken om het gemakkelijker te maken om gegevenstoegang voor uw gebruikers te beheren.


Opdrachten

Dit zijn de primaire SQL-opdrachten die we zullen bespreken met betrekking tot het beheren van MySQL-rollen.

  • CREATE ROLE :De CREATE ROLE commando definieert een nieuwe rol binnen het databasesysteem.
  • DROP ROLE :De DROP ROLE commando doet het tegenovergestelde en verwijdert een bestaande rol.
  • GRANT :De GRANT opdracht heeft twee verschillende doelen met betrekking tot rollen:het toevoegen van privileges aan rollen en het toevoegen van gebruikersaccounts als leden van rollen.
  • REVOKE :In de context van rollen, de REVOKE commando verwijdert privileges van een rol en verwijdert ook rollidmaatschap van gebruikersaccounts.
  • SHOW GRANTS :De SHOW GRANTS commando toont de privileges van de gegeven gebruikersaccount of rol.
  • SET ROLE :De SET ROLE command wijzigt de rollen die een gebruikersaccount actief gebruikt. Hiermee kunt u bepalen welke sets machtigingen van toepassing zijn op het account voor de sessie.
  • SET DEFAULT ROLE :De SET DEFAULT ROLE commando definieert de rollen die automatisch worden toegepast wanneer een klant inlogt als een specifiek gebruikersaccount.


Vereiste privileges

Om deze handleiding te volgen, hebt u de volgende rechten nodig:

  • CREATE ROLE
  • GRANT OPTION
  • CREATE USER (om de standaardrollen voor een andere gebruiker in te stellen)
  • ROLE_ADMIN (om systeemvariabelen in te stellen die het rolgedrag wijzigen)
  • SYSTEM_VARIABLES_ADMIN (om systeemvariabelen in te stellen die het rolgedrag wijzigen)

De CREATE ROLE privilege is een mindere versie van de CREATE USER privilege, waarmee u rollen kunt maken en beheren. Accounts die al de CREATE USER . hebben privilege hebben automatisch alle functionaliteit die nodig is om rollen te beheren.

De GRANT OPTION privilege is vereist om privileges aan een rol toe te kennen. U moet GRANT OPTION . hebben ingeschakeld voor alle rechten die u aan een rol wilt toewijzen.




Wat zijn rollen?

In MySQL is een rol een entiteit die fungeert als een container of verzameling bevoegdheden. Beheerders kunnen privileges aan rollen toewijzen op dezelfde manier als privileges aan gebruikersaccounts. U kunt vervolgens gebruikersaccounts toevoegen als leden van de rol, waardoor deze accounts toegang krijgen tot de privileges die aan de rol zijn gekoppeld.

In principe werken rollen als een manier om verschillende gerelateerde privileges te bundelen om privilegebeheer eenvoudiger te maken. In plaats van ervoor te zorgen dat elke gebruiker het exacte toegangsniveau heeft dat ze nodig hebben door individuele privileges toe te wijzen, kunt u met behulp van benoemde groepen privileges minder, gemakkelijker te begrijpen toewijzingen beheren.

Dit heeft een duidelijk voordeel bij het toewijzen van toegangsniveaus, omdat het gemakkelijker is om een ​​developer toe te wijzen , sysadmin , of financeteam rol aan een gebruiker dan om tientallen privileges individueel te beheren. Het maakt het ook snel om de toegang tot meerdere accounts tegelijk aan te passen. Als u een nieuwe database voor het verkoopteam aanmaakt, kunt u het salesteam roltoegang ertoe in plaats van elk account op te sporen dat toegang zou moeten hebben.



Rollen maken

Als je een account hebt met de CREATE ROLE privilege, kunt u rollen beheren met de CREATE ROLE commando.


Wat is de syntaxis van MySQL voor rollen?

Rolnamen moeten een specifiek formaat hebben voor MySQL om ze als geldig te beschouwen. In veel opzichten weerspiegelen ze het formaat dat wordt gebruikt om MySQL-gebruikersaccounts te definiëren, maar met enkele belangrijke verschillen.

Rollen volgen het volgende formaat:

'<role>'@'<host>'

Net als gebruikers hebben rollen twee componenten:de naam van de rol en de host waarvan de client verbinding maakt. De manier waarop MySQL deze componenten interpreteert, verschilt echter.

Met rollen, de '<role>' een deel van de naam mag nooit leeg zijn. Er is geen concept dat een rol "anoniem" is zoals bij gebruikers. Aan de andere kant, het weglaten van de '<host>' gedeelte is nog steeds toegestaan, en MySQL gebruikt % als de gastheer. Echter, de % in deze context wordt geïnterpreteerd als een letterlijk teken, niet als een jokerteken.

In feite betekent dit dat, hoewel rolnamen oppervlakkig het formaat van de gebruikersaccountnamen delen, ze geen enkele vorm van evaluatie ondergaan zoals gebruikersaccounts doen en slechts een label met twee componenten zijn. De reden waarom ze doen twee delen aan hun naam hebben, is dat u gebruikersaccounts kunt maken die zowel als gebruikers als als rollen kunnen fungeren. Bij gebruik als gebruiker zijn de componenten onderworpen aan de speciale evaluatieregels die worden beschreven in het artikel over gebruikersbeheer en wanneer gebruikt als een rol, wordt de naam gewoon rechtstreeks gekoppeld aan de letterlijke componentnamen.

Vanwege deze regels kiezen beheerders er in veel gevallen voor om rollen te definiëren met alleen de '<role>' onderdeel. Hierdoor vervangt MySQL een letterlijke % teken voor de '<host>' component, waardoor dat deel van de naam effectief onzichtbaar en onbelangrijk wordt. Als u niet van plan bent om een ​​naam te gebruiken als zowel een gebruikersaccount als een rol, kunt u hetzelfde doen.



Hoe maak je rollen aan?

Om nieuwe rollen aan te maken, gebruik je de CREATE ROLE commando.

De basissyntaxis ziet er als volgt uit:

CREATE ROLE '<role>'@'<host>';

U kunt ook meerdere rollen tegelijk maken door elke rolnaam te scheiden met een komma:

CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Als een van de rollen die u opgeeft al op het systeem bestaat, mislukt de opdracht met een fout.

Om dit te voorkomen en ervoor te zorgen dat MySQL alleen een waarschuwing geeft, kunt u de IF NOT EXISTS opnemen clausule na de CREATE ROLE commando voor de rolnamen:

CREATE ROLE IF NOT EXISTS '<role>'@'<host>';

Zoals hierboven vermeld, laten beheerders vaak de '<host>' deel van de rolnaam voor de eenvoud, impliciet ingesteld op de letterlijke % karakter. Dus in de praktijk kunnen veel van uw opdrachten voor het maken van rollen er meer als volgt uitzien:

CREATE ROLE '<role>';



Hoe verleen je privileges aan een rol?

Nadat je nieuwe rollen hebt gemaakt, is je volgende prioriteit meestal om ze betekenisvol te maken door ze privileges te geven.

U verleent privileges aan rollen op dezelfde manier als privileges aan gebruikersaccounts. U geeft de exacte privileges op die u wilt verlenen, specificeert een bereik door de database en het databaseobject op te geven waar het privilege geldig is, en de entiteit die de privileges moet krijgen - in dit geval een rol:

GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';

Om bijvoorbeeld de SELECT privilege voor een rol genaamd readapp op de appdb database en alle objecten die het bevat, kunt u typen:

GRANT SELECT ON appdb.* TO 'readapp';

Op dezelfde manier kunt u schrijfrechten toekennen aan dezelfde database aan een rol genaamd writeapp door te typen:

GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';

U kunt rechten toekennen aan en intrekken van rollen, precies zoals u dat rechtstreeks zou doen met gebruikersaccounts. U kunt dus altijd de rechten die aan een rol zijn gekoppeld, wijzigen als u het toegangsniveau dat u wilt verlenen moet aanpassen.



Hoe verleent u gebruikers lidmaatschap van een rol?

Zodra u privileges aan uw rollen heeft toegevoegd, kunt u leden aan de rol toevoegen om hen de bijbehorende privileges te verlenen.

Hiervoor gebruikt MySQL een andere vorm van dezelfde GRANT we gebruiken om privileges toe te kennen aan gebruikers en rollen. Dit nieuwe formulier voegt echter rollen toe aan een gebruiker, waardoor het gebruikersaccount toegang heeft tot alle rechten die aan de rol zijn gegeven.

De basissyntaxis ziet er als volgt uit:

GRANT '<role>'@'<host>' TO '<user>'@'<host>';

Als bijvoorbeeld de 'reports'@'localhost' gebruiker moet gegevens kunnen lezen van de appdb database om rapporten te genereren, kunnen we de readapp . toevoegen rol toe aan het gebruikersaccount, waardoor het bepaalde privileges krijgt:

GRANT 'readapp' TO 'reports'@'localhost';

Evenzo, om de 'appuser'@'localhost' de mogelijkheid om de gegevens binnen dezelfde database te beheren, kunnen we die gebruiker lid maken van de writeapp rol:

GRANT 'writeapp' TO 'appuser'@'localhost';

De 'appuser'@'localhost' account heeft nu de mogelijkheid om gegevens in de database in te voegen, bij te werken en te verwijderen. Als er nieuwe privileges worden toegevoegd aan de writeapp rol, de 'appuser'@'localhost' account krijgt die privileges onmiddellijk.


Hoe verleen je automatisch bepaalde rollen aan elke gebruiker?

Soms zijn er rollen waartoe u wilt dat elke gebruiker op uw systeem toegang heeft. U kunt bepalen welke rollen elk account automatisch wordt toegekend door de mandatory_roles . in te stellen variabel.

Om de mandatory_roles te wijzigen variabele, moet uw gebruiker de ROLE_ADMIN . hebben en SYSTEM_VARIABLES_ADMIN voorrechten. U kunt de rollen instellen die u aan elke gebruiker wilt geven door te typen:

SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';

Hier geven we elke gebruiker op het systeem automatisch drie rollen. Bij het instellen van de systeemvariabele, de waarde van mandatory_roles moet een tekenreeks zijn, dus we kapselen de volledige lijst met rollen in enkele aanhalingstekens en gebruiken backticks om individuele rolcomponenten te citeren.

U kunt geen rol toevoegen aan de mandatory_roles lijst met de SYSTEM_USER voorrecht. Dit is een beveiligingsmaatregel om ervoor te zorgen dat niet alle sessies op het systeem automatisch systeemsessies zijn.




Hoe gebruik je privileges van rollen?

Als u gebruikersaccounts lidmaatschap heeft verleend aan rollen, hoe gebruikt u ze dan? Om toegang te krijgen tot de rechten die door een rol aan een account zijn verleend, moet deze worden geactiveerd.


De huidige actieve rollen bekijken

Voordat u nieuwe rollen activeert, kunt u controleren welke rollen momenteel actief zijn voor uw gebruikerssessie.

Om de actieve rollen voor uw sessie te zien, typt u:

SELECT CURRENT_ROLE()

De uitvoer zal nul of meer rollen weergeven die actief zijn in uw huidige sessie. De privileges die aan die rollen zijn gekoppeld, zullen bijdragen aan de acties die u mag uitvoeren.



Hoe rollen voor de sessie te activeren

Om te wijzigen welke rollen actief zijn tijdens uw sessie, gebruikt u de SET ROLE opdracht. Je kunt deze opdracht op verschillende manieren gebruiken.

De basissyntaxis ziet er als volgt uit:

SET ROLE '<rolename>'@'<host>';

Hiermee wordt de betreffende rol geactiveerd. Het is belangrijk op te merken dat alle eerder actieve rollen die niet worden genoemd in de SET ROLE commando wordt nu gedeactiveerd.

Om meer dan één rol tegelijk te activeren, scheidt u elke rol met een komma:

SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Om alle rollen die aan uw account zijn toegekend te activeren, kunt u ALL . specificeren in plaats van een specifieke rol:

SET ROLE ALL;

U kunt MySQL ook vertellen om al uw rollen met specifieke uitzonderingen te activeren door ALL EXCEPT te gebruiken :

SET ROLL ALL EXCEPT '<role_1>'@'<host>';

Een andere optie is om alle rollen in uw account uit te schakelen door NONE op te geven :

SET ROLE NONE

Hiermee worden al uw gebruikersrollen voor de sessie gedeactiveerd, waardoor u alleen de rechten krijgt die specifiek aan uw gebruikersaccount zijn toegewezen.

Om terug te keren naar de standaardlijst met rollen die voor uw account zijn gedefinieerd, gebruikt u de DEFAULT zoekwoord:

SET ROLE DEFAULT


Standaardrollen voor een gebruikersaccount definiëren

De rollen die automatisch worden geactiveerd wanneer u inlogt als gebruiker en die opnieuw worden geactiveerd wanneer u SET ROLE DEFAULT gebruikt zijn configureerbaar.

Om de rollen te definiëren die standaard worden geactiveerd, gebruikt u de SET DEFAULT ROLE commando vergelijkbaar met hoe u de SET ROLE . gebruikt commando:

SET DEFAULT ROLE '<role_1>'@'<host>';

Hiermee worden de standaardrollen ingesteld die voor uw eigen account worden geactiveerd bij het inloggen of bij het gebruik van SET ROLE DEFAULT .

Als uw gebruiker de CREATE USER . heeft privilege, kunt u de standaardrollen voor andere accounts instellen:

SET DEFAULT ROLE ALL TO '<user>'@'<host>';

Hier specificeren we dat de '<user>'@'<host>' account zou automatisch al zijn rollen moeten activeren bij authenticatie.

Deze syntaxis kan ook worden gebruikt om de standaardrollen voor meer dan één account te definiëren door elke gebruiker te scheiden met een komma:

SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';


Standaard alle rollen voor alle gebruikers activeren

Als u wilt dat elk account op uw MySQL-server standaard al zijn rollen activeert, kunt u een systeeminstelling wijzigen om dit te doen.

Wanneer de activate_all_roles_on_login variabele is ingesteld op waar, activeert MySQL automatisch alle rollen die aan een account zijn gekoppeld bij het inloggen. Dit vervangt de instellingen die zijn gespecificeerd door SET DEFAULT ROLE .

Om deze functie in te schakelen, moet u de SYSTEM_VARIABLES_ADMIN . hebben en ROLE_ADMIN voorrechten. Schakel de functie in door te typen:

SET PERSIST activate_all_roles_on_login = ON;

Dit zorgt ervoor dat gebruikersaccounts automatisch alle rollen activeren bij het inloggen. Echter, SET ROLE DEFAULT kunt u nog steeds alleen de standaardrollen activeren die aan een account zijn gekoppeld.




Bestaande rechten weergeven die zijn verkregen uit rollen

Om te begrijpen welke privileges beschikbaar zijn op uw account, kunt u de SHOW GRANTS . gebruiken commando.

Om te controleren welke subsidies voor een gebruiker zijn ingeschakeld, typt u:

SHOW GRANTS FOR '<user>'@'<host>';

De uitvoer toont u alle privileges die rechtstreeks aan het gebruikersaccount zijn toegewezen, evenals alle rollen waarvan de gebruiker lid is.

Nadat u hebt geleerd van welke rollen een account lid is, kunt u controleren welke privileges die rollen de gebruiker geven door te typen:

SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';

Om bijvoorbeeld de privileges van de 'reports'@'localhost' te controleren gebruiker, inclusief die toegekend door zijn lidmaatschap in de readapp rol, kunt u gebruiken:

SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';

Dit toont u alle privileges die expliciet zijn toegekend aan de 'reports'@'localhost' gebruikersaccount en die toegevoegd door de readapp rol.



Een rol van een gebruiker intrekken

Dus wat gebeurt er als je een rol van een gebruiker wilt verwijderen? Vergelijkbaar met hoe de GRANT commando kan ofwel nieuwe privileges toevoegen aan een gebruiker of rol of rollen toevoegen aan een gebruiker, de REVOKE commando kan privileges van een gebruiker of rol verwijderen en kan ook het lidmaatschap van een rol van een gebruiker verwijderen.

De basissyntaxis die wordt gebruikt om een ​​rol uit een gebruikersaccount te verwijderen, ziet er als volgt uit:

REVOKE '<role>' FROM '<user>'@'<host>';

Na het uitvoeren van een dergelijke instructie heeft de gebruiker geen toegang meer tot de rechten die via rol zijn verleend.

Als voorbeeld kunnen we de writeapp . intrekken rol van de 'appuser'@'localhost' gebruikersaccount door te typen:

REVOKE 'writeapp' FROM 'appuser'@'localhost';

Als de gebruiker echter op een andere manier een privilege heeft gekregen (hetzij rechtstreeks verleend of verleend via een lidmaatschap met een andere rol), hebben ze nog steeds toegang tot dat privilege. Dus als de 'appuser'@'localhost' gebruiker was ook lid van de readapp rol die we eerder hadden toegekend, zouden ze nog steeds SELECT . hebben privileges op de appdb database.



Conclusie

Het gebruik van rollen om privileges in uw MySQL-databases te verdelen, kan de beheeroverhead en complexiteit van uw toegangscontrolesysteem helpen vereenvoudigen. Het is veel gemakkelijker om ervoor te zorgen dat gebruikers met dezelfde verantwoordelijkheden dezelfde privileges hebben door rollen te gebruiken dan om veel verschillende privileges rechtstreeks toe te kennen.

Evenzo kunt u met rollen expliciet zijn over de bedoeling achter uw privilegeverlening. In plaats van grote aantallen privileges toe te kennen aan accounts zonder commentaar, kunnen zorgvuldig gekozen rolnamen helpen onderscheid te maken tussen verschillende redenen voor toegang. Door de tijd te nemen om rollen van tevoren te maken en te organiseren, wordt het op de lange termijn eenvoudiger om gebruikerstoegang tot verschillende delen van uw gegevens te beheren.




  1. Laravel:Fout [PDOException]:Kan stuurprogramma niet vinden in PostgreSQL

  2. SQL Server sp_msforeachable gebruik om alleen die tabellen te selecteren die aan een bepaalde voorwaarde voldoen

  3. Automatische gegevensverzameling over voltooide taken in MS SQL Server

  4. Kan ik met MySQL Connector/J meerdere query's uitvoeren, gescheiden door puntkomma's?