Zabezpečení dat proti neoprávněnému přístupu patří v MySQL mezi to nejdůležitější. Její nastavení není nejjednodušší, po přečtení následujících řádků by pro vás ale nemělo být problémem.

Po instalaci a provozním nastavení MySQL je třeba přidat uživatele, jejich hesla a přidělit jim přístupová práva. Během provozu můžete systému vznést také požadavek na změnu práv nebo zrušení uživatele. Systém řízení přístupu v MySQL je poněkud odlišný od ostatních SQL serverů.

Řízení přístupu

Základní funkcí řízení přístupu je rozpoznat uživatele přistupujícího z daného počítače a přidělit mu příslušná práva nad databázemi. Informace o uživatelích a právech jsou uloženy v tabulkách „user“, „db“, „host“, „tables_priv“ a „columns_priv“ patřících do databáze „mysql“. Tato databáze byla vytvořena již během instalace. Data z ní se načítají při každém spuštění SQL serveru.

Typy privilegií

V tabulkách databáze „mysql“ se vyskytují následující sloupce. Jednotlivým uživatelům přihlašujícím se z daných počítačů můžete přidělit tato práva:

Právo Název sloupce Rozsah působnosti
select Select_priv tabulky
insert Insert_priv tabulky
update Update_priv tabulky
delete Delete_priv tabulky
index Index_priv tabulky
alter Alter_priv tabulky
create Create_priv databáze, tabulky, indexy
drop Drop_priv databáze, tabulky, indexy
grant Grant_priv databáze, tabulky
references References_priv databáze, tabulky
reload Reload_priv správa serveru
shutdown Shutdown_priv správa serveru
process Process_priv správa serveru
file File_priv přístup k souborům na serveru

Práva pro definici a manipulaci s daty:
select, insert, update a delete potřebuje uživatel k vykonávání příslušných příkazů;
index je vyžadován pro vytváření a rušení indexů v tabulkách;
alter umožňuje použít ALTER TABLE;
create, drop dovolují vytvářet a rušit databáze a tabulky v nich;
grant dovoluje danému uživateli předat všechna jeho práva i ostatním uživatelům;
file dává svolení číst a zapisovat soubory na serveru pomocí příkazů LOAD DATA INFILE a SELECT INTO OUTFILE.

Práva pro správu serveru (tyto akce můžete vykonávat pomocí aplikace mysqladmin, která je umístěna v podadresáři /bin):
reload dovoluje provést příkazy reload (znovunačtení tabulek uživatelů a práv), refresh (flush všech tabulek a logů), flush-privileges (to samé, co příkaz reload), flush-hosts, flush-logs, flush-tables (příkaz refresh provede flush všeho; tyto se specializují na hosty, logy a tabulky);
shutdown dává právo provést příkaz shutdown (ukončení běhu SQL serveru);
process je nutný pro provedení processlist (seznam vláken běžících na serveru s uživateli, kteří je spustili), kill (ukončení procesů vláken ostatních uživatelů, na vlastní procesy má každý práva automaticky).

Jak pracuje systém řízení přístupu

Nejprve se kontroluje, zda má uživatel dovolen přístup. Je rozdíl, když se „milda“ hlásí z počítače „milda“ nebo z počítače „alfonz“. Kontroluje se platnost celé identifikační trojice (uživatel – heslo – počítač). Nezapomeňte také, že uživatelská jména a hesla v MySQL nemají nic společného s těmi v operačním systému počítače, na kterém SQL server běží. Připojení tedy proběhlo v pořádku a klient posílá požadavky. Při každém z nich se kontroluje oprávnění uživatele k vykonání dané operace.

Struktura tabulek s privilegiemi

MySQL používá tabulky „user“, „db“ a „host“ v obou případech řízení přístupu, tj. jednak při přihlašování, jednak při obsluze požadavků. A jen pro druhý případ jsou určeny další dvě tabulky: „tables_priv“ a „columns_priv“. Pro přesné údaje, co který sloupec privilegií v těchto pěti tabulkách znamená, čtěte výše – Typy privilegií.

Tabulka „user“

V této tabulce jsou uloženi uživatelé se svými hesly a počítači, odkud se mohou k SQL serveru připojovat. Zároveň se jim zde přisuzují práva pro definici a manipulaci s daty a práva pro správu serveru. Práva zde přidělená mají globální platnost nad všemi databázemi na serveru. Následující tabulka ukazuje strukturu tabulky „user“ v databázi „mysql“.

Určení působnosti Host
User
Password
Přiřazení práv Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

