Control de acceso a la información
Documento escrito por: Oussama Osman
Puedes ver todos los documentos de este autor aquí.
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:
Imagen de la Documentación Oficial de Oracle
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:
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:
Imagen de la Documentación Oficial de Oracle
Modos de autenticación
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:
- 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.
- 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:
- Los usuarios de tipo SYSDBA o SYSOPER tienen que introducir usuario y contraseña.
- 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 esy
, permite sobrescribir el archivo.IGNORECASE
: (opcional) Si esy
, 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 aSHARED
para ser compartido.
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.
- La contraseña se verifica en el diccionario de datos, por lo tanto, la BD debe estar montada y abierta.
- 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.
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ÓN | TABLA | VISTA | SECUENCIA | Procedimiento |
---|---|---|---|---|
ALTER | X | X | ||
DELETE | X | X | ||
EXECUTE | X | |||
INDEX | X | |||
INSERT | X | X | ||
REFERENCES | X | |||
SELECT | X | X | X | |
UPDATE | X | X |
Conceder privilegios
Para conceder privilegios se usa el GRANT
, con la siguiente sintaxis :
Imagen de la Documentación Oficial de Oracle
El ON
tiene la siguiente sintaxis:
Imagen de la Documentación Oficial de Oracle
Y el TO
la siguiente:
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;
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 :
Imagen de la Documentación Oficial de Oracle
El ON
tiene la siguiente sintaxis:
Imagen de la Documentación Oficial de Oracle
Y el FROM
la siguiente:
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;
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:
Imagen de la Documentación Oficial de Oracle
Y el TO
la siguiente:
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 :
Imagen de la Documentación Oficial de Oracle
Y el FROM
la siguiente:
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:
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:
Imagen de la Documentación Oficial de Oracle
La sintaxis de resource_parameters
es esta:
Imagen de la Documentación Oficial de Oracle
Parámetro | Significado |
---|---|
SESSION_PER_USER | Número de sesiones simultáneas del usuario |
CPU_PER_SESSION | Límite de tiempo de CPU para una sesión, en centésimas de segundo |
CPU_PER_CALL | Igual que la anterior solo que por procesos |
CONNECT_TIME | Límite de tiempo total transcurrido para una sesión, expresado en minutos |
IDLE_TIME | Límite de tiempo de inactividad de una sesión, expresado en minutos |
LOGICAL_READS_PER_SESSION | Número permitido de bloques leídos por sesión |
LOGICAL_READS_PER_CALL | Número permitido de bloques leídos por proceso |
PRIVATE_SGA | Cantidad de espacio privado que una sesión puede asignar en el grupo compartido del (SGA) |
COMPOSITE_LIMIT | Coste 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:
Imagen de la Documentación Oficial de Oracle
Parámetro | Significado | Valor por defecto |
---|---|---|
FAILED_LOGIN_ATTEMPTS | Número consecutivo de intentos fallidos al poner la contraseña antes de bloquear la cuenta | 10 |
PASSWORD_LIFE_TIME | Número de días de vigencia de la contraseña | 180 |
PASSWORD_REUSE_TIME | Número de días que una contraseña se puede reutilizar | |
PASSWORD_LOCK_TIME | Número de días que estará bloqueada la cuenta si se supera el límite de FAILED_LOGIN_ATTEMPTS | 1 |
PASSWORD_GRACE_TIME | Días de más a partir del límite del PASSWORD_LIFE_TIME | 7 |
INACTIVE_ACCOUNT_TIME | Número de días consecutivos sin inicio de sesión en la cuenta, después la cuenta se bloqueará | UNLIMITED |
PASSWORD_VERIFY_FUNCTION | Funció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:
Imagen de la Documentación Oficial de Oracle
La sintaxis de resource_parameters
es esta:
Imagen de la Documentación Oficial de Oracle
Y la sintaxis de password_parameters
es la siguiente:
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:
Imagen de la Documentación Oficial de Oracle
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:
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;