sql >> Database teknologi >  >> RDS >> Mysql

Sådan administrerer du privilegier med roller i MySQL


Introduktion

Adgangskontrol og brugerstyring er to områder, der hurtigt kan blive komplekse, efterhånden som antallet af brugere og forskellige databaseenheder i dit system stiger. Håndtering af mange forskellige privilegier på forskellige databaseobjekter, sikring af, at brugere, der har de samme ansvarsområder, har samme adgangsniveau, og revision og indsnævring af adgang bliver alt sammen vanskeligere med tiden.

For at hjælpe med at løse dette har MySQL et koncept kaldet "roller", som giver dig mulighed for at gruppere bundter af privilegier under et givet navn, så du kan tildele og ændre indstillinger i massevis. I denne guide gennemgår vi, hvordan roller fungerer i MySQL, og hvordan man bruger dem til at gøre det nemmere at administrere dataadgang for dine brugere.


Kommandoer

Her er de primære SQL-kommandoer, som vi vil diskutere i forhold til at administrere MySQL-roller.

  • CREATE ROLE :CREATE ROLE kommandoen definerer en ny rolle i databasesystemet.
  • DROP ROLE :DROP ROLE kommandoen gør det modsatte og sletter en eksisterende rolle.
  • GRANT :GRANT kommandoen har to forskellige formål relateret til roller:tilføjelse af privilegier til roller og tilføjelse af brugerkonti som medlemmer af roller.
  • REVOKE :I forbindelse med roller er REVOKE kommando fjerner privilegier fra en rolle og fjerner også rollemedlemskab fra brugerkonti.
  • SHOW GRANTS :SHOW GRANTS kommandoen viser privilegierne for den givne brugerkonto eller rolle.
  • SET ROLE :SET ROLE kommando ændrer de roller, som en brugerkonto aktivt bruger. Dette giver dig mulighed for at diktere, hvilke sæt tilladelser der gælder for kontoen for sessionen.
  • SET DEFAULT ROLE :SET DEFAULT ROLE kommandoen definerer de roller, der automatisk anvendes, når en klient logger på som en specifik brugerkonto.


Påkrævede rettigheder

For at følge med i denne vejledning skal du bruge følgende privilegier:

  • CREATE ROLE
  • GRANT OPTION
  • CREATE USER (for at indstille standardrollerne for en anden bruger)
  • ROLE_ADMIN (for at indstille systemvariabler, der ændrer rolleadfærd)
  • SYSTEM_VARIABLES_ADMIN (for at indstille systemvariabler, der ændrer rolleadfærd)

CREATE ROLE privilegiet er en mindre version af CREATE USER privilegium, så du kan oprette og administrere roller. Konti, der allerede har CREATE USER privilegium har automatisk al den funktionalitet, der kræves for at administrere roller.

GRANT OPTION privilegium er påkrævet for at tildele privilegier til en rolle. Du skal have GRANT OPTION aktiveret for alle privilegier, du vil tildele en rolle.




Hvad er roller?

I MySQL er en rolle en enhed, der fungerer som en beholder eller samling af privilegier. Administratorer kan tildele privilegier til roller på samme måde, som de tildeler privilegier til brugerkonti. Du kan derefter tilføje brugerkonti som medlemmer af rollen, hvilket giver disse konti adgang til de privilegier, der er knyttet til rollen.

Grundlæggende fungerer roller som en måde at samle forskellige relaterede privilegier sammen for at gøre rettighedsadministration lettere. I stedet for at sikre, at hver bruger har det nøjagtige adgangsniveau, de har brug for, ved at tildele individuelle privilegier, giver brug af navngivne grupperinger af privilegier dig mulighed for at administrere færre, lettere at forstå tildelinger.

Dette har en klar fordel ved tildeling af adgangsniveauer, da det er nemmere at tildele en developer , sysadmin , eller financeteam rolle for en bruger end at administrere snesevis af privilegier individuelt. Det gør det også hurtigt at tilpasse adgangen til flere konti på én gang. Hvis du opretter en ny database til salgsteamet, kan du give salesteam rolleadgang til den i stedet for at spore alle konti, der burde have adgang.



Oprettelse af roller

Hvis du har en konto med CREATE ROLE privilegium, kan du administrere roller ved hjælp af CREATE ROLE kommando.


