Pràctica ASI-C6-ASGBD: Seguretat a Oracle II

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Objectius

En aquesta pràctica executarem el script admin_seguretat2.sql, que ilustra els conceptes vistos anteriorment, i a més a més la creació de rols. Creem dos rols, ACCES1 i ACCES2, i el rol ACCESTOTAL que és la suma dels dos rols anteriors.

Teoria

Desenvolupament

Rols

En aquesta pràctica executaràs el script admin_seguretat2.sql, però abans d'executar-lo l'analitzaràs per determinar el seu funcionament. El script el modificaràs amb el sufix de l'alumne.

Un cop funcioni correctament i entenguis tot el procediment, implementaràs regles de seguretat més complexes mitjançant rols.

Permisos sobre vistes en comptes de taules

El problema que plantegem a continuació té molt sentit:

Tenim la taula TENDA i la taula EMPLEAT_TENDA. Cada tenda té un encarregat, i una de les seves missions és actualitzar el camp facturació. Si creem els usuaris U_TENDA1 (Maria) i U_TENDA2 (Clara) amb permisos d'actualitzar facturació sobre la taula TENDA, ens trobem que tant l'un com l'altre poden actualitzar la facturació de les dues tendes, i això és un forat de seguretat gran. Per solucionar-ho (i és pràctica habitual), creem dues vistes, una per cada tenda, i que només visualitzi la facturació. Donem permisos als usuaris sobre la vista corresponent, i així ens assegurem que els encarregats només poden modificar la facturació de la seva tenda. Per tant, donem permisos no sobre les taules, sino sobre les vistes que hem creat sobre les taules. L'exercici complet és el següent:

REM TENDA-EMPLEAT_TENDA és una relació 1:M
REM els encarregats de les tendes 1 i 2 són els empleats 1 i 5

CONNECT ASI2AXX/ASI@BBDD

DROP TABLE EMPLEAT_TENDA;
DROP TABLE TENDA;

CREATE TABLE TENDA(
id_tenda NUMBER(2) PRIMARY KEY,
direccio VARCHAR2(15),
facturacio NUMBER(5)
);

CREATE TABLE EMPLEAT_TENDA (
id_empleat NUMBER(2) PRIMARY KEY,
nom VARCHAR2(10),
categoria VARCHAR2(15),
id_tenda NUMBER(2) REFERENCES TENDA
);


INSERT INTO TENDA VALUES(1,'C/Pau 23',1250);
INSERT INTO TENDA VALUES(2,'C/Llibertat 32',2542);

INSERT INTO EMPLEAT_TENDA VALUES(1,'Maria','encarregat',1);
INSERT INTO EMPLEAT_TENDA VALUES(2,'Pau','caixer',1);
INSERT INTO EMPLEAT_TENDA VALUES(3,'Robert','reposador',1);
INSERT INTO EMPLEAT_TENDA VALUES(4,'Pere','fruiteria',1);
INSERT INTO EMPLEAT_TENDA VALUES(5,'Clara','encarregat',2);
INSERT INTO EMPLEAT_TENDA VALUES(6,'Esther','caixer',2);
INSERT INTO EMPLEAT_TENDA VALUES(7,'Maurici','reposador',2);
INSERT INTO EMPLEAT_TENDA VALUES(8,'Marta','xarcuteria',2);

CREATE VIEW V_TENDA1 AS SELECT facturacio FROM TENDA WHERE id_tenda=1;
CREATE VIEW V_TENDA2 AS SELECT facturacio FROM TENDA WHERE id_tenda=2;

drop user "U_TENDA1" CASCADE;
drop user "U_TENDA2" CASCADE;

create user "U_TENDA1" identified by "TENDA1"
default tablespace users
temporary tablespace temp
quota 1M on users
profile default;

create user "U_TENDA2" identified by "TENDA2"
default tablespace users
temporary tablespace temp
quota 1M on users
profile default;

grant "CONNECT" to "U_TENDA1";
grant "CONNECT" to "U_TENDA2";

REM dono permisos sobre les vistes, no sobre la taula TENDA
GRANT UPDATE(facturacio) ON ASI2AXX.V_TENDA1 TO U_TENDA1;
GRANT UPDATE(facturacio) ON ASI2AXX.V_TENDA2 TO U_TENDA2;

CONNECT U_TENDA1/TENDA1@BBDD

REM l'usuari U_TENDA1 pot modificar la facturació de la seva botiga, però no de l'altra. La informació ''ORA-00942: table or view does not exist'' despista. La vista si que existeix, però no hi ha permisos.

UPDATE ASI2AXX.V_TENDA1 SET facturacio=2200;
UPDATE ASI2AXX.V_TENDA2 SET facturacio=2200;

Perfils

Provar de crear un perfil propi (limitant el número de sessions i el temps de connexió). Comprova com els recursos es limiten. Al final, elimina el perfil.

CREATE PROFILE limitar_sessions LIMIT SESSIONS_PER_USER 2 CONNECT_TIME 2;
ALTER USER "PEREXX" PROFILE limitar_sessions;


Entrega

Entregaràs els script (i el logs) resultant al Moodle.

Recursos

script admin_seguretat2.sql:

