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 erREVOKE
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 readapp
på appdb
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.