Hvad er MySQL's syntaks for roller?

Rollenavne skal følge et specifikt format for at MySQL kan betragte dem som gyldige. På mange måder afspejler de det format, der bruges til at definere MySQL-brugerkonti, men med nogle vigtige forskelle.

Roller følger følgende format:

'<role>'@'<host>'

Ligesom brugere har roller to komponenter:rollenavnet og værten, som klienten opretter forbindelse fra. Den måde, MySQL fortolker disse komponenter på, er dog forskellig.

Med roller, '<role>' del af navnet må aldrig være tom. Der er ikke noget begreb om, at en rolle er "anonym", som der er med brugere. På den anden side, udeladelse af '<host>' del er stadig tilladt, og MySQL vil bruge % som vært. Men % i denne sammenhæng fortolkes som en bogstavelig karakter, ikke et jokertegn.

Dette betyder faktisk, at selvom rollenavne overfladisk deler formatet af brugerkontonavnene, gennemgår de ikke nogen form for evaluering, som brugerkonti gør, og er blot en etiket med to komponenter. Grunden til at de gør har to dele til deres navn er, at du kan oprette brugerkonti, der kan fungere som både brugere og roller. Når de bruges som bruger, er komponenterne underlagt de særlige evalueringsregler, der er beskrevet i artiklen om brugeradministration, og når de bruges som en rolle, matches navnet bare direkte ved hjælp af de bogstavelige komponentnavne.

På grund af disse regler vælger administratorer i mange tilfælde kun at definere roller ved brug af '<role>' komponent. Dette får MySQL til at erstatte en bogstavelig % tegn for '<host>' komponent, hvilket effektivt gør den del af navnet usynlig og uvæsentlig. Hvis du ikke har til hensigt, at et navn skal bruges som både en brugerkonto og en rolle, kan du gøre det samme.



Hvordan opretter du roller?

For at oprette nye roller skal du bruge CREATE ROLE kommando.

Den grundlæggende syntaks ser således ud:

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

Du kan også oprette flere roller på samme tid ved at adskille hvert rollenavn med et komma:

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

Hvis nogen af ​​de roller, du angiver, allerede findes på systemet, vil kommandoen mislykkes med en fejl.

For at undgå dette og få MySQL til kun at udsende en advarsel, kan du inkludere koden IF NOT EXISTS klausul efter CREATE ROLE kommando før rollenavnene:

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

Som nævnt ovenfor udelader administratorer mange gange '<host>' del af rollenavnet for enkelhedens skyld, implicit at sætte det til den bogstavelige % Karakter. Så i praksis kan mange af dine rolleoprettelseskommandoer se mere sådan ud:

CREATE ROLE '<role>';



Hvordan giver du privilegier til en rolle?

Når du har oprettet nye roller, er din næste prioritet typisk at gøre dem meningsfulde ved at give dem privilegier.

Du tildeler privilegier til roller på samme måde, som du giver privilegier til brugerkonti. Du angiver de nøjagtige privilegier, du ønsker at give, angiver et omfang ved at angive databasen og databaseobjektet, hvor privilegiet er gyldigt, og den enhed, der skal tildeles privilegierne - i dette tilfælde en rolle:

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

For eksempel at give SELECT privilegium til en rolle kaldet readappappdb database og alle objekter den indeholder, kan du skrive:

GRANT SELECT ON appdb.* TO 'readapp';

På samme måde kan du give skriverettigheder til den samme database til en rolle kaldet writeapp ved at skrive:

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

Du kan give privilegier til og tilbagekalde dem fra roller, præcis som du ville gøre direkte med brugerkonti. Så du kan altid ændre de privilegier, der er knyttet til en rolle, hvis du har brug for at justere det adgangsniveau, du ønsker at give.



Hvordan giver du brugere medlemskab til en rolle?

Når du har tilføjet privilegier til dine roller, kan du begynde at tilføje medlemmer til rollen for at give dem de tilknyttede privilegier.

For at gøre dette bruger MySQL en anden form af den samme GRANT vi bruger til at give privilegier til brugere og roller. Denne nye formular tilføjer imidlertid roller til en bruger, hvilket giver brugerkontoen adgang til alle de privilegier, der er givet til rollen.

