본문 바로가기

Database

CHAPTER18. Oracle Password Management

오라클 User의 PASSWORD 관련 설정들을 변경하여 보자.

 

기본적으로 오라클에서는 이와 관련된 SCRIPT가 내장되어 있다.

C:\oracle\product\10.1.0\db_1\RDBMS\ADMIN\utlpwdmg.sql

CREATE OR REPLACE FUNCTION verify_function

(username varchar2,

password varchar2,

old_password varchar2)

RETURN boolean IS

n boolean;

m integer;

differ integer;

isdigit boolean;

ischar boolean;

ispunct boolean;

digitarray varchar2(20);

punctarray varchar2(25);

chararray varchar2(52);

 

BEGIN

digitarray:= '0123456789';

chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

punctarray:='!"#$%&()``*+,-/:;<=>?_';

 

-- Check if the password is same as the username

IF NLS_LOWER(password) = NLS_LOWER(username) THEN

raise_application_error(-20001, 'Password same as or similar to user');

END IF;

 

-- Check for the minimum length of the password

IF length(password) < 4 THEN

raise_application_error(-20002, 'Password length less than 4');

END IF;

 

-- Check if the password is too simple. A dictionary of words may be

-- maintained and a check may be made so as not to allow the words

-- that are too simple for the password.

IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN

raise_application_error(-20002, 'Password too simple');

END IF;

 

-- Check if the password contains at least one letter, one digit and one

-- punctuation mark.

-- 1. Check for the digit

isdigit:=FALSE;

m := length(password);

FOR i IN 1..10 LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) = substr(digitarray,i,1) THEN

isdigit:=TRUE;

GOTO findchar;

END IF;

END LOOP;

END LOOP;

IF isdigit = FALSE THEN

raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation');

END IF;

-- 2. Check for the character

<<findchar>>

ischar:=FALSE;

FOR i IN 1..length(chararray) LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) = substr(chararray,i,1) THEN

ischar:=TRUE;

GOTO findpunct;

END IF;

END LOOP;

END LOOP;

IF ischar = FALSE THEN

raise_application_error(-20003, 'Password should contain at least one \

digit, one character and one punctuation');

END IF;

-- 3. Check for the punctuation

<<findpunct>>

ispunct:=FALSE;

FOR i IN 1..length(punctarray) LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) = substr(punctarray,i,1) THEN

ispunct:=TRUE;

GOTO endsearch;

END IF;

END LOOP;

END LOOP;

IF ispunct = FALSE THEN

raise_application_error(-20003, 'Password should contain at least one \

digit, one character and one punctuation');

END IF;

 

<<endsearch>>

-- Check if the password differs from the previous password by at least

-- 3 letters

IF old_password IS NOT NULL THEN

differ := length(old_password) - length(password);

 

IF abs(differ) < 3 THEN

IF length(password) < length(old_password) THEN

m := length(password);

ELSE

m := length(old_password);

END IF;

 

differ := abs(differ);

FOR i IN 1..m LOOP

IF substr(password,i,1) != substr(old_password,i,1) THEN

differ := differ + 1;

END IF;

END LOOP;

 

IF differ < 3 THEN

raise_application_error(-20004, 'Password should differ by at \

least 3 characters');

END IF;

END IF;

END IF;

-- Everything is fine; return TRUE ;

RETURN(TRUE);

END;

/

 

ALTER PROFILE DEFAULT LIMIT

PASSWORD_LIFE_TIME 60 --암호유효기간 60

PASSWORD_GRACE_TIME 10 --암호를 변경하지 않을시 계속 재촉하는 기간

 

 

 

PASSWORD_REUSE_TIME 1800 --1800 동안 예전에 사용했던 값을 사용할 없다.

PASSWORD_REUSE_MAX UNLIMITED --여기에 값을 주게 되면 예전에 사용되었던 passwd 갯수를 기억하고 갯수만큼은 사용할 없게한다.

-- 둘의 값은 양자택일로서 하나가 언리미티드면 하나는 숫자값이어야 한다.

 

 

FAILED_LOGIN_ATTEMPTS 3 --로긴이 3 틀리면 새로 접속해야 한다.

PASSWORD_LOCK_TIME 1/1440 --로긴이 틀려 새로 접속해야할 1/1440(=1) 동안 세션이 잠긴다.

PASSWORD_VERIFY_FUNCTION verify_function;

 

이제 sys에서 스크립트를 실행한다.

 

SQL>@C:\oracle\product\10.1.0\db_1\RDBMS\ADMIN\utlpwdmg.sql

 

이제 실습을 위해 SYS에서 임의의 사용자(SCOTT) PW를 만료시킨다.

ALTER USER SCOTT PASSWORD EXPIRE;

 

이제 SCOTT으로 접속을 시도하게 되면 password 변경하란 메시지가 출력된다.

또한 새롭게 생성될 passwd 규칙이 위 스크립트에서 기본 4글자에 영/숫/특 기호의 조합이 이루어져야 되며,

암호 입력에 3번이상 오류가 발생시, 계정이 자동으로 잠기므로

 

sys에서 계정의 잠금을 풀어준다.

ALTER USER SCOTT ACCOUNT UNLOCK;

(다른 실습들은 SKIP)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

실습을 원상태로 돌릴려면 아래의 SQL문을 실행한다.

 

ALTER PROFILE "DEFAULT"

LIMIT FAILED_LOGIN_ATTEMPTS

UNLIMITED PASSWORD_LOCK_TIME

UNLIMITED PASSWORD_GRACE_TIME

UNLIMITED PASSWORD_LIFE_TIME

UNLIMITED PASSWORD_REUSE_TIME

UNLIMITED PASSWORD_VERIFY_FUNCTION NULL;

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

설정 내용들을 확인하기 위해서는

SELECT *

FROM DBA_PROFILES

WHERE PROFILE='DEFAULT';

통해 설정 값들을 확인 변경할 있다.