64
BEZPEČNOSŤ DATABÁZ Bezpečnosť informačných systémov Peter Erdélyi 4. ročník Škol. rok : 2003/2004

BEZPE ČNOSŤ DATABÁZ Bezpečnosť informačných systémov

Embed Size (px)

DESCRIPTION

BEZPE ČNOSŤ DATABÁZ Bezpečnosť informačných systémov. Peter Erdélyi 4. ročník Škol. rok : 2003/2004. Architektonick é komponenty a bezpečnosť. - PowerPoint PPT Presentation

Citation preview

BEZPEČNOSŤ DATABÁZBezpečnosť informačných systémov

Peter Erdélyi

4. ročník

Škol. rok : 2003/2004

Architektonické komponenty a bezpečnosť

V nasledujúcej diskusii bude používaná terminológia od výrobcu databázového servra Oracle, ale aj ostatní výrobcovia databázových servrov ponúkajú podobnú bezpečnostnú funkcionalitu, ktoré sa však líšia v úrovni úspešnosti ich implementácie.

Bezpečnosť databáz je zvyčajne podporovaná na dvoch miestach: mimo databázy a vo vnútri databázy.

Databázy podporujú funkcie sieťovej bezpečnosti:

- integrácia podnikovej bezpečnostnej infraštruktúry

- single-sign on

- podpora bezpečných protokolov ako SSL

- jednoduchá kryptografia a protokoly

Predchádzajúce technológie sú používané, aby sa dali autentifikovať všetci používatelia usilujúcich sa o komunikáciu s databázou.

Tieto metódy majú veľmi málo spoločné s teóriou relačných databáz a sú implementované len kvôli vytvoreniu dôveryhodnej linke medzi používateľským klientom a databázovým servrom.

Ak už používateľ bol autentifikovaný databázou a bola vytvorená bezpečná komunikácia, tak sa používateľ už nachádza vo vnútri databázy a jeho požiadavky sú zabezpečované vnútornými bezpečnostnými mechanizmami.

Tieto mechanizmy sú nasledovné:

Správa relácií (Session management) - Na úrovni relácií, ak sa používateľ prihlási do databázy, tak databáza nastaví premenné pre danú reláciu, ktoré sú platné počas trvania tejto relácie. Uchovávajú sa stavové informácie, aby mohli byť úspešne vykonané transakcie a na konci úspešne ukončená komunikácia.

Vlastníctvo objektov (Object ownership) - V databázovej schéme je možné zadefinovať vlastníctvo databázových objektov ako tabuľka, index, pohľad, procedúra atď. Používatelia, ktorý vlastnia tieto objekty môžu zadefinovať práva pomocou príkazov GRANT a REVOKE a tak umožniť alebo zakázať ostatným používateľom prácu s týmito objektmi.

Zaobaľovanie objektov (Object encapsulation) - Zaobaľovanie objektov je dosiahnuté pomocou balíčkov a storovaných procedúr. Balíčky obsahujú kolekciu storovaných procedúr, ktoré podporujú jasne definované transakcie, používané aby používateľ mal obmedzené práva pre prácu s databázovými objektmi. Používateľ má právo vykonávať, ale nie modifikovať storované procedúry.

Používateľ je blokovaný proti priamemu prístupu k údajom v databáze, pretože storované procedúry sa vykonávajú s právami vlastníka procedúry a nie s právami používateľa. Používateľ musí mať dostatočné práva, aby mohol pristúpiť k údajom. Od verzie 8.0 a vyššie databázy Oracle dovoľujú administrátorovi nakonfigurovať bezpečnostné práva pre storované procedúry, aby bežali s právami INVOKER namiesto DEFINER.

Triggre (Triggers) - Triggre sú transparentné procedurálne definície pripojené k tabuľkám v databáze. Triggre sú aktivované v čase ak sa uskutoční nejaká udalosť nad danou tabuľkou. Triggre môžu byť spustené pred alebo po snahe modifikovať tabuľku. Triggre môžu byť špecifikované, aby sa vykonali raz nad celou tabuľkou alebo raz pre každý riadok tabuľky.

Predikátové aplikácie (Predicate application) - Databáza je schopná modifikovať požiadavky používateľa za behu, pridávaním predikátov k požiadavke, aby sa zamedzila jej platnosť.

Viacúrovňová označovaná bezpečnosť (Multi-level labeled security) - Údaje v databáze môžu mať prídavné štrukturované atribúty, ktoré môžu kontrolovať prístup k týmto údajom na najnižšej úrovni. Týmto spôsobom databáza môže pristupovať s najjemnejšou bezpečnostnou politikou k jednotlivým riadkom tabuľky pred vykonaním príkazov SELECT, UPDATE, INSERT a DELETE.

Ďalšie výrobcom špecifické mechanizmy (Other vendor-specific features) - Tieto mechanizmy môžu rozšíriť bezpečnostný model o ďalšie dôležité prvky, ale sú väčšinou patentom chránené.

Komponenty bezpečnosti v databázach

Kontrola prístupu založená na rolách

