Vous êtes sur la page 1sur 17

SEGURIDAD Y ACCESO A ORACLE

UD PLANIFICACIN Y GESTIN DEL


DESARROLLO DE SOFTWARE

SEGURIDAD Y ACCESO A ORACLE


Una de las tareas al administrar Oracle es permitir el acceso a bases de datos y asignar
permisos sobre los objetos que conforman una base de datos.
Para conectarnos con un servidor Oracle necesitamos un modo de acceso que incluye los
permisos que dispondremos durante la conexin; estos permisos se definen a partir de un
nombre de usuario.
Un USUARIO es un identificador necesario para acceder a una base de datos. Un usuario es
un conjunto de permisos que se aplican a una conexin de base de datos. Un usuario es
adems propietario de ciertos objetos.
Los PRIVILEGIOS (permisos) especifican qu operaciones puede realizar un usuario y sobre
qu objetos de la base de datos tiene autorizacin, es decir, qu tarea puede realizar con
esos objetos y si puede emitir determinadas instrucciones. Estas operaciones pueden ser de
dos tipos: de sistema y sobre objeto.
Un rol de base de datos es una agrupacin de permisos de sistema y de objeto.
Un ROL (role) es un grupo de usuarios; permite agrupar usuarios para aplicarles permisos;
as, al agregar un nuevo usuario a la base de datos, no es necesario concederle permiso para
cada objeto, sino que lo agregamos a un rol; cuando asignamos permisos sobre un objeto al
rol, automticamente el permiso afectar a los usuarios que pertenezcan a tal rol.
Los permisos controlan el acceso a los distintos objetos de una base de datos; pueden
concederse a nivel de usuario (individualmente) o a nivel de rol (a todos los usuarios de un
grupo).

USUARIOS (CREAR)
Puede haber varios usuarios diferentes de la base de datos. Cada uno es propietario de sus objetos.
Para crear un usuario debemos conectarnos a la base datos como administradores (por ejemplo
"system").
Sintaxis bsica para crear un usuario:
create user NOMBREUSUARIO identified by CONTRASEA default tablespace
NOMBRETABLESPACEPORDEFECTO quota CANTIDAD on TABLEESPACE; ** [default role ROLE, ALL];
La clusula "identified by" permite indicar una contrasea.
La clusula "default tablespace" ser el tablespace (espacio de tablas) por defecto en la creacin de
objetos del usuario. Si se omite se utilizar el tablespace SYSTEM. Los tablespaces son unidades lgicas
en las cuales de divide una base de datos, en las cuales se almacenan los objetos (tablas, secuencias,
etc.); todos los objetos estn almacenados dentro de un tablespace.
La clusula "quota" permite configurar un espacio en bytes, Kb o Mb en la base de datos. Si no se
especifica, por defecto es cero y no podr crear objetos.
La clusula "default role" permite asignar roles de permisos durante la creacin del usuario.
Ejemplo:
create user ana identified by anita;
Con la sentencia anterior se crea un usuario denominado "ana" con la clave "anita", el tablespace por
defecto es "system" porque no se especific otro.
Con la siguiente sentencia se crea un usuario denominado "juan" con la clave "juancito", se le asigna un
espacio de 100 mb:
create user juan identified by juancito default tablespace system quota 100M on system;
Si intentamos crear un usuario que ya existe, Oracle muestra un mensaje de error indicando tal
situacin.
El diccionario "dba_users" muestra informacin sobre todos los usuarios; el nombre de usuario

USUARIOS (CREAR)
Problema:
Sabemos que para crear un usuario debemos conectarnos a la base datos como
administradores (por ejemplo "system").
Necesitamos crear un usuario "ana"; antes vamos a eliminarlo por si existe (luego veremos
detenidamente cmo eliminar usuarios y explicaremos la siguiente sentencia):
drop user ana cascade;
Creamos un usuario denominado "ana" con la contrasea "anita":
create user ana identified by anita;
Aparece un mensaje indicando que el usuario "ana" ha sido creado.
Necesitamos crear un usuario denominado "juan"; antes vamos a eliminarlo por si existe:
drop user juan cascade;
Creamos el usuario "juan" con la contrasea "juancito", le asignamos un espacio de 100 mb
en "system":
create user juan identified by juancito default tablespace system quota 100M on system;
Si intentamos crear un usuario que ya existe, Oracle muestra un mensaje de error indicando
tal situacin.
create user juan identified by juancito;
Mensaje de error.
Consultamos el diccionario "dba_users" y analizamos la informacin que nos muestra:
select username, password, default_tablespace, created from dba_users;
El resultado nos muestra el nombre de usuario, si tiene o no contrasea, el espacio asignado

