Používatelia a oprávnenia v databáze
Ako vytvoriť samostatného používateľa pre každú aplikáciu v MySQL a PostgreSQL, prideliť minimálne oprávnenia a overiť, že nič navyše nie je povolené.
Aktualizované 23. augusta 2026
Aplikácia bežiaca ako root alebo postgres odovzdá pri prvej zraniteľnosti útočníkovi všetky databázy na stroji. Vyhradený používateľ s právami len na svoju schému obmedzí škody na jeden projekt.
MySQL a MariaDB
Používateľ je tu dvojica „meno a host“, a to je hlavný zdroj zmätku:
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
FLUSH PRIVILEGES;
'shop'@'localhost' a 'shop'@'%' sú dvaja rôzni používatelia s rôznymi heslami. Nevytváraj záznamy s hostom %, ak to nie je nevyhnutné: umožňuje prihlásenie z akejkoľvek adresy.
Privilegácie na štruktúru sú potrebné len počas migrácií:
GRANT CREATE, ALTER, DROP, INDEX, REFERENCES ON shop.* TO 'shop_migrate'@'localhost';
Oddelenie roly aplikácie a roly migrácií je dobrá prax: bežný dotaz potom fyzicky nemôže zahodiť tabuľku.
Kontrola:
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'shop'@'localhost';
Zmena hesla a zmazanie:
ALTER USER 'shop'@'localhost' IDENTIFIED BY 'new-password';
DROP USER 'shop'@'localhost';
PostgreSQL
Rola a jej privilegácie na databázu a schému:
CREATE ROLE shop WITH LOGIN PASSWORD 'long-random-password';
CREATE DATABASE shop OWNER shop;
REVOKE ALL ON DATABASE shop FROM PUBLIC;
Pre rolu len na čítanie (reporty, analytika, monitorovací panel):
CREATE ROLE reader WITH LOGIN PASSWORD '...';
GRANT CONNECT ON DATABASE shop TO reader;
GRANT USAGE ON SCHEMA public TO reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO reader;
Posledný riadok je povinný: bez neho rola neuvidí tabuľky vytvorené po udelení privilegácií a o mesiac sa reporty zlomia na nových dátach.
Kontrola:
\du
\l
\dp
Čo treba uzamknúť
- Žiadna rola aplikácie nie je superuser.
- Každý projekt má vlastnú databázu a vlastného používateľa.
- heslá sú dlhé a náhodné a pre rôzne projekty rôzne.
- Externé prihlásenie je povolené len pre adresy, ktoré ho potrebujú — vzdialený prístup.
- MySQL nemá anonymných používateľov ani testovaciu databázu:
mariadb-secure-installationto zariadi.
Časté chyby
| Príznak | Príčina |
|---|---|
Access denied so správnym heslom | Zhodou okolností sa uplatnilo iné pravidlo hosta, napríklad ''@'localhost' |
Privilegácie udelené, ale SELECT nefunguje | PostgreSQL nemá USAGE ON SCHEMA |
| Nová tabuľka nie je pre rolu viditeľná | DEFAULT PRIVILEGES nie sú nastavené |
| Aplikácia pri neúspešnej migrácii zmazala všetko | Rola aplikácie mala privilegiá DROP |
| Heslo je viditeľné v histórii príkazov | Nastav heslá zo súboru, vyčisti ~/.mysql_history |
Heslá k databázam ukladaj do súboru prostredia služby s právami
600, nie do kódu. Pri kompromitácii zmeníš jeden riadok a reštartuješ, nie prerobíš celý projekt.