V dnešním předposledním díle našeho seriálu vám ukáži, jakým způsobem v MySQL zabráníme neoprávněné manipulaci s daty.
Každý databázový produkt, MySQL nevyjímaje, by měl obsahovat alespoň základní zabezpečovací mechanismy, které brání odcizení či úmyslnému poškození citlivých dat někým nepovolaným. Podle mnoha studií totiž většina neoprávněných přístupů nepochází z okolí sítě (např. z Internetu), ale přímo z vnitřní sítě. To je hlavní důvod, proč bychom neměli nechávat naše mnohdy cenná data jen tak na pospas okolí, ale měli bychom je řádně zabezpečit.
Na úvod uvedu konkrétní případ. Pracujete ve firmě, kde jsou důležitá data uložena v databázi MySQL, a potřebujete zajistit, aby pracovník č. 1 měl přístup do jedné databáze a pracovník č. 2 do druhé databáze. Jak se s tím vypořádáte?
Zcela jednoduše. Využijete totiž možností správy „účtů“, která je v MySQL k dispozici. Při každé nové instalaci MySQL se automaticky vytvoří 2 databáze. První se jmenuje test a je implicitně prázdná. Druhá má název mysql (neplést s názvem produktu) a obsahuje několik tabulek, v nichž je uvedeno aktuální nastavení uživatelských „kont“. Konkrétně se jedná o tabulky user, db, host, func, tables_priv a columns_priv.
Předpokládám, že jste správci MySQL, a tudíž jako jediní máte přístup k databázi mysql. Jak jsem se již zmínil, tato databáze obsahuje několik tabulek pro konfiguraci uživatelských „kont“. Začnu tabulkou user. Tato tabulka obsahuje privilegia (oprávnění) na globální úrovni. Pokud tedy má uživatel nastavena některé oprávnění v této tabulce, pak se vztahují na celý SQL server - tudíž na každou databázi, která se na něm nachází. Tato tabulka obsahuje několik polí. Jejich výčet a popis naleznete v následující tabulce:
Název pole |
Popis |
Host |
Název hostitelského počítače. Tímto způsobem můžete omezit přístup pouze na určitou doménu (název či IP). |
User |
Uživatelské jméno. Pod tímto jménem se následně přihlašujete do MySQL. |
Password |
Uživatelské heslo. Toto heslo je z bezpečnostních důvodů ukládáno zašifrované. |
Select_priv |
Dovoluje uživateli vykonávat výběrové dotazy (příkaz SELECT). |
Insert_priv |
Dovoluje uživateli vkládat nové záznamy do databáze (příkaz INSERT). |
Update_priv |
Dovoluje uživateli aktualizovat data v databázích (příkaz UPDATE). |
Delete_priv |
Dovoluje uživateli odstraňovat záznamy (příkaz DELETE). |
Create_priv |
Dovoluje uživateli vytvářet nové tabulky a databáze (příkaz CREATE). |
Drop_priv |
Dovoluje uživateli rušit tabulky a databáze (příkaz DROP). |
Reload_priv |
Dovoluje uživateli aktualizovat tabulku uživatelských účtů (příkaz FLUSH PRIVILEGES). |
Shutdown_priv |
Dovoluje uživateli ukončit SQL server. |
Process_priv |
Dovoluje uživateli sledovat jednotlivé požadavky na SQL serveru. Při tomto oprávnění smí odstraňovat i jednotlivé procesy. |
File_priv |
Dovoluje uživateli číst a zapisovat do souborů na SQL serveru. |
Grant_priv |
Dovoluje uživateli přidělovat práva dalším uživatelům. |
References_priv |
Není mi známa funkce. |
Index_priv |
Dovoluje uživateli vytvářet či odstraňovat indexy. |
Alter_priv |
Dovoluje uživateli měnit strukturu tabulky. |
Kromě polí Host, User a Password obsahují ostatní pole hodnotu Y nebo N tj. jestli je dané právo uděleno (Y) či nikoliv (N). Veškeré přidávání, modifikace a mazání uživatelských „kont“ se pak děje za použití standardních příkazů SQL, protože se jedná o „normální“ tabulku. Uveďme příklad:
INSERT INTO user (Host, User, Password, Select_priv) VALUES (“localhost“,“novak“,PASSWORD(“heslo“),“Y“);
Předcházející příklad umožní uživateli novak provádět výběrové dotazy v kterékoliv databázi, která je umístěna na SQL serveru. Jistě jste si všimli, že jsem použil funkci PASSWORD(). Tato funkce slouží k zašifrování hesla. Ale pozor! MySQL bere ohled na velikost písmen.
Jak mi jistě dáte za pravdu, přidělování práv na globální úrovni není příliš dobré. Většinou mají v této tabulce přidělena významnější práva pouze uživatelé, kteří mají co do činění se správou MySQL. Na začátku dnešního dílu jsem se ale zmínil o možnosti mít přístup pouze do určité databáze. Vždy totiž platí, že uživatel by měl mít pouze ta práva, která skutečně potřebuje. Jak tedy na to?
Práva ke konkrétní databázi se přidělují v tabulce db. Tato tabulka obsahuje většinu polí, která jsou v tabulce user (všechna kromě Reload_priv, Shutdown_priv, Process_priv a File_priv, která zde pozbývají smyslu), a přidává pole Db, které obsahuje název databáze, na niž se práva vztahují. Postup je obdobný jako v předchozím případě, jen s tím rozdílem, že uživatel musí být již zaveden v tabulce user. Jak tomu rozumět?
Dříve, než budeme moci uživateli přidělit práva pro přístup k dané databázi, mu totiž musíme zřídit „konto“, aby se mohl přihlásit k SQL serveru. A to právě uděláme v tabulce user. Následně mu přidáte příslušná práva v tabulce db, znovu načtete práva, a vše je hotovo. Celé to vypadá následovně:
INSERT INTO user (Host, User, Password) VALUES (“localhost“,“novak“,PASSWORD(“heslo“));
INSERT INTO db (Host, User, Db, Select_priv) VALUES (“localhost,“novak“,“uzivatele“,“Y“);
FLUSH PRIVILEGES;
Předchozí syntaxe myslím nepotřebuje žádného zvláštního komentáře. Nejdříve je na globální úrovni přidán uživatel (na této úrovni mu nejsou přiřazena žádná práva). Následně je uživateli novak přiděleno právo prohlížet záznamy v tabulce uzivatele. Na úplný závěr je znovu načtena tabulka uživatelských účtů.
Další tabulkou je tabulka host. Tato tabulka obsahuje stejná pole jako tabulka db a má více méně podobnou funkci jako tabulka db. Proto ji příliš nepoužijete. Poslední dvě tabulky jsou tables_priv a columns_priv. Ty slouží k nastavování práv k jednotlivým tabulkám resp. k jednotlivým polím v tabulce. Obě tyto tabulky obsahují následující pole:
Název pole |
Popis |
Host |
Název hostitelského počítače. |
Db |
Jméno databáze, která obsahuje danou tabulku. |
User |
Jméno uživatele, kterému přidělujeme práva. |
Table_name |
Jméno tabulky, ke které přidělujeme práva. Zde pozor na rozlišování velkých a malých písmen. |
Timestamp |
Informace o poslední změně. |
Column_priv |
Toto pole obsahuje přidělená práva (množina SET). Může obsahovat hodnoty SELECT, INSERT, UPDATE a REFERENCES, případně jejich kombinaci. Vždy však musíte jednotlivé hodnoty oddělovat čárkou. |
Tabulka tables_priv navíc obsahuje pole Grantor (obsahuje jméno člověka, který práva přidělil) a Table_priv, které obsahuje přidělená práva. Jedná se opět o množinu SET, která může nabývat různých kombinací hodnot: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, REFERENCES, INDEX či ALTER (opět oddělených čárkou). Tabulka columns_priv obsahuje navíc pole Column_name, které udává název pole, na než se vztahují práva udělená v poli Column_priv.
Možnosti nastavení jsou tedy vcelku bohaté. Mnozí zkušenější uživatelé MySQL taktéž jistě dobře znají druhý způsob nastavování práv, a to ve formě použití příkazů GRANT a REVOKE. Popis těchto příkazů je však bohužel nad rámec tohoto seriálu, a případné zájemce tedy odkáži na jejich popis v manuálu. Pro ostatní pouze dodám, že s pomocí těchto příkazů docílíte prakticky stejné věci jako přímým nastavováním uživatelských „kont“.
Po dnešním dílu tedy již víte, jak nastavovat příslušná oprávnění jednotlivým uživatelům MySQL. V příštím, již závěrečném dílu tohoto seriálu vám povím něco málo o základní správě MySQL.