Databázy implementujú RBAC (Role-Based Access Control) pomocou databázových rolí. Privilégium je právo vykonávať niektoré operácie nad objektom alebo spúšťať nejakú akciu vo vnútri systému. Používateľ môže vlastniť privilégia pomocou, ktorých sa môže pripojiť na databázu, iniciovať reláciu, vytvárať databázové objekty ako tabuľka alebo index, spúšťať niektoré DML (Data Manipulation Language) príkazy nad objektmi vlastnené iným používateľom alebo spúšťať storované procedúry.

Privilégiá môžu byť prideľované používateľom priamo alebo pomocou rolí. Rola je množina prístupových práv spojená s nejakou obecnou funkciou.

Databázy poskytujú kontrolu prístupu založenú na rolách pridelením používateľov k rolám a použitím príkazov GRANT a REVOKE pre povolenie alebo zakázanie prístupu používateľov alebo rolí k databázovému objektu.

Oracle podporuje privilégiá na úrovni systému a objektov. Schopnosť prideľovať privilégiá je sama o sebe privilégium a je povolená len administrátorovi databázy alebo používateľom, ktorým bolo toto právo pridelené príkazom GRANT ANY PRIVILEGE. Používateľ automaticky vlastní privilégiá na všetky objekty v jeho schéme a môže prideľovať prístupové práva nad týmito objektmi všetkým používateľom patriacich do iných schém.

Príkazy DML (Data Manipulation Language) môžu byť obmedzené na stĺpce v tabuľkách.

Napríklad, príkazy INSERT a UPDATE v tabuľke môžu byť obmedzené na niektoré stĺpce, aby sa na tieto stĺpce príkazy nevzťahovali. Do týchto stĺpcov je nastavená hodnota NULL, ak používateľ bez dostatočných práv sa ju pokúsi modifikovať.

Používatelia môžu vlastniť aj privilégiá na spúštanie DDL (Data Definition Language) príkazov, ktoré dovoľujú meniť vlastnosti tabuliek, vytvárať triggre, vytvárať indexy atď.

Používatelia môžu byť prideľovaní do rolí založených na funkciách vykonávaných v danej firme a tak vlastniť len privilégiá na prácu nad tabuľkami databázy, ktoré sú nevyhnutné pri vykonávaní činnosti ich funkcie. Role môžu byť dynamicky prideľované alebo odoberané, aby boli privilégiá obmedzené v kontrolovanom spôsobe. Role môžu byť zabezpečené heslom. Používateľ musí poznať heslo, aby bol oprávnený používať danú rolu.

Slovník údajov(The Data Dictionary)

V slovníku údajov sa ukladajú informácie o štruktúre databázových objektov. Metadáta (údaje o údajoch) popisujú ako sú aktuálne údaje štrukturované a ako sú uložené v databáze. Slovník údajov definuje pohľady do metadát, na ktoré sa môžeme dotazovať.

Slovník údajov v Oracle-i je vlastníctvom Oracle používateľa SYS, ktorý nemôže byť menený iným používateľom a je automaticky spravovaný databázou. Pohľady v slovníku údajov organizujú objekty do troch kategórií: objekty vlastnené súčasným používateľom, objekty prístupné súčasným používateľom a všetky objekty.

Oracle Label Security

Viacúrovňové bezpečnostné modely v databázach si vynucujú povinnú kontrolu prístupu, definovaním hierarchie label-ov a priradením rozsahu label-ov používateľom a riadkom v každej bázovej tabuľke. Používateľom sú priradené session label-y z ich rozsahu lebel-ov, keď sa po prvýkrát pripoja na databázu. Používateľ najprv musí prejsť kontrolou, aby sa zistilo či má dostatočné práva pre používanie databázových objektov, pohľadov a storovaných procedúr. Na tomto mieste, predtým ako by používateľ mohol pristúpiť k údajom, prídavná bezpečnostná politika label-ov je použitá. Táto politika dovoľuje používateľom čítať údaje na úrovni ich session label-u a úrovne pod ním a zapisovať údaje na úrovni jeho session label-u.

Predchádzajúci MLS produkt Trusted Oracle implementovala túto politiku pridaním stĺpca ROWLABEL ku každej tabuľke v databáze, zahrňajúc slovník údajov. Všetky prístupy k dátam boli riešené cez tento stĺpec.

Firma Oracle vyvinula aj ďalší prvok pre zvýšenú kontrolu prístupu k údajom v jej databázach, ktorá sa nazýva Oracle Label Security (OLS). Funkcia OLS podporuje komplexný model prístupu k údajom na úrovni riadkov v tabuľkách. Súčasná verzia OLS sa odlišuje od obvyklej povinnej kontrole k prístupu k dátam v niektorých detailoch.

Label-y používajú štruktúru s troma poliamy. Tieto tri polia sa nazývajú: úroveň, oddiel a skupina.

Úroveň (Level) – Úrovne sú organizované hierarchicky a majú sémantiku typicky používanú vo vojenských organizáciách:

- verejná (public) úroveň,

- súkromná (proprietary) úroveň,

- obmedzená (restricted) úroveň,

- tajná (secret) úroveň,

- prísne tajná (top secret) úroveň atď.

Oddiel (Compartment) – Oddiely v rámci jednotlivých úrovní odpovedajú kategóriám informácií. Kategórie nie sú organizované hierarchicky v rámci úrovní. Povoľujú obmedzenie prístupu k dátam založené na kontexte alebo obchodnej logike (business logic).

Používatelia s prístupom k istej úrovni môžu pristupovať len k im prislúchajúcim kategóriám v rámci danej úrovne. Používateľom sú pridelené oddiely Čítanie a Zápis. Ak používateľ chce pristúpiť k riadku v tabuľke, potom jeho oddiel Čítanie a Zápis je porovnávaný s oddielom Čítanie a Zápis riadku. Ak sú totožné len potom bude daný riadok sprístupnený používateľovi. Údajový element môže prislúchať viacerým oddielom.

  Skupina (Group) – Tretie pole label-ov definuje vlastníctvo.

Definície vlastníctva môžu byť hierarchické. Toto tretie pole má jednu neobvyklú vlastnosť, ktorá povoľuje definíciu prídavných metód prístupu, založených na voľnom uvážení.

Label-y môžu byť usporiadané ako nezávislé úrovne, úrovne spojené s oddielmi alebo všetky polia spolu. Skupiny reprezentujú prídavný stupeň slobody v definovaní bezpečnostnej politiky. Odporúča sa však, aby skupiny boli používané opatrne, lebo ich chybná konfigurácia by mohla odporovať hlavnej bezpečnostnej politike databázy.

Bezpečnosť z pohľadu SQL Jazyk SQL (Structured Query Language) je štruktúrovaný

dotazovací jazyk, ktorý umožňuje základné operácie s databázou. Jazyk SQL má tri časti:

  DDL (Data Definition Language) - poskytuje prostriedky pre

zadefinovanie relačnej schémy bázy dát.  DML (Data Manipulation Language) - umožňuje základné

operácie s údajmi, ktoré sú uložené v báze dát.

DCL (Data Control/Access Language) - poskytuje prostriedky pre kontrolu údajov s dôrazom na bezpečnosť a integritu. Štandard SQL poskytuje podporu transakciám.

Základné príkazy pre zabezpečenie obnovy a konkurentnosti sú COMMIT pre normálne ukončenie a ROLLBACK pre abnormálne ukončenie. Na zaistenie bezpečnosti a integrity bázy dát slúžia príkazy CREATE VIEW, CREATE ROLE, GRANT a REVOKE.

  V SQL sú dva principiálne prístupy k bezpečnosti,

mechanizmus pohľadov (View) a operácie GRANT a REVOKE. Pohľady sa používajú na zakrytie senzitívnych dát pre neautorizovaných používateľov. Príkaz CREATE VIEW slúži na výber stĺpcov z databázy, ktoré majú byť používateľovi dostupné. Pohľad sa správa ako tabuľka s názvom meno_pohľadu, ktorá pozostáva z množiny riadkov a stĺpcov vybraných príkazom SELECT. Pohľad odzrkadlí všetky zmeny do zodpovedajúcej základnej tabuľky, ak táto nezmenila štruktúru po vytvorení pohľadu.

Operácia GRANT. Pre vykonanie ľubovoľného SQL príkazu používateľ musí mať priradené vhodné práva pre kombináciu operácií a operandov, inak bude príkaz odmietnutý. Práva sa týkajú príkazov SELECT, INSERT. UPDATE a DELETE. Práva INSERT a UPDATE môžu byť obmedzené na špecifikované stĺpce. Typy prideliteľných práv:

  Používateľ, ktorý vytvorí tabuľku, má všetky aplikovateľné

práva, ako aj možnosť prideľovať práva iným používateľom.

  Používateľ s právom prideľovať práva, môže prideliť a meniť

práva iným používateľom.

Používateľovi môže byť pridelené právo na používanie pohľadu, nie základnej tabuľky.

SQL štandard špecifikuje množinu prístupových pravidiel, ktorými sa definujú práva potrebné pre rôzne kombinácie dátových objektov a operácií. Definuje tiež dva príkazy, GRANT a REVOKE, ktoré umožňujú používateľom prideliť alebo odobrať práva. Termín používateľ by mohol byť nahradený vhodnejším - identifikátor autorizácie (authlD).

Identifikátor autorizácie

Podľa SQL štandardu je niekoľko identifikátorov autorizácie : aktuálny authID, modulový authID, authID SQL a authID schémy. Niektoré alebo všetky authID môžu mať tú istú hodnotu, ale všetky sú jedinečné.

  Aktuálny authID identifikuje aktuálneho resp. bežného

používateľa. Význam tohoto identifikátora spočíva v tom, že systém kontroluje, či používateľ má právo na ním požadovanú operáciu so základnou (bázovou) tabuľkou.

