Si es cierto, es una pregunta muy grande la que he hecho. Tienen toda la razón.
Pero han pensando tan sólo un segundo, realmente cuanto tiempo han dedicado a este tipo de tareas que son "cajoneras".?
A ver, cuando tienes decenas de bases de datos y cientos de usuarios y no confías la autenticación a un servicio LDAP para que otros sean los que sufran con el mantenimiento de vencimiento de contraseñas, la verdad es que uno busca como simplificar ciertas tareas.
Incluso, muchas veces, las acciones más comúnes tiene que ver con los vencimientos de los propios compañeros del área de TI en los ambientes de UAT o DEV.
Una manera de mitigar esta sobrecarga de trabajo es "semi-automatizando" la tarea.
Veamos a ver como lo podemos hacer.
Primero que todo, vamos a crear una PROFILE en la raiz de contenedor de base de datos, para que este disponible para todos los PDBs que tengamos que gestionar.
No vamos a ser tan rigurosos con los tiempos de vigencia y tiempo ocioso.
Nuestro PERFIL a crear, tendrá como parámetros 30 minutos de tiempo ocioso antes de ser desconectado, soporta hasta 5 fallas en el ingreso de la contraseña antes de bloquear la cuenta, va a tener un período de vida de 45 días y un período de gracia de 5. El usuario no podrá reutilizar la contraseña hasta que no se hayan cumplido 365 días y máximo podrá reutilizarla 10 veces.
CREATE PROFILE "C##PERFIL_USUARIOS_TI" LIMIT
COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT
CPU_PER_SESSION DEFAULT
CPU_PER_CALL DEFAULT
LOGICAL_READS_PER_SESSION DEFAULT
LOGICAL_READS_PER_CALL DEFAULT
IDLE_TIME 30
CONNECT_TIME DEFAULT
PRIVATE_SGA DEFAULT
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LIFE_TIME 45
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 10
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function
create or replace NONEDITIONABLE function generate_password(
no_of_digits in number,
no_of_special_characters in number,
no_of_lower in number,
no_of_upper in number
) return varchar2
AS
password VARCHAR2(40);
password_redefine VARCHAR2(40);
password_final VARCHAR2(40);
digits CONSTANT VARCHAR2(10) := '123456789';
lower CONSTANT VARCHAR2(26) := 'abcdefghijklmnpqrstuvwxyz';
upper CONSTANT VARCHAR2(26) := 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
special CONSTANT VARCHAR2(32) := '!$+{}[]?#';
BEGIN
SELECT LISTAGG(letter, NULL) WITHIN GROUP (ORDER BY DBMS_RANDOM.VALUE)
INTO password
FROM (
SELECT SUBSTR(
digits,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(digits) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_digits
UNION ALL
SELECT SUBSTR(
lower,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(lower) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_lower
UNION ALL
SELECT SUBSTR(
upper,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(upper) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_upper
UNION ALL
SELECT SUBSTR(
special,
FLOOR(DBMS_RANDOM.VALUE(1, LENGTH(special) + 1)),
1
) AS letter
FROM DUAL
CONNECT BY LEVEL <= no_of_special_characters
);
password_redefine :=dbms_random.string('U',2)||password;
RETURN password_redefine;
END;
Esta función estaría generando contraseñas parecidas a esta: MH46$1g+6p5dCr7ClZB5bQ5C3
as
pwd varchar2(30);
uname varchar2(20) := p_usuario;
v_user dba_users.username%TYPE;
v_estado dba_users.account_status%TYPE;
begin
pwd := generate_password(9,2,6,6);
execute immediate 'alter user '||uname||' identified by "'||pwd||'"';
dbms_output.put_line('done=> user: '||uname||' | new password: '||pwd);
select username, account_status into v_user, v_estado from dba_users
where username=uname;
dbms_output.put_line('Ambiente=> BD:LABORATORIO_PDB1');
dbms_output.put_line('User=> user: '||uname||' estado: '|| v_estado);
dbms_output.put_line('jdbc:oracle:thin:@//127.0.0.1:1521/pdb1.sub12180050100.vcnlab1.oraclevcn.com');
end;
set serveroutput on
execute cambiar_contrasena_user('TEST');

No hay comentarios:
Publicar un comentario
Te agradezco tus comentarios. Te esperamos de vuelta.