Documente Academic
Documente Profesional
Documente Cultură
Andrei-Alexandru UNGHIANU
Cuprins:
2
Securitatea bazelor de date
Astăzi vom discuta despre sucuritatea bazelor de date. Ne vom uita în mod deosebit la diferite
comenzi şi construcţii SQL care să ne ajute să administrăm în mod eficient o bază de date
relaţională.
Ca şi în alte subiecte studiate până acum, modul în care sistemul de management al bazei de
date implementează securitatea, variază de la un produs la altul. Pentru introducerea în
această temă vom folosi Oracle7. La sfârşitul zilei, vom fi capabili să realizăm următoarele:
- crearea de utlizatori
- schimbarea parolelor
- crearea de roluri
- folosirea view-urilor în scopuri de securitate
- folosirea elementelor synonym în locul view-urilor
Securitatea este adesea un aspect cerut în arhitectura unei baze de date. Majoritatea
profesioniştilor în calculatoare intră în lumea acestora cu câteva cunoştiinţe de hardware sau
de programare, şi tind să se axeze pe aceste arii. De exemplu, dacă şeful tău ţi-ar cere să
lucrezi într-un proiect care cere implemntarea unei baze de date relaţionale, care ar fi primul
pas pe care l-ai face? După ce ai ales un tip de hardware şi software, probabil că ai incepe a
constui arhitectura de bază a bazei de date pentru proiect. Această etapă, în mod gradat va fi
împărţită între mai multe personae – una dintre ele poate implementa interfaţa grafică de
utilizator, alta poate construi componentele de nivel jos. Probabil că tu, după ce vei fi citit
această carte, vei fi solicitat pentru a scrie codul interogările SQL ce oferă funcţionalitate
acestei aplicaţii. Odata cu această sarcină, vine şi responsabilitatea efectivă de a administra şi
menţine operaţională baza de date.
De multe ori, puţin din ce a fost plănuit intră defapt în faza de producţie a aplicaţiei. Ce se
îmtâmplă cand multor utilizatori le este permisă folosirea aplicaţiei peste Wide Area Network
(WAN)? Cu softul avansat ce rulează pe calculatoarele personale din ziua de astăzi, şi cu
tehnologii cum ar fi Open Database Connectivity ( ODBC ) de la Microsoft, orice utilizator
cu acces la reţeaua ta, poate găsi o modalitate de a accesa baza ta de date. ( Nici macăr nu
luăm în considerare complexitatea indusă în momentul în care compania ta decide să
coneteze reţeaua locală la Internet sau la altă reţea de calculatoare de domeniu întins! ). Eşti
pregătit să faci faţă acestei situaţii?
3
Din fericire, producatorii software pun la dispoziţie majoritatea uneltelor necesare pentru
rezolvarea problemei legate de securitate. Fiecare lansare a unui nou sistem de operare se
confruntă cu cerinţe de securitate mai stricte decât prececesorii săi. În plus, majoritatea
producătorilor de baze de date construiesc un anumit grad de securitate pentru produsele lor,
care există independent de sistemul de operare sau securitatea reţelei. Implementarea acestor
comportamente de securitate diferă major de la un produs la altul.
Fiecare furnizor are nevoie de tine pe termen scurt şi pe termen lung. În timpul fazei de
dezvoltare a proiectului, s-ar putea să cumperi un număr mic de licenţe de produs pentru
testare, dezvoltare şi aşa mai departe. Oricum, numărul total de licenţe necesar pentru
producţia bazei de date poate ajunge la numărul sutelor sau chiar miilor. În plus, atunci când
te hotărăşti să foloseşti un anumit produs de baze de date, sunt şanse să îl foloseşti mai mulţi
ani. Mai jos sunt câteva aspecte ce ar trebui reţinute atunci cand examinezi aceste produse:
- Sistemul de management Microsoft FoxPro este un sistem de baze de date
puternic care este folosit în mod principal într-un mediu în care este un singur
utilizator. FoxPro foloseşte un set limitat de comenzi SQL. Acest sistem nu oferă
nicio măsură de siguranţă. De asemenea foloseşte un format al fişierelor de tip
Xbase, fiecare fişier conţinând un table. Indecşii sunt stocate în fişiere separate.
- Sistemul de management al bazei de date relaţionale Microsoft Access
implementează mai mult din SQL. Microsoft Access este încă destinat utilizării
pe platformele PC-urilor, cu toate că acesta conţine un sistem de securitate
rudimentar. Acest produs oferă posibilitatea creării de interogări şi stocarea
acestora în baza de date. În plus, întreaga bază de date şi toate obiectele acesteia
sunt pastrate într-un singur fişier.
- Sistemul de management al bazei de date relaţionale Oracle7 suportă aproape
întregul standard SQL. În plus, Oracle şi-a adăugat propia extensie la SQL, numită
PL*SQL. Acest produs conţine comportamente întregi de securitate, inclusive
capabilitatea de a crea roluri şi asignarea unor permisii şi privilegii asupra
obiectelor din baza de date.
- Serverul Sysbase SQL ca performanţă şi comportament este asemănător cu
produsul Oracle. Serverul SQL oferă de asemenea, oferă un domeniu larg de
trăsături de securitate şi are propia sa extensie relative la limbajul SQL, numită
Transact-SQL.
Scopul descrierii acestor produse este acela de a ilustra aceea că nu toate produsele sunt
potrivite pentru orice tip de aplicaţie. Dacă eşti într-un mediu business, opţiunile tale pot fi
limitate. Factori cum ar fi costul si performanţa sunt extreme de importanţi. Oricum, fară
măsurile de securitate potrivite, orice salvări pe care baza ta de date le face pot fi cu uşurinţă
compensate de probleme de securitate.
4
3.CUM POATE DEVENII O BAZĂ DE DATE SECURIZATĂ?
Până în acest punct nu te-ai preocupat prea mult de “securitatea” bazei de date pe care ai
creat-o. Te-ai gândit ca poate nu ai vrea ca alţi utilizatori să acceseze şi să manipuleze
informaţiile din baza ta de date pe care le-ai introdus cu atenţie? Care ar fi reacţia ta dacă te-
ai loga pe server într-o dimineaţă şi ai descoperi că baza ta de date a fost ştearsă ( aduţi
aminte cât de uşor poate fi folosită comanda DROP DATABASE). Vom examina în detaliu
cum un sistem popular de management al bazei de date (Personal Oracle7) oferă posibilitatea
creării unei baze de date securizate. Vei fi capabil să aplici majoritatea acestor informaţii şi
altor sisteme de management al bazelor de date, deci citeşte aceste informaţii chiar daca nu ai
ales să foloseşti Oracle ca system de management al bazei de date.
3.1.1.Crearea de utilizatori
Utilizatorii sunt repreznetaţi prin conturi la care sunt ataşate nume, şi cărora le este permis să
se conecteze la baza de date Oracle. Sintaxa SQL utilizată pentru a crea un tilizator este
următoarea:
SINTAXĂ:
CREATE USER user
IDENTIFIED {BY password | EXTERNALLY}
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]
5
[PROFILE profile]
De fiecare dată când mă voi conecta cu usernem-ul Dani, şi mi se fa cere să intru parola:
oracle.
Dacă este aleasă opţiunea EXTERNALLY, Oracle va folosi username-ul şi parola de la
calculator. Când te conectezi la calculatorul tau, automat esti conectat si la baza de date
Oracle.
După cum puteţi vedea uitându-vă la restul sintaxei CREATE USER, Oracle permite de
asemenea crearea de locaţii de stocare pentru fişierele bazei de date, numite tablespaces. Poţi
să aflii mai multe despre acestea examinând documentaţia Oracle. La fel ca oricărei alte
comezi de tip CREATE pe care le-ai învăţat în această carte, există o comandă ALTER.
Acesta arată astfel:
SINTAXĂ:
ALTER USER user
[IDENTIFIED {BY password | EXTERNALLY}]
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]
6
[PROFILE profile]
[DEFAULT ROLE { role [, role] ...
| ALL [EXCEPT role [, role] ...] | NONE}]
Poţi folosi această comandă pentru a folosi toate opţiunile utilizatorului, inclusiv parola şi
profilul. De exemplu putem schimba parola utilizatorului Dani, astfel:
Pentru a elimina un utilizator, utilizaţi comanda DROP USER, care elimină intrarea
utilizatorului în sistemul bazei de date. Sintaxa pentru această comandă este:
SINTAXĂ:
DROP USER user_name [CASCADE];
7
Dacă este aleasă opţiunea CASCADE, toate obiectele ce aparţin utlizatorului sunt eliminate
odata cu eliminarea contului acestuia. Dacă nu este folosită opţiunea CASCADE şi
utilizatorul reprezentat prin user_name încă deţine toate obiectele, nu este permisă eliminarea
acelui cont de utiliazator. Acest comportament este într-un fel derutant, dar este folositor în
cazul ştergerii conturilor de utilizator.
3.1.2.Crearea de roluri
Un rol este un privilegiu sau o colecţie de privilegii care permit unui utilizator să execute
anumite funcţii în baza de date. Pentru a permite un rol unui utilizator, se foloseşte
următoarea sintaxă:
SINTAXĂ:
GRANT role TO user [WITH ADMIN OPTION];
Dacă opţiunea WITH ADMIN OPTION este folosită, acel utilizator poate crea roluri altor
utilizatori.
8
Pentru a elimina un rol, se foloseşte comanda REVOKE.
SINTAXĂ:
REVOKE role FROM user;
Odată ce te-ai conectat la sistem folosind contul creat anterior, se aplică limitele permise
contului creat(pentru contul de utilizator Dani sau Student, utilizatorului Operator i s-a ataşat
un rol, insă nu a fost definit deocamdată niciun privilegiu acestui rol). Te poţi conecta, dar
acesta e tot ceea ce poţi face. Oracle te lasă să te conectezi cu următoarele drepturi de
utilizator:
- Conectare
- Resource (cu rol de creare proceduri, tabele, cluster, trigger şi altele)
- DBA (administrator de baze de date)
Rolul CONNECT
Rolul CONNECT poate fi vazut ca un role de început. Unui utilizator care are rolul Connect i
se pot da diferite privilegii ce îi permit acestuia sau acesteia să manipuleze cumva baza de
date.
9
Rolul Connect permite utilizatorului următoarele operaţii: select, update, si ştergerea de
înregistrări din tabele ce aparţin altor utilizatori (după ce au fost atribuite permisiunile
necesare). Utilizatorul poate de asemenea crea tabele, view-uri, secvenţe, cluster-e şi
synonyms.
Rolul RESOURCE
Rolul Resource oferă utilizatorului mai mult acces la baza de date oracle. În plus faţă de
permisiunile pe care le oferă rolul Connect, rolul Resource oferă posibilitarea creării de
proceduri, trigger-e şi indecşi.
10
Rolul DBA
Rolul DBA include toate privilegiile. Utilizatorii cu acest rol sunt capabili să facă orice
sistemului de baze de date. Ar trebui să se păstreze cât mai mic numărul de utilizatori cu acest
rol pentru a asigura integritatea sistemului.
Urmărind cei trei paşi, utilizatorului Operator2 i s-au dat rolurile Connect, Resource şi DBA.
Acest lucru este oarecum redundant deoarece rolul DBA le cuprinde pe celelalte două roluri,
deci poţi renunţa la celelalte două, după cum urmează:
11
Operator2 poate face orice are doreşte cu rolul de administrator DBA.
3.1.3.Privilegiile de utilizator
După ce te-ai hotărat ce roluri să dai utilizatorilor tăi, următorul pas este să hotărăşti ce
permisiuni să aibă acesti utilizatori asupra obiectelor din baza de date. (Oracle7 numeşte
aceste permisiuni privilegii.) Aceste tipuri de privilegii variază, depinzând de rolul care a fost
atribuit utilizatorului. Dacă creezi un obiect, poţi atribui anumite privilegii utilizatorilor
asupra acelui obiect, atâta timp cât rolul acestora le permite accesul la acel privilegiu. Oracle
defineşte două tipuri de privilegii care pot fi atribuite utilizatorilor: privilegii referitoare la
sistem şi privilegii referitoare la obiecte. (A se vedea tabelul 1 şi 2.)
Privilegiile referitoare la sistem se aplică pe întregul sistem. Sintaxa utlizată pentru a atribui
un privilegiu de sistem este următoarea:
SINTAXĂ:
GRANT system_privilege TO {user_name | role | PUBLIC}
[WITH ADMIN OPTION];
Opţiunea WITH ADMIN OPTION oferă posibilitatea atribuirii acestui privilegiu altui
utilizator.
12
Accesul utilizatorului la VIEW-uri
Următoarea comandă permite tuturor utilizatorilor sistemului să aibă acces de tip CREATE
VIEW în baza lor de date.
ANALIZĂ:
Cuvântul cheie public înseamnă că toate are lumea are privlegii de tip CREATE VIEW.
Evident, privilegiile de sistem oferă acces aproape la toate setările de sistem. Privilegiile de
sistem ar trebui atribuite numai anumitor utilizatori sau utilizatorilor care au nevoie de aceste
privilegii. Tabelul 1 prezintă privilegiile de sistem care se regăsesc şi în meniul de help al
produsului Personal Oracle7.
AVERTIZMENT: Fii atent când atribui privilegii utilizând parametrul public. Acest tip de
atribuire permit tuturor utilizatorilor să aibă acces la privilegiile bazei de date, ceea ce
probabil nu ai vrea.
13
date
14
propria lor schemă
15
GRANT ANY PRIVILEGE Permite celui căruia îi este atribuit
privilegiul să permită orice privilegiu de
sistem
Privilegiile referitoare la obiecte sunt privilegii ce pot fi folosite împotriva anumitor obiecte
ale bazei de date. Acestea sunt prezentate în tabelul 2.
ALL
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
16
SELECT
UPDATE
Poţi folosi următoarele forme ale comenzii GRANT pentru a altor utilizatori acces la tabelele
tale:
SINTAXĂ:
GRANT {object_priv | ALL [PRIVILEGES]} [ (column
[, column]...) ]
[, {object_priv | ALL [PRIVILEGES]} [ (column
[, column] ...) ] ] ...
ON [schema.]object
TO {user | role | PUBLIC} [, {user | role | PUBLIC}] ...
[WITH GRANT OPTION]
Pentru a elimina un privilegiu referitor la obiect pe care l-ai atribuit unui utilizatr, foloseşte
comanda REVOKE cu următoarea sintaxă:
SINTAXĂ:
REVOKE {object_priv | ALL [PRIVILEGES]}
[, {object_priv | ALL [PRIVILEGES]} ]
ON [schema.]object
FROM {user | role | PUBLIC} [, {user | role | PUBLIC}]
[CASCADE CONSTRAINTS]
17
3.2. De la crearea de roluri la alocarea acestora
Crează o tabelă Salariati cu următoarea structură:
NAME, CHAR(30)
SALARY, NUMBER
AGE, NUMBER
ANALIZĂ:
Până acum, ai creat 2 utilizatori şi ai alocat fiecăruia câte un rol diferit. Prin urmare, ei vor
avea diferite permisiuni când vor lucra cu baza de date. Prima dată crează tabela Salarii cu
următoarele informaţii:
18
Pentru acest exemplu, ai putea aloca diferite privilegii acestei tabele după nişte criterii alese
arbitrar. Presupunem că în momentul de faţă deţii privilegii de administrator şi poţi aloca
orice privilegiu de sistem. Chiar dacă nu ai privilegii de administrator, poţi să aloci privilegii
referitoare la obiectele bazei de date, asupra tabelei Salarii deoarece o deţii (presupunând că
tocmai ai creat-o).
Deoarece telecom2 are rolul de Connect, vei dori ca acesta să aibă doar privilegiul SELECT.
Deoarece telecom1 i-a fost alocat rolul Resource, îi vei permite să execute comenzile
SELECT şi INSERT asupra tabelei. Îi vei permite de asemenea să actualizeze doar valorile
aparţinând coloanei Salariu din tabela telecom.
19
Acum că au fost creaţi utilizatorii şi această tabelă, trebuie să vezi cum se accesează o tabelă
care a fost creată de alt utilizator. Atât lui telecom1 cât şi lui telecom2 le-a fost alocată
permisiunea de a executa comanda SELECT asupra tabelei telecom. Oricum, dacă teelcom2
încearcă să acceseze tabela telecom, va primi un mesaj în care i se va spune că aceasta nu
există pentru că Oracle are nevoie de username sau schema ce deţine tabela pentru a întoarce
numele tabelei.
Aici telecom1 a fost avertizat că acea tabelă nu există. Acum folosiţi username-ul celui care a
creat tabela (system în acest caz):
20
ANALIZĂ:
După cum vezi de data aceasta interogarea a funcţionat. Acum testează privilegiile de acces
ale telecom2. Prima dată conectează-te cu username-ul telecom2 (se foloseşte parola definită
mai sus, şi anume oracle).
21
ANALIZĂ:
Această operaţie nu a funcţionat deoarece telecom2 nu beneficiază de privilegiul e a executa
comanda INSERT asupra tabelei telecom.
Încă o dată, telecom2 încearcă să beneficieze de privilegiile care i s-au dat. Normal, ea are
drept de UPDATE, însă doar pentru înregistrările corespunzătoare coloanei nr_telf.
22
ANALIZĂ:
După cum se vede actualizarea tabelei merge, atâta timp cât telecom2 respectă privilegiile ce
i-au fost alocate.
23
3.5.O soluţie simplă pentru definiea unei tabele sau view
Presupunând că te-ai logat ca teltelecom1, utilizator creat anterior. După cum aţi observat, ca
telecom1 să poată accesa conţinutul tabelei telecom, acesta trebuie să folosească următoarea
comadă:
Dacă ar fi să creaţi un view numit telecom_VIEW, un utilizator a putea să extragă date din
aceasta fără nicio problemă.
24
ANALIZĂ:
Interogarea anterioară a îmtors aceleaşi rezultate ca şi cea din system.telecom.
25
Acum conectează-te cu username-ul lui telecom1 şi testează accesul la datele din view-ul ce a
fost creat pentru acesta.
26
După cum se poate observa, telecom1 nu mai are acces la tabela telecom ci doar la view-ul ce
i-a fost creat şi i s-a alocat un privilegiu asupra acestuia.
Decontaţi-vă şi conectaţi-vă pe contul de utilizator al telecom2 pentru a testa privilegiile pe
care acesta le are asupra tabelei şi asupra view-ului care i-a fost creat şi asupra căruia i s-a
alocat un privilegiu.
ANALIZĂ:
După cum puteţi vedea, accesul la tabela telecom a fost complet controlat folosind view-uri.
27
SQL vă oferă posibilitatea de a crea aceste view-uri cum doriţi şi apoi să alocaţi permisiuni
celorlalţi utilizatori asupra acestora. Această tehnică vă permite o flexibilitate mare.
Sintaxa pentru a elimina un synonym este:
SQL> drop [public] synonym synonym_name;
NOTĂ: Până acum, ar trebui să fi înţeles cât de important este să menţinem un număr cât mai
mic de utilizatori cu rol de DBA. Un utilizator cu acest nivel de acces, are acces complet
asupra tuturor comenzilor şi operaţiilor ce se pot executa asupra bazei de date. Ţine-ţi minte
că pentru a putea importa sau exporta date din baza de date trebuie să aveţi acces de nivel
DBA dacă folosiţi Oracle sau acces de nivel SA dacă folosiţi Sybase.
28
SINTAXĂ:
GRANT {object_priv | ALL [PRIVILEGES]} [ (column
[, column]...) ]
[, {object_priv | ALL [PRIVILEGES]} [ (column
[, column] ...) ] ] ...
ON [schema.]object
TO {user | role | PUBLIC} [, {user | role | PUBLIC}] ...
[WITH GRANT OPTION]
Ceea ce ne interesează în acest moment este opţiunea WITH GRANT OPTION de la sfârşitul
comenzii. Când privilegiile de obiect sunt alocate şi este folosită opţiunea WITH GRANT
OPTION, aceste privilegii pot fi pasate mai departe şi altor utilizatori. Deci dacă doriţi ca
telecom2 să paseze mai departe lui telecom1 aceste privilegii, se precedează astfel:
Acum ne putem conecta cu username-ul lui telecom1 să verificăm dacă într-adevăr acesta are
areste privilegii asupra tabelei telecom.
29
Nu uitaţi că mai sus când am creat view-urile atât pentru telecom1 cât şi pentru telecom2, li s-
a revocat amândurora dreptul la privilegiul SELECT asupra tabelei telecom. Însă apoi i s-a
atribuit din nou utilizatorului telecom2 acest privilegiu, dar nu şi lui telecom1. Telecom1 are
acest privilegiu nu de la utilizatorul ce a creat tabela, ci de la telecom2 care i l-a pasat lui mai
departe.
30
4.BIBLIOGRAFIE
31