Den grundlæggende syntaks ser således ud:

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

For eksempel, hvis 'reports'@'localhost' brugeren skal kunne læse data fra appdb database til at generere rapporter, kan vi tilføje readapp rolle til brugerkontoen, hvilket giver den udvalgte privilegier:

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

På samme måde for at give 'appuser'@'localhost' evnen til at administrere data i den samme database, kan vi gøre denne bruger til medlem af writeapp rolle:

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

'appuser'@'localhost' konto vil nu have mulighed for at indsætte, opdatere og fjerne data fra databasen. Hvis der tilføjes nye privilegier til writeapp rolle, 'appuser'@'localhost' konto vil straks få disse privilegier.


Hvordan tildeler du automatisk bestemte roller til hver bruger?

Nogle gange kan der være roller, som du ønsker, at alle brugere på dit system skal have adgang til. Du kan definere, hvilke roller hver konto automatisk tildeles ved at indstille mandatory_roles variabel.

For at ændre mandatory_roles variabel, skal din bruger have ROLE_ADMIN og SYSTEM_VARIABLES_ADMIN privilegier. Du kan indstille de roller, du ønsker at give til hver bruger, ved at skrive:

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

Her giver vi hver bruger på systemet automatisk tre roller. Når du indstiller systemvariablen, værdien af ​​mandatory_roles skal være en streng, så vi indkapsler hele rollelisten i enkelte anførselstegn og bruger backticks til at citere individuelle rollekomponenter.

Du kan ikke tilføje en rolle til mandatory_roles liste, der har SYSTEM_USER privilegium. Dette er en sikkerhedsforanstaltning for at sikre, at ikke alle sessioner på systemet automatisk er systemsessioner.




Hvordan bruger du privilegier fra roller?

Når du har givet brugerkonti medlemskab til roller, hvordan bruger du dem så? For at få adgang til de privilegier, der er givet til en konto af en rolle, skal den aktiveres.


Visning af de aktuelle aktive roller

Før du aktiverer nye roller, kan du kontrollere, hvilke roller der i øjeblikket er aktive for din brugersession.

For at se de aktive roller for din session skal du skrive:

SELECT CURRENT_ROLE()

Outputtet vil vise nul eller flere roller, der er aktive i din aktuelle session. De privilegier, der er knyttet til disse roller, vil føje til de handlinger, du har tilladelse til at udføre.



Sådan aktiverer du roller for sessionen

For at ændre, hvilke roller der er aktive under din session, skal du bruge SET ROLE kommando. Du kan bruge denne kommando på en række forskellige måder.

Den grundlæggende syntaks ser således ud:

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

Dette vil aktivere den pågældende rolle. Det er vigtigt at bemærke, at alle tidligere aktive roller, der ikke er nævnt i SET ROLE kommandoen vil nu blive deaktiveret.

For at aktivere mere end én rolle ad gangen skal du adskille hver rolle med et komma:

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

For at aktivere alle de roller, der er blevet tildelt din konto, kan du angive ALL i stedet for en bestemt rolle:

SET ROLE ALL;

Du kan også bede MySQL om at aktivere alle dine roller med specifik undtagelse ved at bruge ALL EXCEPT :

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

En anden mulighed er at deaktivere alle roller på din konto ved at angive NONE :

SET ROLE NONE

Dette deaktiverer alle dine brugerroller for sessionen og giver dig kun de privilegier, der er specifikt tildelt din brugerkonto.

For at vende tilbage til standardlisten over roller, der er defineret for din konto, skal du bruge DEFAULT søgeord:

SET ROLE DEFAULT


Sådan defineres standardroller for en brugerkonto

De roller, der automatisk aktiveres, når du logger på som bruger, og dem, der genaktiveres, når du bruger SET ROLE DEFAULT er konfigurerbare.

For at definere de roller, der vil blive aktiveret som standard, skal du bruge SET DEFAULT ROLE kommando svarende til hvordan du bruger SET ROLE kommando:

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

Dette indstiller de standardroller, der aktiveres for din egen konto ved login eller ved brug af SET ROLE DEFAULT .

Hvis din bruger har CREATE USER privilegium, kan du indstille standardrollerne for andre konti:

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

Her angiver vi, at '<user>'@'<host>' konto bør automatisk aktivere alle sine roller ved godkendelse.

Denne syntaks kan også bruges til at definere standardrollerne for mere end én konto ved at adskille hver bruger med et komma:

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


Aktivering af alle roller for alle brugere som standard

Hvis du ønsker, at hver konto på din MySQL-server skal aktivere alle dens roller som standard, kan du ændre en systemindstilling for at gøre det.

Når activate_all_roles_on_login variabel er indstillet til sand, vil MySQL automatisk aktivere alle roller, der er knyttet til en konto, når du logger ind. Dette erstatter indstillingerne angivet af SET DEFAULT ROLE .

For at aktivere denne funktion skal du have SYSTEM_VARIABLES_ADMIN og ROLE_ADMIN privilegier. Aktiver funktionen ved at skrive:

SET PERSIST activate_all_roles_on_login = ON;

Dette vil få brugerkonti til automatisk at aktivere alle roller ved login. Dog SET ROLE DEFAULT vil stadig tillade dig kun at aktivere de standardroller, der er knyttet til en konto.




Vis eksisterende privilegier opnået fra roller

For at forstå, hvilke privilegier der er tilgængelige på din konto, kan du bruge SHOW GRANTS kommando.

For at kontrollere de tilskud, der er aktiveret for en bruger, skal du skrive:

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

Outputtet viser dig alle de privilegier, der er direkte tildelt brugerkontoen, samt alle de roller, som brugeren er medlem af.

Når du har lært, hvilke roller en konto er medlem af, kan du kontrollere, hvilke privilegier rollerne giver brugeren ved at skrive:

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

For eksempel for at kontrollere privilegierne for 'reports'@'localhost' bruger, inklusive dem, der er givet af dens medlemskab af readapp rolle, kan du bruge:

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

Dette vil vise dig alle de privilegier, der udtrykkeligt er givet til 'reports'@'localhost' brugerkonto såvel som dem, der er tilføjet af readapp rolle.



Tilbagekaldelse af en rolle fra en bruger

Så hvad sker der, når du vil fjerne en rolle fra en bruger? Svarende til hvordan GRANT kommandoen kan enten tilføje nye privilegier til en bruger eller rolle eller tilføje roller til en bruger, REVOKE kommando kan fjerne privilegier fra en bruger eller rolle og kan også fjerne rollemedlemskab fra en bruger.

Den grundlæggende syntaks, der bruges til at fjerne en rolle fra en brugerkonto, ser sådan ud:

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

Efter at have udført en sætning som denne, vil brugeren ikke længere have adgang til de privilegier, der blev givet gennem rollen.

Som et eksempel kan vi tilbagekalde writeapp rolle fra 'appuser'@'localhost' brugerkonto ved at skrive:

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

Hvis brugeren er blevet tildelt et privilegium på andre måder (enten direkte eller givet gennem medlemskab med en anden rolle), vil de stadig have adgang til dette privilegium. Så hvis 'appuser'@'localhost' brugeren var også medlem af readapp rolle, vi tildelte tidligere, ville de stadig have SELECT privilegier på appdb database.



Konklusion

Brug af roller til at distribuere privilegier i dine MySQL-databaser kan hjælpe med at forenkle administrationsomkostningerne og kompleksiteten af ​​dit adgangskontrolsystem. Det er meget nemmere at sikre, at brugere med de samme ansvarsområder har de samme privilegier ved brug af roller, end det er at tildele mange forskellige privilegier direkte.

På samme måde giver roller dig mulighed for at være eksplicit om hensigten bag din tildeling af privilegier. I stedet for at give et stort antal privilegier til konti uden nogen kommentarer, kan nøje udvalgte rollenavne hjælpe med at skelne mellem forskellige årsager til adgang. Ved at tage sig tid til at oprette og organisere roller i forvejen, vil din evne til at administrere brugeradgang til forskellige dele af dine data være mere ligetil i det lange løb.




  1. SQL Server 2008 personsøgningsmetoder?

  2. SQL Server - definerer en XML-type kolonne med UTF-8-kodning

  3. Postgresql-opdatering med join

  4. Hvordan kan jeg VÆLGE flere kolonner i en CASE WHEN på SQL Server?