lunes, 2 de julio de 2012

8.2. CONCEDER Y REVOCAR PRIVILEGIOS


CONCEDER Y REVOCAR PRIVILEGIOS
Por default, nadie puede hacer nada en una Base de Datos Oracle. Como usuario no puede incluso conectarse sin el otorgamiento de un privilegio. Y una vez hecho esto, todavía no puede hacer nada útil (o peligroso) sin haber dado más privilegios. Los privilegios son asignados a las cuentas de usuarios con el comando GRANT y retirados con un REVOKE. Sintaxis adicional puede dar a usuario capacidad para conceder privilegios a otros usuarios. Por defecto sol el DBA (SYS y SYSTEM) tiene el derecho para conceder
Los privilegios vienen en dos grupos: Privilegios de sistemas que (generalmente hablando) permite a a los usuarios desarrollar acciones que afecten el diccionario de datos y privilegios de objeto que permiten a los usuarios desarrollar acciones que afectan los datos.


PRIVILEGIOS DE SISTEMA.
Hay cerca de dos cientos privilegios de sistema. La mayoría aplica para acciones que afectan el diccionario de datos, tales como creación de tablas o usuarios. Otros afectan la Base de Datos o la Instancia, tales como creación de Tablespaces, modificar valores de los parámetros de instancia, o el establecimiento de una sesión. Algunos de los más comúnmente utilizados son:


• CREATE SESSION este permite a los usuarios conectarse, sin este, no puede incluso loguearse en la Base de Datos.
• RESTRICTED SESSION si la Base de Datos es iniciada con STARTUP RESTRICT, o modificada con ALTER SYSTEM ENABLE RESTRICTED SESSION, solo los usuarios con este privilegio serán capaz de conectarse.
• ALTER DATABASE da acceso a muchos comandos necesarios para modificar estructuras físicas.
• ALTER SYSTEM Da control total sobre parámetros de instancia y estructuras de memoria.
• CREATE TABLESPACE con los privilegios ALTER TABLESPACE y DROP TABLESPACE, este permitirá a los usuarios gestionar Tablespaces.
• CREATE TABLE permite al concesionario crear tablas en su propio esquema; incluso la capacidad para alterar y eliminarlos, para ejecutar SELECT y comandos DML sobre ellos, y para crear, alterar o eliminar índices sobre ellos.
• GRANT ANY OBJECT PRIVILEGE permite al concesionario conceder permisos de objetos sobre objetos que él no posee a otros pero no para si misma.
• CREATE ANY TACLE el concecionario puede crear tablas que pertenecen a otros usuarios.
• DROP ANY TABLE. El concesionario puede eliminar tablas pertenecientes a otros usuarios.
• INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE el concesionario puede ejecutar estos commandos DML contra tablas propiedad de todos los demas usuarios.
• SELECT ANY TABLE el concesionarios puede SELECT cualquier tabla en la Base de Datos.

La sintaxis para otorgar privilegios de sistema es:


GRANT privilege [, privilege...] TO username ;


Despues de crear una cuenta de usuario, un comando tal como este otorgará los privilegios de sistema comúnmente asignado a usuario que estarán involucrados en el desarrollo de aplicaciones:


grant create session, alter session,
create table, create view, create synonym, create cluster,
create database link, create sequence,
create trigger, create type, create procedure, create operator
to username ;


Estos privilegios le permiten al usuario conectarse y configurar su sesión, y entonces crear objetos para almacenar datos y objetos PL/SQL. Estos objetos solo pueden existir en su propio esquema; no tendrá privilegios contra cualquier otro esquema. La creación de objetos también se verá limitada por la cuota puede haber sido asignado en varios Tablespaces.
Una variación en la sintaxis le permite pasar sus privilegios a otros terceros. Por ejemplo:


connect system/oracle;
grant create table to scott with admin option;
connect scott/tiger;
grant create table to jon;


Este da a SCOTT la capacidad para crear tablas en su propio esquema, y también para emitir el mismo el comando GRANT. En este ejemplo. Se le permite a JON crear tablas también. Pero JON solo será capaz para crear en su propio esquema. La figura 8-5 muestra el resultado de los otorgamientos según lo presentado por el Database Control. La misma información puede ser recogida por una consulta a la vista DBA_SYS_PRIVS.


EXAMEN
La revocación de unos privilegios de sistema no es en cascada (a diferencia de una revocación de privilegio de objeto)


Si un privilegio es revocado de un usuario, cualquier acción realizada que se realiza con ese privilegio (tales como crear tablas) permanecerá intacta. También, si ha sido otorgado y había utilizado el ADMIN OPTION, cualquier usuario a quien le paso el privilegio lo retendrá. Hay registro guardado del otorgante de un privilegio de sistema, por lo que no es posible un REVOKE en cascada.
La figura 8-6 ilustra esto. El privilegio ANY da permiso contra todos los objetos relevantes en la Base de Datos.
Por lo tanto,


grant select any table to scott;






Permitirá a SCOTT consultar cualquier tabla en cualquier esquema en la Base de Datos. Es a menudo considerado mala práctica otorgar el privilegio ANY a cualquier otro usuario que el administrador de sistemas.


EN EL TRABAJO
En realidad, no es tan peligroso ahora como con versiones anteriores. Ya no se incluyen tablas en el esquema SYS, por lo que el diccionario de datos esta todavía protegido. Pero ANY debe ser utilizado con extrema precaución, ya que elimina toda la protección de las tablas de usuarios.

