Úvod
Správa uživatelů je nejdůležitější odpovědností každého, kdo doufá, že bude spravovat databázový systém MySQL. Vytváření, úpravy a mazání uživatelských účtů, aby co nejlépe reprezentovaly uživatele a služby ve vašem prostředí, pomáhá položit základy pro uzamčení přístupu, omezení rozsahu změn a implementaci auditu a odpovědnosti za úpravy.
V této příručce si povíme, jak spravovat uživatelské účty v MySQL. Nejprve probereme, co je platný uživatel v MySQL, a ukážeme vám, jak do systému přidat další uživatele. To vede k diskusi o tom, jak nakonfigurovat autentizaci pro každého uživatele a jak systém vybere možnost autentizace ze seznamu možností. Dále budeme hovořit o provádění změn u stávajících uživatelů, o tom, jak se přihlásit pomocí účtů, které jste vytvořili, a jak smazat uživatele, které již nepotřebujete.
Předpoklady
Abyste mohli postupovat podle tohoto průvodce, budete potřebovat účet na serveru MySQL s příslušnými oprávněními.
Příkazy, které použijeme
Chcete-li vytvořit, upravit a odstranit uživatele v MySQL, základní příkazy, které potřebujete, jsou:
CREATE USER
:vytvořit nový uživatelský účetALTER USER
:provést změny ve stávajícím uživatelském účtuDROP USER
:odebrat existující uživatelský účet
Požadovaná oprávnění
Chcete-li provést výše uvedené příkazy, musíte se přihlásit do MySQL pomocí účtu s CREATE USER
privilegia. CREATE USER
oprávnění vám mimo jiné umožňuje vytvářet, upravovat, mazat a přejmenovávat uživatele. Budeme také potřebovat SELECT
oprávnění na mysql
databáze pro zobrazení informací o stávajících uživatelích.
V preferovaném pořadí byste se měli přihlásit pomocí:
- Omezený účet, který má
CREATE USER
oprávnění aSELECT
oprávnění namysql
databáze root
nebo administrativní uživatel, který má plná oprávnění v rámci MySQL
Porozumění tomu, jak MySQL definuje a interpretuje uživatelské účty
Než začneme vytvářet nové účty, je užitečné věnovat nějaký čas tomu, abyste se seznámili s různými způsoby, které MySQL používá k vytváření a odkazování na uživatele. Musíte se také seznámit s ověřovacím algoritmem MySQL, abyste pochopili, jaký uživatelský účet bude používat k ověřování připojení.
Jaká je syntaxe MySQL pro uživatelské účty?
V MySQL se uživatelské účty skládají ze dvou samostatných informací spojených zavináčem (@):
- Uživatelské jméno
- Hostitel, ze kterého se uživatel připojuje
Obecně budou uživatelské účty v systému vypadat takto:
'<user>'@'<host>'
Jednoduché uvozovky lze použít, jak je uvedeno výše, k individuálnímu zabalení uživatelských a hostitelských komponent uživatelského účtu. Někdy jsou nezbytné, pokud některá z komponent obsahuje znaky, které by jinak byly nesprávně interpretovány. Obecně platí, že jejich přidání je vždy dobré být explicitní.
Tedy spíše než mít účet s názvem 'john'
, v MySQL by úplný název účtu vyžadoval nějaký druh hostitele, například 'john'@'localhost'
. To znamená, že může existovat více 'john'
účty v systému a MySQL bude každý z nich považovat za jedinečný účet, pokud pocházejí z jiné domény.
S tím vším, co bylo řečeno, je možné definovat uživatelské účty, které nemají uživatelskou nebo hostitelskou komponentu, ale existují důležité důsledky, kterých si musíte být vědomi.
Uživatelský účet bez uživatelské hodnoty můžete definovat pomocí prázdného řetězce:
''@'<host>'
Můžete například vytvořit uživatele jako ''@'localhost'
. Tento uživatel by odpovídal jakémukoli uživatelské jméno připojující se z místního počítače.
Podobně můžete mít uživatelský účet, který odpovídá libovolnému hostiteli. Místo použití prázdného řetězce byste pro hodnoty hostitele použili %
zástupný znak, jako je tento:
'<user>'@'%'
Pokud například vytvoříte 'john'@'%'
, bude tento účet odpovídat 'john'
uživatel se připojuje z libovolného hostitel.
Jak MySQL ověřuje uživatele?
Pochopení toho, jak MySQL skutečně zpracovává každý požadavek na autentizaci, je velmi důležité, aby se předešlo běžné třídě problémů s autentizací, které vyplývají z rozumných, ale nesprávných předpokladů. Toto bylo do určité míry probráno v našem úvodu k autentizaci a autorizaci v článku MySQL.
Při ověřování požadavku na připojení používá MySQL řadu polí v rámci user
tabulky jeho interního mysql
databázi rozhodnout, zda připojení povolit. MySQL bude používat nejvýše jeden záznam uživatelského účtu pro pokus o ověření připojení. To znamená, že MySQL potřebuje způsob, jak rozhodnout, který uživatelský účet použít, pokud existuje více než jeden účet, který by mohl odpovídat připojení.
Algoritmus MySQL pro ověřování uživatelů začíná při spuštění serveru. Při spuštění MySQL načte celý mysql.user
tabulky do paměti. Dělá to také vždy, když jsou vytvořeny uživatelské účty pomocí běžných příkazů MySQL. Při načítání tabulky seřadí položky od nejvyšší priority po nejnižší.
MySQL používá Host
jako primární třídicí pole a upřednostňuje výsledky s konkrétnějšími hodnotami. Takže doslovné hodnoty jsou seřazeny nahoru jako nejvyšší priorita a ty, které používají zástupné znaky, jako %
, jsou seřazeny dolů. Poslední položky jsou ty, které obsahují pouze %
bez dalších znaků, za kterými následují záznamy, které mají zcela prázdného hostitele.
User
sloupec se používá jako sekundární třídicí pole pro všechny položky, které mají stejný Host
hodnota. Opět se upřednostňuje přesnější shody. Protože User
sloupec nemůže používat zástupné znaky, všechny položky mají stejné postavení kromě položek s prázdným User
hodnota. Ty jsou seřazeny dolů. Pokud je nějaká položka s prázdným User
Pokud je vybrána hodnota, uživatel bude ověřen jako "anonymní uživatel", což obvykle znamená, že nemá žádná oprávnění.
Nyní, kdykoli dojde k požadavku na připojení, MySQL prochází svou seřazenou tabulkou v paměti shora dolů. Používá první záznam, který najde pro ověření uživatele, bez ohledu na to, zda existují další záznamy, které by také odpovídaly. Pokud se klientovi nepodaří ověřit pomocí metody definované tímto záznamem, připojení se nezdaří a žádné další záznamy nebudou kontrolovány.
Jaké jsou důsledky nezahrnutí uživatele nebo hostitele do definice uživatelského účtu MySQL?
Kvůli autentizačnímu algoritmu MySQL se mohou objevit problémy, pokud nejste opatrní při vytváření uživatelských účtů bez uživatelské nebo hostitelské komponenty. Je to proto, že způsob, jakým MySQL rozhoduje, který záznam použít k vaší autentizaci, může být neintuitivní a překvapivý.
Pokud se například uživatel autentizuje do MySQL s uživatelskou částí jako prázdným řetězcem, MySQL jej bude po zbytek relace považovat za „anonymního uživatele“. Anonymní uživatelé zpravidla nemají téměř žádnou moc a po připojení mohou dělat velmi málo. Je možné se dokonce náhodně autentizovat jako anonymní uživatel při pokusu o ověření pomocí jiného uživatelského účtu.
Problém s použitím zástupných hostitelů pro uživatelské účty je to ostatní uživatelské účty, které zahrnují hodnota hostitele může snadno maskovat nebo znepřístupnit uživatelský účet, který používá zástupný znak.
Například, pokud máte uživatelský účet definovaný jako 'emily'@'%'
, můžete očekávat, že se budete moci autentizovat na 'emily'
od jakéhokoli hostitele. Pokud však máte uživatelský účet s prázdným uživatelem, ale s hodnotou hostitele, která odpovídá hostiteli 'emily'
se připojuje, MySQL se místo toho ověří pomocí tohoto účtu (což povede k přihlášení anonymního uživatele, jak je popsáno výše).
Například MySQL seřadí následující účty do následujícího pořadí:
Priorita | Účet MySQL | Komentáře |
---|---|---|
1 | 'emily'@'localhost' a 'emily'@'example.com' | Tyto údaje mají stejnou prioritu, což je v pořádku, protože pouze jeden z nich může odpovídat připojení. |
2 | ''@'localhost' a ''@'example.com' | Tyto dva záznamy mají opět stejnou prioritu. Protože nemají uživatelskou komponentu, ale mají mají doslovnou hostitelskou komponentu, jsou umístěny na konci položek, které mají přesné hodnoty hostitele. |
3 | 'emily'@'%.example.com' | Tento záznam má v hostitelské komponentě zástupný znak, takže má nižší prioritu než záznamy s přesnými hodnotami hostitele. |
4 | ''@'%.example.com' | Tento záznam je seskupen se záznamy, které mají v hostitelské hodnotě zástupný znak. Protože nemá žádnou uživatelskou komponentu, je na konci této skupiny. |
5 | 'emily'@'%' | Tento záznam má hodnotu hostitele sestávající pouze ze zástupného znaku. Protože se shoduje s jakýmkoli hostitelem, má velmi nízkou prioritu. |
7 | ''@'%' | Tento záznam lze použít k ověření libovolného uživatele z libovolného hostitele jako anonymního uživatele. Má extrémně nízkou prioritu, protože odpovídá jakémukoli připojení. |
6 | 'emily'@'' | Tento záznam má zcela prázdnou hodnotu hostitele, která má ještě nižší prioritu než hostitel, který obsahuje pouze hostitele se zástupným znakem. |
8 | ''@'' | Toto je uživatel s nejnižší možnou prioritou. Neobsahuje žádné informace o hostiteli, takže je při řazení hostitelů umístěn na konci. Protože obsahuje také prázdného uživatele, je umístěn pod ostatními položkami v této skupině. Stejně jako všechny záznamy bez uživatele budou připojení ověřená tímto záznamem přihlášena jako anonymní uživatel. |
Jak vytváříte uživatele?
Nyní, když máte pocit, jak MySQL zpracovává uživatelské účty, můžeme začít vytvářet nové uživatele. Nezapomeňte se přihlásit s uživatelem s oprávněními popsanými v předpokladech.
Základní syntaxe
Základní syntaxe pro vytvoření nového uživatele je poměrně jednoduchá. Používáte CREATE USER
a poté zadejte uživatele a hostitele pro nový účet:
CREATE USER '<user>'@'<host>';
Tím vytvoříte základní účet, aniž byste při vytváření museli konfigurovat jakékoli podrobnosti kromě jeho uživatele a hostitele.
Jak vytvoříte uživatele s heslem?
Často chcete konfigurovat ověřování při vytváření uživatele. Můžete to provést přidáním volitelného IDENTIFIED BY
klauzule na CREATE USER
prohlášení:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
Tím se vytvoří nový uživatelský účet jako dříve a zároveň se k účtu přiřadí heslo. Jak později přiřadit heslo nebo jak změnit heslo uživatele, probereme později.
Jak vytvoříte uživatele s ověřováním soketu Unix?
I když je ověřování pomocí hesla pro většinu uživatelů nejběžnější metodou ověřování, není to jediná možnost. MySQL poskytuje mnoho různých interních a externích autentizačních mechanismů, které můžete nakonfigurovat pro své uživatelské účty. Jako příklad nakonfigurujeme nový účet pomocí autentizace soketu Unix.
Autentizaci soketu Unix lze použít v prostředích Linuxu nebo Unixu, takže účet v operačním systému získá přístup ke stejnému názvu účtu v MySQL bez dalšího ověřování. V této konfiguraci administrátor MySQL ví, že uživatelské účty v operačním systému jsou přísně kontrolovány.
Pokud tedy existuje mary
uživatel v operačním systému, bude se moci přihlásit k 'mary'@'localhost'
účet v rámci MySQL, pokud je definovaným mechanismem autentizace autentizace soketu Unix. Pojďme to nyní nakonfigurovat.
Ověření soketu vyžaduje auth_socket
plugin, takže nejprve načtěte plugin zadáním:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Dále vytvořte uživatelský účet, který odpovídá uživatelskému účtu, který máte v operačním systému. V tomto příkladu použijeme mary
účet, o kterém jsme hovořili výše. Pokud nepoužijete jméno, které odpovídá některému z názvů vašeho operačního systému, nebudete se moci pomocí tohoto uživatele ověřit.
K vytvoření uživatele s ověřením soketu musíme použít IDENTIFIED WITH
klauzule (jiná než IDENTIFIED BY
klauzule použitá dříve) k určení ověřovacího pluginu, který se má použít:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
Nyní byste měli být schopni autentizovat se na 'mary'@'localhost'
Uživatel MySQL z mary
uživatele ve vašem operačním systému. Když jste přihlášeni jako mary
, připojte se k databázi bez zadání uživatelského jména nebo hesla:
mysql
Měli byste být přihlášeni automaticky prostřednictvím autentizace soketu Unix, kterou jste nakonfigurovali.
Jak zobrazíte stávající uživatele?
Dále se podívejme na to, jak najít informace o stávajících uživatelích.
Chcete-li zobrazit všechny stávající uživatele MySQL, skládající se z jejich uživatelské a hostitelské komponenty a také ověřovacího pluginu, který aktuálně používají, můžete SELECT
tato pole z mysql.user
databáze:
SELECT user,host,plugin FROM mysql.user
+------------------+-----------+-----------------------+ user | host | plugin |+------------------+-----------+-----------------------+ mary | localhost | auth_socket | mysql.infoschema | localhost | caching_sha2_password | mysql.session | localhost | caching_sha2_password | mysql.sys | localhost | caching_sha2_password | root | localhost | caching_sha2_password | useradmin | localhost | caching_sha2_password |+------------------+-----------+-----------------------+6 rows in set (0.00 sec)
Zde vidíme, že v systému je definováno šest uživatelů, z nichž všichni se mohou přihlásit pouze lokálně. Pět z účtů je nakonfigurováno pro použití ověřování heslem. 'mary'@'localhost'
účet je nakonfigurován pro použití autentizace soketu Unix.
Další informace o vlastnostech uživatele můžeme najít pomocí SHOW CREATE USER
příkaz. Navzdory svému názvu zobrazuje všechny aktuální vlastnosti uživatelského účtu, ne nutně ty, které byly použity při počátečním vytvoření účtu.
SHOW CREATE USER
příkaz bere jako argument název účtu:
SHOW CREATE USER '<user>'@'<host>'\G
Obvykle je nejlepší ukončit příkaz pomocí \G
terminátor příkazu namísto obvyklého dvojtečky (;
), abyste si mohli prohlédnout výsledky o něco jasněji.
Chcete-li zobrazit vlastnosti pro 'useradmin'@'localhost'
účtu, zadejte:
SHOW CREATE USER 'useradmin'@'localhost'\G
*************************** 1. row ***************************CREATE USER for useradmin@localhost: CREATE USER 'useradmin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$O Rl7lM;@Gt{roB4EWchqDdYM142Lq7pfzcCNiK4yUxnRBlrAgr0sE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT1 row in set (0.00 sec)
Jak změníte stávající uživatele MySQL?
Stávající uživatele v MySQL můžete změnit pomocí ALTER USER
příkaz. Toto lze použít ke změně většiny uživatelských vlastností účtu, s výjimkou oprávnění účtu, která jsou řízena GRANT
a REVOKE
příkazy.
Základní syntaxe pro ALTER USER
vypadá takto:
ALTER USER <user> <properties_to_change>;
Jak změníte heslo pro uživatele MySQL?
Pro většinu lidí je nejčastější použití ALTER USER
je upravit hesla.
Můžete například upravit heslo pro 'kamal'@'localhost'
zadáním:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
Pokud chcete nastavit dočasné heslo pro uživatele, které bude muset okamžitě nahradit, můžete nastavit heslo a zároveň mu vyprší platnost:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
Své vlastní heslo můžete kdykoli změnit, a to i bez CREATE USER
privilegium. Nejjednodušší je použít USER()
funkce pro automatické vyplnění vašeho vlastního uživatelského jména:
ALTER USER USER() IDENTIFIED BY '<new_password>';
Jak změníte ověřovací pluginy pro uživatele MySQL?
Můžete také změnit mechanismus nebo plugin používaný k ověření účtu.
V předchozím příkladu jsme nakonfigurovali účet s názvem 'mary'@'localhost'
používat autentizaci soketu Unix. Pokud později budeme chtít tento účet změnit tak, aby používal konvenční ověřování heslem, můžeme použít ALTER USER
příkaz znovu.
Nejprve určete výchozí ověřovací plugin pro váš server. Pokud se jedná o metodu ověřování založenou na hesle, bude pravděpodobně nejlepší znovu použít výchozí výběr:
SHOW VARIABLES LIKE 'default_authentication_plugin';
V tomto případě je výchozím ověřovacím pluginem caching_sha2_password
, takže to použijeme, když přejdeme na ověřování heslem.
Nyní změňte 'mary'@'localhost'
použít caching_sha2_password
plugin s novým heslem:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';
'mary'@'localhost'
uživatel se již nebude moci přihlásit pomocí autentizace soketu Unix, ale může se přihlásit pomocí poskytnutého hesla.
Jak se přihlásíte do MySQL?
Probrali jsme, jak vytvářet a upravovat uživatelské účty MySQL, včetně ověřování. Nemluvili jsme však o tom, jak se skutečně přihlásit pomocí těchto metod ověřování.
mysql
klient je výkonný klient příkazového řádku, který lze použít pro připojení k místním a vzdáleným databázím. Použijeme ho, abychom si řekli, jak se autentizovat pomocí metod, které jsme nakonfigurovali výše.
Jak se přihlásíte do místní databáze pomocí hesla?
Chcete-li se přihlásit k lokálně hostované databázi MySQL pomocí uživatelského účtu s heslem, základní syntaxe vypadá takto:
mysql --user=<username> --password <dbname>
Pokud tedy 'kamal'@'localhost'
uživatel se chce přihlásit k MySQL a připojit se k testing
databáze z počítače, kde je systém hostován, mohou zadat:
mysql --user=kamal --password testing
mysql
klient požádá o heslo pro 'kamal'@'localhost'
. Pokud zadáte správné přihlašovací údaje, budete připojeni k testing
databáze.
Zadání databáze na příkazovém řádku je volitelné. Není-li zadána žádná, připojíte se k serveru, ale ne ke konkrétní databázi.
Jak se přihlásíte do lokální databáze s autentizací Unix socket?
Chcete-li se přihlásit k místnímu serveru MySQL pomocí autentizace soketu Unix, musíte být přihlášeni do operačního systému jako odpovídající název účtu. Pokud se tedy chceme autentizovat na 'mary'@'localhost'
pomocí autentizace Unix socketu se musíme nejprve přihlásit k našemu počítači pomocí uživatelského jména s názvem mary
.
Jakmile používáte správný účet operačního systému, můžete se připojit přímo k místní databázi spuštěním klienta bez jakýchkoliv možností.
mysql
Stejně jako dříve můžete volitelně připojit název databáze a připojit se ke konkrétní databázi, kterou chcete.
Jak se přihlásíte do vzdálené databáze pomocí hesla?
Pokud váš server MySQL na vašem místním serveru neběží, budete muset určit hostitele, ke kterému se má klient pokusit připojit. Můžete to udělat přidáním --host
možnost.
Většinu času se budete ověřovat heslem na vzdálených serverech MySQL, takže příkaz bude vypadat nějak takto:
mysql --user=<username> --password --host=<host> <dbname>
Takže 'tanya'@'<tanyas_domain>'
mohl připojit k serveru MySQL umístěnému na example.com
zadáním:
mysql --user='tanya' --password --host='example.com'
Jak odstraníte uživatele MySQL?
Udržování uživatelských účtů, které již neplní svůj účel, představuje bezpečnostní riziko. Účty můžete snadno odstranit pomocí DROP USER
příkaz.
Základní syntaxe vypadá takto:
DROP USER '<user>'@'<host>';
Chcete-li tedy odstranit 'mary'@'localhost'
uživatel, zadali byste:
DROP USER 'mary'@'localhost';
Pokud se pokusíte odstranit uživatele, který neexistuje, zobrazí se chyba:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'
Abyste tomu zabránili, můžete přidat IF EXISTS
klauzule před názvem účtu. Pokud uživatel existuje, bude smazán. Pokud ne, zobrazí se pouze varování:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Závěr
Správa uživatelských účtů a konfigurace ověřování MySQL je vysoce flexibilní. Naučíte-li se vytvářet, upravovat a získávat informace o uživatelích v MySQL, pomůže vám to efektivněji spravovat vaše databázové systémy.
Osvědčené bezpečnostní postupy diktují, že byste měli vytvářet účty pro každý jedinečný případ použití s ohledem pouze na úroveň přístupu potřebnou k provedení jejich rozsahu. Vytvoření účtu a ověření jsou první fáze tohoto procesu. V dalším průvodci budeme hovořit o udělování a odebírání oprávnění k naplnění druhé části této strategie.