Modulový authID identifikuje majiteľa modulu. Tento identifikátor sa definuje príkazom MODULE s klauzulou AUTHORIZATION. V prípade, že klauzula je vynechaná, modul nemá vlastníka a neexistuje žiadne authID. Štandard nehovorí, aké práva sú potrebné na vytvorenie modulu, pretože celý mechanizmus vytvárania modulov závisí od implementácie. AuthID SQL slúži ako implicitný authlD použitý v kontexte, ak žiadny iný authlD nieje použitý. Na špecifíkovanie tohoto authID sa používa klauzula USER v príkaze CONNECT. V prípade, že klauzula je vynechaná, authID SQL je definovaný v závislosti od implementácie. AuthID schémy identifikuje vlastníka schémy. Na špecifíkovanie tejto identifikácie slúži klauzula AUTHORIZATION príkazu CREATE SCHEMA. V prípade vynechania klauzuly vlastníkom schémy sa stáva používateľ s SQL authlD.

Privilégiá a prístupové práva

Rozlišujeme tri skupiny prístupových práv k databázam:  Connect - používateľovi umožňuje vykonávať nasledovné

príkazy nad databázou: SELECT, INSERT, UPDATE, DELETE a pohľady.

  Resource - používateľovi umožňuje vykonávať: vytvárať

tabuľky, indexy, prístup k diskovému priestoru.  DBA - používateľ: databázový administrátor (správca) môže

vykonávať neobmedzené operácie so všetkými databázami v systéme.

Nasledujúci zoznam sumarizuje všetky privilégia, ktoré sú definované v SQL štandarde. Uvedené privilégia s výnimkou práva USAGE majú význam tabuľkových privilégií.

  USAGE - právo použiť špecifickú doménu.

  SELECT - právo pristupovať na všetky stĺpce špecifikovanej

tabuľky, vrátane stĺpcov pridaných do tabuľky neskôr.

  INSERT(x) - právo vkladať údaje do špecifikovaného stĺpca x

príslušnej tabuľky.

  INSERT - právo vkladať údaje do všetkých stĺpcov

špecifikovanej tabuľky, vrátane stĺpcov pridaných neskôr.

UPDATE(x) - právo modifikovať špecifikovaný stĺpec príslušnej tabuľky.

  UPDATE - právo modifikovať všetky stĺpce špecifikovanej

tabuľky, vrátane stĺpcov pridaných neskôr.

  DELETE - právo rušiť riadky zo špecifikovanej tabuľky.

  REFERENCES(x) - právo referencie na špecifikovaný

stĺpec x príslušnej tabuľky v podmienkach integrity.

  REFERENCES - právo referencie na všetky stĺpce

špecifikovanej tabuľky v podmienkach integrity, vrátane neskôr pridaných stĺpcov.

Pohľady (VIEW)

„Dynamický pohľad” je forma na riadenie prístupových práv. Je to fiktívna tabuľka založená na stĺpcoch jednej alebo viacerých tabuliek, prípadne ďalších pohľadov. Pri vytváraní pohľadu sa vyberú určité údaje, ktoré bude obsahovať. Pomocou prideľovania prístupových práv umožníme prístup používateľovi iba k zvolenému pohľadu.

Prvý význam majú pohľady v tom, že umožňujú zakryť senzitívne údaje pred neautorizovanými používateľmi. Druhý význam pohľadu sa využíva v rozsiahlych databázach, kde z viacerých tabuliek vyberáme určité stĺpce a príkazom SELECT ich spojíme do jedného pohľadu, ktorý budeme neskôr využívať.

Vytvorením pohľadu definujeme nový pohľad v databáze.

Syntax

CREATE VIEW view_name [column_1,…,column_n] AS SELECT statement;

Odobratie pohľadu: odstránenie pohľadu z databázy (nemá žiadny vplyv na tabuľky, ktorých sa pohľad týkal).

 

Syntax:

 

DROP VIEW view_name;

Príklad Nasl.príklad umožní všetkým používateľom pracovať s pohľadom

cust_public, ktorý zobrazuje iba časť tabuľky customer.

CREATE VIEW cust_public AS SELECT name, address, city FROM customer;

GRANT SELECT ON cust_public TO PUBLIC

REVOKE ALL ON customer FROM PUBLIC;

Príklad

  Pohľad vytvorený nad viacerými tabuľkami:

 

CREATE VIEW invoce_from_john AS SELECT invnr, date, amount, name

FROM invoice, customer

WHERE customer.name = 'John‘;

