반응형
Oracle 계정 Lock 해제 완벽 가이드 - 원인부터 해결까지 총정리
개요
Oracle 데이터베이스를 운영하다 보면 "ORA-28000: 계정이 잠겼습니다"라는 오류 메시지를 마주치게 되는 경우가 종종 있습니다. 비밀번호를 잘못 입력했거나, 비밀번호 만료 기간이 지났거나, 보안 정책에 따라 계정이 자동으로 잠기는 등 다양한 이유로 계정 접근이 차단될 수 있습니다.
이러한 상황은 업무 진행에 큰 차질을 주며, 특히 운영 환경에서 발생하면 서비스 장애로 이어질 수 있어 신속한 대응이 필요합니다. Oracle 계정 Lock은 보안을 위한 필수적인 메커니즘이지만, 그 원인과 해결 방법을 정확히 알지 못하면 불필요한 시간 낭비와 스트레스를 초래합니다.
이 글에서는 Oracle 계정이 잠기는 모든 원인을 체계적으로 분석하고, 각 상황별 해결 방법을 상세히 다룹니다. 계정 잠금 상태 확인 쿼리부터 관리자 권한으로 잠금 해제하는 방법, 비밀번호 정책 설정, 자주 발생하는 오류 해결 사례까지 실무에서 바로 활용할 수 있는 내용으로 구성했습니다.
또한 계정 잠금을 사전에 예방하는 방법과 모니터링 전략까지 포함하여, Oracle 데이터베이스 관리자와 개발자 모두에게 유용한 완벽한 가이드를 제공합니다.
이러한 상황은 업무 진행에 큰 차질을 주며, 특히 운영 환경에서 발생하면 서비스 장애로 이어질 수 있어 신속한 대응이 필요합니다. Oracle 계정 Lock은 보안을 위한 필수적인 메커니즘이지만, 그 원인과 해결 방법을 정확히 알지 못하면 불필요한 시간 낭비와 스트레스를 초래합니다.
이 글에서는 Oracle 계정이 잠기는 모든 원인을 체계적으로 분석하고, 각 상황별 해결 방법을 상세히 다룹니다. 계정 잠금 상태 확인 쿼리부터 관리자 권한으로 잠금 해제하는 방법, 비밀번호 정책 설정, 자주 발생하는 오류 해결 사례까지 실무에서 바로 활용할 수 있는 내용으로 구성했습니다.
또한 계정 잠금을 사전에 예방하는 방법과 모니터링 전략까지 포함하여, Oracle 데이터베이스 관리자와 개발자 모두에게 유용한 완벽한 가이드를 제공합니다.

