sábado, 9 de julio de 2016

Control de Acceso a Usuarios de la Base de Datos

Objetivos:
•Diferenciar los privilegios del sistema de los de objeto.
•Otorgar privilegios en tablas.
•Ver privilegios en el diccionario de datos.
•Otorgar roles.
•Distinguir entre privilegios y roles.

NOTA: Usamos como ejemplo la base de datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.
_____________________________________________________________________________________
Control de Acceso a Usuarios.
En un entorno de varios usuarios, necesita mantener la seguridad del acceso y el uso de la base de datos. Con la seguridad de base de datos de Oracle Server, puede:
•Controlar el acceso a la base de datos.
•Otorgar acceso a objetos específicos de la base de datos.
•Confirmar los privilegios otorgados y recibidos con el diccionario de datos Oracle.
•Crear sinónimos para objetos de base de datos.

La seguridad de base de datos se puede clasificar en dos categorías: Seguridad del Sistema y Seguridad de los Datos. La seguridad del sistema cubre el acceso y el uso de la base de datos en el nivel del sistema como, por ejemplo, nombre de usuario y contraseña, el espacio en disco asignado a los usuarios y las operaciones del sistema que pueden realizar los usuarios. La seguridad de datos cubre el acceso y el uso de los objetos de base de datos y las acciones que esos usuarios pueden llevar a cabo en los objetos.
_____________________________________________________________________________________
Privilegios.
•Seguridad de base de datos:
–Seguridad del sistema.
–Seguridad de datos.
•Privilegios del sistema: Obtención de acceso a la base de datos.
•Privilegios de objeto: Manipulación del contenido de los objetos de base de datos.

Los privilegios son el derecho a ejecutar sentencias SQL en particular. El DBA (administrador de la base de datos) es un usuario de alto nivel con la capacidad de crear usuarios y de otorgarles acceso a la base de datos y a sus objetos. Los usuarios necesitan privilegios del sistema para obtener acceso a la base de datos y privilegios de objeto para manipular el contenido de los objetos de la base de datos. A los usuarios también se les puede otorgar el privilegio de otorgar privilegios adicionales a otros usuarios o a roles, que son grupos especificados de privilegios relacionados. 

Esquemas.
Un esquema es una recopilación de objetos como, por ejemplo, tablas, vistas y secuencias. El esquema es propiedad de un usuario de base de datos y tiene el mismo nombre que el usuario.

Privilegios del Sistema.
Los usuarios y los roles tienen a su disposición más de 100 privilegios del sistema distintos. Los privilegios del sistema suelen ser proporcionados por el administrador de la base de datos.

•Hay más de 100 privilegios disponibles.
•El administrador de la base de datos tiene privilegios del sistema de alto nivel para tareas como, por ejemplo:
–Creación de usuarios nuevos.
–Eliminación de usuarios.
–Eliminación de tablas.
–Realización de copias de seguridad de tablas.

Privilegios de DBA Típicos.
Privilegio del Sistema. Operaciones Autorizadas
CREATE USER
La persona a la que se otorga el privilegio puede crear otros usuarios de Oracle.
DROP USER
La persona a la que se otorga el privilegio puede borrar otro usuario.
DROP ANY TABLE
La persona a la que se otorga el privilegio puede borrar una tabla de cualquier esquema.
BACKUP ANY TABLE
La persona a la que se otorga el privilegio puede realizar copias de seguridad de cualquier esquema con la utilidad de exportación.
SELECT ANY TABLE
La persona a la que se otorga el privilegio puede consultar tablas, vistas o instantáneas en cualquier esquema.
CREATE ANY TABLE
La persona a la que se otorga el privilegio puede crear tablas en cualquier esquema.

Creación de un Usuario.
Para crear el usuario, el DBA ejecuta la sentencia CREATE USER. El usuario no tiene ningún privilegio en ese momento. Por tanto, el DBA puede otorgar privilegios a ese usuario. Estos privilegios determinan lo que el usuario podrá hacer en el nivel de base de datos. 

Sintaxis: 
CREATE USER user
IDENTIFIED BY password;
En la sintaxis:
user es el nombre del usuario que se va a crear.
Password especifica que el usuario se debe conectar con esta contraseña.

EjemploS:
CREATE USER vmoquete
IDENTIFIED BY "MagicPL/SQL";
/*En este ejemplo(conectado con hr) creamos el usuario: vmoquete, con la siguiente contraseña: MagicPL/SQL(sin las comillas dobles).*/
_____________________________________________________________________________________
Privilegios de Usuario Típicos.
•Una vez creado el usuario, el DBA le puede otorgar privilegios del sistema específicos.
•Un desarrollador de aplicaciones, por ejemplo, puede tener los siguientes privilegios del sistema:
Privilegio del Sistema Operaciones Autorizadas
CREATE SESSION
Conectarse a la base de datos
CREATE TABLE
Crear tablas en el esquema del usuario
CREATE SEQUENCE
Crear una secuencia en el esquema del usuario
CREATE VIEW
Crear una vista en el esquema del usuario
CREATE PROCEDURE
Crear un procedimiento, una función o un paquete en el esquema del usuario


