Proč řešit bezpečnostní role a přístupová práva v SQL
SQL databáze uchovávají kritická data a bývají „zdrojem pravdy“ pro celou organizaci. Nesprávně nastavené role a oprávnění vedou k únikům, porušení compliance a k chybám v aplikacích. Cílem řízení přístupů je kombinace minimálních práv (least privilege), oddělení povinností (segregation of duties), auditovatelnosti a snadné správy (role-based access control, RBAC). Správně navržený model práv je opakovatelný (Infrastructure as Code), testovatelný a škálovatelný pro více prostředí (dev/test/prod).
Autentizace vs. autorizace
- Autentizace ověřuje identitu (hesla, Kerberos/AD, OAuth/OIDC, certifikáty). Zajišťuje ji DB engine nebo externí poskytovatel identity.
- Autorizace rozhoduje, co identita smí. V SQL se realizuje pomocí ROLÍ, PRÁV (privileges/permissions) a objektů (database, schema, table, view, function atd.).
RBAC: role-based access control
RBAC mapuje uživatele na role a role na práva. Uživatelé obvykle nedostávají práva přímo, ale přes role. Výhody: menší počet grantů, auditovatelnost, konzistence napříč prostředími.
- Role aplikační vrstvy: app_reader, app_writer, reporting, etl.
- Role provozní: dba_admin (správa), security_officer (audit, klíče), release_engineer (migrace).
- Role doménové: finance_read, hr_read, orders_write…
Úrovně objektů a typy oprávnění
| Úroveň | Příklady objektů | Typická práva |
|---|---|---|
| Server/Instance | login, cluster, instance | CONNECT, CREATE DATABASE, SUPERUSER (PG), sysadmin (SQL Server) |
| Databáze | database, schema | CONNECT, USAGE (schema), CREATE |
| Tabulka/Materializovaný pohled | table, materialized view | SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES |
| Sloupec/Řádek | column, row policy | Column-level SELECT/UPDATE; Row-Level Security/RLS |
| Kód | function, procedure | EXECUTE; SECURITY DEFINER/INVOKER |
Princip minimálních práv a oddělení povinností
- Minimální práva: udělujte pouze nezbytné operace pro konkrétní roli; preferujte SELECT přes VIEW místo přístupu k plné tabulce.
- Oddělení povinností: nasazování schémat (migrace) odděleně od správy produkčních dat a od bezpečnostní správy klíčů.
- Bez přímých práv pro uživatele: uživatelé patří do rolí; individuální výjimky evidujte a pravidelně revidujte.
PostgreSQL: role, default privileges a RLS
- Role = uživatelé/skupiny: role mohou dědit jiné role (INHERIT), mít LOGIN a další atributy.
- Schémata a USAGE: pro čtení je nutné USAGE na schema a SELECT na objekt.
- Default privileges: ALTER DEFAULT PRIVILEGES pro budoucí objekty v rámci schématu – klíč pro konzistentní přístup po nasazení.
- RLS (Row-Level Security): CREATE POLICY a ENABLE ROW LEVEL SECURITY na tabulce; filtrace na základě current_user nebo session proměnných.
- SECURITY DEFINER: funkce mohou dočasně rozšířit práva – nutná opatrnost (omezení search_path a validace vstupů).
Příklad shrnutí práv:
CREATE ROLE app_reader;
GRANT USAGE ON SCHEMA sales TO app_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA sales TO app_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA sales GRANT SELECT ON TABLES TO app_reader;
SQL Server: loginy, uživatelé, schémata a DENY
- Login vs. User: login (server) mapován na user (database). Role na úrovni serveru i databáze (db_datareader, db_datawriter, vlastní role).
- Deny preceduje grant: DENY blokuje i při přítomném GRANT přes jinou roli – používejte opatrně.
- Ownership chaining: přístup přes pohled/proceduru bez explicitního práva na tabulku; zajistí se izolace schémat.
- Row-Level Security a maskování: CREATE SECURITY POLICY s predikáty; Dynamic Data Masking pro citlivé sloupce.
MySQL/MariaDB: privilegia a role
- Privilege model: práva na úrovni serveru, DB, tabulky, sloupce; role jsou podporované (novější verze) a mapují se přes GRANT … TO role.
- Definer/Invoker: definer pro views a routines určuje, pod čími právy se objekt spouští; kontrolujte SQL SECURITY.
- Host scoping: uživatelé vázaní na hostitele (např. ‚app’@’10.%‘) pro zmenšení útoku.
Oracle Database: systémy rolí a VPD
- System vs. object privileges: jemnozrnná správa, široké použití rolí.
- Fine-Grained Access Control (VPD): zásady na úrovni řádků přes DBMS_RLS a sloupcové maskování.
- Least privilege v PL/SQL: minimalizujte AUTHID DEFINER, preferujte AUTHID CURRENT_USER pokud to architektura umožní.
Row-Level Security (RLS), sloupcová práva a datové maskování
- RLS: prosazuje datové filtry na úrovni enginu. Definujte jasné predikáty, dokumentujte a testujte side-effects (JOIN, plánovač).
- Sloupcová práva: omezte přístup ke sloupcům s PII/PHI (např. jen hashované e-maily).
- Maskování: dynamické (během dotazu) vs. statické (předávání datasetů). Mít jasná pravidla pro analytiky vs. operativu.
Pohledy, procedury a koncept „security boundary“
- View jako brána: poskytujte pouze potřebné sloupce/řádky, skrývejte citlivé atributy a business logiku.
- Stored procedures: kapsulují změny a validace; volající nepotřebuje INSERT/UPDATE na tabulce, pouze EXECUTE na proceduře.
- Security definer: umožní provést úlohu s vyššími právy – pečlivě ošetřit search_path a vstupy proti SQL injection.
Schémata a jmenné prostory
- Oddělení domén: např. core, finance, hr, analytics. Role dostávají USAGE/SELECT jen tam, kde je to nutné.
- Search path hardening: u SECURITY DEFINER objektů fixujte schéma (např. SET search_path = core, pg_temp).
API přístup a aplikační identity
- App role místo end-user účtů: aplikace využívá jednu či více technických identit s minimálními právy pro konkrétní workloady.
- Session kontext: pro RLS nastavujte kontext (např. SET app.current_tenant = ‚A‘) výhradně v bezpečné vrstvě aplikace.
- Rotace tajemství: krátkodobé tokeny, vaulty (KMS/HSM), princip „never log secrets“.
Šifrování a správa klíčů
- Šifrování v klidu (TDE): minimalizuje dopad ztráty médií. Neřeší privilegované uživatele.
- Šifrování po sloupcích/na úrovni aplikace: chrání citlivá data i vůči DB adminům; vyžaduje správu klíčů a indexační strategie.
- Šifrování v přenosu: TLS povinně; vypněte slabé šifry, vynucujte certifikáty klienta, kde dává smysl.
Audit, monitoring a detekce anomálií
- Auditní logy: přihlášení, změny rolí, GRANT/REVOKE, DDL/DDL-D, přístupy k citlivým objektům.
- Detekce anomálií: neobvyklé dotazy, velké exporty, přístupy mimo pracovní dobu; alerty a playbooky.
- Integrace SIEM: centralizace auditů a korelace s infrastrukturními událostmi.
Životní cyklus přístupů: recertifikace a Just-In-Time
- Recertifikace práv: periodické potvrzení vlastníky dat; vyčištění „dočasných“ přístupů.
- JIT přístupy: dočasné elevace (break-glass) se silným auditem a časovým omezením.
- Offboarding: okamžité odebrání rolí při odchodu, rotace sdílených tajemství.
Migrace schémat a IaC pro bezpečnost
- Migrační nástroje: zahrňte GRANT/REVOKE/ALTER DEFAULT PRIVILEGES do migračních skriptů.
- Idempotentní skripty: používejte CREATE ROLE IF NOT EXISTS (dle vendorů) a kontrolní dotazy, aby bylo nasazení opakovatelné.
- Testy bezpečnosti: v CI spusťte SQL testy: „uživatel X“ nesmí SELECT tabulku Y; „role Z“ smí pouze EXECUTE proceduru P.
Multi-tenancy a sdílené databáze
- Hard tenancy: izolace per tenant (DB/Schema) – jednodušší bezpečnost, vyšší provozní náklady.
- Soft tenancy: sdílené tabulky + RLS; nutná přísná disciplína v definici politik a testech.
- Hybrid: sdílené read-only dimenze, izolované transakční tabulky per tenant.
Časté chyby a jak se jim vyhnout
- Granty přímo uživatelům: nahraďte za role; jinak exploduje počet výjimek.
- Zapomenuté default privileges: nově vytvořené tabulky nejsou přístupné – nadefinujte výchozí granty.
- Široká práva „SELECT ON *.*“: neúměrný přístup k PII; používejte výhledy nebo sloupcová práva.
- Nedostatečně zajištěný SECURITY DEFINER: zneužitelný search_path a nevalidované vstupy.
- Deny peklo (SQL Server): nadužívání DENY komplikuje troubleshooting; preferujte precizní GRANT.
Kontrolní seznam pro návrh bezpečnostních rolí
- Definované domény dat a mapování objektů na schémata.
- Seznam uživatelských person a jejich požadovaných operací (CRUD) v jednotlivých doménách.
- Návrh rolí a hierarchie (dědičnost) + oddělení povinností.
- Definované default privileges pro budoucí objekty.
- Volba RLS/sloupcových práv a případného maskování citlivých dat.
- Proces recertifikace a JIT elevací.
- Automatizované testy a audit v CI/CD.
Příkladová mini-matice práv (koncept)
| Role | Schéma | Objekt | Práva | Poznámka |
|---|---|---|---|---|
| app_reader | sales | view v_orders | SELECT | RLS ve výhledu; bez přístupu na tabulky |
| app_writer | sales | proc upsert_order | EXECUTE | Bez INSERT/UPDATE na tabulce, validace v proceduře |
| reporting | analytics | v_sales_daily, v_customers | SELECT | Sloupcové maskování PII |
| etl | staging | všechny tabulky | INSERT, UPDATE, DELETE, TRUNCATE | Bez SELECT na produkčním schématu |
Závěr
Bezpečnostní role a přístupová práva v SQL jsou základním stavebním kamenem odolné datové platformy. Úspěšný model kombinuje RBAC s principem minimálních práv, využívá RLS a sloupcová práva pro ochranu citlivých dat, kapsuluje změny přes procedury a výhledy, automatizuje správu (IaC, CI/CD) a pravidelně provádí audity i recertifikace. Správná architektura přístupů snižuje rizika, zvyšuje shodu s regulací a zjednodušuje provoz i rozvoj databázových řešení.