목차
1. Oracle 계정 Lock의 주요 원인 분석
2. 계정 잠금 상태 확인 및 진단
3. 계정 잠금 해제 방법
4. 비밀번호 정책 관리 및 설정
5. 계정 잠금 예방 및 모니터링
#1. Oracle 계정 Lock의 주요 원인 분석
Oracle 데이터베이스 계정이 잠기는 현상은 여러 가지 원인에 의해 발생합니다. 원인을 정확히 파악해야 적절한 해결책을 적용할 수 있으며, 동일한 문제의 재발을 방지할 수 있습니다.
1) 비밀번호 오류 횟수 초과
가장 흔하게 발생하는 계정 잠금 원인입니다. Oracle은 기본적으로 10회 연속 로그인 실패 시 자동으로 계정을 잠급니다. 이는 무차별 대입 공격(Brute Force Attack)을 방지하기 위한 보안 메커니즘입니다.
(1) 로그인 실패 카운트 메커니즘
Oracle은 프로파일 설정에서 FAILED_LOGIN_ATTEMPTS 값에 따라 허용 가능한 로그인 실패 횟수를 관리합니다. 이 값을 초과하면 계정은 자동으로 LOCKED 상태가 됩니다.
① 애플리케이션 연결 오류로 인한 반복적인 로그인 시도
② 개발자가 잘못된 비밀번호를 저장하여 자동 접속 시도
③ 사용자가 비밀번호를 잊어버리고 여러 번 시도
④ SQL Developer, Toad 등 도구에서 저장된 잘못된 비밀번호로 자동 연결 시도
⑤ 외부 공격자의 무차별 대입 시도
② 개발자가 잘못된 비밀번호를 저장하여 자동 접속 시도
③ 사용자가 비밀번호를 잊어버리고 여러 번 시도
④ SQL Developer, Toad 등 도구에서 저장된 잘못된 비밀번호로 자동 연결 시도
⑤ 외부 공격자의 무차별 대입 시도
. . . . .
2) 비밀번호 만료
Oracle 데이터베이스는 보안을 강화하기 위해 비밀번호에 만료 기간을 설정할 수 있습니다. DEFAULT 프로파일의 기본 설정은 180일이며, 이 기간이 지나면 계정이 EXPIRED & LOCKED 상태가 될 수 있습니다.
(1) 비밀번호 수명 주기
PASSWORD_LIFE_TIME 파라미터는 비밀번호가 유효한 기간을 일(day) 단위로 지정합니다. 이 기간이 지나면 사용자는 로그인 시 비밀번호 변경을 강제 받거나, 경우에 따라 계정이 잠길 수 있습니다.
① 장기간 사용하지 않은 계정의 비밀번호가 만료됨
② PASSWORD_GRACE_TIME 기간 내 비밀번호를 변경하지 않아 계정 잠김
③ 시스템 계정(예: SCOTT, HR 등) 비밀번호 정책 미관리로 만료
④ 배치 작업용 계정의 비밀번호가 알림 없이 만료되어 작업 실패
⑤ 개발 환경에서 운영으로 이전 시 비밀번호 정책 차이로 인한 만료
② PASSWORD_GRACE_TIME 기간 내 비밀번호를 변경하지 않아 계정 잠김
③ 시스템 계정(예: SCOTT, HR 등) 비밀번호 정책 미관리로 만료
④ 배치 작업용 계정의 비밀번호가 알림 없이 만료되어 작업 실패
⑤ 개발 환경에서 운영으로 이전 시 비밀번호 정책 차이로 인한 만료
. . . . .
3) DBA에 의한 수동 잠금
데이터베이스 관리자(DBA)가 보안상의 이유나 계정 관리를 위해 수동으로 계정을 잠글 수 있습니다. 이는 의심스러운 활동이 감지되거나, 퇴사자 계정을 비활성화하거나, 임시로 접근을 차단할 필요가 있을 때 사용됩니다.
(1) 수동 잠금 사유
① 비정상적인 접속 패턴 감지 시 임시 차단
② 퇴사자 또는 계약 만료자의 계정 비활성화
③ 보안 사고 발생 시 관련 계정 일괄 잠금
④ 시스템 점검 중 특정 계정 접근 제한
⑤ 권한 재검토 기간 동안 임시 잠금
⑥ 컴플라이언스 요구사항에 따른 주기적 계정 검토 및 잠금
② 퇴사자 또는 계약 만료자의 계정 비활성화
③ 보안 사고 발생 시 관련 계정 일괄 잠금
④ 시스템 점검 중 특정 계정 접근 제한
⑤ 권한 재검토 기간 동안 임시 잠금
⑥ 컴플라이언스 요구사항에 따른 주기적 계정 검토 및 잠금
. . . . .
4) 프로파일 설정에 의한 자동 잠금
Oracle은 프로파일(Profile)을 통해 리소스 제한과 비밀번호 정책을 관리합니다. 각 사용자 계정에는 하나의 프로파일이 할당되며, 해당 프로파일의 설정에 따라 자동으로 계정이 잠길 수 있습니다.
(1) 프로파일 관련 잠금 트리거
① FAILED_LOGIN_ATTEMPTS: 허용된 로그인 실패 횟수 초과
② PASSWORD_LIFE_TIME: 비밀번호 수명 만료
③ PASSWORD_GRACE_TIME: 유예 기간 내 비밀번호 미변경
④ INACTIVE_ACCOUNT_TIME: 지정된 기간 동안 계정 미사용 시 자동 잠금
⑤ 사용자 정의 프로파일의 엄격한 보안 정책 적용
② PASSWORD_LIFE_TIME: 비밀번호 수명 만료
③ PASSWORD_GRACE_TIME: 유예 기간 내 비밀번호 미변경
④ INACTIVE_ACCOUNT_TIME: 지정된 기간 동안 계정 미사용 시 자동 잠금
⑤ 사용자 정의 프로파일의 엄격한 보안 정책 적용
. . . . .
5) 장기간 미사용
일정 기간 동안 계정을 사용하지 않으면 자동으로 잠기도록 설정된 경우가 있습니다. 이는 INACTIVE_ACCOUNT_TIME 파라미터로 제어되며, 보안 정책에 따라 설정됩니다.
(1) 미사용 계정 관리
① 테스트용 임시 계정이 장기간 방치되어 자동 잠김
② 프로젝트 종료 후 사용하지 않는 개발 계정이 비활성화됨
③ 백업용으로 생성했던 계정이 일정 기간 후 자동 잠김
④ 외주 인력 계정이 계약 종료 후 자동으로 비활성화됨
⑤ 보안 정책에 따라 90일 이상 미접속 계정 자동 잠금
② 프로젝트 종료 후 사용하지 않는 개발 계정이 비활성화됨
③ 백업용으로 생성했던 계정이 일정 기간 후 자동 잠김
④ 외주 인력 계정이 계약 종료 후 자동으로 비활성화됨
⑤ 보안 정책에 따라 90일 이상 미접속 계정 자동 잠금
#2. 계정 잠금 상태 확인 및 진단
계정이 실제로 잠겼는지, 그리고 잠금의 원인이 무엇인지 확인하기 위해서는 DBA_USERS 뷰를 조회하여 계정의 상태를 확인해야 합니다. 정확한 진단을 통해 적절한 해결 방법을 선택할 수 있습니다.
1) 특정 계정의 잠금 상태 확인
특정 사용자 계정의 현재 상태와 잠금 정보를 확인하는 쿼리입니다.
-- 특정 계정의 상세 상태 확인
SELECT username, account_status, lock_date, expiry_date, profile
FROM dba_users
WHERE username = 'USER_NAME';
-- 예시: SCOTT 계정 확인
SELECT username, account_status, lock_date, expiry_date, profile
FROM dba_users
WHERE username = 'SCOTT';
SELECT username, account_status, lock_date, expiry_date, profile
FROM dba_users
WHERE username = 'USER_NAME';
-- 예시: SCOTT 계정 확인
SELECT username, account_status, lock_date, expiry_date, profile
FROM dba_users
WHERE username = 'SCOTT';
. . . . .
2) 모든 잠긴 계정 확인
데이터베이스 전체에서 현재 잠겨 있는 모든 계정을 조회하여 관리가 필요한 계정을 파악할 수 있습니다.
-- 잠긴 모든 계정 조회
SELECT username, account_status, lock_date, expiry_date, created
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
ORDER BY lock_date DESC;
-- 최근 30일 이내 잠긴 계정만 조회
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
AND lock_date >= SYSDATE - 30
ORDER BY lock_date DESC;
SELECT username, account_status, lock_date, expiry_date, created
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
ORDER BY lock_date DESC;
-- 최근 30일 이내 잠긴 계정만 조회
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
AND lock_date >= SYSDATE - 30
ORDER BY lock_date DESC;
. . . . .
3) 계정 상태 코드 이해
ACCOUNT_STATUS 컬럼은 계정의 현재 상태를 나타내며, 다음과 같은 값을 가질 수 있습니다.
| 상태 코드 | 의미 | 조치 방법 |
|---|---|---|
| OPEN | 계정이 정상적으로 열려 있음 | 조치 불필요 |
| LOCKED | 계정이 잠겨 있음 (주로 로그인 실패 초과) | ACCOUNT UNLOCK 실행 |
| EXPIRED | 비밀번호가 만료됨 | 비밀번호 변경 필요 |
| EXPIRED & LOCKED | 비밀번호 만료 및 계정 잠김 | 잠금 해제 후 비밀번호 변경 |
| LOCKED(TIMED) | 일정 시간 후 자동 해제되는 임시 잠금 | 대기 또는 수동 해제 |
| EXPIRED(GRACE) | 유예 기간 중 (로그인 가능하나 비밀번호 변경 필요) | 로그인 후 비밀번호 변경 |
. . . . .
4) 계정 프로파일 및 정책 확인
계정에 적용된 프로파일과 비밀번호 정책을 확인하여 잠금 원인을 분석할 수 있습니다.
-- 사용자의 프로파일 확인
SELECT username, profile, account_status
FROM dba_users
WHERE username = 'USER_NAME';
-- 해당 프로파일의 비밀번호 정책 확인
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile = 'PROFILE_NAME'
AND resource_type = 'PASSWORD'
ORDER BY resource_name;
SELECT username, profile, account_status
FROM dba_users
WHERE username = 'USER_NAME';
-- 해당 프로파일의 비밀번호 정책 확인
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile = 'PROFILE_NAME'
AND resource_type = 'PASSWORD'
ORDER BY resource_name;
#3. 계정 잠금 해제 방법
계정 잠금을 해제하려면 SYS나 SYSTEM 같은 관리자 권한이 필요합니다. 잠금 원인에 따라 적절한 해제 방법을 선택해야 하며, 필요한 경우 비밀번호 변경과 함께 진행할 수 있습니다.
1) 기본 계정 잠금 해제
가장 기본적인 계정 잠금 해제 방법입니다. 단순히 LOCKED 상태인 계정을 열어주는 명령입니다.
-- 관리자 권한으로 로그인 후 실행
ALTER USER username ACCOUNT UNLOCK;
-- 예시: SCOTT 계정 잠금 해제
ALTER USER SCOTT ACCOUNT UNLOCK;
-- 잠금 해제 확인
SELECT username, account_status FROM dba_users WHERE username = 'SCOTT';
ALTER USER username ACCOUNT UNLOCK;
-- 예시: SCOTT 계정 잠금 해제
ALTER USER SCOTT ACCOUNT UNLOCK;
-- 잠금 해제 확인
SELECT username, account_status FROM dba_users WHERE username = 'SCOTT';
. . . . .
2) 비밀번호 재설정과 함께 잠금 해제
비밀번호를 잊어버렸거나 만료된 경우, 비밀번호를 변경하면서 동시에 잠금을 해제할 수 있습니다. 이 방법은 가장 안전하고 권장되는 방법입니다.
-- 비밀번호 변경과 동시에 잠금 해제
ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;
-- 예시: SCOTT 계정 비밀번호를 'Tiger123!'으로 변경하며 잠금 해제
ALTER USER SCOTT IDENTIFIED BY Tiger123! ACCOUNT UNLOCK;
-- 비밀번호에 특수문자가 포함된 경우 큰따옴표 사용
ALTER USER SCOTT IDENTIFIED BY "Tiger@123#" ACCOUNT UNLOCK;
ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;
-- 예시: SCOTT 계정 비밀번호를 'Tiger123!'으로 변경하며 잠금 해제
ALTER USER SCOTT IDENTIFIED BY Tiger123! ACCOUNT UNLOCK;
-- 비밀번호에 특수문자가 포함된 경우 큰따옴표 사용
ALTER USER SCOTT IDENTIFIED BY "Tiger@123#" ACCOUNT UNLOCK;
. . . . .
3) SQL*Plus를 사용한 잠금 해제
커맨드라인 환경에서 SQL*Plus를 사용하여 계정 잠금을 해제하는 방법입니다.
-- Windows 환경
C:\> sqlplus / as sysdba
SQL> ALTER USER username ACCOUNT UNLOCK;
SQL> EXIT;
-- Linux/Unix 환경
$ sqlplus / as sysdba
SQL> ALTER USER username ACCOUNT UNLOCK;
SQL> EXIT;
C:\> sqlplus / as sysdba
SQL> ALTER USER username ACCOUNT UNLOCK;
SQL> EXIT;
-- Linux/Unix 환경
$ sqlplus / as sysdba
SQL> ALTER USER username ACCOUNT UNLOCK;
SQL> EXIT;
. . . . .
4) EXPIRED & LOCKED 상태 해결
비밀번호가 만료되고 계정도 잠긴 경우, 반드시 비밀번호를 변경해야 합니다. 단순 잠금 해제만으로는 EXPIRED 상태가 해소되지 않습니다.
(1) 단계별 해결 방법
① 관리자 권한으로 로그인
② 비밀번호 변경 및 잠금 해제 명령 실행
③ 계정 상태 확인
④ 사용자에게 새 비밀번호 전달
⑤ 필요시 비밀번호 정책 검토 및 조정
② 비밀번호 변경 및 잠금 해제 명령 실행
③ 계정 상태 확인
④ 사용자에게 새 비밀번호 전달
⑤ 필요시 비밀번호 정책 검토 및 조정
-- EXPIRED & LOCKED 상태 해결
ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;
-- 계정 상태가 OPEN으로 변경되었는지 확인
SELECT username, account_status, expiry_date
FROM dba_users
WHERE username = 'USER_NAME';
ALTER USER username IDENTIFIED BY new_password ACCOUNT UNLOCK;
-- 계정 상태가 OPEN으로 변경되었는지 확인
SELECT username, account_status, expiry_date
FROM dba_users
WHERE username = 'USER_NAME';
. . . . .
5) 로그인 실패 카운터 초기화
계정 잠금을 해제하면 로그인 실패 카운터도 자동으로 초기화됩니다. 별도의 명령이 필요하지 않으며, ACCOUNT UNLOCK 실행 시 자동으로 처리됩니다.
(1) 잠금 해제 후 확인 사항
① 계정 상태가 OPEN으로 변경되었는지 확인
② 로그인 테스트를 통해 정상 접속 가능 여부 확인
③ 애플리케이션 연결 설정에서 비밀번호가 정확히 업데이트되었는지 확인
④ 동일한 문제가 재발하지 않도록 원인 분석 및 조치
⑤ 필요시 사용자 교육 또는 프로파일 정책 조정
② 로그인 테스트를 통해 정상 접속 가능 여부 확인
③ 애플리케이션 연결 설정에서 비밀번호가 정확히 업데이트되었는지 확인
④ 동일한 문제가 재발하지 않도록 원인 분석 및 조치
⑤ 필요시 사용자 교육 또는 프로파일 정책 조정
#4. 비밀번호 정책 관리 및 설정
Oracle의 비밀번호 정책을 적절히 관리하면 계정 잠금 문제를 사전에 예방하고, 보안과 사용 편의성의 균형을 맞출 수 있습니다. 프로파일 설정을 통해 조직의 보안 요구사항에 맞는 정책을 구현할 수 있습니다.
1) 현재 비밀번호 정책 확인
데이터베이스에 설정된 비밀번호 정책을 확인하여 현재 상태를 파악합니다.
-- 모든 프로파일의 비밀번호 정책 확인
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_name IN (
'FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME',
'PASSWORD_REUSE_TIME',
'PASSWORD_REUSE_MAX',
'INACTIVE_ACCOUNT_TIME'
)
ORDER BY profile, resource_name;
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_name IN (
'FAILED_LOGIN_ATTEMPTS',
'PASSWORD_LOCK_TIME',
'PASSWORD_LIFE_TIME',
'PASSWORD_GRACE_TIME',
'PASSWORD_REUSE_TIME',
'PASSWORD_REUSE_MAX',
'INACTIVE_ACCOUNT_TIME'
)
ORDER BY profile, resource_name;
. . . . .
2) 비밀번호 만료 정책 설정
비밀번호 수명과 유예 기간을 조정하여 만료로 인한 계정 잠금을 방지할 수 있습니다.
(1) 비밀번호 만료 기간 설정
-- 비밀번호 만료 기간을 무제한으로 설정 (운영 계정에 적합)
ALTER PROFILE profile_name LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 비밀번호 만료 기간을 365일로 설정 (일반 사용자에 적합)
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 365;
-- 유예 기간 설정 (만료 후 7일간 비밀번호 변경 가능)
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 7;
ALTER PROFILE profile_name LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 비밀번호 만료 기간을 365일로 설정 (일반 사용자에 적합)
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 365;
-- 유예 기간 설정 (만료 후 7일간 비밀번호 변경 가능)
ALTER PROFILE DEFAULT LIMIT PASSWORD_GRACE_TIME 7;
(2) 특정 계정에 대한 만료 없는 프로파일 적용
-- 비밀번호 만료 없는 프로파일 생성
CREATE PROFILE no_expire_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED;
-- 배치 작업용 계정에 적용
ALTER USER batch_user PROFILE no_expire_profile;
CREATE PROFILE no_expire_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED;
-- 배치 작업용 계정에 적용
ALTER USER batch_user PROFILE no_expire_profile;
. . . . .
3) 로그인 실패 정책 조정
로그인 실패 허용 횟수와 잠금 시간을 조정하여 보안과 편의성의 균형을 맞출 수 있습니다.
(1) 로그인 실패 횟수 설정
-- 로그인 실패 허용 횟수를 5회로 변경 (더 엄격)
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5;
-- 로그인 실패 허용 횟수를 무제한으로 설정 (개발 환경에만 권장)
ALTER PROFILE dev_profile LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5;
-- 로그인 실패 허용 횟수를 무제한으로 설정 (개발 환경에만 권장)
ALTER PROFILE dev_profile LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
(2) 자동 잠금 해제 시간 설정
PASSWORD_LOCK_TIME은 계정이 잠긴 후 자동으로 해제되는 시간을 일(day) 단위로 지정합니다. 예를 들어 1/1440은 1분, 1/24는 1시간을 의미합니다.
-- 잠금 후 30분(1/48일) 후 자동 해제
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 0.0208;
-- 잠금 후 1일 후 자동 해제
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1;
-- 무제한 잠금 (수동으로만 해제 가능 - 보안 중요 시스템)
ALTER PROFILE production_profile LIMIT PASSWORD_LOCK_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 0.0208;
-- 잠금 후 1일 후 자동 해제
ALTER PROFILE DEFAULT LIMIT PASSWORD_LOCK_TIME 1;
-- 무제한 잠금 (수동으로만 해제 가능 - 보안 중요 시스템)
ALTER PROFILE production_profile LIMIT PASSWORD_LOCK_TIME UNLIMITED;
. . . . .
4) 비밀번호 복잡성 및 재사용 정책
비밀번호 품질을 높이고 재사용을 방지하여 보안을 강화할 수 있습니다.
(1) 비밀번호 복잡성 검증 함수 설정
-- Oracle 제공 기본 검증 함수 적용
ALTER PROFILE DEFAULT LIMIT
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;
-- 사용자 정의 검증 함수 적용
ALTER PROFILE secure_profile LIMIT
PASSWORD_VERIFY_FUNCTION custom_password_verify;
ALTER PROFILE DEFAULT LIMIT
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;
-- 사용자 정의 검증 함수 적용
ALTER PROFILE secure_profile LIMIT
PASSWORD_VERIFY_FUNCTION custom_password_verify;
(2) 비밀번호 재사용 방지 설정
-- 최근 5개의 비밀번호는 재사용 불가
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 5;
-- 180일 이내 사용한 비밀번호는 재사용 불가
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 180;
-- 최근 5개 비밀번호 또는 180일 이내 비밀번호 재사용 방지
ALTER PROFILE DEFAULT LIMIT
PASSWORD_REUSE_MAX 5
PASSWORD_REUSE_TIME 180;
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_MAX 5;
-- 180일 이내 사용한 비밀번호는 재사용 불가
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 180;
-- 최근 5개 비밀번호 또는 180일 이내 비밀번호 재사용 방지
ALTER PROFILE DEFAULT LIMIT
PASSWORD_REUSE_MAX 5
PASSWORD_REUSE_TIME 180;
. . . . .
5) 환경별 권장 프로파일 설정
시스템 환경에 따라 적절한 비밀번호 정책을 적용하는 것이 중요합니다.
| 환경 | FAILED_LOGIN_ATTEMPTS | PASSWORD_LOCK_TIME | PASSWORD_LIFE_TIME |
|---|---|---|---|
| 운영 환경 (사용자) | 5회 | 1일 | 90일 |
| 운영 환경 (시스템 계정) | 10회 | UNLIMITED | UNLIMITED |
| 개발 환경 | 10회 | 1/48일 (30분) | 365일 |
| 테스트 환경 | 10회 | 1/24일 (1시간) | 180일 |
| 배치 작업 계정 | 20회 | UNLIMITED | UNLIMITED |
#5. 계정 잠금 예방 및 모니터링
계정 잠금 문제를 사후에 해결하는 것보다 사전에 예방하고 주기적으로 모니터링하는 것이 더 효과적입니다. 체계적인 관리 전략을 통해 안정적인 데이터베이스 운영을 보장할 수 있습니다.
1) 연결 풀(Connection Pool) 사용
애플리케이션에서 Oracle 데이터베이스에 연결할 때 연결 풀을 사용하면 인증 실패로 인한 계정 잠금을 효과적으로 방지할 수 있습니다. 연결 풀은 미리 생성된 연결을 재사용하므로 매번 인증할 필요가 없습니다.
(1) 연결 풀 설정 권장사항
① 최소 연결 수와 최대 연결 수를 적절히 설정
② 연결 검증(Connection Validation) 쿼리 설정하여 끊어진 연결 자동 감지
③ 유휴 연결 타임아웃 설정으로 불필요한 연결 정리
④ 연결 재시도 로직 구현 시 지수 백오프(Exponential Backoff) 적용
⑤ 비밀번호 변경 시 연결 풀 재시작 또는 갱신 프로세스 수립
② 연결 검증(Connection Validation) 쿼리 설정하여 끊어진 연결 자동 감지
③ 유휴 연결 타임아웃 설정으로 불필요한 연결 정리
④ 연결 재시도 로직 구현 시 지수 백오프(Exponential Backoff) 적용
⑤ 비밀번호 변경 시 연결 풀 재시작 또는 갱신 프로세스 수립
. . . . .
2) 주기적인 로그인 실패 모니터링
로그인 실패 이벤트를 주기적으로 모니터링하여 계정 잠금 전에 문제를 발견하고 조치할 수 있습니다.
(1) 로그인 실패 감사 쿼리
-- Unified Audit 사용 시 (Oracle 12c 이상)
SELECT dbusername, event_timestamp, return_code,
client_program_name, os_username
FROM unified_audit_trail
WHERE action_name = 'LOGON'
AND return_code != 0
AND event_timestamp >= SYSDATE - 7
ORDER BY event_timestamp DESC;
-- 전통적인 Audit Trail 사용 시 (Oracle 11g 이하)
SELECT username, timestamp, action_name, returncode
FROM dba_audit_trail
WHERE action_name = 'LOGON'
AND returncode != 0
AND timestamp >= SYSDATE - 7
ORDER BY timestamp DESC;
SELECT dbusername, event_timestamp, return_code,
client_program_name, os_username
FROM unified_audit_trail
WHERE action_name = 'LOGON'
AND return_code != 0
AND event_timestamp >= SYSDATE - 7
ORDER BY event_timestamp DESC;
-- 전통적인 Audit Trail 사용 시 (Oracle 11g 이하)
SELECT username, timestamp, action_name, returncode
FROM dba_audit_trail
WHERE action_name = 'LOGON'
AND returncode != 0
AND timestamp >= SYSDATE - 7
ORDER BY timestamp DESC;
(2) 로그인 실패 통계 분석
-- 사용자별 최근 7일간 로그인 실패 횟수
SELECT dbusername, COUNT(*) as fail_count
FROM unified_audit_trail
WHERE action_name = 'LOGON'
AND return_code != 0
AND event_timestamp >= SYSDATE - 7
GROUP BY dbusername
HAVING COUNT(*) >= 5
ORDER BY fail_count DESC;
SELECT dbusername, COUNT(*) as fail_count
FROM unified_audit_trail
WHERE action_name = 'LOGON'
AND return_code != 0
AND event_timestamp >= SYSDATE - 7
GROUP BY dbusername
HAVING COUNT(*) >= 5
ORDER BY fail_count DESC;
. . . . .
3) 비밀번호 만료 알림 시스템 구축
비밀번호 만료가 임박한 계정을 사전에 파악하여 사용자에게 알림을 보내면 갑작스러운 계정 잠금을 방지할 수 있습니다.
(1) 만료 예정 계정 조회
-- 30일 이내 비밀번호 만료 예정인 계정 조회
SELECT username, account_status, expiry_date,
TRUNC(expiry_date - SYSDATE) as days_until_expiry
FROM dba_users
WHERE expiry_date IS NOT NULL
AND expiry_date BETWEEN SYSDATE AND SYSDATE + 30
AND account_status IN ('OPEN', 'EXPIRED(GRACE)')
ORDER BY expiry_date;
-- 이미 만료되었지만 유예 기간 중인 계정 조회
SELECT username, account_status, expiry_date,
TRUNC(SYSDATE - expiry_date) as days_expired
FROM dba_users
WHERE account_status = 'EXPIRED(GRACE)'
ORDER BY expiry_date;
SELECT username, account_status, expiry_date,
TRUNC(expiry_date - SYSDATE) as days_until_expiry
FROM dba_users
WHERE expiry_date IS NOT NULL
AND expiry_date BETWEEN SYSDATE AND SYSDATE + 30
AND account_status IN ('OPEN', 'EXPIRED(GRACE)')
ORDER BY expiry_date;
-- 이미 만료되었지만 유예 기간 중인 계정 조회
SELECT username, account_status, expiry_date,
TRUNC(SYSDATE - expiry_date) as days_expired
FROM dba_users
WHERE account_status = 'EXPIRED(GRACE)'
ORDER BY expiry_date;
. . . . .
4) 자동화된 모니터링 스크립트 구축
정기적으로 실행되는 모니터링 스크립트를 통해 계정 상태를 자동으로 점검하고 알림을 발송할 수 있습니다.
(1) 잠긴 계정 자동 감지 및 알림
① 크론(Cron) 또는 작업 스케줄러를 통해 매시간 또는 매일 실행
② DBA_USERS 뷰를 조회하여 LOCKED 상태 계정 탐지
③ 이메일, SMS, 또는 모니터링 시스템으로 즉시 알림 발송
④ 로그 파일에 상세 정보 기록하여 이력 관리
⑤ 중요 계정(시스템 계정, 서비스 계정)에 대한 우선순위 알림 설정
② DBA_USERS 뷰를 조회하여 LOCKED 상태 계정 탐지
③ 이메일, SMS, 또는 모니터링 시스템으로 즉시 알림 발송
④ 로그 파일에 상세 정보 기록하여 이력 관리
⑤ 중요 계정(시스템 계정, 서비스 계정)에 대한 우선순위 알림 설정
(2) 대시보드 구축
① Grafana, Kibana 등 모니터링 도구와 연동
② 계정 상태 현황을 실시간으로 시각화
③ 로그인 실패 추이를 그래프로 표시
④ 비밀번호 만료 예정 계정 목록 대시보드 표시
⑤ 임계값 초과 시 자동 알림 트리거
② 계정 상태 현황을 실시간으로 시각화
③ 로그인 실패 추이를 그래프로 표시
④ 비밀번호 만료 예정 계정 목록 대시보드 표시
⑤ 임계값 초과 시 자동 알림 트리거
. . . . .
5) 권한 분리 및 계정 관리 전략
효과적인 계정 관리 전략을 통해 보안을 강화하고 계정 잠금 위험을 줄일 수 있습니다.
(1) 계정 유형별 관리 방안
① 관리자 계정: 엄격한 비밀번호 정책, 다중 인증(MFA) 적용, 사용 이력 상세 감사
② 서비스 계정: 비밀번호 만료 없음, 높은 로그인 실패 허용 횟수, 연결 풀 사용
③ 개발자 계정: 적절한 비밀번호 정책, 개발 환경에 맞는 유연한 설정
④ 임시 계정: 명확한 만료일 설정, 프로젝트 종료 시 자동 비활성화
⑤ 외부 협력사 계정: 제한된 권한, 계약 기간에 맞춘 자동 잠금 설정
② 서비스 계정: 비밀번호 만료 없음, 높은 로그인 실패 허용 횟수, 연결 풀 사용
③ 개발자 계정: 적절한 비밀번호 정책, 개발 환경에 맞는 유연한 설정
④ 임시 계정: 명확한 만료일 설정, 프로젝트 종료 시 자동 비활성화
⑤ 외부 협력사 계정: 제한된 권한, 계약 기간에 맞춘 자동 잠금 설정
(2) 정기적인 계정 감사
① 분기별 또는 월별 계정 사용 현황 검토
② 장기간 미사용 계정 식별 및 비활성화
③ 불필요한 권한을 가진 계정 정리
④ 퇴사자 계정 즉시 비활성화 프로세스 확립
⑤ 계정 생성 및 삭제 이력 문서화
② 장기간 미사용 계정 식별 및 비활성화
③ 불필요한 권한을 가진 계정 정리
④ 퇴사자 계정 즉시 비활성화 프로세스 확립
⑤ 계정 생성 및 삭제 이력 문서화
(3) 비밀번호 관리 도구 활용
① 비밀번호 관리 솔루션(예: HashiCorp Vault, CyberArk) 도입
② 비밀번호 자동 로테이션 시스템 구축
③ 애플리케이션 설정 파일의 비밀번호 암호화
④ 환경 변수 또는 비밀 관리 서비스를 통한 비밀번호 주입
⑤ 개발팀과 운영팀 간 안전한 비밀번호 공유 프로세스 수립
② 비밀번호 자동 로테이션 시스템 구축
③ 애플리케이션 설정 파일의 비밀번호 암호화
④ 환경 변수 또는 비밀 관리 서비스를 통한 비밀번호 주입
⑤ 개발팀과 운영팀 간 안전한 비밀번호 공유 프로세스 수립
마무리
Oracle 계정 Lock 문제는 비밀번호 오류, 만료, DBA의 수동 잠금, 프로파일 설정, 장기간 미사용 등 다양한 원인으로 발생합니다. 각 원인을 정확히 파악하고 적절한 해결 방법을 적용하는 것이 중요합니다.
계정 잠금 해제는 ALTER USER 명령을 통해 간단히 수행할 수 있지만, 근본적인 원인을 해결하지 않으면 동일한 문제가 반복될 수 있습니다. 따라서 비밀번호 정책을 환경에 맞게 조정하고, 주기적인 모니터링 체계를 구축하는 것이 필수적입니다.
특히 주목할 점은 다음과 같습니다.
① 계정 상태 정확한 진단: DBA_USERS 뷰를 통해 ACCOUNT_STATUS를 확인하고 원인 파악
② 환경별 차별화된 정책: 운영 환경, 개발 환경, 시스템 계정별로 적절한 프로파일 적용
③ 연결 풀 활용: 애플리케이션에서 연결 풀을 사용하여 인증 실패 최소화
④ 사전 예방 체계: 비밀번호 만료 알림, 로그인 실패 모니터링, 정기적인 계정 감사
⑤ 자동화된 관리: 모니터링 스크립트와 대시보드를 통한 실시간 상태 파악
② 환경별 차별화된 정책: 운영 환경, 개발 환경, 시스템 계정별로 적절한 프로파일 적용
③ 연결 풀 활용: 애플리케이션에서 연결 풀을 사용하여 인증 실패 최소화
④ 사전 예방 체계: 비밀번호 만료 알림, 로그인 실패 모니터링, 정기적인 계정 감사
⑤ 자동화된 관리: 모니터링 스크립트와 대시보드를 통한 실시간 상태 파악
실수요자인 개발자와 일반 사용자는 자신의 비밀번호를 안전하게 관리하고, 만료 알림을 받으면 즉시 변경하는 습관을 들여야 합니다. DBA는 보안과 편의성의 균형을 맞추는 합리적인 정책을 수립하고, 문제 발생 시 신속하게 대응할 수 있는 체계를 갖춰야 합니다.
비밀번호 정책은 너무 엄격하면 사용자 불편을 초래하고, 너무 느슨하면 보안 위협이 증가합니다. 조직의 보안 요구사항과 시스템 특성을 고려하여 최적의 균형점을 찾는 것이 중요합니다.
이 가이드가 Oracle 계정 Lock 문제로 어려움을 겪는 분들에게 실질적인 도움이 되기를 바랍니다. 복잡한 환경이나 특수한 상황에서는 Oracle 공식 문서를 참고하거나 전문가의 도움을 받는 것도 좋은 방법입니다.
긴 글 읽어주셔서 감사합니다.
끝.
끝.
반응형
'Development > Error' 카테고리의 다른 글
| [Error] This version only understands SDK XML versions up to 2 오류 원인과 해결방법 (0) | 2022.09.29 |
|---|---|
| [Error] Invalid file name: must contain only [a-z0-9_.] 원인과 해겳 방법 (0) | 2020.04.08 |
| [Error] Android OS 10 Target 시 파일 조회 원인과 해결 방법 (0) | 2020.03.24 |
| [Error] Android Data-Scheme 설정 후 앱 아이콘 사라지는 이유와 해결 방법 (0) | 2020.03.22 |
| [Error] 큰 용량의 PDF 읽기 (0) | 2019.10.29 |