• Pavol Drotován
  • DB expert
  • 17-09-2021

Práca administrátora - oprávnenia v Oracle

Práca s oprávnenia patrí medzi základnu súčasť administrácie databáz. Oprávnenia sa prideľujú v závislosti od náplne práce, ktorú uživatelia databázy vykonávajú. Rovnako sú akýmsi databázovým bezpečnostným prvkom, ktorý predchádza iné softvérové bezpečnostné prvky.Je rozdiel či uživateľ potrebuje len čítať alebo aj zapisovať, alebo či potrebuje spravovať celú databázu alebo iba jej časť. Podľa toho sa oprávnenia prideľujú. V DB Oracle poznáme 3 druhy oprávnení:

  1. Systemové-Schopnosť vykonávať task v databáze
  2. Objektové-Schopnosť vykonávať task na databázovom objekte/schéme
  3. Role-Zbierka jedného alebo viacerých systémových oprávnení a/alebo objektových oprávnení a/alebo iných rolí

Systémové oprávnenia

Existuje viac ako 100 systémových oprávnení, ktoré možno udeliť jednému userovi resp. schéme ak rozprávame o iných DB jazykoch, najznámejšie sú create session, create table,create view, create sequence, create synonym...Rozdiel medzi systemovým a objektovým oprávnením je v tom, že systémové oprávnenia umožňuje pristupovať k objektu ako celku a objektové k jednotlivým častiam tzn mám napríklad celkový prístup ku všetkým tabuľkám s možnosťou zápisu alebo iba k jednej bez zápisu.Keď sa pri pridelení oprávnenia pridá slovo ANY, user môže napr. vytvoriť tabuľku v akejkoľvek schéme.Keď sa zas pridá slovo PUBLIC, všetci useri môže napr. vytvoriť tabuľku v akejkoľvek schéme čo je viacmenej oprávnenie hodné administrátora alebo system usera, ktorý je v Oracle default.Keď sa pridá WITH ADMIN OPTION, user môže pridelené oprávnenie prideľovať ďalším userom. POSTUP pre pridanie systemovych oprávnení:

  1. Pre vytvorenie usera musíme sprístupniť jeho vytvorenie v SQL PLUS:alter session set "_ORACLE_SCRIPT"=true;
  2. Vytvorí sa USER v SQL PLus, Napr: Create user user_name identified by heslo
  3. Grantne sa vytváranie session tzn spojenia s DB tzn. Grant create session to user_name;
  4. Alokuje sa tablespace Grant unlimited tablespace to user_name;
  5. Grantne sa pristup do vytvaranie tabuliek: Grant create table to user_name;

!Ak sa odoberie oprávnenie (Revoke CREATE TABLE from user_name), neodoberie sa automaticky oprávnenie od iných userov , ktorým bolo pridelené!

Objektové oprávnenia

Umožňujú pristupovať k jednotlivým častiam objektu.Vlastní ich automaticky user (schema), ktorý objekt vytvoril, on prideľuje oprávnenia ďalším userom / alebo system user prideľuje. Medzi tabuľkové oprávnenia patria: SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER, INDEX, ALL.Tabuľkové oprávnenia možno definovať aj na úrovni stĺpcov (INSERT, UPDATE, REFERENCES).Keď sa pridá WITH GRANT OPTION, user môže pridelené oprávnenie prideľovať ďalším userom (Napr. Grant select on table_name to user_name WITH GRANT OPTION). Je dôležité spomenúť. že ak sa dropne tabuľka, všetky oprávnenia sa dropnu a ak sa dá recreate, znovu sa musia prideliť, keď sa však dá FLASHBACK TABLE ... BEFORE DROP , oprávnenia zostanú. Príklady objektových oprávnení:

  1. pre čítanie tabuľky -> Grant select on table_name to user_name
  2. pre zapisovanie do tabuľky -> Grant insert on table_name to user_name
  3. pre všetky oprávnenia pre zápis a úpravu či vymazanie tabuľky -> Grant ALL on table_name to user_name
  4. nastavenie zapisu do jedného stĺpca -> Grant insert(column_NAME) on table_name to user_name

!Na rozdiel od sys. oprávnení ak sa odoberie oprávnenie (revoke from..)od 1 usera, odoberie sa automaticky oprávnenie od iných userov, ktorým user oprávnenie pridelil!

Oprávnenia pre Roly

Roly predstavujú organizovaný systém aby sme mohli zoskupiť inak roztrúsené oprávnenia (napríklad vytvoríme rolu na vytváranie DML v tabuľke-ách) Oprávnenie pridelené pre rolu existuje samostatne ako oprávnenie pridelené pre usera. Práve rola je dôležitým bezpečnostným prvkom v databáze a jej názov by mal odpovedať tomu, čo môže vykonať. Napr. keď máme systémom vytvorenú schému HR, vytvorením role napr. HR_USER dáme možnosť len čítať všetkým, kto dané oprávnenie má. Ak chceme nájsť všetky roly v databáze použijeme pod systemovym userom select * from role_sys_privs ; Historicky Oracle prideľuje nasledovné roly:

  1. CONNECT Zahŕňa nasledujúce systémové oprávnenia: ALTER SESSION, CREATE CLUSTER, CREATE DATABASE LINK, CREATE SEQUENCE, CREATE SESSION, CREATE SYNONYM, CREATE TABLE, CREATE VIEW --> nagrantuje sa grant connect to user_name a user už môže všetko vytvárať
  2. RESOURCE Zahŕňa nasledujúce systémové privilégiá: CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE
  3. DBA Všetky systémové privilégiá S MOŽNOSŤOU ADMINISTRÁTORA--> nagrantuje sa grant dba to user_name a user už môže administrovať /s týmto opatrne

! Ak sa odoberie oprávnenie od roly odoberie sa automaticky oprávnenie od všetkých userov, ktorým bolo pridelené (rovnako ako pri obj. oprávneniach)!

Zaujímavé: Názvy rolí existujú mimo názvov userov, a tak môžu byť rovnaké ako názvy objektov (tabuľky, pohľady...), to sa však neodporúča.Ak máme napr. tabuľkové oprávnenia (DML) pridelené pre rolu, ak sa dropne tabuľka a pridelíme znovu oprávnenia, nemusíme znovu oprávnenia pridávať pre usera, ani vytvárať rolu (tzn. 2 kroky vynecháme) Pozrime na nasledujúci príklad:

  1. drop table hr.emp;
  2. create table hr.emp as select * from HR.employees;
  3. create role EMPDML; - toto sa už nemusí pri drope vytvárať
  4. grant update,insert,delete on hr.emp to EMPDML;
  5. grant EMPDML to op;
  6. delete from hr.emp;

Takto pozrieme všetkych userov a nastavenia v databaze pod sys účtom


SELECT *
FROM (SELECT CONNECT_BY_ROOT grantee grantee,
 privilege,
 REPLACE(
 REGEXP_REPLACE(SYS_CONNECT_BY_PATH(granteE, '/'),
 '^/[^/]*'),
 '/',
 ' --> ')
 ROLES,
 owner,
 table_name,
 column_name
 FROM (SELECT PRIVILEGE,
 GRANTEE,
 OWNER,
 TABLE_NAME,
 NULL column_name
 FROM DBA_TAB_PRIVS
 WHERE owner NOT IN
('SYS','SYSTEM','WMSYS','SYSMAN','MDSYS','ORDSYS','XDB','WKSYS','EXFSYS','OLAPSYS','DBSNMP','DMSYS','CTXSYS','WK_TEST','ORDPLUGINS','OUTLN','ORACLE_OCM','APPQOSSYS')
 UNION
 SELECT PRIVILEGE,
 GRANTEE,
 OWNER,
 TABLE_NAME,
 column_name
 FROM DBA_COL_PRIVS
 WHERE owner NOT IN ('SYS','SYSTEM','WMSYS','SYSMAN','MDSYS','ORDSYS','XDB','WKSYS','EXFSYS','OLAPSYS','DBSNMP','DMSYS','CTXSYS','WK_TEST','ORDPLUGINS','OUTLN','ORACLE_OCM','APPQOSSYS')
 UNION
 SELECT GRANTED_ROLE,
 GRANTEE,
 NULL,
 NULL,
 NULL
 FROM DBA_ROLE_PRIVS
 WHERE GRANTEE NOT IN ('SYS','SYSTEM','WMSYS','SYSMAN','MDSYS','ORDSYS','XDB','WKSYS','EXFSYS','OLAPSYS','DBSNMP','DMSYS','CTXSYS','WK_TEST','ORDPLUGINS','OUTLN','ORACLE_OCM','APPQOSSYS')
) T
 START WITH grantee IN (SELECT username FROM dba_users)
 CONNECT BY PRIOR PRIVILEGE = GRANTEE)
WHERE table_name IS NOT NULL
 AND grantee != OWNER
ORDER BY grantee,
 owner,
 table_name,
 column_name,
 privilege;

Zhrnutie

Na príkladoch sme si ukázali ako fungujú oprávnenia v Oracle. Zistili sme aký je rozdiel medzi systémovými a objektovými oprávneniami priraďovanim rolí. Na základe príkladov každý si môže vytvoriť vlastnú databázu s potrebnými grantmi.