Sintaxis:
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];


En la sintaxis:
privilege es el privilegio del sistema que se va a otorgar.
•user |role|PUBLIC es el nombre del usuario, el nombre del rol o, en el caso de PUBLIC, designa que el privilegio se otorga a todos los usuarios.

Nota: Los privilegios del sistema actuales se pueden encontrar en la vista de diccionario SESSION_PRIVS.

Ejemplo:
GRANT create session, create table,
create sequence, create view
TO 
vmoquete;
/*El usuario vmoquete fue creado en un ejemplo previo a este, pero no se le asigno ningún privilegio por lo cual no tenia ningún tipo de acceso al sistema, en este ejemplo le otorgamos algunos privilegios para que pueda conectarse y crear ciertos objetos.*/
_____________________________________________________________________________________
Los Roles.
Un rol es un grupo especificado de privilegios relacionados que se pueden otorgar al usuario. Este método facilita la revocación y el mantenimiento de privilegios. 

Un usuario puede tener acceso a varios roles y se puede asignar a varios usuarios el mismo rol. Los roles se suelen crear para una aplicación de base de datos. 

Creación y Asignación de un Rol
En primer lugar, el DBA debe crear el rol. Después, el DBA puede asignar privilegios al rol y asignar el rol a usuarios. 

Sintaxis:
CREATE ROLE role

En la sintaxis: 
role es el nombre del rol que se va a crear 

Una vez creado el rol, el DBA puede utilizar la sentencia GRANT para asignar el rol a usuarios, del mismo modo que puede asignar privilegios al rol.

Ejemplo:
CREATE ROLE auditor
---
GRANT select on hr.employees
TO 
auditor;
---
GRANT auditor
TO 
vmoquete;
/*El ejemplo anterior muestra como crear un role, como otorgar privilegios a dicho role y luego como asignar el role a los usuarios.*/
_____________________________________________________________________________________
Otorgando Privilegios de Objeto.
•Los privilegios de objeto varían de un objeto a otro.
•Un propietario tiene todos los privilegios en el objeto.
•Un propietario puede otorgar privilegios específicos en el objeto del que es propietario.

Existen diferentes privilegios de objeto disponibles para diferentes tipos de objetos de esquema. Un usuario tiene automáticamente todos los privilegios de objeto para objetos de esquema contenidos en el esquema del usuario. Un usuario puede otorgar cualquier privilegio de objeto en cualquier objeto de esquema que sea propiedad del usuario a cualquier otro usuario o rol. Si el otorgamiento incluye WITH GRANT OPTION, la persona a la que se otorga el privilegio puede otorgar a su vez el privilegio de objeto a otros usuarios; de lo contrario, la persona a la que se otorga el privilegio lo puede utilizar pero no lo puede otorgar a otros usuarios. 


Sintaxis:

