sql >> Databáze >  >> RDS >> Mysql

Jak spravovat oprávnění s rolemi v MySQL


Ú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šší.




  1. Formuláře Oracle v R12/R12.2

  2. Jak vrátit zpět, když dojde k chybě při provádění příkazu sql loader?

  3. Jak povolit SQL Server Agent XP pomocí T-SQL

  4. Existuje v databázích Oracle nějaký booleovský typ?