USUARIOS (CREAR)
Primer problema:
Una escuela necesita crear 2 usuarios diferentes en su base de datos. Uno denominado
"director" y otro "profesor". Luego se les concedern diferentes permisos para retringir el
acceso a los diferentes objetos. Conctese como administrador (por ejemplo "system").
1- Primero eliminamos el usuario "director", porque si existe, aparecer un mensaje de error:
drop user director cascade;
2- Cree un usuario "director", con contrasea "escuela" y 100M de espacio en "system"
3- Elimine el usuario "profesor":
drop user profesor cascade;
4- Cree un usuario "profesor", con contrasea "maestro" y espacio en "system"
5- Consulte el diccionario "dba_users" y analice la informacin que nos muestra

PERMISO DE CONEXIN
Los usuarios necesitan permisos para poder acceder a la base de datos y a los objetos de la misma.
Los privilegios pueden ser de dos tipos: del sistema y sobre objetos.
Como mnimo, un usuario debe tener permiso para conectarse.
El permiso "create session" es un privilegio de sistema.
Para conceder permiso de conexin a un usuario empleamos la instruccin "grant".
Sintaxis bsica:
grant create session to USUARIO;
En el siguiente ejemplo concedemos al usuario "juan" permiso para conectarse:
grant create session to juan;
Podemos consultar el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a los
usuarios. Nos mostrar el nombre del usuario (grantee) y el permiso (privilege), entre otra informacin
que analizaremos prximamente.
Luego de tener permiso para crear sesin, puede crear una sesin presionando el cono "new
connection" en la solapa "connections"; se abrir una ventana en la cual deber colocar un nombre de
conexin ("connection name", puede ser el mismo nombre de usuario), el nombre del usuario
("username") y la contrasea ("password"), luego presionar el botn "connect"; se abrir una nueva
solapa (nueva conexin) con el nombre del usuario; no se abrir la nueva conexin si:
a) el usuario para quien quiere abrir una nueva sesin no existe,
b) la contrasea es incorrecta o
c) el usuario existe pero no tiene permiso "create session".
Si consultamos el diccionario "user_sys_privs" obtendremos la misma informacin que "dba_sys_privs"
pero nicamente del usuario actual.
Podemos averiguar el nombre del usuario conectado con la siguiente sentencia:
select user from dual;

PERMISO DE CONEXIN
Problema:
Creamos un usuario denominado "ana", con contrasea "anita", le asignamos espacio en
"system" (100M). Antes lo eliminamos por si existe:
drop user ana cascade; create user ana identified by anita default tablespace system quota
100M on system;
Creamos un usuario denominado "juan", con contrasea "juancito", le asignamos espacio en
"system" (100M). Antes lo eliminamos por si existe:
drop user juan cascade; create user juan identified by juancito default tablespace system
quota 100M on system;
Consultamos el diccionario "dba_users" y analizamos la informacin que nos muestra:
select username, password, default_tablespace, created from dba_users;
Verificamos que los usuarios "ana" y "juan" existen.
Consultamos el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a
nuestros usuarios. Nos mostrar el nombre del usuario (grantee) y el permiso (si lo tiene):
select grantee, privilege from dba_sys_privs where GRANTEE='ANA' or grantee='JUAN';
Nos muestra que estos usuarios no tienen ningn privilegio concedido.
Concedemos a "juan" permiso para conectarse:
grant create session to juan;
Consultamos el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a
"juan":
select grantee,privilege from dba_sys_privs where grantee='JUAN';

PERMISO DE CONEXIN
Tiene permiso "create session". Abrimos una nueva conexin para "juan":
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): juan;
- "username" (nombre del usuario): juan y
- "password" (contrasea): juancito.
Luego presionamos "connect"; se abre una nueva solapa (nueva conexin) con el nombre del usuario
(juan).
En la conexin de "juan" podemos consultar sus privilegios:
select username, privilege from user_sys_privs;
Note que nicamente aparecen los permisos del usuario actual.
Para obtener el nombre del usuario conectado, empleamos la siguiente sentencia:
select user from dual;
Aparece Juan. Volvemos a la conexin "system" (la otra solapa). Comprobamos el usuario actual:
select user from dual;
Aparece System.
Ya sabemos abrir una nueva sessin de usuario. Aprendimos que existen 3 razones por las cuales una
nueva sesin no se pueda iniciar; una de ellas es que el usuario no exista. Intentemos abrir una nueva
conexin para un usuario inexistente:
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): pedro;
- "username" (nombre del usuario): pedro y