PRIVILEGIOS DE OBJETOS
Los privilegios de objeto dan la capacidad para realizar los comandos SELECT, INSERT, UPDATE y DELETE contra tabla y objetos relacionados, y para ejecutar objetos PL/SQL. Estos privilegios no existen para los objetos propios en el esquema del usuario.
Si un usuario tiene el privilegio de sistema CRETA TABLE, puede realizar operaciones SELECT y DML contra las tablas que el crea sin la necesidad de adicionar permisos.

EXAMEN
El privilegio ANY, que concede permisos contra objetos en cualquier cuenta de usuario en la Base de Datos, no es privilegio de objeto, son privilegios de sistemas.

Los privilegios de objetos aplicados a los diferentes tipos de objetos




La sintaxis es.
GRANT privilege ON schema.object TO username [WITH GRANT OPTION] ;


Por ejemplo:
grant select on hr.regions to scott;


Las variaciones incluyen el uso de ALL, que aplicará todos los permisos relevantes al tipo de objeto, y nombramiento de columnas particulares de vistas y tablas.


grant select on hr.employees to scott;
grant update (salary) on hr.employees to scott;
grant all on hr.regions to scott;


Este código permitirá a SCOTT consultar todas las columnas de la tabla HR EMPLOYEES pero solo escribir a una columna nominada, SALARY. Luego SCOTT da tolos los privilegios (SELECT y DML) de objeto sobre la tabla HR REGIONS. La figura 8-7 muestra el resultado de esto, como vista en el Database Control.


EN EL TRABAJO
Otorgar privilegios a nivel de columna es a menudo ser una mala práctica debido a la carga de trabajo masivo que involucra. Si es necesario restringir el acceso a algunas personas a ciertas columnas, creando una vista que muestra solo las columnas a menudo será buena alternativa.


Utilizando WITH GRANT OPTION (o con el Database Control, seleccionado el Check Box GRANT OPTION como se muestra en la figura 8-7) permite a un usuario pasar sus privilegios de objeto sobre un tercer usuario. Oracle mantiene un registro de quien otorgo privilegios de objeto a quien. Esto permite un REVOKE sobre un objeto en cascada para todos estos en la cadena. Considere esta secuencia de comandos:




connect hr/hr;
grant select on employees to scott with grant option;
connect scott/tiger;
grant select on hr.employees to jon with grant option;
conn jon/jon;
grant select on hr.employees to sue;
connect hr/hr;
revoke select on employees from scott;


En la conclusión de este comando, ni SCOTT ni JON ni SUE tiene el privilegio SELECT contra HR.EMPLOYEES.


EXAMEN
La revocación de un privilegio de objeto es en cascada (a diferencia de un privilegio de sistema)


EJERCICIO 8-2.
OTORGANDO PRIVILEGIOS DIRECTOS.
En este ejercicio, usted otorgará algunos privilegios a los usuarios creados en el ejercicio 8-1 y probar que funcionan.


1. Conéctese a su Base de Datos como usuario SYSTEM con SQL*PLUS.


2. Otorgue CREATE SESSION al usuario ALOIS:
grant create sessions to alois;


3. Abrir otra sesión SQL*PLUS, y conéctese como ALOIS. Esta vez, el Login tendrá éxito.
connect alois/oracle


4. Como ALOIS, intente crear una Tabla:
create table t1 (c1 date);
Esta fallara con el mensaje “ORA-01031: insufficient privileges”


5. En la sesión SYSTEM, otorgue a ALOIS el privilegio CREATE TABLE:
grant create table to alois;


6. En la sesión ALOIS, intente nuevamente:
create table t1 (c1 date);
Este fallará con el mensaje “ORA-01950: no privileges on Tablespace ‘EXAMPLE’.”


7. En la sesión de SYSTEM, dar a ALOIS una quota en el Tablespace EXAMPLE:
alter user alois quota 1m on example;


8. En la session ALOIS, intente nuevamente, esta vez, la creación tendrá éxito.


9. Como ALOIS, conceda privilegios de objeto sobre la nueva Tabla:
grant all on t1 to afra;
grant select on t1 to anja;


10. Conectese al Database Control como SYSTEM.


11. Confirme que los privilegios de objeto han sido otorgados. 

La ruta de navegación desde la página principal del Database Control es: sobre la ficha Schema dar clic al link Table en la sección Database Objects. Ingrese ALOIS cono el esquema y T1 como la tabla y dar clic en el botón Go. En la lista de Accions, seleccione Objects Privileges. Como lo muestra la siguiente ilustración, ANJA solo tiene SELECT, pero AFRA tiene todo. Tenga en cuenta que la ventana también muestra por quien los privilegios fueron concedidos, y que ninguno de ellos fue concedido con WITH GRANT OPTION




12. Con el Database Control, confirme que privilegios tiene otorgado ALOIS. La ruta de navegación desde la pagina principal de la Base de Datos es: sobre la ficha Server dar clic al link Users en la sesión de Seguridad, seleccione el Radio Button para ALOIS, dar clic al View Botón. Usted vera que tiene dos privilegios de sistema (CREATE SESSION y CREATE TABLE)sin la opción ADMIN OPTION, un 1MB de quota en EXAMPLE y nada más.

13. Recupere la misma información mostrada en los pasos 11 y 12 con SQL*PLUS. Como SYSTEM ejecute esta consulta:

select grantee,privilege,grantor,grantable from dba_tab_privs
where owner='ALOIS' and table_name='T1';
select * from dba_sys_privs where grantee='ALOIS';
14. Revoque los privilegios concedidos a AFRA y ANJA:
revoke all on alois.t1 from afra;
revoke all on alois.t1 from anja;


Confirme las revocaciones mediante el primer query del paso 13.

No hay comentarios:

Publicar un comentario