프린트 하기

내맘대로긍정이 알려주는

Oracle 23ai 신기능
무료 세미나 발표자료

다운로드 trending_flat

 

OS환경 : Oracle Linux 6.8 (64bit)

 

DB 환경 : Oracle Database 10.2.0.4, 11.2.0.4, 19.10

 

방법 : 오라클 패스워드 조건 설정, VERIFY_FUNCTION, oracle profile

암호관리란?

 

더 뛰어난 데이터베이스 보안을 위해서 관리자가 프로파일로 오라클 암호를 관리 제어 할 수 있는 기능

 

 

 

암호관리의 기능

계정 잠금(Accont locking) : 사용자가 지정된 시도 횟수 내에 시스템에 로그인하지 못한 경우 자동적으로 계정을 잠그는 기능

암호의 노화(aging)와 기간 만료(expire) : 암호가 수명을 갖도록 하여 그 기간이 지나면 암호를 변경 하도록 설정하는 기능

암호의 현재까지의 기록(Password history) : 암호를 검사하여 지정된 시간 동안이나 지정된 횟수 이상 사용되지 않도록 설정하는 기능

암호의 복잡성 검증(Password complexity verification) : 추측된 암호를 사용하지 못하도록 암호를 충분히 복잡하게 설정 할 수 있는 기능

 

 

암호관리를 사용하는 방법

프로파일을 사용자에게 지정하여 암호관리를 설정

CREATE USER나 ALTER USER 명령을 사용하여 계정을 잠그거나 잠금을 해제하고 기간을 만료 할 수 있음

인스턴스의 RESOURCE_LIMIT가 FALSE로 설정되어 있더라도 암호제한은 항상 시행됨

자원 제한 설정과 비슷하게 CREATE나 ALTER USER 명령을 사용하여 암호 설정을 제한하도록 프로파일을 생성하여 사용자에게 지정할 수 있음

SESSIONS_PER_USER 같은 다른 제한들은 초기화 파라미터나 ALTER SYSTEM 명령으로 

자원 제한이 enable되어 있을 때에만 시행되는 반면, 프로파일의 암호 설정은 항상 시행됨

암호 관리가 enable되면 사용자 계정은 CREATE USER나 ALTER USER 명령을 사용하여 잠그거나 잠금을 해제할 수 있음

 

 

 

PASSWORD_VERIFY_FUNCTION이란?

 

사용자에게 새로운 암호를 할당하기 전에 암호의 복합성, 타당성을 인증하는 PL/SQL 함수

오라클 서버는 기본 함수를 제공하며 데이터베이스 관리자가 PL/SQL 함수를 만들 수 있음

파라미터 : PASSWORD_VERIFY_FUNCTION

 

 

PASSWORD 검증 

사용자 암호를 설정하는 과정에서 단순한 문자나 숫자 등으로 암호를 설정하지 못하도록 암호를 검증하는 방법이 제공됨

스크립트 : $ORACLE_HOME/rdbms/admin/utlpwdmg.sql

이 스크립트를 실행하면 VERIFY_FUNCTION 함수가 생성되고 사용자가 암호를 4자 이하로 설정하거나 사용자 ID와 암호를 같은 값으로 설정하는 경우에 에러 메시지를 표시하고 암호를 생성하지 못하도록함

 

 

사용법

VERIFY_FUNCTION_11G 함수 생성

1
SQL> @?/rdbms/admin/utlpwdmg.sql

 

 

!중요! utlpwdmg.sql 함수 생성 SQL을 수행시 profile 이 기본값으로 변경 되므로 

VERIFYT_FUNCTION 을 사용하려면 함수 생성 SQL을 수행 한뒤에 PROFILE을 변경 하거나 

PROFILE 이 설정 되어있는 대로 사용하려면 utlpwdmg.sql 내용 중 

아래 내용을 삭제 또는 주석처리 후 실행해야함 그렇게 하면 profile이 기본값으로 변경 되지 않음

1
2
3
4
5
6
7
8
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G; 

11gR2 기준으로 195번째 줄에 있음

이부분을 아래와 같이 주석처리해야함

1
2
3
4
5
6
7
8
--ALTER PROFILE DEFAULT LIMIT
--PASSWORD_LIFE_TIME 180
--PASSWORD_GRACE_TIME 7
--PASSWORD_REUSE_TIME UNLIMITED
--PASSWORD_REUSE_MAX UNLIMITED
--FAILED_LOGIN_ATTEMPTS 10
--PASSWORD_LOCK_TIME 1
--PASSWORD_VERIFY_FUNCTION verify_function_11G; 

 

옵션 설명

- FAILED_LOGIN_ATTEMPTS : 로그인 실패 가능 횟수

- PASSWORD_LOCK_TIME : 암호가 사용기간 만료되어 계정이 잠겨진 채로 남아 있었던 일 수 (단위:일)

- PASSWORD_LIFE_TIME : 암호의 만료 기간을 일 수로 나타냄 (단위:일)

- PASSWORD_GRACE_TIME : 암호의 사용기간이 만료된 후 첫 번째 성공적인 로그인부터 암호변경을 할 때까지의 유예기간 (단위:일)

- PASSWORD_REUSE_TIME : 이전 암호가 재사용 가능할 때까지의 일 수 (단위:일)

- PASSWORD_REUSE_MAX : 이전 암호가 재사용 가능한 최대 횟수

- PASSWORD_VERIFY_FUNCTION : 암호를 할당하기 전 복잡성 검사를 수행할 PL/SQL 함수  

- INACTIVE_ACCOUNT_TIME : 지정된 일 수 후에 사용자 계정을 자동으로 잠금

 

 

10g는 기본이 복잡도가 4자 11g는 8자임

10g에서 복잡도를 8자로 하려면 utlpwdmg.sql 쿼리 안에서 내용을 변경 해줘야함

10g

1
2
3
4
5
6
7
utlpwdmg.sql
==10g================================================================
   -- Check for the minimum length of the password
   IF length(password) < 4 THEN
      raise_application_error(-20001'Password length less than 4');
   END IF;
=====================================================================

 

 

11g

1
2
3
4
5
6
7
utlpwdmg.sql
==11g================================================================
   -- Check for the minimum length of the password
   IF length(password) < 8 THEN
      raise_application_error(-20001'Password length less than 8');
   END IF;
=====================================================================

 

 

VERIFY_FUNCTION 설정

1
2
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION verify_function; -- 10g
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION verify_function_11G; -- 11g

 

 

VERIFY_FUNCTION 설정 원복

1
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;

 

 

암호 복잡성 검증 함수 조건

- 암호의 최소 길이는 4자 

  ※10g는 4자, 11g는 8자 기본값, 변경 가능

- 암호는 사용자 ID와 달라야 함

- 암호는 적어도 하나 이상의 영문자, 숫자, 구두점으로 구성

- 암호는 welcome, account, database, user와 같이 단순한 단어와 달라야 함

- 암호는 적어도 이전 암호와 세 자 이상 달라야 함

- 프로시저는 수행 성공시 TRUE, 실패시 FALSE 값 반환

- 프로시저에 예외 발생시 에러가 반환되고 ALTER USER 또는 CREATE USER 명령은 종료

- 프로시저에 오류 발생시 오류 메시지가 반환되고 ALTER USER 또는 CREATE USER 명령은 종료

- 프로시저는 SYS 소유 

 

dba_profiles에서 적용된 값 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SQL> 
set line 200 
set pages 1000
col profile for a20
col resource_name for a40
col resource_type for a15
col limit for a30
select * from dba_profiles order by 1, 2;
 
PROFILE          RESOURCE_NAME                  RESOURCE_TYPE   LIMIT
-------------------- ---------------------------------------- --------------- --------------------
DEFAULT          COMPOSITE_LIMIT                  KERNEL          UNLIMITED
DEFAULT          SESSIONS_PER_USER                  KERNEL          UNLIMITED
DEFAULT          CPU_PER_SESSION                  KERNEL          UNLIMITED
DEFAULT          CPU_PER_CALL                  KERNEL          UNLIMITED
DEFAULT          LOGICAL_READS_PER_SESSION              KERNEL          UNLIMITED
DEFAULT          LOGICAL_READS_PER_CALL              KERNEL          UNLIMITED
DEFAULT          IDLE_TIME                      KERNEL          UNLIMITED
DEFAULT          CONNECT_TIME                  KERNEL          UNLIMITED
DEFAULT          PRIVATE_SGA                  KERNEL          UNLIMITED
DEFAULT          FAILED_LOGIN_ATTEMPTS              PASSWORD          10
DEFAULT          PASSWORD_LIFE_TIME               PASSWORD          180
DEFAULT          PASSWORD_REUSE_TIME              PASSWORD          UNLIMITED
DEFAULT          PASSWORD_REUSE_MAX               PASSWORD          UNLIMITED
DEFAULT          PASSWORD_VERIFY_FUNCTION              PASSWORD          NULL
DEFAULT          PASSWORD_LOCK_TIME               PASSWORD          1
DEFAULT          PASSWORD_GRACE_TIME              PASSWORD          7
 