Sloupec „Host“ může být název počítače nebo IP adresa nebo „localhost“. Může obsahovat znaky divokých karet – procento („%“) zastupující 0-n znaků a podtržítko („_“) zastupující právě jeden znak. Hodnoda „%“ platí za jakýkoli řetězec, resp. počítač.
Ve sloupci „user“ znaky divokých karet použít nemůžete. Máte možnost nechat políčko prázdné – tzv. anonymní uživatel. S tímto řádkem pak souhlasí kterékoli uživatelské jméno.
„Password“ můžete nechat také prázdný. Neznamená to, že kterékoli heslo je správné, ale uživatel se musí připojovat bez hesla. Neprázdný sloupec obsahuje zakryptované heslo.
Všechny ostatní sloupce nabývají jedné z hodnot „Y“ nebo „N“ podle toho, zda daná práva přidělíte nebo ne.

Tabulka „db“

Nad danou databází (sloupec „Db“) mohou mít jednotliví uživatelé (sloupec „User“), připojující se z různých počítačů (sloupec „Host“), rozdílná práva (všechny zbývající sloupce).

Určení působnosti Host
Db
User
Přiřazení práv Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv

Ve sloupcích „Host“ a „Db“ můžete použít znaky divokých karet. Hodnota „%“ ve sloupci „Host“ znamená kterýkoli počítač a hodnota „“ (prázdná) přikazuje, aby se systém řízení přístupu podíval do tabulky „host“.

Tabulka „host“

Nad danou databází (sloupec „Db“) je dovoleno z různých počítačů (sloupec „Host“) provádět rozdílné akce (všechny zbývající sloupce).

Určení působnosti Host
Db
Přiřazení práv Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv

Hodnota „%“ nebo „“ ve sloupci „Host“ znamená kterýkoli počítač. Hodnota „%“ nebo „“ ve sloupci „Db“ tabulky „db“ a zároveň tabulky „host“ představuje kteroukoli databázi. Prázdná hodnota „User“ v obou tabulkách znamená anonymní uživatel.

Tabulka „tables_priv“

Další zjemnění přístupových práv na úrovni tabulek umožňuje „tables_priv“. Zde opět platí, že při přístupu do dané tabulky (sloupec „Table_name“), příslušející dané databázi (sloupec „Db“) a podle uživatele a počítače („User“, „Host“) systém určí, jaké operace jsou povoleny.

Určení působnosti Host
Db
User
Table_name
Přiřazení práv Table_priv
Column_priv
Další údaje Timestamp
Grantor

Sloupce „Db“, „Table_name“ a „Column_name“ nemohou obsahovat znaky divokých karet nebo zůstat prázdné. Sloupce „Table_priv“ a „Column_priv“ jsou typu set, tzn. že mohou nabývat žádné, jedné, více nebo všech hodnot z dané množiny. Pro „Table_priv“ je množina: „Select“, „Insert“, „Update“, „Delete“, „Create“, „Drop“, „Grant“, „References“, „Index“, „Alter“ a pro „Column_priv“: „Select“, „Insert“, „Update“, „References“.

Tabulka „columns_priv“

Nastavení přístupových práv na úrovni jednotlivých sloupců tabulky umožňuje „columns_priv“. Při přístupu ke sloupci (jeho název je ve sloupci „Column_name“) z tabulky (sloupec „Table_name“), v databázi (sloupec „Db“) a podle uživatele a počítače („User“, „Host“) se určí, jaké operace jsou povoleny.

Určení působnosti Host
Db
User
Table_name
Column_name
Přiřazení práv Column_priv
Další údaje Timestamp

Sloupce „Db“, „Table_name“ a „Column_name“ nemohou obsahovat znaky divokých karet nebo zůstat prázdné. Sloupec „Column_priv“ je typu set. Množina jeho možných hodnot je: „Select“, „Insert“, „Update“, „References“.

Rekapitulace významu tabulek

user určuje všechna povolená připojení (Host – User – Password). Kterákoli práva vyplývající pro danou trojici mají globální působnost na všechny databáze na serveru.
db popisuje, kteří uživatelé mohou přistoupit k jakým databázím z jakých počítačů. Přiřazení práv určují, které operace jsou povoleny.
host se používá jako rozšíření tabulky „db“. Když chcete, aby se daný řádek tabulky „db“ týkal více počítačů. Tedy, když potřebujete zajistit, aby jeden uživatel mohl používat databázi z několika počítačů na síti, nechejte sloupec „Host“ v tabulce „db“ prázdný a pak do tabulky „host“ uveďte všechny počítače.
tables_priv a columns_priv mají podobný význam, jako tabulka „db“. Práva z nich plynoucí mají daleko menší dopad. Jsou zjemněny na úroveň jednotlivých tabulek resp. sloupců. Pomocí tohoto mechanismu docílíte stejného efektu, jako v případě vytvoření pohledu (CREATE VIEW), jehož účelem je zpřístupnění jen některých sloupců tabulky jen některým uživatelům.

Kdy začínají platit změněná práva

Při změnách pomocí k tomu určených SQL příkazů GRANT, REVOKE a SET PASSWORD se změny promítnou ihned. Pokud změníte tabulky privilegií přímo (INSERT, UPDATE), je třeba vykonat flush privileges nebo reload, aby nová nastavení začala platit.

Nastavení počátečních práv

