본문 바로가기

Oracle/Admin

[Oracle] PASSWORD_VERIFY_FUNCTION

728x90

PASSWORD_VERIFY_FUNCTION (암호인증)

 

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

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

 

 

- 파라미터 : PASSWORD_VERIFY_FUNCTION

 

 

password의 검증 함수로 검증진행 

 

사용자 암호를 설정하는 과정에서 단순한 문자나 숫자 등으로 암호를 설정하지 못하도록 

암호를 검증하는 방법이 제공되는데, 

이는 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql 스크립트이다. 

이 스크립트를 실행하면 VERIFY_FUNCTION 함수가 생성되고 사용자가 암호를 4자 이하로 

설정하거나 사용자 ID와 암호를 같은 값으로 설정하는 경우에 에러 메시지를 표시하고 

암호를 생성하지 못하도록 한다.

 

 

 

 

- VERIFY_FUNCTION_11G 함수 생성

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

 

또는

SQL> @"D:\app\Oracle\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlpwdmg.sql"

 

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

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

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

 

   ALTER PROFILE DEFAULT LIMIT

   PASSWORD_LIFE_TIME 180      -- 패스워드 변경 기간 기존 암호가 유효한 기간, 11g의 기본값은 180일이다.

   PASSWORD_GRACE_TIME 7      -- 암호 변경 메시지 출력날짜

   PASSWORD_REUSE_TIME UNLIMITED   -- 이전 암호를 다시 입력할 수 있기 전의 제한 시간을 지정

   PASSWORD_REUSE_MAX UNLIMITED    -- 비밀번호를 재사용할 수 있는 횟수 , 비밀번호 순환 방지

   FAILED_LOGIN_ATTEMPTS 10

   PASSWORD_LOCK_TIME 1   -- 계정이 잠긴 후 잠금 해제되기 전에 경과해야하는 일 수  실패한 로그인 시도가 충족된 후 계정을 잠글 시간을 지정 11g의 기본값은 하루 

   PASSWORD_VERIFY_FUNCTION verify_function_11G; 

 

   내용을 삭제 또는 주석처리 후 utlpwdmg.sql 파일 실행하면 profile이 기본값으로 변경 되지 않습니다.

 

   10g는 기본이 복잡도가 4자 11g는 8자 입니다.

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

 

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;

=====================================================================

 

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 설정

 

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 설정을 원래대로]

 

 

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;

 

 

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

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

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

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

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

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

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

 

 

 

*> 암호 복잡성 검증 함수 

 

- 암호의 최소 길이는 4자 

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

 

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

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

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

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

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

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

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

- 프로시저는 SYS 소유 

 

 

 

== VERIFY_FUNCTION 적용

 

 

 

SQL> 

SQL> set line200 pages999

SQL> col profile for a20

SQL> col resource_name for a40

SQL> col resource_type for a15

SQL> col limit for a20

SQL> 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          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        VERIFY_FUNCTION_11G

DEFAULT              PASSWORD_LOCK_TIME                       PASSWORD        1

DEFAULT              PASSWORD_GRACE_TIME                      PASSWORD        7

 

 

 

 

## 11g VERIFY_FUNCTION 요약 ##

 

 

# 함수 생성

@?/rdbms/admin/utlpwdmg.sql

 

 

# profile에 VERIFY_FUNCTION 적용

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION verify_function; -- 10g

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION verify_function_11G; -- 11g

 

 

# 적용시 변경되는 프로파일 항목

 

 

FAILED_LOGIN_ATTEMPTS 10

부정확한 패스워드 입력을 10회 하면 account의 상태가 locked 상태로 변경되며, 해당 account 로는 dbms 접속 불가

 

 

PASSWORD_LIFE_TIME 180

패스워드의 수명을 나타내며 단위는 '일' (180일, 6개월을 의미)

180일 이내에 패스워드를 변경하지 않으면 계정에 접속이 불가능해 진다. (패스워드의 유효기간이 지났기 때문에) 단, account 상태를 locked 로 변경하지는 않는다.

180일 이후에 password_grace_time 내에 패스워드를 변경하면 문제 없이 해당 account 를 사용할 수 있다.

 

 

PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_11G

password 를 검증하는 함수를 이용

사용자가 암호를 4자 이하로 설정하거나 사용자 ID와 암호를 같은 값으로 설정하는 경우에 에러 메시지를 표시하고 암호를 생성하지 못하도록 한다.

 

 

PASSWORD_LOCK_TIME 1

login 허용횟수를 지나면 password 를 locked 시키는 기간을 나타내며 단위는 '일' (1일이 지나면 풀린다는 의미)

 

 

PASSWORD_GRACE_TIME 7

password_life_time 수명이 지난 후 7일이 지나기 전에 비밀번호를 변경하지 않으면 해당 account의 상태가 locked 상태로 변경되며, 해당 account 로는 dbms 접속 불가

 

 

# 복잡도 설정 변경, VERIFY_FUNCTION 설정 방법

 

 

1. cd $ORACLE_HOME/rdbms/admin 경로에 있는 utlpwdmg.sql 라는 파일을 수정

 

 

 

  1) 최소 PASSWORD 갯수 설정

 

   -- Check for the minimum length of the password

   IF length(password) < 8 THEN

      raise_application_error(-20001, 'Password length less than 8');

   END IF;                 

 

            -- 위 값에서 8 이라고 되어있는 값이 최소 PASSWORD 글자수를 의미 하므로 10 으로 변경 시켜줘야 합니다.

 

   변경 후

 

   -- Check for the minimum length of the password

   IF length(password) < 10 THEN

      raise_application_error(-20001, 'Password length less than 10');

   END IF;   

 

            -- 이렇게 수정하면 최소 PASSWORD 글자수 가 10개로 변경됩니다.

 

 

 

  2) 9i, 10g 에서의 VERIFY_FUNCTION 사용시 특수문자 포함 기능 OFF

 

       ※ 11g 에서 사용되는 복잡도 함수인 VERIFY_FUNCTION_11G 에서는 대소문자, 숫자 만 복잡도에 포함 

 

           9i, 10g 에서 사용되는 복잡도 함수인 VERIFY_FUNCTION 에서는 대소문자, 숫자, 특수문자 가 복잡도에 포함

 

           그러므로 VERIFY_FUNCTION 을 사용하는 9i, 10g 환경에서는 특수문자 포함 기능을 OFF 시켜줘야 함.

 

           만약 11g 환경에서 VERIFY_FUNCTION 을 사용하게되는 상황이 오게되도 특수문자 포함 기능을 OFF 시켜야 함.

 

 

 

   -- 3. Check for the punctuation

   <<findpunct>>

   ispunct:=TRUE;                                  -- 특수문자 포함 기능 off 하려면 값을 TRUE로 변경(기본값: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');

 

 

 

  3) utlpwdmg.sql 수행시 profile 값 초기화로 인한 기존 계정 expired 장애 방지

 

    utlpwdmg.sql 내용 중 하단에 위치

 

 

 

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;

 

 

 

또는 

 

 

 

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;

 

 

내용을 주석처리 또는 내용 을 지우셔야 합니다.

위 내용이 주석처리 되지 않거나 남아있는경우에서 utlpwdmg.sql 쿼리를 수행시 

기존에 있던 default profile 이 전부 초기값으로 변경되면서 기존에 사용되던 계정이 expired 상태로 변경되는 장애가 

발생할 수 있습니다.

반드시 ALTER PROFILE 내용을 주석처리 또는 내용 삭제를 해주셔야 합니다.

 

 

 

2. sysdba 접속하여 utlpwdmg.sql 스크립트 수행

 

 

 

- DB접속

 

$sqlplus / as sysdba

 

 

 

- 복잡도 함수 생성

 

SQL>@utlpwdmg.sql

Function created.

 

- 9i, 10g VERIFY_FUNCTION 설정

 

SQL>ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION;

 

 

 

- 11g VERIFY_FUNCTION 설정

 

SQL>ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_11G;

 

 

 

- 적용 되었는지 확인

 

SQL>set line200 pages999

        col limit for a20

        select * from dba_profiles;

 

 

 

- VERIFY_FUNCTION 설정 전

 

PROFILE                        RESOURCE_NAME                    RESOURCE 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

 

 

 

- 9i, 10g 설정시

PROFILE                        RESOURCE_NAME                    RESOURCE 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 VERIFY_FUNCTION

DEFAULT                        PASSWORD_LOCK_TIME               PASSWORD 1

DEFAULT                        PASSWORD_GRACE_TIME              PASSWORD 7

 

 

 

- 11g 설정시

 

PROFILE                        RESOURCE_NAME                    RESOURCE 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 VERIFY_FUNCTION_11G 

DEFAULT                        PASSWORD_LOCK_TIME               PASSWORD 1

DEFAULT                        PASSWORD_GRACE_TIME              PASSWORD 7

 

 

-- 12c 

Resource NameLimitDescription

PASSWORD_LIFE_TIME 180 Sets the number of days the user can use his current password.
PASSWORD_GRACE_TIME 7 Sets the number of days that a user has to change his password before it expires.
PASSWORD_REUSE_TIME UNLIMITED Sets the number of days before which a password cannot be reused.
PASSWORD_REUSE_MAX UNLIMITED Sets the number of password changes required before the current password can be reused.
FAILED_LOGIN_ATTEMPTS 10 Specify the number of failed attempts to log in to the user account before the account is locked.
PASSWORD_LOCK_TIME 1 Specify the number of days an account will be locked after the specified number of consecutive failed login attempts.
PASSWORD_VERIFY_FUNCTION ora12c_verify_function PL/SQL password complexity verification function to enforce password complexity.

 

 

Resource NameLimit

PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function

 

 

국방부 권장 

 

Resource NameLimit

PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 5
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function

 

 

이 기능은 새로운 12c 비밀번호 확인 기능입니다. verify_function_11G와 유사하고 약간 더 강력한 암호 복잡성을 적용합니다.

 

  • Password at least 8 characters
  • at least 1 letters
  • at least 1 digits
  • must not contain database name
  • must not contain user name or reverse user name
  • must not contain oracle
  • must not be too simple like welcome1
  • password must differ by at least 3 characters from the old password

 

ora12c_strong_verify_function

This function is provided to give stronger password complexity. It considers recommendations of the Department of Defense Database (STIG) with the following limits.

  • Password at least 9 characters
  • at least 2 capital letters
  • at least 2 small letters
  • at least 2 digits
  • at least 2 special characters
  • password must differ by at least 4 characters from the old password
728x90
반응형

'Oracle > Admin' 카테고리의 다른 글

[Oracle] OCR VIGING DISK 재구성  (0) 2024.08.14
[Oracle]GPnP(grid plug n play)  (0) 2024.08.14
[Oracle]ORA-08104  (0) 2024.08.01
[Oracle] Row Size 구하기  (2) 2024.07.24
[Oracle] ora.diskmon offline  (0) 2024.07.15