GRANT object_priv|all| [(columns)] 
ON object 
TO {user|role|PUBLIC
[WITH GRANT OPTION]; 


En la sintaxis:

object_priv es un privilegio de objeto que se va a otorgar.
ALL especifica todos los privilegios de objeto.
columns especifica la columna de una tabla o de una vista en la que se otorgan los privilegios.
ON object es el objeto en el que se otorgan privilegios.
TO identifica a quién se otorga el privilegio.
PUBLIC otorga privilegios de objeto a todos los usuarios.
WITH GRANT OPTION permite a la persona a la que se otorga el privilegio otorgar privilegios de objeto a otros usuarios y roles.

Directrices:
•Para otorgar privilegios en un objeto, éste debe estar en el esquema o le deben haber otorgado los privilegios de objeto con la cláusula WITH GRANT OPTION
•Un propietario de objeto puede otorgar cualquier privilegio de objeto a cualquier otro usuario o rol de la base de datos. 
•El propietario de un objeto adquiere automáticamente todos los privilegios de objeto en ese objeto.
Nota: Los DBA suelen asignar privilegios del sistema; cualquier usuario propietario de un objeto puede otorgar privilegios de objeto.

Ejemplos:
GRANT select
ON
hr.jobs
TO
sue, scott;
/*En ahora los usuarios sue y rich pueden consultar la tabla jobs del esquema hr.*/
---
GRANT all
ON 
hr.departments
TO 
vmoquete;
/*Luego de este GRANT el usuario vmoquete puede consultar, insertar, actualizar y eliminar registros en la tabla departments del esquema hr.*/
---
GRANT update (city, location_id) ON hr.locations TO auditorscott;
/*En este ejemplo se le otorga el privilegio para actualizar los campos city y location_id de la tabla locations de hr al role auditor y al usuario scott.*/
---
Otorgando el Privilegio de Otorgar Privilegios.

Palabras Clave WITH GRANT OPTION.
La persona a la que se otorga un privilegio que se otorgue con la cláusula WITH GRANT OPTION lo puede transferir a otros usuarios y roles. Los privilegios de objeto otorgados con la cláusula WITH GRANT OPTION se revocan si se revoca el privilegio del otorgante. 

Palabra Clave PUBLIC.
Un propietario de la tabla puede otorgar acceso a todos los usuarios mediante la palabra clave PUBLIC.

Ejemplos:

CREATE USER other_user 

IDENTIFIED BY "MagicPL/SQL";
/
*Aquí(conectado con hr) creamos el usuario other_user con la contraseña: 
MagicPL/SQL
---
GRANT CREATE SESSION
TO other_user;
/
*Aquí le otorgamos el privilegio para que pueda crear sesiones, osea conectarse a la Base de Datos.*/
GRANT select, insert
ON hr.jobs
TO vmoquete

WITH GRANT OPTION;
/
*Aquí otorgamos el privilegio de consultar e insertar en la tabla jobs de hr al usuario vmoquete, debido a que especificamos WITH GRANT OPTION, el usuario puede transferir estos privilegios al usuario other_user.*/

---
GRANT select
ON hr.countries
TO PUBLIC;

/*Con este GRANT permitimos a todos los usuarios de la Base de Datos consultar en la tabla countries de HR.*/
_____________________________________________________________________________________
Confirmación de Privilegios Otorgados.
Si intenta realizar una operación no autorizada, como suprimir una fila de una tabla para la que no tiene el privilegio DELETE, Oracle Server no permite que la operación se realice. 

Si recibe el mensaje de error de Oracle Server “table or view does not exist”, es porque ha realizado una de estas acciones: 
•Ha especificado una tabla o una vista que no existen 
•Ha intentado realizar una operación en una tabla o en una vista para la que no tiene el privilegio adecuado 

Puede acceder al diccionario de datos para ver los privilegios de los que dispone. El gráfico describe varias vistas de diccionario de datos.
Vista del Diccionario de Datos
Descripción
ROLE_SYS_PRIVS
Privilegios del sistema otorgados a roles.
ROLE_TAB_PRIVS
Privilegios de la tabla otorgados a roles.
USER_ROLE_PRIVS
Roles a los que puede acceder el usuario.
USER_TAB_PRIVS_MADE
Privilegios de objeto otorgados en los objetos del usuario.
USER_TAB_PRIVS_RECD
Privilegios de objeto otorgados al usuario.
USER_COL_PRIVS_MADE
Privilegios de objeto otorgados en las columnas de los objetos del usuario.
USER_COL_PRIVS_RECD
Privilegios de objeto otorgados al usuario en columnas específicas.
USER_SYS_PRIVS
Privilegios del sistema otorgados al usuario.
_____________________________________________________________________________________
Revocación de Privilegios de Objeto.
Puede eliminar privilegios otorgados a otros usuarios mediante la sentencia REVOKE. Al utilizar la sentencia REVOKE, los privilegios que especifique se revocarán de los usuarios que especifique y de cualquier otro usuario a quien el usuario revocado hubiera otorgado esos privilegios. 

Sintaxis:
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];


En la sintaxis: 
CASCADE es necesario para eliminar cualquier restricción de integridad referencial realizada en el objeto CONSTRAINTS mediante el privilegio REFERENCES

Nota: Si revoca los privilegios de un usuario que debe dejar la compañía, debe volver a otorgar cualquier privilegio que este usuario hubiera otorgado a otros usuarios. Si borra la cuenta de usuario sin revocarle los privilegios, esta acción no afectará a los privilegios del sistema otorgados por este usuario a otros usuarios.

Ejemplo:
REVOKE select, insert
ON hr.jobs
FROM vmoquete;

/*Aquí revocamos los privilegios de consultar e insertar en la tabla jobs de hr al usuario vmoquetedichos privilegios también son revocados de cualquier otro usuario al cual vmoquete los haya otorgado..*/
---
Detalles:
Si se otorga un privilegio a un usuario con la cláusula WITH GRANT OPTION, ese usuario también puede otorgar el privilegio con la cláusula WITH GRANT OPTION, de forma que es posible una larga cadena de personas a las que se otorgan privilegios, aunque no se permiten otorgamientos circulares. Si el propietario revoca un privilegio de un usuario que otorgó dicho privilegio a otros usuarios, se revocarán en cascada todos los privilegios otorgados. 

Por ejemplo, si el usuario vmoquete otorga un privilegio SELECT en una tabla al usuario other_user con la cláusula WITH GRANT OPTION, el usuario other_user también puede otorgar al usuario user_x el privilegio SELECT con la cláusula WITH GRANT OPTION y el usuario user_x puede otorgar al usuario user_nx el privilegio SELECT. Si el usuario vmoquete revoca los privilegios del usuario other_user, los privilegios otorgados a los usuarios user_x y user_nx también se revocan.
_____________________________________________________________________________________
_____________________________________________________________________________________
Fuente: Base de Datos Oracle 10g: Conceptos Fundamentales de SQL 1