Úvod
Řízení přístupu a správa uživatelů jsou dvě oblasti, které se mohou rychle stát složitými, jak se zvyšuje počet uživatelů a různých databázových entit ve vašem systému. Správa mnoha různých oprávnění k různým databázovým objektům, zajištění stejné úrovně přístupu pro uživatele, kteří mají stejné povinnosti, a auditování a zužování přístupu – to vše se časem stává obtížnějším.
Abychom tomu pomohli vyřešit, má MySQL koncept zvaný „role“, který vám umožňuje seskupovat balíčky oprávnění pod daným jménem, což vám umožňuje hromadně přiřazovat a upravovat nastavení. V této příručce se podíváme na to, jak fungují role v MySQL a jak je používat ke snazší správě přístupu k datům pro vaše uživatele.
Příkazy
Zde jsou primární příkazy SQL, o kterých budeme diskutovat ve vztahu ke správě rolí MySQL.
CREATE ROLE
:CREATE ROLE
příkaz definuje novou roli v databázovém systému.DROP ROLE
:DROP ROLE
příkaz dělá opak, smaže existující roli.GRANT
:GRANT
Příkaz má dva odlišné účely související s rolemi:přidávání oprávnění k rolím a přidávání uživatelských účtů jako členů rolí.REVOKE
:V kontextu rolíREVOKE
příkaz odebere oprávnění z role a také odebere členství v roli z uživatelských účtů.SHOW GRANTS
:SHOW GRANTS
zobrazí oprávnění daného uživatelského účtu nebo role.SET ROLE
:SET ROLE
příkaz změní role, které uživatelský účet aktivně používá. To vám umožňuje diktovat, které sady oprávnění se vztahují na účet pro relaci.SET DEFAULT ROLE
:SET DEFAULT ROLE
definuje role, které se automaticky použijí, když se klient přihlásí jako konkrétní uživatelský účet.
Požadovaná oprávnění
Abyste mohli pokračovat v této příručce, budete potřebovat následující oprávnění:
CREATE ROLE
GRANT OPTION
CREATE USER
(pro nastavení výchozích rolí pro jiného uživatele)ROLE_ADMIN
(k nastavení systémových proměnných, které upravují chování role)SYSTEM_VARIABLES_ADMIN
(k nastavení systémových proměnných, které upravují chování role)
CREATE ROLE
privilegium je menší verze CREATE USER
oprávnění, které vám umožní vytvářet a spravovat role. Účty, které již mají CREATE USER
oprávnění automaticky mít všechny funkce potřebné ke správě rolí.
GRANT OPTION
oprávnění je vyžadováno k přiřazení oprávnění roli. Musíte mít GRANT OPTION
povoleno pro všechna oprávnění, která chcete přiřadit roli.
Co jsou role?
V MySQL je role entita, která funguje jako kontejner nebo kolekce oprávnění. Správci mohou přidělovat oprávnění rolím stejným způsobem, jakým přidělují oprávnění uživatelským účtům. Poté můžete přidat uživatelské účty jako členy role a umožnit těmto účtům přístup k oprávněním spojeným s rolí.
Role v zásadě fungují jako způsob, jak spojit různá související oprávnění dohromady, aby byla správa oprávnění jednodušší. Namísto toho, abyste se ujistili, že každý uživatel má přesnou úroveň přístupu, kterou vyžaduje, přidělováním jednotlivých oprávnění, používání pojmenovaných seskupení oprávnění vám umožňuje spravovat méně přiřazení, která jsou snáze srozumitelná.
To má jasnou výhodu při přidělování úrovní přístupu, protože je snazší přiřadit developer
, sysadmin
nebo financeteam
než individuálně spravovat desítky privilegií. Umožňuje také rychlé vyladění přístupu k více účtům najednou. Pokud vytvoříte novou databázi pro prodejní tým, můžete zadat salesteam
místo sledování každého účtu, který by měl mít přístup.
Vytváření rolí
Pokud máte účet s CREATE ROLE
oprávnění, můžete spravovat role pomocí CREATE ROLE
příkaz.
Jaká je syntaxe MySQL pro role?
Názvy rolí musí mít pro MySQL specifický formát, aby je považovali za platné. V mnoha ohledech odrážejí formát používaný k definování uživatelských účtů MySQL, ale s některými důležitými rozdíly.
Role mají následující formát:
'<role>'@'<host>'
Stejně jako uživatelé mají i role dvě součásti:název role a hostitele, ze kterého se klient připojuje. Způsob, jakým MySQL interpretuje tyto komponenty, se však liší.
S rolemi, '<role>'
část jména nemůže být nikdy prázdná. Neexistuje žádný koncept role „anonymní“, jako je tomu u uživatelů. Na druhou stranu vynechání '<host>'
část je stále povoleno a MySQL bude používat %
jako hostitel. Nicméně %
v tomto kontextu je interpretován jako doslovný znak, nikoli zástupný znak.
Ve skutečnosti to znamená, že ačkoli názvy rolí povrchně sdílejí formát názvů uživatelských účtů, nepodléhají žádnému typu hodnocení jako uživatelské účty a jsou pouze štítkem se dvěma komponentami. Důvod, proč to dělají mají dvě části názvu je, že můžete vytvářet uživatelské účty, které mohou fungovat jako uživatelé i role. Při použití jako uživatel podléhají komponenty zvláštním pravidlům hodnocení popsaným v článku o správě uživatelů a při použití jako role je název přímo porovnáván pomocí doslovných názvů komponent.
Kvůli těmto pravidlům se administrátoři v mnoha případech rozhodnou definovat role pouze pomocí '<role>'
součástka. To způsobí, že MySQL nahradí doslovné %
znak pro '<host>'
komponentu, čímž se tato část jména stane neviditelnou a bezvýznamnou. Pokud nechcete, aby jméno bylo použito jako uživatelský účet i jako role, můžete udělat totéž.
Jak vytváříte role?
Chcete-li vytvořit nové role, použijte CREATE ROLE
příkaz.
Základní syntaxe vypadá takto:
CREATE ROLE '<role>'@'<host>';
Můžete také vytvořit více rolí současně tak, že každý název role oddělíte čárkou:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Pokud některá ze zadaných rolí již v systému existuje, příkaz selže s chybou.
Chcete-li se tomu vyhnout a způsobit, že MySQL vydá pouze varování, můžete zahrnout IF NOT EXISTS
klauzule za CREATE ROLE
příkaz před názvy rolí:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';
Jak bylo zmíněno výše, administrátoři mnohokrát vynechávají '<host>'
část názvu role pro zjednodušení, implicitně jej nastavíme na doslovný %
charakter. V praxi tedy může mnoho vašich příkazů pro vytváření rolí vypadat spíše takto:
CREATE ROLE '<role>';
Jak udělujete oprávnění roli?
Po vytvoření nových rolí je vaší další prioritou obvykle dát jim smysl tím, že jim udělíte oprávnění.
Oprávnění udělujete rolím stejným způsobem, jako udělujete oprávnění uživatelským účtům. Zadáte přesná oprávnění, která chcete udělit, určíte rozsah poskytnutím databáze a databázového objektu, kde je oprávnění platné, a entity, které by měla být oprávnění udělena – v tomto případě role:
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';
Například pro udělení SELECT
oprávnění k roli s názvem readapp
na appdb
databáze a všechny objekty, které obsahuje, můžete napsat:
GRANT SELECT ON appdb.* TO 'readapp';
Podobně můžete udělit oprávnění k zápisu do stejné databáze roli s názvem writeapp
zadáním:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';
Rolím můžete udělovat oprávnění nebo je z nich odebírat přesně tak, jako byste to dělali přímo s uživatelskými účty. Takže vždy můžete upravit oprávnění spojená s rolí, pokud potřebujete upravit úroveň přístupu, kterou chcete poskytnout.
Jak uživatelům udělujete členství v roli?
Jakmile ke svým rolím přidáte oprávnění, můžete začít přidávat členy do role a udělit jim související oprávnění.
K tomu používá MySQL jinou formu stejného GRANT
používáme k udělování oprávnění uživatelům a rolím. Tento nový formulář však přidává uživateli role a umožňuje uživatelskému účtu přístup ke všem oprávněním přiděleným roli.
Základní syntaxe vypadá takto:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';
Například pokud 'reports'@'localhost'
uživatel musí být schopen číst data z appdb
databáze pro generování sestav, můžeme přidat readapp
role k uživatelskému účtu, která mu dává vybraná oprávnění:
GRANT 'readapp' TO 'reports'@'localhost';
Podobně zadejte 'appuser'@'localhost'
schopnost spravovat data v rámci stejné databáze, můžeme z tohoto uživatele učinit člena writeapp
role:
GRANT 'writeapp' TO 'appuser'@'localhost';
'appuser'@'localhost'
účet bude mít nyní možnost vkládat, aktualizovat a odstraňovat data z databáze. Pokud jsou do writeapp
přidána nová oprávnění role, 'appuser'@'localhost'
účet okamžitě získá tato oprávnění.
Jak automaticky udělujete určité role každému uživateli?
Někdy mohou existovat role, ke kterým chcete, aby měli všichni uživatelé ve vašem systému přístup. Nastavením mandatory_roles
můžete definovat, které role jsou každému účtu automaticky přiděleny proměnná.
Chcete-li upravit mandatory_roles
proměnnou, váš uživatel musí mít ROLE_ADMIN
a SYSTEM_VARIABLES_ADMIN
privilegia. Můžete nastavit role, které chcete přidělit každému uživateli, zadáním:
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';
Zde dáváme každému uživateli v systému automaticky tři role. Při nastavování systémové proměnné hodnota mandatory_roles
musí být řetězec, takže celý seznam rolí zapouzdřujeme do jednoduchých uvozovek a k uvozování jednotlivých komponent rolí používáme zadní zaškrtnutí.
Do mandatory_roles
nemůžete přidat roli seznam, který má SYSTEM_USER
privilegium. Toto je bezpečnostní opatření, které zajišťuje, že ne všechny relace v systému jsou automaticky systémovými relacemi.
Jak využíváte oprávnění z rolí?
Jak je poté, co jste udělili členství v uživatelských účtech rolím, používáte? Chcete-li získat přístup k oprávněním uděleným účtu rolí, musí být aktivována.
Zobrazení aktuálních aktivních rolí
Před aktivací nových rolí můžete zkontrolovat, které role jsou aktuálně aktivní pro vaši uživatelskou relaci.
Chcete-li zobrazit aktivní role pro vaši relaci, zadejte:
SELECT CURRENT_ROLE()
Výstup zobrazí nula nebo více rolí, které jsou aktivní ve vaší aktuální relaci. Oprávnění spojená s těmito rolemi se přidají k tomu, jaké akce smíte provádět.
Jak aktivovat role pro relaci
Chcete-li změnit, které role jsou během relace aktivní, použijte SET ROLE
příkaz. Tento příkaz můžete použít mnoha různými způsoby.
Základní syntaxe vypadá takto:
SET ROLE '<rolename>'@'<host>';
Tím se daná role aktivuje. Je důležité poznamenat, že všechny dříve aktivní role, které nejsou uvedeny v SET ROLE
příkaz bude nyní deaktivován.
Chcete-li aktivovat více než jednu roli najednou, oddělte každou roli čárkou:
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Chcete-li aktivovat všechny role, které byly přiděleny vašemu účtu, můžete zadat ALL
místo konkrétní role:
SET ROLE ALL;
Můžete také říci MySQL, aby aktivovalo všechny vaše role s konkrétní výjimkou pomocí ALL EXCEPT
:
SET ROLL ALL EXCEPT '<role_1>'@'<host>';
Další možností je zakázat všechny role ve vašem účtu zadáním NONE
:
SET ROLE NONE
Tím deaktivujete všechny vaše uživatelské role pro relaci a získáte pouze oprávnění přiřazená konkrétně vašemu uživatelskému účtu.
Chcete-li se vrátit k výchozímu seznamu rolí definovaných pro váš účet, použijte DEFAULT
klíčové slovo:
SET ROLE DEFAULT
Jak definovat výchozí role pro uživatelský účet
Role, které se automaticky aktivují, když se přihlásíte jako uživatel, a role, které se znovu aktivují, když použijete SET ROLE DEFAULT
jsou konfigurovatelné.
Chcete-li definovat role, které budou standardně aktivovány, použijte SET DEFAULT ROLE
příkaz podobný tomu, jak používáte SET ROLE
příkaz:
SET DEFAULT ROLE '<role_1>'@'<host>';
Tím nastavíte výchozí role, které budou aktivovány pro váš vlastní účet po přihlášení nebo po použití SET ROLE DEFAULT
.
Pokud má váš uživatel CREATE USER
oprávnění, můžete nastavit výchozí role pro ostatní účty:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';
Zde specifikujeme, že '<user>'@'<host>'
účet by měl po ověření automaticky aktivovat všechny své role.
Tuto syntaxi lze také použít k definování výchozích rolí pro více než jeden účet tak, že každého uživatele oddělíte čárkou:
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';
Ve výchozím nastavení se aktivují všechny role pro všechny uživatele
Pokud chcete, aby každý účet na vašem serveru MySQL ve výchozím nastavení aktivoval všechny své role, můžete změnit systémové nastavení.
Když activate_all_roles_on_login
Pokud je proměnná nastavena na hodnotu true, MySQL po přihlášení automaticky aktivuje všechny role spojené s účtem. Toto nahradí nastavení zadaná v SET DEFAULT ROLE
.
Chcete-li povolit tuto funkci, musíte mít SYSTEM_VARIABLES_ADMIN
a ROLE_ADMIN
privilegia. Aktivujte funkci zadáním:
SET PERSIST activate_all_roles_on_login = ON;
To způsobí, že uživatelské účty automaticky aktivují všechny role při přihlášení. Nicméně SET ROLE DEFAULT
stále vám umožní aktivovat pouze výchozí role přidružené k účtu.
Zobrazit existující oprávnění získaná z rolí
Chcete-li zjistit, jaká oprávnění jsou na vašem účtu k dispozici, můžete použít SHOW GRANTS
příkaz.
Chcete-li zkontrolovat povolení povolená pro uživatele, zadejte:
SHOW GRANTS FOR '<user>'@'<host>';
Výstup vám ukáže všechna oprávnění přímo přiřazená uživatelskému účtu a také všechny role, kterých je uživatel členem.
Poté, co zjistíte, jakých rolí je účet členem, můžete zkontrolovat, jaká oprávnění dané role uživateli poskytují, zadáním:
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';
Chcete-li například zkontrolovat oprávnění 'reports'@'localhost'
uživatele, včetně těch, které uděluje jeho členství v readapp
role, můžete použít:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';
Zobrazí se vám všechna oprávnění výslovně udělená 'reports'@'localhost'
uživatelský účet a také ty, které přidá readapp
role.
Odvolání role uživateli
Co se tedy stane, když chcete uživateli odebrat roli? Podobně jako GRANT
příkaz může buď přidat nová oprávnění uživateli nebo roli, nebo přidat role uživateli, REVOKE
příkaz může odebrat oprávnění uživateli nebo roli a také může uživateli odebrat členství v roli.
Základní syntaxe použitá k odebrání role z uživatelského účtu vypadá takto:
REVOKE '<role>' FROM '<user>'@'<host>';
Po provedení příkazu, jako je tento, uživatel již nebude mít přístup k oprávněním uděleným prostřednictvím role.
Jako příklad můžeme zrušit writeapp
role z 'appuser'@'localhost'
uživatelský účet zadáním:
REVOKE 'writeapp' FROM 'appuser'@'localhost';
Pokud však bylo uživateli uděleno oprávnění jiným způsobem (buď přímo uděleno, nebo uděleno prostřednictvím členství s jinou rolí), bude mít stále k tomuto oprávnění přístup. Pokud tedy 'appuser'@'localhost'
uživatel byl také členem readapp
roli, kterou jsme udělili dříve, budou mít stále SELECT
oprávnění na appdb
databáze.
Závěr
Použití rolí k distribuci oprávnění ve vašich databázích MySQL může pomoci zjednodušit režii správy a složitost vašeho systému řízení přístupu. Je mnohem snazší zajistit, aby uživatelé se stejnými povinnostmi měli stejná oprávnění pomocí rolí, než udělovat mnoho různých oprávnění přímo.
Podobně vám role umožňují explicitně vyjádřit záměr udělení oprávnění. Namísto udělování velkého počtu oprávnění účtům bez komentáře mohou pečlivě zvolené názvy rolí pomoci rozlišit různé důvody přístupu. Tím, že si uděláte čas na vytvoření a organizaci rolí předem, bude vaše schopnost spravovat přístup uživatelů k různým částem vašich dat z dlouhodobého hlediska jednodušší.