OracleDB/Test

사용자별 DB 접속 Timeout 설정

대끄블 2023. 1. 10. 14:56

지난번 소개드린 INBOUND_CONNECT_TIMEOUT은 DB에 접속하기까지 걸리는 시간에 대한 Timeout 설정방법이라면, 오늘 소개하는 내용은 DB에 이미 접속한 사용자에 대한 Timeout 설정하는 방법입니다.

INBOUND_CONNECT_TIMEOUT에 대한 내용이 궁금하시다면 아래 내용을 읽어보세요.

INBOUND_CONNECT_TIMEOUT 설정 :: 대끄블 (tistory.com)

 

INBOUND_CONNECT_TIMEOUT 설정

INBOUND_CONNECT_TIMEOUT 설정은 악의적인 연결 요청으로 데이터베이스 서버를 Flooding시키는 등의 상황을 방지하기 위해 도입되었습니다. 어떠한 이유든지 TIMEOUT 설정값 이내에 인증 프로세스를 마치

eorrmqmf.tistory.com

DB에는 다양한 목적을 가진 여러 사용자가 접속하여 DB를 사용하기때문에 DBA는 각 사용자에게 필요한 것이 무엇인지 파악하여 적절하게 DB를 관리하여야 합니다.
이러한 관리 방법중에 하나로 DB에 접속한 사용자에게 TIMEOUT을 설정하여 DB에 필요한만큼만 머물 수 있도록 한계를 설정하는 것입니다.

그럼 이제 해당 파라미터를 설정하는 방법을 설명 드리겠습니다.

 

Create Profile

[test:/home/oracle] sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 30 15:38:46 2022
Version 19.9.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

SQL> CREATE PROFILE APP_USER1 LIMIT
  2  PASSWORD_LOCK_TIME 1/24
  3  PASSWORD_GRACE_TIME 7
  4  CONNECT_TIME 4320
  5  IDLE_TIME 60;

Profile created.

SQL> SELECT * FROM DBA_PROFILES
  2  WHERE PROFILE='APP_USER1';

PROFILE     RESOURCE_NAME              RESOURCE LIMIT      COM INH IMP
----------- -------------------------- -------- ---------- --- --- ---
APP_USER1   COMPOSITE_LIMIT            KERNEL   DEFAULT    NO  NO  NO
APP_USER1   SESSIONS_PER_USER          KERNEL   DEFAULT    NO  NO  NO
APP_USER1   CPU_PER_SESSION            KERNEL   DEFAULT    NO  NO  NO
APP_USER1   CPU_PER_CALL               KERNEL   DEFAULT    NO  NO  NO
APP_USER1   LOGICAL_READS_PER_SESSION  KERNEL   DEFAULT    NO  NO  NO
APP_USER1   LOGICAL_READS_PER_CALL     KERNEL   DEFAULT    NO  NO  NO
APP_USER1   IDLE_TIME                  KERNEL   60         NO  NO  NO
APP_USER1   CONNECT_TIME               KERNEL   4320       NO  NO  NO
APP_USER1   PRIVATE_SGA                KERNEL   DEFAULT    NO  NO  NO
APP_USER1   FAILED_LOGIN_ATTEMPTS      PASSWORD DEFAULT    NO  NO  NO
APP_USER1   PASSWORD_LIFE_TIME         PASSWORD DEFAULT    NO  NO  NO
APP_USER1   PASSWORD_REUSE_TIME        PASSWORD DEFAULT    NO  NO  NO
APP_USER1   PASSWORD_REUSE_MAX         PASSWORD DEFAULT    NO  NO  NO
APP_USER1   PASSWORD_VERIFY_FUNCTION   PASSWORD DEFAULT    NO  NO  NO
APP_USER1   PASSWORD_LOCK_TIME         PASSWORD .0416      NO  NO  NO
APP_USER1   PASSWORD_GRACE_TIME        PASSWORD 7          NO  NO  NO
APP_USER1   INACTIVE_ACCOUNT_TIME      PASSWORD DEFAULT    NO  NO  NO

17 rows selected.

 

Create User

SQL> CREATE USER APPUSER1
  2  IDENTIFIED BY APPUSER1
  3  PROFILE APP_USER1;

User created.

SQL> SELECT USERNAME, ACCOUNT_STATUS, CREATED, PROFILE     
  2  FROM DBA_USERS
  3  WHERE USERNAME='APPUSER1';
													
USERNAME   ACCOUNT_STATUS   CREATED      PROFILE    
---------- ---------------- ------------ -----------
APPUSER1   OPEN             30-SEP-22    APP_USER1

 