Po instalaci se vytvoří tabulky privilegií a do nich je zaznamenán uživatel root, který má neomezená privilegia na úplně všechno. Jeho heslo je ale prázdné, tzn. kdokoli se může připojit jako root. Tento nebezpečný stav změníte následovně: Na příkazovém řádku (shell) počítače, kde běží MySQL, spustíte konzoli mysql. Spustitelný soubor se nachází v podadresáři /bin a nazývá se mysql.exe na Windows a mysql na Linuxu (tento název jsem použil pro další příklady, ve Windows si připište ještě „.exe“).

shell> mysql -u root # přihlášení se jako root
mysql> \u mysql # budete používat databázi „mysql“
mysql> UPDATE user SET Password=PASSWORD(‚heslo_roota‘) WHERE user=’root‘; # přímý zápis do tabulky privilegií
mysql> FLUSH PRIVILEGES; # takže se musí provést znovunačtení tabulek privilegií mysql> \q # ukončení práce

Přidání nového uživatele a nastavení jeho práv

Po předchozí akci má již superuživatel nastaveno heslo. Připojte se tedy znovu k MySQL pomocí konzole mysql. K přidání uživatele a práv tentokrát použijte příkazu GRANT.

shell> mysql -u root -p # přihlášení se jako root, již s heslem
Enter passowrd: # server chce heslo
mysql> \u mysql # budete používat databázi „mysql“
mysql> GRANT ALL PRIVILEGES ON *.* TO milda@localhost IDENTIFIED BY ‚mildovo_heslo‘ WITH GRANT OPTION; # první řádek
mysql> GRANT SELECT, RELOAD ON alfonz.* TO alfonz@“%“ IDENTIFIED BY ‚alfonzovo_heslo‘; # druhý řádek
mysql> \q # ukončení práce

Na prvním řádku jste přidali uživatele „milda“ s heslem „mildovo_heslo“. Milda má dovoleno se připojit jen z počítače, na kterém běží SQL server, tj. „@localhost“. Byla mu přidělena veškerá práva „ALL PRIVILEGES“ na všechny databáze a všechny tabulky v nich „*.*“. Druhý řádek zakládá uživatele „alfonz“ s heslem „alfonzovo_heslo“, který se může přihlásit z kteréhokoli počítače na této planetě (@“%“). Na všech tabulkách databáze alfonz („alfonz.*“) má právo select a pro administraci může spustit RELOAD.

V tomto případě není nutný příkaz flush privileges. Nyní to samé provedete pomocí přímého přístupu do tabulek privilegií. Uvedu jen první a druhý řádek.

mysql> INSERT INTO user VALUES(‚localhost‘, ‚milda‘, PASSWORD(‚mildovo_heslo‘), ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘, ‚Y‘); # první řádek
mysql> INSERT INTO user (Host, User, Password, Reload_priv) VALUES (‚%‘, ‚alfonz‘, PASSWORD(‚alfonzovo_heslo‘), ‚Y‘); # druhý řádek – první část
mysql> INSERT INTO db (Host, Db, User, Select_priv) VALUES (‚%‘, ‚alfonz‘, ‚alfonz‘, ‚Y‘); # druhý řádek – druhá část
mysql> FLUSH PRIVILEGES; # znovunačtení tabulek privilegií

Odebrání práv

Pro odebrání práv je určen příkaz REVOKE. Následující příklad odebere uživateli „milda“ právo „FILE“.

REVOKE FILE ON *.* FROM milda;

A nyní to samé přímým přístupem k tabulkám v databázi „mysql“.

mysql> UPDATE user SET File_priv = ‚N‘ WHERE User = ‚milda‘; mysql> FLUSH PRIVILEGES;

Změna hesla

Uživatel „milda“ si chce změnit heslo na „mildovo_nove_heslo“. Nejprve se musí připojit k SQL serveru pod svým uživatelským jménem a pak zadat příkaz pro změnu hesla.

shell> mysql -u milda -p # přihlášení se jako milda s použitím hesla
Enter passowrd: # heslo pro milda
mysql> SET PASSWORD=PASSWORD(‚mildovo_nove_heslo‘); # změna hesla pro milda

Tímto postupem si změní své heslo každý uživatel, který používá při přihlašování k SQL serveru heslo. Root může změnit heslo všem pomocí přímého přístupu do tabulky „user“. Také nastaví heslo pro uživatele s prázdným heslem, kteří pro přihlašování na SQL server heslo nepoužívají. Server jim totiž nedovolí si příkazem SET PASWORD heslo zavést.

Pravidla zabezpečení

Nikdy nedávejte možnost komukoli, kromě uživatele „root“, přistupovat k databázi „mysql“.
Vždy udělujte jen ta práva, která jsou nutná pro daný úkol.
Povolte přístup jen z minima počítačů. Root by měl mít dovoleno přihlásit se jen z „localhost“.
Zrušte anonymní uživatele.
Všem zaveďte heslo pro přihlašování.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět