Zabezpečení instalace MySQL je něco, na co by měl myslet každý MySQL DBA. Zatímco jsme diskutovali o tom, jak byste se měli postarat o zabezpečení MySQL jako celek (podívejte se na některé z našich předchozích příspěvků, konkrétně na bezpečnostní sérii MySQL, část jedna a část druhá), neprobírali jsme konkrétní problémy související se zabezpečením, včetně problémů souvisejících s oprávněními. Děláme to zde.
Co jsou oprávnění v MySQL?
Účtům lze udělit oprávnění v MySQL. Pokud udělíte oprávnění účtu v MySQL, určíte, které operace může účet provádět. Oprávnění lze udělit buď databázím nebo databázovým objektům (tabulkám, indexům, pohledům atd.). Oprávnění mohou být také dynamická nebo statická. Statická oprávnění jsou zabudována do serveru, zatímco dynamická oprávnění lze definovat za běhu.
Jak využít oprávnění pro zabezpečení MySQL
Abyste mohli využívat oprávnění v MySQL, musíte mít na paměti toto:
-
Abyste mohli přidělovat nebo odebírat oprávnění, musíte mít uživatele MySQL. Uživatele lze vytvořit spuštěním dotazu CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
-
Chcete-li přidělit nebo odejmout oprávnění, použijte příkazy GRANT a REVOKE:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’; REVOKE INSERT ON *.* FROM ‘demouser’@’localhost’;
-
Oprávnění můžete uložit spuštěním FLUSH PRIVILEGES. Prohlédněte si je spuštěním SHOW GRANTS.
-
Příkaz GRANT nelze použít k udělení oprávnění i rolí; příkaz musí udělovat buď oprávnění, nebo role.
Aby byla vaše instalace MySQL bezpečnější, zvažte následující:
-
Udělujte svým uživatelům pouze oprávnění nezbytná k plnění jejich úkolů (např. nepoužívejte GRANT ALL, pokud není nutné)
-
Obecně se vyhněte spuštění MySQL jako uživatel root Unixu, protože každý uživatel s oprávněním FILE může způsobit server vytvořit soubory jako root.
-
Neudělujte oprávnění FILE uživatelům, kteří nejsou správci (viz vysvětlení výše)
-
Zvažte spuštění mysqld jako běžný neprivilegovaný uživatel.
-
Neudělujte oprávnění PROCESS nebo SUPER uživatelům, kteří nejsou správci. Oprávnění PROCESS umožňuje uživateli zobrazit všechny procesy běžící v MySQL. Privilegium SUPER mimo jiné umožňuje změny konfigurace serveru, umožňuje použití příkazů CREATE SERVER, ALTER SERVER a DROP SERVER a také umožňuje použití příkazu KILL umožňující uživateli zabíjet příkazy patřící jiným účtům. Mějte na paměti, že MySQL vyhrazuje zvláštní připojení pro uživatele, kteří mají oprávnění SUPER. Oprávnění SUPER také umožňuje uživateli ovládat replikační servery.
Řiďte se výše uvedenými radami a měli byste být na dobré cestě k bezpečnější instalaci MySQL. Pokud však používáte novější verzi MySQL, musíme si být vědomi ještě jedné věci – MySQL zavedlo role v MySQL 8.0.16.
Role v zabezpečení MySQL
Pokud jste nikdy neslyšeli o rolích v MySQL, nezoufejte. Role jsou velmi podobné privilegiím, a proto jsme je zahrnuli do tohoto blogového příspěvku. Ve skutečnosti jsou role právě takové – jsou to kolekce oprávnění, to znamená, že když je uživateli přiřazena role, jsou uživateli přiřazena všechna oprávnění spojená s touto rolí. Role lze přidávat a odebírat pomocí příkazů CREATE ROLE a DROP ROLE. Chcete-li používat role v MySQL, vytvořte název role, udělte této roli oprávnění a poté ji přiřaďte uživateli takto:
CREATE ROLE [IF NOT EXISTS] ‘role_1’;
GRANT SELECT ON db_name.* TO user_name;
GRANT role_1 TO [email protected];
Jaká privilegia byste měli udělit?
Při udělování oprávnění dodržujte zásadu nejmenšího oprávnění:účtu MySQL by měla být udělena pouze oprávnění nezbytná pro jeho účely. Nejčastěji používaná oprávnění jsou:
-
VŠECHNY PRIVILEGIE, které udělují veškerá oprávnění účtu.
-
CREATE uděluje oprávnění nezbytná k vytváření databází a tabulek.
-
DROP uděluje oprávnění nezbytná k rušení databází a tabulek.
-
DELETE uděluje oprávnění nezbytná k odstranění řádků z tabulek.
-
INSERT uděluje oprávnění nezbytná pro vkládání řádků do tabulek.
-
SELECT uděluje oprávnění nezbytná ke spouštění SELECT dotazů.
-
UPDATE uděluje oprávnění nezbytná k aktualizaci řádků v tabulce (pro spouštění UPDATE dotazů)
Obecně je dobré vyhnout se udělování všech oprávnění účtu; místo toho zvažte dodržování zásady nejmenšího privilegia. Také mějte na paměti, že udělením dalších oprávnění určitému uživateli se neodeberou oprávnění, která byla na místě dříve. Můžete také zobrazit oprávnění konkrétního uživatele pomocí této syntaxe (uživatelské jméno nahraďte uživatelským jménem vašeho uživatele):
SHOW GRANTS FOR ‘username’;
Shrnutí
Při práci s oprávněními v MySQL mějte na paměti, že byste se měli řídit zásadou nejmenších oprávnění (tj. udělovat pouze ta oprávnění, která jsou nezbytná). Dodržování rad uvedených v tomto blogu by vám mělo pomoci zajistit bezpečnější instalaci MySQL. Pamatujte, že vaše oprávnění musí být uložena, aby se projevila (příkaz FLUSH PRIVILEGES vám v tom může pomoci), navíc mějte na paměti, že od MySQL 8.0.16 můžete využít role v MySQL k přiřazení sad oprávnění konkrétního uživatele.
Doufáme, že vám tento příspěvek na blogu pomohl zabezpečit vaše instance MySQL. Pokud máte nějaké dotazy nebo myšlenky, neváhejte je komentovat, zvažte také možnost prohlédnout si naši sérii zabezpečení MySQL (zde a zde)