CONNECT_TIME/IDLE_TIME 변경

--test를 위해 Timeout을 재설정하였습니다. CONNECT_TIME 5분/IDLE_TIME 3분
SQL> ALTER PROFILE APP_USER1 LIMIT
  2  CONNECT_TIME 5
  3  IDLE_TIME 3;

Profile altered.

SQL> SELECT * FROM DBA_PROFILES
  2  WHERE PROFILE='APP_USER1';

PROFILE    RESOURCE_NAME              RESOURCE LIMIT      COM INH IMP
---------- -------------------------- -------- ---------- --- --- ---
APP_USER1  COMPOSITE_LIMIT            KERNEL   DEFAULT    NO  NO  NO
APP_USER1  SESSIONS_PER_USER          KERNEL   DEFAULT    NO  NO  NO
APP_USER1  CPU_PER_SESSION            KERNEL   DEFAULT    NO  NO  NO
APP_USER1  CPU_PER_CALL               KERNEL   DEFAULT    NO  NO  NO
APP_USER1  LOGICAL_READS_PER_SESSION  KERNEL   DEFAULT    NO  NO  NO
APP_USER1  LOGICAL_READS_PER_CALL     KERNEL   DEFAULT    NO  NO  NO
APP_USER1  IDLE_TIME                  KERNEL   3          NO  NO  NO
APP_USER1  CONNECT_TIME               KERNEL   5          NO  NO  NO
APP_USER1  PRIVATE_SGA                KERNEL   DEFAULT    NO  NO  NO
APP_USER1  FAILED_LOGIN_ATTEMPTS      PASSWORD DEFAULT    NO  NO  NO
APP_USER1  PASSWORD_LIFE_TIME         PASSWORD DEFAULT    NO  NO  NO
APP_USER1  PASSWORD_REUSE_TIME        PASSWORD DEFAULT    NO  NO  NO
APP_USER1  PASSWORD_REUSE_MAX         PASSWORD DEFAULT    NO  NO  NO
APP_USER1  PASSWORD_VERIFY_FUNCTION   PASSWORD DEFAULT    NO  NO  NO
APP_USER1  PASSWORD_LOCK_TIME         PASSWORD .0416      NO  NO  NO
APP_USER1  PASSWORD_GRACE_TIME        PASSWORD 7          NO  NO  NO
APP_USER1  INACTIVE_ACCOUNT_TIME      PASSWORD DEFAULT    NO  NO  NO

17 rows selected.

 

Timeout 확인

--아무 작업도 하지 않는 경우, IDLE_TIME으로 설정한 3분 뒤 세션이 끊기는지 확인
[test:/home/oracle] sqlplus appuser1@test

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 30 16:06:47 2022
Version 19.9.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password: 

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

SQL> /*아무것도 하지 않고 대기*/
SQL> 
SQL> select count(*) from test;
select count(*) from test
*
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again

--이때 alert.log
[test:/oracle/app/oracle/diag/rdbms/test/test/trace] tailf alert_test.log 
...
2022-09-30T16:10:03.428025+09:00
KILL SESSION for sid=(214, 42062):
  Reason = profile limit idle_time
  Mode = KILL SOFT -/-/NO_REPLAY
  Requestor = PMON (orapid = 2, ospid = 371, inst = 1)
  Owner = Process: USER (orapid = 38, ospid = 2892)
  Result = ORA-0
--CONNECT_TIME으로 설정한 5분 뒤 세션이 끊기는지 확인
[test:/home/oracle] sqlplus appuser1@test

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 30 16:12:52 2022
Version 19.9.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Enter password: 
Last Successful login time: Fri Sep 30 2022 16:06:55 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

--IDLE_TIME 설정으로 인해 세션이 끊기지 않기위해 간단한 SELECT문 조회
SQL> SELECT COUNT(*) FROM DBA_OBJECTS;

  COUNT(*)
----------
     65771
...

--5분 경과
SQL> SELECT COUNT(*) FROM DBA_OBJECTS;
select count(*) from dba_objects
*
ERROR at line 1:
ORA-01012: not logged on
Process ID: 32224
Session ID: 208 Serial number: 43026

-> CONNECT_TIME의 경우, alert.log에는 아무것도 기록되지 않았다.

Profile을 통해 Timeout뿐만 아니라, 다양한 설정을 할 수 있으므로 아래 URL을 통해 다른 파라미터도 확인해보면 좋을 것 같습니다.



참조:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-PROFILE.html#GUID-ABC7AE4D-64A8-4EA9-857D-BEF7300B64C3

 

SQL Language Reference

 

docs.oracle.com