Saltar al contenido principal

Control de acceso a la información

Documento escrito por: Oussama Osman

Puedes ver todos los documentos de este autor aquí.

Conceptos previos:

BD: Base de Datos

SO: Sistema Operativo

DCL: Lenguaje para el control de acceso a los objetos de la BD

SGA: área global del sistema o system global area

DD: diccionario de datos

Gestión de usuarios

Un usuario con contraseña es lo que se usa para la conexión a la base de datos. Este usuario tiene permisos para usar algunos objetos y otros no de la base de datos.

Cuentas administrativas

Estas se crean en la instalación:

  • SYS:
    • Rol DBA
    • Clave por defecto: change_on_install
    • Propietario del diccionario de datos
    • Su usa para arrancar o modificar los componentes de la BD
  • SYSTEM:
    • Rol DBA
    • Clave por defecto: manager
    • DBA por excelencia
    • Se usa para tareas administrativas habituales como alta de usuarios o creación de tablespaces
  • SYSMAN: Usuario para realizar tareas administrativas con la app Database Control de Enterprise Manager
  • DBSMNP: Usuario con permisos para monitorizar Enterprise Manager

Privilegios administrativos

  • SYSDBA:
    • Parar y arrancar la BD
    • Modificar la BD
    • Crear y borrar bases de datos
    • Cambiar el archivo de parámetros
    • Cambiar el modo de archivado de la BD
    • Recuperar la BD
    • Incluye el privilegio de sistema RESTRICTED SESSION
  • SYSOPER:
    • Privilegios de SYSDBA
    • Crear y borrar la BD
    • Recuperar en todas las formas la BD

Consultar Usuarios

Los usuarios los podemos ver en la tabla dba_users:

SELECT * FROM dba_users;

Crear Usuarios

Para crear un usuario se puede usar la siguiente instrucción:

CREATE USER nombre IDENTIFIED BY contra
DEFAULT TABLESPACE tablespace
QUOTA 20K ON tablespace
ACCOUNT LOCK;

La sintaxis de esta sentencia es la siguiente:

Create User Oracle Documentation

Imagen de la Documentación Oficial de Oracle

info

La quota es un entero seguido de las letras K, M, G, T que representan KB, MB, GB y TB siendo 2TB el máximo, a partir de ahí se debe poner UNLIMITED.

Modificar Usuarios

Para modificar un usuario existente se debe usar la instrucción ALTER:

ALTER USER nombre IDENTIFIED BY contranueva;

ALTER USER nombre QUOTA UNLIMITED ON tablespace;

Las sintaxis de esta sentencia son las siguientes:

Alter User Oracle Documentation

Imagen de la Documentación Oficial de Oracle

Borrar Usuarios

Para borrar un usuario usamos la instrucción DROP, y en caso de que el usuario tenga objetos en la BD, pondremos CASCADE al final de la instrucción:

  • Si está vacío:

    DROP USER nombre;
  • Si tiene objetos:

    DROP USER nombre CASCADE;

Las sintaxis de esta sentencia son las siguientes:

Drop User Oracle Documentation

Imagen de la Documentación Oficial de Oracle

Modos de autenticación

info

Autenticación: Modo en el que el usuario verifica y valida quién es.

Por el SO

Este se usa para usuarios con permisos administrativos:

  1. Una vez instalado Oracle, en el SO se crean dos grupos relacionados con los privilegios SYSDBA y SYSOPER:
    • Windows: se llaman ORA_DBA y ORA_OPER.
    • Linux: dba y oper.
  2. Los usuarios de esos grupos se conectan sin necesidad de escribir la clave y usuario mediante:
    • CONNECT / AS sysdba
    • CONNECT / AS sysoper

Por archivos de contraseñas

Se utiliza si no se confía en el anterior método o para validar usuarios administradores:

  1. Los usuarios de tipo SYSDBA o SYSOPER tienen que introducir usuario y contraseña.
  2. Los datos son validados en un fichero de password.

En caso de que este archivo no exista, se puede crear con la siguiente instrucción:

ORAPWD FILE=ruta [ENTRIES=n]
[FORCE={Y|N}] [IGNORECASE={Y|N}] [NOSYSDBA={Y|N}]
  • FILE: Nombre del archivo.
  • ENTRIES: (opcional) Máximo número de contraseñas que permite el archivo.
  • FORCE: (opcional) Si es y, permite sobrescribir el archivo.
  • IGNORECASE: (opcional) Si es y, no tiene en cuenta mayúsculas, todo minúsculas.
  • NOSYSDBA: (opcional) Para instalaciones del Data Vault.

También debemos indicar el parámetro de inicio REMOTE_LOGIN_ PASSWORDFILE con el valor apropiado. Estos valores pueden ser:

  • NONE: No permite usar el archivo de contraseñas.
  • EXCLUSIVE: (por defecto) El archivo de contraseñas solo se usa en la instancia actual.
  • SHARED: Un archivo de contraseñas compartido y usado por múltiples BD en el mismo servidor, o múltiples instancias de una base de datos Oracle Real Application Clusters (RAC), es decir, bases de datos distribuidas. Este archivo no puede ser modificado, por lo tanto, no se pueden añadir usuarios ya que estos se añaden al crear el archivo (EXCLUSIVE) y después este se cambia a SHARED para ser compartido.
A tener en cuenta

Para cambiar este parámetro hay que reiniciar la BD.

Para ver los usuarios guardados en este archivo se usa la vista v$PWFILE_USERS.

Por servicios externos

La autenticación la hace un servicio externo que se asociará a Oracle, como Kerberos o RADIUS.

Global

Usando un servicio LDAP para realizar la autenticación. Oracle tiene un servicio LDAP integrado en Oracle Applications que se llama Oracle Internet Directory.

Por contraseña en el DD

Esta suele ser la forma común de autenticar a los usuarios normales.

  1. La contraseña se verifica en el diccionario de datos, por lo tanto, la BD debe estar montada y abierta.
  2. La contraseña se pasa encriptada (algoritmo AES) desde el cliente al servidor.

Privilegios sobre objetos

Privilegio

Un privilegio es la capacidad de un usuario, dentro de la BD, de realizar ciertas operaciones o tener acceso a determinados objetos de otros usuarios. Los usuarios tienen unos privilegios que son los que les dan permisos de uso sobre algunos objetos.

Los privilegios se dividen en dos grupos:

  • Privilegios del sistema.
  • Privilegios sobre objetos.

Grant Oracle Documentation

Imagen de la Documentación Oficial de Oracle

Privilegios sobre objetos

Permiten acceder y realizar consultas y cambios en los datos de los objetos de otros, como por ejemplo consultar una tabla perteneciente a otro usuario.

Los permisos sobre objetos más habituales son estos:

INSTRUCCIÓNTABLAVISTASECUENCIAProcedimiento
ALTERXX
DELETEXX
EXECUTEX
INDEXX
INSERTXX
REFERENCESX
SELECTXXX
UPDATEXX

Conceder privilegios

Para conceder privilegios se usa el GRANT, con la siguiente sintaxis :

grant object privileges

Imagen de la Documentación Oficial de Oracle

El ON tiene la siguiente sintaxis:

on object clause

Imagen de la Documentación Oficial de Oracle

Y el TO la siguiente:

grantee clause

Imagen de la Documentación Oficial de Oracle

Ejemplos:

  • Todos los permisos sobre una tabla a todo el mundo:
     GRANT all ON tabla TO public;
  • Permiso de actualizar a una columna específico de una tabla a un usuario específico:
    GRANT update (columna) ON tabla TO usuario;
  • Desde otro usuario, da permisos a un usuario sobre la tabla de un tercer usuario:
    GRANT select ON usuario3.tabla TO usuario2;
A tener en cuenta

La opción WITH GRANT OPTION que se suele colocar al final de la sentencia GRANT permite transmitir los permisos otorgados.

Revocación de privilegios

Para revocar o quitar privilegios se usa REVOKE, con la sintaxis siguiente :

Revoke Object Privileges

Imagen de la Documentación Oficial de Oracle

El ON tiene la siguiente sintaxis:

on object clause revoke

Imagen de la Documentación Oficial de Oracle

Y el FROM la siguiente:

grantee clause revoke

Imagen de la Documentación Oficial de Oracle

EJEMPLOS:

  • Todos los permisos sobre una tabla a todo el mundo:
     REVOKE all ON tabla FROM public;
  • Permiso de actualizar a una tabla a un usuario específico:
    REVOKE update ON tabla FROM usuario;
Cuidado

EL revoke no se puede hacer sobre una columna específica

Vistas con información de los privilegios

  • SESSION_PRIVS: Privilegios del usuario actual.
  • USER_TAB_PRIVS: Concesiones sobre objetos que son del usuario o recibidos por el.
  • USER_COL_PRIVS: Concesiones sobre columnas propiedad del usuario.

Privilegios del sistema

Nos permiten realizar operaciones en la BD como la conexión o creación de tablas.

Conceder privilegios

Para conceder privilegios se usa el GRANT, con la sintaxis siguiente:

grant system privileges

Imagen de la Documentación Oficial de Oracle

Y el TO la siguiente:

grantee clause

Imagen de la Documentación Oficial de Oracle

EJEMPLO:

Darle a un usuario el privilegio CREATE SESSION:

GRANT CREATE SESSION
TO usuario;

Revocación de privilegios

Para revocar o quitar privilegios se usa REVOKE, con la sintaxis siguiente :

Revoke System Privileges

Imagen de la Documentación Oficial de Oracle

Y el FROM la siguiente:

grantee clause revoke

Imagen de la Documentación Oficial de Oracle

EJEMPLO:

Quitar el privilegio DROP ANY TABLE a un usuario:

REVOKE DROP ANY TABLE
FROM usuario;

Vistas con información de los privilegios

  • DBA_SYS_PRIVS: Permisos del sistema otorgados a los usuarios.
  • USER_SYS_PRIVS: Permisos en el sistema otorgados al usuario activo.

Roles

Un role es un grupo de privilegios. El privilegio para crear un role se llama CREATE ROLE.

Crear un role

Para la creación de un role, se debe seguir la sintaxis siguiente:

create role

Imagen de la Documentación Oficial de Oracle

EJEMPLO:

  • Crear un role llamado nombre:
    CREATE ROLE nombre;
  • Crear un role llamado nombre con la contraseña contra:
    CREATE ROLE nombre IDENTIFIED BY contra;

Asignar role

Para asignar un role, se usa la sentencia GRANT

GRANT nombre_del_rol TO usuario;

Revocar role

Para quitar un role, se usa la sentencia REVOKE:

REVOKE nombre_del_rol FROM usuario;

Borrar role

Para borrar un role usaremos la sentencia DROP, pero para ello debemos previamente tener el permiso DROP ANY ROL:

DROP ROLE nombre_del_role;

Vistas con información de los roles

  • ROLE_TAB_PRIVS: Permisos sobre tablas aplicados a roles.
  • ROLE_ROLE_PRIVS: Roles que tienen otros roles.
  • USER_ROLE_PRIVS: Roles que tiene el usuario actual.

Perfiles

Los perfiles sirven para limitar los recursos que los usuarios usan. Por defecto un usuario tiene el perfil DEFAULT, que le da recursos sin límite sobre la BD.

Para poder trabajar con perfiles (crear, modificar, asignar, etc...) se debe activar la variable RESOURCE_LIMIT y poner su valor en true:

ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;

Crear un perfil

Para crear un perfil, el usuario que lo va a crear tiene que tener el permiso del sistema llamado CREATE PROFILE.

GRANT CREATE PROFILE TO usuario;

Una vez se tiene ese permiso, la sintaxis del CREATE PROFILE es la siguiente:

create profile

Imagen de la Documentación Oficial de Oracle

La sintaxis de resource_parameters es esta:

resource parameters

Imagen de la Documentación Oficial de Oracle

ParámetroSignificado
SESSION_PER_USERNúmero de sesiones simultáneas del usuario
CPU_PER_SESSIONLímite de tiempo de CPU para una sesión, en centésimas de segundo
CPU_PER_CALLIgual que la anterior solo que por procesos
CONNECT_TIMELímite de tiempo total transcurrido para una sesión, expresado en minutos
IDLE_TIMELímite de tiempo de inactividad de una sesión, expresado en minutos
LOGICAL_READS_PER_SESSIONNúmero permitido de bloques leídos por sesión
LOGICAL_READS_PER_CALLNúmero permitido de bloques leídos por proceso
PRIVATE_SGACantidad de espacio privado que una sesión puede asignar en el grupo compartido del (SGA)
COMPOSITE_LIMITCoste total de recursos para una sesión, expresado en unidades de servicio. Calculado según CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION, y PRIVATE_SGA.

Y la sintaxis de password_parameters es la siguiente:

password parameters

Imagen de la Documentación Oficial de Oracle

ParámetroSignificadoValor por defecto
FAILED_LOGIN_ATTEMPTSNúmero consecutivo de intentos fallidos al poner la contraseña antes de bloquear la cuenta10
PASSWORD_LIFE_TIMENúmero de días de vigencia de la contraseña180
PASSWORD_REUSE_TIMENúmero de días que una contraseña se puede reutilizar
PASSWORD_LOCK_TIMENúmero de días que estará bloqueada la cuenta si se supera el límite de FAILED_LOGIN_ATTEMPTS1
PASSWORD_GRACE_TIMEDías de más a partir del límite del PASSWORD_LIFE_TIME7
INACTIVE_ACCOUNT_TIMENúmero de días consecutivos sin inicio de sesión en la cuenta, después la cuenta se bloquearáUNLIMITED
PASSWORD_VERIFY_FUNCTIONFunción que comprueba que la nueva contraseña sea lo suficientemente compleja y segura

El valor de cada parámetro puede ser DEFAULT, UNLIMITED o el tipo de dato que espera.

EJEMPLO: Crear un perfil llamado 'perfil' con un máximo de 7 intentos fallidos antes de bloquear la cuenta:

CREATE PROFILE perfil LIMIT FAILED_LOGIN_ATTEMPTS 7;

Modificar un perfil

Para modificar un perfil usaremos ALTER PROFILE, el cual tiene la siguiente sintaxis:

alter profile

Imagen de la Documentación Oficial de Oracle

La sintaxis de resource_parameters es esta:

resource parameters

Imagen de la Documentación Oficial de Oracle

Y la sintaxis de password_parameters es la siguiente:

password parameters

Imagen de la Documentación Oficial de Oracle

EJEMPLO: Modificar un perfil para que los intentos fallidos de inicio de sesión sean máximo 5 y que a partir de ahí la cuenta quede bloqueada durante 1 día:

ALTER PROFILE perfil LIMIT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1;

Borrar un perfil

Para borrar un perfil usaremos DROP, y en caso de que no esté vacío, irá acompañado con CASCADE:

DROP PROFILE perfil CASCADE;

Asignar un perfil

Para asignar u perfil hay que tener en cuenta que un usuario solo puede tener un único perfil. Para asignar un perfil usaremos la siguiente instrucción:

ALTER USER usuario PROFILE perfil;

Sinónimos

Un sinónimo sería un atajo o una sintaxis más corta para referenciar la tabla de otro usuario por ejemplo, así en vez de escribir usuario.tabla podemos escribir SINONIMO.

Permisos

Para la creación de sinónimos, el usuario que desea crearlos debe tener estos permisos:

  • Para sinónimos privados: CREATE SYNONYM
    GRANT CREATE SYNONYM TO usuario;
  • Para sinónimos públicos: CREATE PUBLIC SYNONYM
    GRANT CREATE PUBLIC SYNONYM TO usuario;

Crear un sinónimo

Para crear un sinónimo se usa esta sintaxis:

create synonym

Imagen de la Documentación Oficial de Oracle

A tener en cuenta

El OR REPLACE creará nuevamente el sinónimo si este ya existe.

EJEMPLO:

Para crear un sinónimo llamado 'nombre' de la tabla 'tabla' del usuario 'usuario' haríamos lo siguiente:

CREATE SYNONYM nombre
FOR usuario.tabla;

Borrar un sinónimo

Para borrar un sinónimo se usa DROP siguiendo esta sintaxis:

drop synonym

Imagen de la Documentación Oficial de Oracle

EJEMPLO:

Borrar un sinónimo público llamado 'syn':

DROP PUBLIC SYNONYM syn;

Consultas sobre sinónimos

  • Para saber los sinónimos creados:
    SELECT owner, synonym_name, table_owner, table_name
    FROM DBA_SYNONYMS;
  • Para saber los sinónimos públicos creados:
    SELECT owner, synonym_name, table_owner, table_name
    FROM DBA_SYNONYMS
    WHERE owner='PUBLIC';
  • Para saber el estado de los sinónimos creados:
    SELECT object_name, status
    FROM dba_objects;