REM ROLS: el rol serveix per agrupar un conjunt de privilegis. Els privilegis d'un rol poden ser de sistema i a nivell d'objecte
REM INFORMACIÓ SOBRE ROLS EN EL DICCIONAR DE DADES:
REM USER_TAB_PRIVS: concessions sobre objectes que són propietat de l'usuari, concedits o rebuts per aquest
REM ROLE_SYS_PRIVS: privilegis de sistema assignats a rols
REM ROLE_TAB_PRIVS: privilegis sobre les taules aplicats a rols
REM ROLE_ROLE_PRIVS: rols assignats a d'altres rols
REM SESSION_ROLES: rols actius per l'usuari
REM USER_ROLE_PRIVS: rols assignats a l'usuari
REM DBA_SYS_PRIVS: privilegis del sistema assignats als usuaris o rols
REM DBA_ROLE_PRIVS: privilegis assignats a tots els usuaris i rols
REM DBA_ROLES: tots els rols

SPOOL /home/joan/log.txt
SET echo on
prompt ens connectem amb l'usuari ASI2AXX...
pause
connect ASI2AXX/ASI@bbdd

prompt i creem la taula JTEMP1 i JTEMP2 amb tres files per a fer proves
pause
drop table jtemp1;
create table jtemp1(camp1 varchar2(10), camp2 varchar2(10));
insert into jtemp1 values('fila1col1','fila1col2');
insert into jtemp1 values('fila2col1','fila2col2');
insert into jtemp1 values('fila3col1','fila3col2');
select * from jtemp1;

drop table jtemp2;
create table jtemp2(camp1 varchar2(10));
insert into jtemp2 values('fila1col1');
insert into jtemp2 values('fila2col1');
insert into jtemp2 values('fila3col1');
select * from jtemp2;

REM l'opcio CASCADE es per esborrar les taules de 'pere' si es que n'hi han
drop user "PEREXX" CASCADE;

prompt creem l'usuari PERE. Es important donar una quota en l'espai de taules d'usuari, doncs si la quota és 0, encara que hi hagi permisos no es podran crear taules.

create user "PEREXX" identified by "PERE"
default tablespace users
temporary tablespace temp
quota 1M on users
profile default;


grant "CONNECT" to "PEREXX";

prompt Creem un ROL anomenat ACCES1. L'usuari que crea el ROL ha de ser administrador o bé tenir el ROL de CREATE ROL.
pause
DROP ROLE ACCESTOTAL;
DROP ROLE ACCES1;
DROP ROLE ACCES2;

CREATE ROLE ACCES1;
 
prompt ara afegim privilegis als rol que acabem de crear
pause
GRANT SELECT, INSERT ON ASI2AXX.JTEMP1 TO ACCES1;
GRANT UPDATE ON ASI2AXX.JTEMP2 TO ACCES1;

prompt comprovem que els privilegis s'han afegit al ROL mirant la vista USER_TAB_PRIVS
pause
select * from USER_TAB_PRIVS;

prompt ara afegim aquest ROL a l'usuari PERE
pause
GRANT ACCES1 TO "PEREXX";

PROMPT i comprovem que el ROL funciona correctament...
pause

connect PEREXX/PERE@bbdd

REM funciona
INSERT INTO ASI2AXX.JTEMP1(camp1) VALUES('fila4col1');
SELECT * FROM ASI2AXX.JTEMP1;
REM no funciona
UPDATE ASI2AXX.JTEMP1 SET CAMP1='fila5' WHERE CAMP1='fila4';

REM no funciona
INSERT INTO ASI2AXX.JTEMP2 VALUES('fila4');
SELECT * FROM ASI2AXX.JTEMP2;
REM funciona
UPDATE ASI2AXX.JTEMP2 SET CAMP1='modificada' WHERE CAMP1='fila3col1';

prompt finalment, podem revocar privilegis del ROL. Ens tornem a connectar com a Administrador...
pause

connect ASI2AXX/ASI@bbdd
REVOKE INSERT ON ASI2AXX.JTEMP1 FROM ACCES1;
connect PEREXX/PERE@bbdd
REM ara no funciona perquè s'ha retirat el privilegi del rol
INSERT INTO ASI2AXX.JTEMP1(camp1) VALUES('fila5col1');


connect ASI2AXX/ASI@bbdd
select * from USER_TAB_PRIVS;

REVOKE ACCES1 FROM "PEREXX";

CREATE ROLE ACCES2;
GRANT DELETE, UPDATE(camp2) ON ASI2AXX.JTEMP1 TO ACCES2;
GRANT ALTER ON ASI2AXX.JTEMP2 TO ACCES2;

CREATE ROLE ACCESTOTAL;
GRANT ACCES1 TO ACCESTOTAL;
GRANT ACCES2 TO ACCESTOTAL;
GRANT ACCESTOTAL TO "PEREXX";

connect PEREXX/PERE@bbdd

REM funciona
SELECT * FROM ASI2AXX.JTEMP1;
UPDATE ASI2AXX.JTEMP1 SET camp2='modificada' where camp2='fila1col2';
DELETE FROM ASI2AXX.JTEMP1 WHERE camp1='fila2col1';
UPDATE ASI2AXX.JTEMP1 SET camp2='modificada' WHERE camp2='fila3col2';
ALTER TABLE ASI2AXX.JTEMP2 ADD (camp2 varchar2(10));

REM no funciona
UPDATE ASI2AXX.JTEMP1 SET camp1='modificada' WHERE camp1='fila1col2';
INSERT INTO ASI2AXX.JTEMP2 VALUES('fila5col1','fila5col2');

spool off

REM amb la comanda HOST podem executar comandes del SO
HOST cat /home/joan/log.txt

Durarda

2 hores


creat per Joan Quintana Compte, gener 2010

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines