M2 - Bases de dades / Continguts UF3: Perfils

De wikiserver
La revisió el 10:51, 4 feb 2019 per Rsort (Discussió | contribucions) (Creación, borrado y alteración de perfiles)
Dreceres ràpides: navegació, cerca

Aquest material s'ha elaborat a partir de la pàgina de Orlando Olguin

Introducción

La forma en que funciona un perfil, es que al mismo, se le asignan valores que serán los límites para modelar el comportamiento del usuario o esquema al que será asignado. Un límite, puede ser la cantidad de segundos que el usuario estará sin realizar actividades en la base de datos antes de ser desconectado. Otro límite, puede ser la cantidad de intentos fallidos de conexión por contraseña incorrecta. Estos límites, los detallo más adelante. Los profiles existen desde la versión 7 de la base de datos, prácticamente con la misma estructura.

Para que los perfiles funcionen, el parámetro de la base de datos resource_limit, deberá tener el valor a true.

SQL> show parameter resource_limit

NAME                   TYPE        VALUE
-------------------    --------    -------
resource_limit         boolean     TRUE

Per activar/desactivar la limitació de recursos:

ALTER SYSTEM SET RESOURCE_LIMIT=TRUE [SCOPE = BOTH]

La clàusula SCOPE = BOTH fa que la modificació sigui persistent en cas de es reinicií la base de dades.

Creación, borrado y alteración de perfiles

Para crear un perfil, se requiere tener el privilegio CREATE PROFILE asignado en el usuario que lo quiere crear, y se usa el siguiente comando:

create profile nombre_perfil limit
       nombre_limite_1 [valor entero | unlimited | default ]
       nombre_limite_2 [valor entero | unlimited | default ]
       ...
       nombre_limite_n [valor entero | unlimited | default ];

Por defecto, cada perfil creado tiene todos los límites posibles del mismo de acuerdo a la versión de la base de datos. Existe un perfil llamado default el cual, regirá a todos los usuarios de la base de datos, mientras no sea creado uno nuevo y asignado a un usuario en especial. En el perfil creado, los límites que no sean asignados con un valor predefinido, tendrán el valor del perfil default de la base de datos, como se ve en el siguiente ejemplo:

SQL> create profile lim_prueba limit connect_time 45;

Profile created.

SQL> select *
  2  from   dba_profiles
  3  where  profile = 'LIM_PRUEBA'
  4  order by resource_name;

PROFILE              RESOURCE_NAME             RESOURCE LIMIT
-------------------- ------------------------- -------- ---------------
LIM_PRUEBA           COMPOSITE_LIMIT           KERNEL   DEFAULT
LIM_PRUEBA           CONNECT_TIME              KERNEL   45
LIM_PRUEBA           CPU_PER_CALL              KERNEL   DEFAULT
LIM_PRUEBA           CPU_PER_SESSION           KERNEL   DEFAULT
LIM_PRUEBA           FAILED_LOGIN_ATTEMPTS     PASSWORD DEFAULT
LIM_PRUEBA           IDLE_TIME                 KERNEL   DEFAULT
LIM_PRUEBA           LOGICAL_READS_PER_CALL    KERNEL   DEFAULT
LIM_PRUEBA           LOGICAL_READS_PER_SESSION KERNEL   DEFAULT
LIM_PRUEBA           PASSWORD_GRACE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_LIFE_TIME        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_LOCK_TIME        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_MAX        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_VERIFY_FUNCTION  PASSWORD DEFAULT
LIM_PRUEBA           PRIVATE_SGA               KERNEL   DEFAULT
LIM_PRUEBA           SESSIONS_PER_USER         KERNEL   DEFAULT
16 rows selected.

Este perfil, lo podemos modificar si nuestro usuario tiene el privilegio ALTER PROFILE. Gracias a éste, podemos asignar o desasignar valores a los distintos límites del perfil.

SQL> alter profile lim_prueba limit password_life_time 30;
Profile altered.

SQL> select *
  2  from   dba_profiles
  3  where  profile = 'LIM_PRUEBA'
  4  order by resource_name;

PROFILE              RESOURCE_NAME             RESOURCE LIMIT
-------------------- ------------------------- -------- ---------------
LIM_PRUEBA           COMPOSITE_LIMIT           KERNEL   DEFAULT
LIM_PRUEBA           CONNECT_TIME              KERNEL   45
LIM_PRUEBA           CPU_PER_CALL              KERNEL   DEFAULT
LIM_PRUEBA           CPU_PER_SESSION           KERNEL   DEFAULT
LIM_PRUEBA           FAILED_LOGIN_ATTEMPTS     PASSWORD DEFAULT
LIM_PRUEBA           IDLE_TIME                 KERNEL   DEFAULT
LIM_PRUEBA           LOGICAL_READS_PER_CALL    KERNEL   DEFAULT
LIM_PRUEBA           LOGICAL_READS_PER_SESSION KERNEL   DEFAULT
LIM_PRUEBA           PASSWORD_GRACE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_LIFE_TIME        PASSWORD 30
LIM_PRUEBA           PASSWORD_LOCK_TIME        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_MAX        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_VERIFY_FUNCTION  PASSWORD DEFAULT
LIM_PRUEBA           PRIVATE_SGA               KERNEL   DEFAULT
LIM_PRUEBA           SESSIONS_PER_USER         KERNEL   DEFAULT

16 rows selected.

Nota. Si se desea regresar un valor al default, se tendrá que poner dicho valor en vez de un número propiamente.

Para borrar un perfil, nada más tenemos que aplicar el comando drop como en muchos tipos de objetos en Oracle.

SQL> drop profile lim_prueba;
Profile dropped.
SQL> select *
  2  from   dba_profiles
  3  where  profile = 'LIM_PRUEBA'
  4  order by resource_name;
no rows selected

Ok, entonces ya sabemos crear un perfil y que le podemos asignar un límite con algún valor que nos sea de utilidad. Ahora, ¿cuáles son los límites que podemos asignar a un perfil? A continuación, muestro una lista de los valores y lo que afectan.

Límites aplicables a perfiles

COMPOSITE_LIMIT Suma del máximo de CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION y PRIVATE_SGA. Si este limite es excedido, Oracle aborta la sesión y regresa un error.

CONNECT_TIME Tiempo permitido de conexión por sesión en minutos.

CPU_PER_CALL Máximo tiempo de CPU por llamada en centésimas de segundo.

CPU_PER_SESSION Máximo tiempo de CPU por sesión en centésimas de segundo.

IDLE_TIME Tiempo máximo permitido sin actividad por el usuario antes de ser desconectado. Se expresa en minutos.

LOGICAL_READS_PER_CALL Máximo número de bloques de base de datos leídos por llamada.

LOGICAL_READS_PER_SESSION Máximo numero de bloques de base de datos leídos por sesión.

PRIVATE_SGA Máxima cantidad de bytes de espacio privado reservado en la SGA. Se puede expresar en el formato enteroK para kilobytes o enteroM para megabytes.

SESSIONS_PER_USER Máximo número de sesiones concurrentes permitidas por usuario.

FAILED_LOGIN_ATTEMPTS Número de intentos fallidos de conexión de un usuario, antes de que Oracle ponga la cuenta bloqueada.

PASSWORD_GRACE_TIME Número de días de gracia para realizar un cambio de password de nuestra cuenta. Si en el periodo de tiempo delimitado no fue cambiado el password, el password expira.

PASSWORD_LIFE_TIME Número de días de vida de un password.

PASSWORD_LOCK_TIME Número de días que permanecerá bloqueado un usuario después de rebasar el límite FAILED_LOGIN_ATTEMPTS.

PASSWORD_REUSE_MAX Número de veces que debe cambiar una contraseña antes de poder ser re-usada la original.

PASSWORD_REUSE_TIME Número de días que tienen que pasar para poder re-usar un password.

PASSWORD_VERIFY_FUNCTION En este parámetro, se puede especificar un script para validar el password. Por ejemplo, que tenga una determinada cantidad de caracteres, que tenga letras y números, etcétera.


Asignando el perfil a un usuario

Cuando ya tenemos creado nuestro perfil, podemos asignarlo a los distintos usuarios por medio de un alter user, o al momento de crearlos con create user.

alter user nombre_usuario profile nombre_perfil;

create user nombre_usuario
identified by        password_usuario
default tablespace   nombre_tbs
temporary tablespace nombre_tbs
profile              nombre_perfil;

por ejemplo,

SQL> alter user curso profile lim_prueba;

User altered.

SQL> select username, default_tablespace, temporary_tablespace, profile
  2  from   dba_users
  3  where  username = 'CURSO';

USERNAME             DEFAULT_TABLESPACE        TEMPORARY_TABLESPACE      PROFILE
-------------------- ------------------------- ------------------------- --------------------
CURSO                DATOS                     TEMP                      LIM_PRUEBA

SQL> create user usr_prueba
  2  identified by pwdprueba
  3  default tablespace datos
  4  temporary tablespace temp
  5  profile lim_prueba;

User created.

SQL> select username, default_tablespace, temporary_tablespace, profile
  2  from   dba_users
  3  where  username = 'USR_PRUEBA';

USERNAME             DEFAULT_TABLESPACE        TEMPORARY_TABLESPACE      PROFILE
-------------------- ------------------------- ------------------------- --------------------
USR_PRUEBA           DATOS                     TEMP                      LIM_PRUEBA

de esta forma, ya el usuario curso y el usuario usr_prueba, tienen asignado el perfil lim_prueba.

Para quitar la desasignación del perfil, se tendrá que asignar el perfil default al usuario. Por ejemplo:

SQL> alter user curso profile default;
User altered.
SQL> select username, default_tablespace, temporary_tablespace, profile
  2  from   dba_users
  3  where  username = 'CURSO';
USERNAME             DEFAULT_TABLESPACE        TEMPORARY_TABLESPACE      PROFILE
-------------------- ------------------------- ------------------------- --------------------
CURSO                DATOS                     TEMP                      DEFAULT

Viendo el perfil en acción

Ahora vamos a probar un perfil como el que mostramos en este post a manera de ejemplo. Tendrá un tiempo de inactividad de 1 minuto y un límite de intentos fallidos de 3:

SQL> create profile lim_prueba limit
  2       idle_time             1
  3      failed_login_attempts 3;
Profile created.
SQL> select *
  2  from   dba_profiles
  3  where  profile = 'LIM_PRUEBA'
  4  order by resource_name;
PROFILE              RESOURCE_NAME             RESOURCE LIMIT
-------------------- ------------------------- -------- ---------------
LIM_PRUEBA           COMPOSITE_LIMIT           KERNEL   DEFAULT
LIM_PRUEBA           CONNECT_TIME              KERNEL   DEFAULT
LIM_PRUEBA           CPU_PER_CALL              KERNEL   DEFAULT
LIM_PRUEBA           CPU_PER_SESSION           KERNEL   DEFAULT
LIM_PRUEBA           FAILED_LOGIN_ATTEMPTS     PASSWORD 3
LIM_PRUEBA           IDLE_TIME                 KERNEL   1
LIM_PRUEBA           LOGICAL_READS_PER_CALL    KERNEL   DEFAULT
LIM_PRUEBA           LOGICAL_READS_PER_SESSION KERNEL   DEFAULT
LIM_PRUEBA           PASSWORD_GRACE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_LIFE_TIME        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_LOCK_TIME        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_MAX        PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_REUSE_TIME       PASSWORD DEFAULT
LIM_PRUEBA           PASSWORD_VERIFY_FUNCTION  PASSWORD DEFAULT
LIM_PRUEBA           PRIVATE_SGA               KERNEL   DEFAULT
LIM_PRUEBA           SESSIONS_PER_USER         KERNEL   DEFAULT
SQL> create user usr_prueba
  2  identified by pwdprueba
  3  default tablespace datos
  4  temporary tablespace temp
  5  profile lim_prueba;
User created.
SQL> select username, default_tablespace, temporary_tablespace, profile
  2  from   dba_users
  3  where  username = 'USR_PRUEBA';
USERNAME             DEFAULT_TABLESPACE        TEMPORARY_TABLESPACE      PROFILE
-------------------- ------------------------- ------------------------- --------------------
USR_PRUEBA           DATOS                     TEMP                      LIM_PRUEBA
SQL> grant connect to usr_prueba;
Grant succeeded.
E:\Oracle\Product\10.2.0\BIN>sqlplus usr_prueba/intento1
SQL*Plus: Release 10.2.0.4.0 - Production on Sßb Sep 19 19:56:46 2009
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: usr_prueba/intento2
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: usr_prueba/intento3
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus