Skip to content
VDS · Databázy

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-installation to zariadi.

Časté chyby

PríznakPríčina
Access denied so správnym heslomZhodou okolností sa uplatnilo iné pravidlo hosta, napríklad ''@'localhost'
Privilegácie udelené, ale SELECT nefungujePostgreSQL 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šetkoRola aplikácie mala privilegiá DROP
Heslo je viditeľné v histórii príkazovNastav 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.