Príkaz GRANT v PostgreSQL Syntax

 GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE dbname [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ([type, ...]) [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { username | GROUP groupname | PUBLIC } [, ...]

Popis

  Príkazom GRANT sa dá nastaviť špecifické práva pre objekt

(tabuľka, pohľad, databáza, funkcia, schéma atď.) pre jedného používateľa alebo skupinu používateľov. Tieto práva sú pridané k už existujúcim právam, ak už nejaké boli vytvorené.

  Kľúčové slovo PUBLIC indikuje, že práva budú pridelené

všetkým používateľom, vrátane tých, ktorí budú vytvorení neskôr. PUBLIC môže byť chápané ako implicitná skupina používateľov, ktorá vždy zahrňa všetkých používateľov. Poznamenajme, že používateľ bude vlastníkom práv pridelených jemu, vlastníkom práv skupiny do ktorej patrí a vlastníkom práv pridelených ako PUBLIC.

Nie je žiadna potreba prideľovať práva používateľovi nad objektom, ktorý sám vytvoril, pretože implicitne vlastní všetky práva. (Pre prípad bezpečnosti je dobrým zvykom, aby sa tento používateľ zriekol niektorých práv nad objektom, ktorý sám vytvoril.) Poznamenajme, že schopnosť prideľovať a odoberať práva nad objektom, ktorý používateľ vytvoril je dedičná (teda automatická) a táto schopnosť nemôže byť stratená.

  V závislosti od typu objektu, pôvodné predvolené nastavenie

práv môžu zahrňať niektoré práva pridelené PUBLIC. Pri predvolenom nastavení je zamietnutý verejný prístup pre tabuľky a schémy, vytváranie TEMP tabuliek v databázach, právo EXECUTE pre spúštanie funkcií a USAGE pre jazyky. Používateľ, ktorý objekt vytvoril však tieto predvolené práva pridelené PUBLIC môže odobrať.

Aby bola dodržaná najväčšia bezpečnosť, príkaz REVOKE by sa mal použiť v tej istej transakcii ako v ktorej bol objekt vytvorený. V tom prípade neexistuje žiadny spôsob ako pristúpiť k práve vytvorenému objektu iným používateľom.

Nastaviteľné práva sú: 

SELECT

  INSERT

  UPDATE

  DELETE

RULE - umožňuje vytvoriť pravidlo nad tabuľkou alebo pohľadom.

  REFERENCES - umožňuje vytvoriť cudzí kľúč v tabuľke.

Pri vytváraní cudzích kľúčov je nutné, aby toto právo bolo nastavené v referujúcej aj referovanej tabuľke.

  TRIGGER - umožňuje vytvoriť trigger nad danou

tabuľkou.

  CREATE - pre databázy umožňuje vytvoriť nové schémy

v rámci databázy a pre schémy umožňuje vytvoriť nové objekty v rámci schémy. 

TEMPORARY, TEMP - umožňuje vytvoriť dočasné tabuľky počas používania databázy. 

EXECUTE - umožňuje použiť špecifikovanú funkciu a použiť operátory, ktoré sú implementované vo funkcii.

  USAGE - pre procedurálne jazyky umožňuje použitie

špecifikovaného jazyka pre tvorbu funkcií v danom jazyku. Pre schémy umožňuje prístup k objektom, ktoré sa v schéme nachádzajú.

  ALL PRIVILEGES - umožňuje prideliť všetky vyššie

uvedené práva naraz.

Poznámky 

Poznamenajme, že superpoužívateľ databázy môže pristupovať ku každému objektu bez ohľadu na to aké práva sú pre daný objekt pridelené. Pristupovať k databázovým objektom z konta superpoužívateľa je odporúčané len v nevyhnutných prípadoch, kvôli dodržaniu najväčšej bezpečnosti.

 

V súčasnej verzii PostgreSQL (verzia 7.3) na to, aby sme pridelili práva len jednotlivým stĺpcom a nie celej tabuľke musí sa vytvoriť pohľad z požadovaných stĺpcov nad tabuľkou a prideliť práva pohľadu.

 

Poznamenajme, že v štandarde SQL92 existuje možnosť prideľovania práv pre jednotlivé stĺpce tabuľky, podľa syntaxu:

GRANT privilege [, ...]

ON object [ ( column [, ...] ) ] [, ...]

TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ]

  V tomto detaile sa PostgreSQL odkláňa od štandardu SQL92.

  Ak v PostgreSQL chceme zistiť už pridelené práva použijeme

príkaz \dp v psql nasledovne:

 lusitania=> \dp mytable

Access privileges for database "lusitania"

Schema | Table | Access privileges

--------+---------+---------------------------------–----

public | mytable | {=r,miriam=arwdRxt,"group todos=arw"}

(1 row)

Hodnoty sa interpretujú nasledovne:

  =xxxx –- práva pridelené PUBLIC

uname=xxxx -- práva pridelené používateľovi uname

group gname=xxxx -- práva pridelené skupine gname

r -- SELECT ("read")

w -- UPDATE ("write")

a -- INSERT ("append")

d -- DELETE

R -- RULE

x -- REFERENCES

t -- TRIGGER

X -- EXECUTE

U -- USAGE

C -- CREATE

T -- TEMPORARY

arwdRxt -- ALL PRIVILEGES (pre tabuľky)

Predchádzajúci výpis dostaneme po príkazoch GRANT:

 

GRANT SELECT ON mytable TO PUBLIC;

GRANT SELECT,UPDATE,INSERT ON mytable TO GROUP todos;

  Ak stĺpec "Access privileges" je prázdny pre nejaký objekt,

znamená to, že objekt má predvolené nastavenie práv (teda jeho pole práv je NULL). Predvolené práva vždy zahŕňajú všetky práva vlastníka objektu a môžu ešte zahŕňať niektoré práva pridelené PUBLIC v závislosti na type objektu, ako to už bolo vyššie spomenuté. Prvý príkaz GRANT alebo REVOKE pre objekt nastaví predvolené práva (napríklad {=,miriam=arwdRxt}) a potom ich modifikuje podľa príkazu.

Príkaz REVOKE v PostgreSQL Syntax

REVOKE { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...]REVOKE { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE dbname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...]REVOKE { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ([type, ...]) [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...]REVOKE { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...]REVOKE { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...]

Popis 

Príkaz REVOKE umožňuje používateľovi, ktorý objekt vytvoril odobrať pridelené práva od používateľa alebo skupiny používateľov. Kľúčové slovo PUBLIC označuje implicitne definovanú skupiny všetkých používateľov.

 

Poznamenajme, že používateľ bude vlastníkom práv pridelených jemu, vlastníkom práv skupiny do ktorej patrí a vlastníkom práv pridelených ako PUBLIC. Preto, ak napríklad sa odoberie právo na príkaz SELECT od PUBLIC to ešte neznamená, že všetci používatelia stratia právo na príkaz SELECT. Používatelia, ktorým toto právo bolo pridelené priamo budú ho ešte stále vlastniť.

 

Práva sú podobné ako pri príkaze GRANT.

Príklady

  Odober právo na príkaz INSERT od PUBLIC na tabuľku

filmy:

REVOKE INSERT ON filmy FROM PUBLIC;

  Odober všetky práva od používateľa kroky na tabuľku

filmy:

REVOKE ALL PRIVILEGES ON filmy FROM kroky;

 

Poznámky

  Ak používateľ A pridelí práva používateľovi B s klauzulou

WITH GRANT OPTION a používateľ B tieto práva pridelí používateľovi C, potom používateľ A môže tieto práva kaskádne zrušiť kľúčovým slovom CASCADE. V prípade, že používateľ A sa pokúsi odobrať toto právo a použije kľúčové slovo RESTRICT, potom príkaz zlyhá.

Nastavovanie prístupových práv v MySQL

Hlavným cieľom je zabezpečenie databázy pred nepovolaným a neautorizovaným prístupom. Pre každú tabuľku v databáze môžeme nadefinovať, ktorý používateľ má k nej prístup a na akej úrovni. Čiže aké operácie s ňou môže vykonávať. K nastaveniu týchto prístupových práv slúži príkaz GRANT. Jeho použitie je nasledovné:

 

GRANT prava ON nazov_tabulky TO meno_pouzivatela;

Položka práva zodpovedá nastaveniu prístupových práv na danú tabuľku. Na tomto mieste môžeme použiť niekoľko príkazov MySQL, na ktoré sa bude pridelenie prístupového práva vzťahovať. Jedná sa o tieto príkazy: SELECT, INSERT, UPDATE a DELETE. Ak chceme prideliť všetky prístupové práva na danú tabuľku, použijeme príkaz ALL.

  Za ON musí nasledovať meno tabuľky, pre ktorú dané

oprávnenia nastavujeme. Na záver, za TO, zadáme používateľa na ktorého sa dané nastavenie vzťahuje.

Syntax

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...

ON {tbl_name | * | *.* | db_name.*}

TO user_name [IDENTIFIED BY [PASSWORD] 'password']

[, user_name [IDENTIFIED BY [PASSWORD] 'password']] ...

[REQUIRE

NONE |

[{SSL| X509}]

[CIPHER cipher [AND]]

[ISSUER issuer [AND]]

[SUBJECT subject]]

[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |

MAX_UPDATES_PER_HOUR # |

MAX_CONNECTIONS_PER_HOUR #]]

Jednotlivé kľúčové slová sú podrobne vysvetlené v rozsiahlom manuáli MySQL.

Nad databázou, ktorú používateľ vytvoril má väčšinou absolútne práva a je oprávnený na nej vykonávať akékoľvek operácie. Ak však vytvoríme skript, pomocou ktorého budeme otvárať našu databázu a pracovať s ňou, je výhodnejšie - z bezpečnostného hľadiska vytvoriť nového používateľa a prideliť mu len tie práva, ktoré sú nevyhnutné na jeho prácu s databázou.

  Ak teda chceme používateľovi "kroky" povoliť plný prístup

k tabuľke "videofilmy", použijeme nasledovný príkaz:

 

GRANT ALL ON videofilmy TO kroky;

 

Keď budeme chcieť používateľovi "kroky" dať iba prístup na prezeranie tabuľky, použijeme nasledovný zápis:

  

GRANT SELECT ON videofilmy TO kroky;

  Ak budeme potrebovať z nejakého dôvodu odobrať

určitému používateľovi prístupové práva do nejakej tabuľky, urobíme to jednoducho pomocou príkazu REVOKE:

 

REVOKE prava ON nazov_tabulky TO meno_pouzivatela;

Úplná syntax príkazu REVOKE v MySQL vyzerá nasledovne:

 

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...

ON {tbl_name | * | *.* | db_name.*}

FROM user_name [, user_name] ...

 

Nie je však všetko také jednoduché ako na prvý pohľad vypadá. Tento systém prideľovania a odoberania prístupových práv nefunguje na všetkých servroch MySQL. Príkaz GRANT totiž všetky serveri nepodporujú. Aj keď sa síce tvária že áno (keď prístupové právo pomocou GRANT pridelíte, všetko vypadá, že je v poriadku, server neprotestuje až na jednu drobnosť - prístup nefunguje! Pôjdeme na to teda inak. A síce takto:

  Najskôr sa prihlásime do databázy ako root:

 

shell> mysql - u root -p mysql

 

Teraz pridáme používateľa "kroky" s heslom "214@abc" a predpokladajme, že sa bude môcť prihlasovať len z lokálneho počítača. To znamená, že databázový server musí bežať na lokálnom počítači. Teraz pridáme používateľa "kroky" do tabuľky používateľov "user":

 

INSERT INTO user (host, user, password)

VALUES ('localhost', 'kroky', password('214@abc'));

 

Používateľa sme pridali, teraz nám už len zostáva priradiť mu prístupové práva (rozhodneme sa pre čítanie z databázy moja_databaza):

 

INSERT INTO db (host, db, user, select_priv)

VALUES ('%', 'moja_databaza', 'kroky', 'Y');

Ak by sme chceli používateľovi "kroky" prideliť aj iné prístupové práva, pomocou príkazu INSERT s príznakom 'Y' nastavíme ďalšie položky: insert_priv, delete_priv, update_priv.

  Po zmene prístupových práv je potrebné aby si ich MySQL

server znovu načítal. To môžeme uskutočniť pomocou nasledovného príkazu:

 

shell> mysql -u root -p reload

Bezpečnejšie príkazy SQL

Hneď po napísaní aplikácie by sme mali pamätať na jej bezpečnosť. Preto sa pozrime, čo všetko je možné nezabezpečenej databáze vyviesť a ako sa proti tomu brániť.

  Ak vytvárame aplikáciu, ktorá pracuje s databázou je nutné

kontrolovať vstupné údaje. Ak to neurobíme, vystavujeme sa nebezpečiu, že SQL dotazy, ktoré naša aplikácia generuje, budú mať iný význam, ako sme zamýšľali. Neošetrené vstupné parametre môže útočník zneužiť k vkladaniu fragmentov SQL dotazov. V niektorých prípadoch (záleží na typu aplikácie, použitom jazyku, databázovom engine) môže útočník spúšťať ľubovoľné SQL príkazy, prepnúť sa do inej databázy a tam zmazať tabuľky.

Neošetrený skript môže vypadať nasledovne: 

PHP: "SELECT * FROM table WHERE id=$id";

ASP: "SELECT * FROM table WHERE id=" & Request.QueryString("id")

  Z parametru obdržaného od používateľa bez akejkoľvek

kontroly vytvoríme súčasť SQL dotazu. V lepšom prípade to skončí chybovým hlásením, v horšom hoci aj zmazaním dát na servri. Zamyslime sa, čo sa stane, pokiaľ používateľ do URL zadá:

 

?id=0%20or%201=1 - znaky %20 sú uvedené ako korektná náhrada medzery do URL)

?id=57;%20DELETE%20FROM%20table

V prvom prípade se vykoná SQL dotaz: 

SELECT * FROM table WHERE id=0 or 1=1;  

Čím sa vyberú všetky záznamy z tabuľky table. To môže vypadať nevinne, ale čo ak ide o overenie mena a hesla administrátora systému? Takto se môže niekto falošne prihlásiť k aplikácii, bez toho aby poznal meno alebo heslo. V druhom príklade sa môže podariť (ako si ukážeme ďalej, závisí to na databázovom systéme) podvrhnúť našému databázovému servru príkaz pre zmazanie všetkých údajov v tabuľke!

Predpokladajme, že sa jedná o MySQL. Tam to síce tak jednoduché nie je, môžeme ale spúšťať rôzne funkcie. Zkusmo si môžeme zistiť, pre aké číslo sa generuje aký článok (obsah stránky). Môžeme id generovať ako číslo odpovedajúce ordinálnej hodnote znakov ASCII z mena užívateľa, pod ktorým skript pracuje s databázou. Podobných "užitočných" funkcií existuje celá rada.

 

?id=ascii(mid(user(),5,1))

?id=mid(version(),3,1)  

V prvom prípade ako odpoveď získame ten samý výsledok ako pre id odpovedajúce v ASCII kódu v poradí piatemu znaku z mena používateľa. Na niekoľko pokusov tak môžeme zistiť celé meno používateľa. Druhý príklad vyberie tretí znak z čísla verzie použitého databázového systému.

Niektoré databázy umožňujú spúštanie viac dotazov naraz oddelených bodkočiarkou:

 

?id=1;%20SELECT%201

SELECT * FROM table WHERE id=1; SELECT 1

  K zadávaniu kompletných dotazov je nutné poznať názvy

tabuliek a stĺpcov. Tie môžu byť vyzradené chybovými hláseniami po nepovedených dotazoch, ale aj prečítané zo zapomenutých .inc súborov. Je preto tiež veľmi vhodné po odladení nášho skriptu potlačiť vypísanie možného chybového hlásenia dotazu v skriptu. V PHP sa to dá urobiť pridaním @ (znak at) pred možný chybový príkaz. Aj keď budete mať skript ošetrený proti tu popísaným technikám, nemôžete tušiť, čo niekto vymyslí nabudúce.

Dalo by sa predpokladať, že pokiaľ v dotaze nasleduje za miestom vkladania parametru ešte nejaký kód (napríklad LIMIT 10), je vloženie druhého dotazu nemožné. Niektoré databázové systémy však interpretujú v dotazoch sekvenciu -- (dve pomlčky) ako komentár, čím môžeme zbytok odrezať:

 

SELECT * FROM table WHERE id=1; SELECT 1 -- LIMIT 10

  Pokiaľ je hodnota textová, hrozia podobné útoky vtedy, ak

je možné vložiť do dotazu neošetrený znak '. Ošetriť tento znak je možné v prípade MySQL a Postgresu spätným lomítkom na \', v prípade MS SQL zdvojením na ''.

?string=';%20SELECT%201%20--

SELECT * FROM table WHERE text like '%'; SELECT 1 -- %' LIMIT 10

  Pokiaľ je apostrof ošetrený, tak je dotaz stále korektný, ale

vložený kód sa neinterpretuje, stane se súčasťou porovnávaného údaja:

 

SELECT id,text FROM table WHERE text like '%\'; SELECT 1 -- %' LIMIT 10

Riešenia a pravidlá

V prípade číselných hodnôt je úprava celkom triviálna - vynásobíme číslo jednotkou. Je možné aj pripočítať nulu, ale dá sa predpokladať, že násobenie bude (asi rovnako ako v strojovom kóde) rýchlejšie. Pokiaľ je zadaný nejaký reťazec, ktorý začína číslom, zostane len hodnota počiatočného čísla. Pokiaľ je zadaný reťazec nezačínajúci číslom, výsledkom je nula a v tej chvíli by sme mali presmerovať na východziu stránku a prípadne si nechať poslať na mail, kto a čo nám do skriptu pustil. Pokiaľ vieme, ako má vstupný parameter vyzerať, zkontrolujeme si ju pomocou regulárnych výrazov, či tak opravdu vyzerá.

V prípade textových parametrov je nutné patričným spôsobom uviesť lomítko (prípadne zdvojiť) znak ' vo všetkých premenných ktoré sú vkladané do SQL reťazca. V PHP môžu byť takto automaticky upravené všetky reťazce z parametrov GET, POST a Cookies. PHP robí potrebné vkladanie lomítka pri východziom nastavení v súboru php.ini samo. Je možné nastaviť aj automatické zdvojenie apostrofov, alebo naopak všetky úpravy vypnúť. Ak nechceme použiť automatické ošetrenie alebo ak nemáme ho možnosť aktivovať, pomôže nám funkcia AddSlashes(), ktorá pridáva spätné lomítka k zadanému reťazci. Podobnú funkciu musíme použiť aj v jazykoch, ktoré automatické ošetrenie úvodzoviek a apostrofov nepoužívajú (ASP, Perl).

Nie je zlým zvykom pridávať do každého dotazu, u ktorého očakávame ako výsledok len jeden záznam (a to hoci aj updatovaný alebo zmazaný), ešte parameter LIMIT 1. Taký dotaz býva spravidla rýchlejšie vykonaný a dá sa predpokladať, že prinajmenšom môže skomplikovať rôzne "vymýšľanie" záškodníkov.

 

V programovacom jazyku Java sa predošlý problém rieši rozhraním PreparedStatement, ktorý zvyšuje bezpešnosť pri vykonávaní SQL príkazov. Uveďme príklad, na ktorom tento prístup sa dá jednoducho demonštrovať:

 

PreparedStatement updateSales = con.prepareStatement(

"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");

updateSales.setInt(1, 75);

updateSales.setString(2, "Colombian");

updateSales.executeUpdate();

Najprv sa vytvorí objekt typu PreparedStatement volaním metódy prepareStatement nad objektom con, ktorý je typu Connection. Ako parameter sa metóde prepareStatement predáva reťazec obsahujúci SQL príkaz. Do SQL príkazu sa na miesta otáznikov doplňajú parametre zadané používateľom. V metódach setXXX prvý parameter vyjadruje, za ktorý otáznik sa má druhý parameter (hodnota) dosadiť. Skôr ako sa príkazy SQL posielajú na databázu najprv sa prekompilujú, takže databázový server ju už nemusí kompilovať. Týmto spôsobom sa môže zamedziť pridávanie nežiadúcich reťazcov za SQL príkaz.

 

SQL príkazy vytvárané touto metódou sú oveľa efektívnejšie a rýchlejšie ako klasickou metódou cez rozhranie Statement, ak sú jej volania často vykonávané s rôznými parametrami.