16 rows selected.

 

 

패스워드 복잡성 설정 시나리오

utlpwdmg.sql 파일 수정

1
$ vi $ORACLE_HOME/rdbms/admin/utlpwdmg.sql

 

 

10g

1
2
3
4
-- Check for the minimum length of the password
IF length(password) < 8 THEN  -- 4 > 8 or 6으로 변경(최소 password글자수 변경)
   raise_application_error(-20002'Password length less than 8');
END IF;  

 

 

10g, 11g

TRUE변경후 verify_function을 사용할것이기 때문에 11g에선 에러날수있음. 

반드시 TRUE변경 후 특수문자를 제외한 패스워드로 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 3. Check for the punctuation
<<findpunct>>
ispunct:=TRUE;  -- FALSE > TRUE로 변경(특수문자 비활성화)
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;

 

 

10G에서 주석 처리 할것

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;
 
아래처럼 주석처리
--ALTER PROFILE DEFAULT LIMIT
--PASSWORD_LIFE_TIME 60
--PASSWORD_GRACE_TIME 10
--PASSWORD_REUSE_TIME 1800
--PASSWORD_REUSE_MAX UNLIMITED
--FAILED_LOGIN_ATTEMPTS 3
--PASSWORD_LOCK_TIME 1/1440
--PASSWORD_VERIFY_FUNCTION verify_function;

 

 

11G에서 주석 처리 할것

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function_11G;
 
아래처럼 주석처리
--ALTER PROFILE DEFAULT LIMIT
--PASSWORD_LIFE_TIME 60
--PASSWORD_GRACE_TIME 10
--PASSWORD_REUSE_TIME 1800
--PASSWORD_REUSE_MAX UNLIMITED
--FAILED_LOGIN_ATTEMPTS 3
--PASSWORD_LOCK_TIME 1/1440
--PASSWORD_VERIFY_FUNCTION verify_function_11G;

 

 

sys계정에서 utlpwdmg.sql 스크립트 수행

1
SQL> @?/rdbms/admin/utlpwdmg.sql

 

 

주석 처리했던 파라미터 수동 적용

1
2
3
4
5
6
7
8
9
SQL>
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 1800;
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_11G;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1;
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 3;
ALTER PROFILE DEFAULT LIMIT IDLE_TIME 5;

 

 

 

 

적용된 파라미터 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SQL> 
set line 200 
pages 1000
col profile for a20
col resource_name for a40
col resource_type for a15
col limit for a20
select * from dba_profiles;
 
PROFILE          RESOURCE_NAME                  RESOURCE_TYPE   LIMIT
-------------------- ---------------------------------------- --------------- --------------------
DEFAULT          COMPOSITE_LIMIT                  KERNEL          UNLIMITED
DEFAULT          SESSIONS_PER_USER                  KERNEL          UNLIMITED
DEFAULT          CPU_PER_SESSION                  KERNEL          UNLIMITED
DEFAULT          CPU_PER_CALL                  KERNEL          UNLIMITED
DEFAULT          LOGICAL_READS_PER_SESSION              KERNEL          UNLIMITED
DEFAULT          LOGICAL_READS_PER_CALL              KERNEL          UNLIMITED
DEFAULT          IDLE_TIME                      KERNEL          5
DEFAULT          CONNECT_TIME                  KERNEL          UNLIMITED
DEFAULT          PRIVATE_SGA                  KERNEL          UNLIMITED
DEFAULT          FAILED_LOGIN_ATTEMPTS              PASSWORD          5
DEFAULT          PASSWORD_LIFE_TIME               PASSWORD          90
DEFAULT          PASSWORD_REUSE_TIME              PASSWORD          1800
DEFAULT          PASSWORD_REUSE_MAX               PASSWORD          UNLIMITED
DEFAULT          PASSWORD_VERIFY_FUNCTION              PASSWORD          VERIFY_FUNCTION_11G
DEFAULT          PASSWORD_LOCK_TIME               PASSWORD          1
DEFAULT          PASSWORD_GRACE_TIME              PASSWORD          3
 
16 rows selected.

 

 

신규 profile 생성

$ORACLE_HOME/rdbms/admin/utlpwdmg.sql 파일에서 내용을 가져 온뒤 수정해서 사용

1
2
3
4
5
6
7
8
9
SQL>
CREATE PROFILE NEW_PF LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function_11G;

 

 

 

 

참조 : 

http://blog.naver.com/kkj871001/220143491008

http://www.gurubee.net/lecture/1725