PERMISO DE CONEXIN
Otra razn por la cual la apertura de una nueva sesin puede fallar es que el usuario no tenga permiso
de conexin. Intentemos abrir una nueva conexin para un usuario que no tenga tal permiso, caso de
"ana":
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): ana;
- "username" (nombre del usuario): ana y
- "password" (contrasea): anita.
Luego presionamos "connect"; la sessin no se abre, un mensaje de error indica que el usuario "ana" no
tiene permiso "create session" por lo cual se deniega la conexin. Cancelamos.
Concedemos a "ana" permiso de conexin:
grant create session to ana;
Consultamos el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a "ana":
select grantee,privilege from dba_sys_privs where grantee='ANA';
Tiene permiso "create session".
La tercera razn por la cual puede no iniciarse una nueva sesin es que coloquemos la contrasea
incorrecta. Intentemos abrir una nueva conexin para un usuario que tenga permiso, pero le demos una
contrasea incorrecta:
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): ana;
- "username" (nombre del usuario): ana y
- "password" (contrasea): ana.
Luego presionamos "connect"; la sessin no se abre, un mensaje de error indica que el nombre de

PERMISO DE CONEXIN
Abramos una nueva conexin para "ana" colocando los datos correctos:
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la
cual colocamos:
- "connection name" (nombre de la conexin): ana;
- "username" (nombre del usuario): ana y
- "password" (contrasea): anita.
Presionamos "connect"; se abre una nueva solapa (nueva conexin) con el nombre del
usuario (ana).
Consultamos el diccionario "user_sys_privs":
select username,privilege from user_sys_privs;
Note que nicamente aparecen los permisos del usuario actual.
Comprobamos que estamos en la sesin de "ana":
select user from dual;

PERMISO DE CONEXIN
Primer problema:
Una escuela necesita crear 3 usuarios diferentes en su base de datos. Uno denominado
"director", otro "profesor" y un tercero "alumno".
Conctese como administrador (por ejemplo "system").
1- Elimine el usuario "director", porque si existe, aparecer un mensaje de error:
drop user director cascade;
2- Cree un usuario "director", con contrasea "dire" y 100M de espacio en "system"
3- Elimine el usuario "profesor":
drop user profesor cascade;
4- Cree un usuario "profesor", con contrasea "profe" y espacio en "system"
5- Elimine el usuario "alumno" y luego crelo con contrasea "alu" y espacio en "system"
6- Consulte el diccionario "dba_users" y analice la informacin que nos muestra
Deben aparecer los tres usuarios creados anteriormente.
7- Consulte el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a
nuestros tres usuarios
Nos muestra que estos usuarios no tienen ningn privilegio concedido.
8- Conceda a "director" permiso para conectarse
9- Conceda a "profesor" permiso para conectarse
10- Consulte el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a

PERMISO DE CONEXIN
11- Abra una nueva conexin para "director". Se debe abrir una nueva solapa (nueva
conexin) con el nombre del usuario (director)
12- En la conexin de "director" consulte sus privilegios
13- Obtenga el nombre del usuario conectado
14- Vuelva a la conexin "system" (la otra solapa) y compruebe el usuario actual
15- Intente abrir una nueva conexin para el usuario inexistente. Debe aparecer un mensaje
de error y denegarse la conexin. Cancele.
16- Intente abrir una nueva conexin para el usuario "profesor" colocando una contrasea
incorrecta. Debe aparecer un mensaje de error y denegarse la conexin. Cancele.
17- Abra una nueva conexin para "profesor" colocando los datos correctos. Se debe abrir
una nueva solapa (nueva conexin) con el nombre del usuario (profesor).
18- Intentemos abrir una nueva conexin para el usuario "alumno", el cual no tiene permiso.
Un mensaje de error indica que el usuario "alumno" no tiene permiso "create session" por lo
cual se deniega la conexin. Cancele.
19- Conceda a "alumno" permiso de conexin
20- Consulte el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a
"alumno"
21- Abra una nueva conexin para "ALUMNO". Se debe abrir una nueva solapa (nueva
conexin) con el nombre del usuario (profesor)
22- Consulte el diccionario "user_sys_privs"

PRIVILEGIOS DEL SISTEMA (CONCEDER)


Aprendimos que los usuarios necesitan permisos para poder acceder a la base de datos y a
los objetos de la misma. Dijimos que los privilegios pueden ser de dos tipos: a) del sistema y
b) sobre objetos.
Hemos aprendido a conceder un privilegio de sistema: "create session", que es necesario
para poder conectarse a la base de datos, es decir, para iniciar una sesin.
Pero teniendo nicamente este permiso, no podemos hacer mucho, solamente iniciar una
sesin, pero no podemos crear tablas, ni ningn otro objeto; por ello son importantes los
permisos de creacin de objetos.
Aprendamos ms sobre los privilegios de sistema.
Los privilegios de sistema son permisos para realizar ciertas operaciones en la base de
datos.
Los siguientes son algunos de los privilegios de sistema existentes:
- create session: para conectarse a la base de datos;
- create table: crear tablas;
- create sequence: crear secuencias;
- create view: crear vistas;
- create trigger: crear disparadores en su propio esquema;
- create procedure: crear procedimientos y funciones;
- execute any procedure: ejecutar cualquier procedimiento en cualquier esquema;
- create user: crear usuarios y especificar claves;
- create role: crear roles;

PRIVILEGIOS DEL SISTEMA (CONCEDER)


- drop user: eliminar usuarios.
Se asignan privilegios de sistema a un usuario mediante la instruccin "grant":
Sintaxis bsica:
grant PERMISODESISTEMA to USUARIO;
Oracle permite conceder mltiples privilegios a mltiples usuarios en una misma sentencia,
debemos separarlos por comas.
En el siguiente ejemplo se concede el permiso para crear sesin a los usuarios "juan" y
"ana":
grant create sesion to juan, ana;
En el siguiente ejemplo se conceden los permisos para crear tablas y vistas al usuario "ana":
grant create table, create view to ana;
En el siguiente ejemplo se conceden 2 permisos a 2 usuarios en una sola sentencia:
grant create trigger, create procedure to juan, ana;
Consultando el diccionario "dba_sys_privs" encontramos los privilegios concedidos a los
distintos usuarios; y consultando "user_sys_privs" obtendremos la misma informacin pero
nicamente del usuario actual.

PRIVILEGIOS DEL SISTEMA (CONCEDER)


Problema:
Creamos un usuario denominado "ana", con contrasea "anita", le asignamos espacio en
"system" (100M). Antes lo eliminamos por si existe:
drop user ana cascade; create user ana identified by anita default tablespace system quota
100M on system;
Creamos un usuario denominado "juan", con contrasea "juancito", le asignamos espacio en
"system" (100M). Antes lo eliminamos por si existe:
drop user juan cascade; create user juan identified by juancito default tablespace system
quota 100M on system;
Concedemos a ambos usuarios permiso para conectarse:
grant create session to ana, juan;
Concedemos permiso para crear tablas y vistas al usuario "ana":
grant create table, create view to ana;
Concedemos permiso para crear disparadores y procedimientos a ambos usuarios:
grant create trigger, create procedure to juan, ana;
Consultamos el diccionario "dba_sys_privs" para ver los privilegios concedidos a "ana" y
"juan":
select grantee, privilege from dba_sys_privs where grantee='ANA' or grantee='JUAN' order
by grantee; Obtenemos la siguiente informacin:

PRIVILEGIOS
DEL
SISTEMA
(CONCEDER)
GRANTEE PRIVILEGE
------------------------------ANA
CREATE VIEW
ANA
CREATE PROCEDURE
ANA
CREATE TRIGGER
ANA
CREATE SESSION
ANA
CREATE TABLE
JUAN
CREATE SESSION
JUAN
CREATE PROCEDURE
JUAN
CREATE TRIGGER
Iniciamos una nueva sesin como "ana". Como "ana" creamos una tabla:
create table prueba(
nombre varchar2(30),
apellido varchar2(30) );
La tabla ha sido creada, porque "ana" tiene pivilegio "create table".
Podemos consultar el diccionario "user_sys_privs" para corroborar sus privilegios:
select privilege from user_sys_privs;Obtenemos la siguiente informacin:
PRIVILEGE --------CREATE TRIGGER
CREATE TABLE
CREATE SESSION
CREATE VIEW
CREATE PROCEDURE
Iniciamos una nueva sesin como "juan". Como "juan" intentamos crear una tabla:
create table prueba( nombre varchar2(30), apellido varchar2(30) );

PRIVILEGIOS DEL SISTEMA (CONCEDER)


Mensaje de error "privilegios insuficientes". Esto sucede porque "juan", no tiene permiso
para crear tablas.
Vemos los permisos de "juan":
select privilege from user_sys_privs;
No tiene permiso para crear tablas.
Cambiamos a la conexin "system" y concedemos a "juan" permiso para crear tablas:
grant create table to juan;
Cambiamos a la solapa "juan" y creamos una tabla:
create table prueba( nombre varchar2(30), apellido varchar2(30) );
Podemos hacerlo porque "juan" ahora tiene el permiso.
Vemos los permisos de "juan":
select privilege from user_sys_privs;
Cambiamos a la conexin "system". Veamos todas las tablas denominadas "PRUEBA":
select *from dba_objects where object_name='PRUEBA';
Note que hay una tabla propiedad de "ana" y otra que pertenece a "juan".