Akashic Records

Oracle 접근제어 방안 - 비밀번호 정책 본문

Database Learning Guide

Oracle 접근제어 방안 - 비밀번호 정책

Andrew's Akashic Records 2023. 3. 14. 10:38
728x90

오라클 비밀번호 정책 및 가이드

오라클 데이터베이스에서는 다양한 비밀번호 정책을 지원합니다. 이를 적용하기 위해서는

PASSWORD_VERIFY_FUNCTION 함수를 사용하여 비밀번호 정책을 구현하면 됩니다. 아래는 오라클 비밀번호 추천 정책과 예시 코드입니다.

 

1. 비밀번호 길이

비밀번호 길이는 12자 이상을 권장합니다.

CREATE OR REPLACE FUNCTION verify_function (password IN VARCHAR2) RETURN BOOLEAN IS
BEGIN
  IF LENGTH(password) < 12 THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must be at least 12 characters long');
  END IF;
  
  RETURN TRUE;
END;

2. 비밀번호 복잡성

비밀번호에 대한 다양한 복잡성 규칙을 적용할 수 있습니다. 대표적으로 다음과 같은 규칙들이 있습니다.

  • 대문자, 소문자, 숫자, 특수 문자 포함 여부
  • 비밀번호에 사용할 수 없는 문자 제한
  • 연속 문자(예: abc, 123) 또는 반복 문자(예: aaa, 111) 제한
CREATE OR REPLACE FUNCTION verify_function (password IN VARCHAR2) RETURN BOOLEAN IS
BEGIN
  -- 비밀번호에 대한 복잡성 규칙
  IF NOT REGEXP_LIKE(password, '[[:upper:]]') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must contain an uppercase letter');
  END IF;
  
  IF NOT REGEXP_LIKE(password, '[[:lower:]]') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must contain a lowercase letter');
  END IF;
  
  IF NOT REGEXP_LIKE(password, '[[:digit:]]') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must contain a digit');
  END IF;
  
  IF NOT REGEXP_LIKE(password, '[[:punct:]]') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must contain a special character');
  END IF;
  
  IF REGEXP_LIKE(password, '[^a-zA-Z0-9[:punct:]]') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password contains invalid characters');
  END IF;
  
  IF REGEXP_LIKE(password, '(.)\1{2,}') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must not contain more than two identical characters in a row');
  END IF;
  
  IF REGEXP_LIKE(password, '([a-zA-Z0-9]){3}') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Password must not contain more than two consecutive characters');
  END IF;
  
  RETURN TRUE;
END;

4. 비밀번호 만료 기간

비밀번호 만료 기간을 설정하여 주기적으로 비밀번호를 변경할 수 있도록 유도합니다.

CREATE PROFILE limited_password
  LIMIT PASSWORD_LIFE_TIME 30;
  
ALTER USER scott PROFILE limited_password;

5. 비밀번호 재사용 방지

이전에 사용한 비밀번호를 재사용할 수 없도록 설정할 수 있습니다.

CREATE OR REPLACE FUNCTION verify_function (username IN VARCHAR2, password IN VARCHAR2, old_password IN VARCHAR2) RETURN BOOLEAN IS
n INTEGER;
BEGIN
-- username, password, old_password 등의 조건을 만족하지 않을 경우 예외 처리
IF LENGTH(password) < 12 THEN
RAISE_APPLICATION_ERROR(-20001, 'Password must be at least 12 characters long');
END IF;

IF NOT REGEXP_LIKE(password, '[[:upper:]]') THEN
RAISE_APPLICATION_ERROR(-20002, 'Password must contain an uppercase letter');
END IF;

IF NOT REGEXP_LIKE(password, '[[:lower:]]') THEN
RAISE_APPLICATION_ERROR(-20003, 'Password must contain a lowercase letter');
END IF;

IF NOT REGEXP_LIKE(password, '[[:digit:]]') THEN
RAISE_APPLICATION_ERROR(-20004, 'Password must contain a digit');
END IF;

IF NOT REGEXP_LIKE(password, '[[:punct:]]') THEN
RAISE_APPLICATION_ERROR(-20005, 'Password must contain a special character');
END IF;

IF REGEXP_LIKE(password, '[^a-zA-Z0-9[:punct:]]') THEN
RAISE_APPLICATION_ERROR(-20006, 'Password contains invalid characters');
END IF;

IF REGEXP_LIKE(password, '(.)\1{2,}') THEN
RAISE_APPLICATION_ERROR(-20007, 'Password must not contain more than two identical characters in a row');
END IF;

IF REGEXP_LIKE(password, '([a-zA-Z0-9]){3}') THEN
RAISE_APPLICATION_ERROR(-20008, 'Password must not contain more than two consecutive characters');
END IF;

-- 이전 비밀번호와 동일할 경우 예외 처리
SELECT COUNT(*) INTO n FROM dba_users WHERE username=username AND password=old_password;
IF n > 0 THEN
RAISE_APPLICATION_ERROR(-20009, 'You cannot reuse your old password');
END IF;

RETURN TRUE;
END;

위와 같은 예시 코드를 PASSWORD_VERIFY_FUNCTION 함수로 등록하면 해당 비밀번호 정책이 적용됩니다. 예를 들어, 아래와 같이 새로운 사용자를 생성할 때 PASSWORD_VERIFY_FUNCTION 함수를 사용하여 비밀번호 정책을 적용할 수 있습니다.

CREATE USER scott IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  PROFILE limited_password
  PASSWORD_VERIFY_FUNCTION verify_function;

이렇게 생성된 사용자는 PASSWORD_VERIFY_FUNCTION 함수에서 정의한 비밀번호 정책을 만족해야만 비밀번호를 변경할 수 있습니다.

728x90
Comments