728x90

ROLE_ROLE_PRIVS는 롤(ROLE)과 롤 사이의 권한 상속 관계를 보여주는 Oracle 데이터 사전 뷰입니다. 사용자에게 직접 부여된 권한은 DBA_ROLE_PRIVS에서 확인할 수 있지만, 어떤 롤이 다른 롤을 포함하고 있는지를 정확히 파악하려면 ROLE_ROLE_PRIVS가 핵심입니다. 대규모 시스템이나 다단계 롤 체계를 운영할수록 “권한이 어디서 흘러들어왔는가?”를 추적하는 데 이 뷰가 가장 빠릅니다.
1) 한눈에 이해하는 핵심 요약
| 주제 | 핵심 내용 | 현업 활용 포인트 |
|---|---|---|
| 역할 | 롤 간 포함 관계(상속)를 조회 | “이 롤이 왜 강한가?”를 구조적으로 설명 |
| 대표 컬럼 | ROLE, GRANTED_ROLE, ADMIN_OPTION, COMMON, INHERITED (버전에 따라 상이 가능) | 관리 권한 여부(ADMIN_OPTION)와 CDB 공통 롤 여부(COMMON)를 빠르게 판단 |
| 차별점 | DBA_ROLE_PRIVS는 “사용자/롤 → 롤”, ROLE_ROLE_PRIVS는 “롤 → 롤” |
권한 누수·중복을 줄이는 구조 리팩토링에 유용 |
| 주요 사용처 | 보안 점검, 최소 권한 원칙(PoLP) 준수, 감사 리포트 | 감사 대비 자동 리포트에 포함하면 설명 책임 강화 |
| 주의사항 | 멀티티어 상속(롤 속의 롤 속의 롤)을 재귀적으로 분석해야 전모 파악 가능 | CTE/CONNECT BY로 전체 트리 펼치기 |
2) 컬럼 구조 (버전 공통적으로 많이 쓰이는 항목)
- ROLE (VARCHAR2): 상위 롤(권한을 받는 주체)
- GRANTED_ROLE (VARCHAR2): 포함된 하위 롤(권한을 제공하는 롤)
- ADMIN_OPTION (VARCHAR2/CHAR): 상위 롤이 하위 롤을 다른 대상에게 부여/회수할 수 있는 관리 권한 여부(
YES/NO) - COMMON (VARCHAR2/CHAR): 멀티테넌트(CDB) 환경에서 CDB 공통 롤 여부 (
YES/NO) - INHERITED (VARCHAR2/CHAR): 이 관계가 상속되어 나타나는 것인지 여부 (
YES/NO)
참고: Oracle 버전에 따라 컬럼 구성이 일부 다를 수 있습니다. 운영 중인 버전의 데이터 사전 정의서를 함께 확인하세요.
3) 왜 중요한가? ― 실무 가치
- 최소 권한 원칙(PoLP) 구현: 실제로는 쓰지 않는 강력한 롤을 중첩 부여한 사례를 찾아 제거.
- 감사 대응: “권한이 어떻게 사용자에게 도달했는가”를 인과적으로 설명하는 증적을 생성.
- 권한 리팩토링: 중복·순환 포함을 제거하고, 기능 단위의 모듈형 롤로 재설계.
- 멀티테넌트 구분:
COMMON컬럼으로 CDB 전체에 영향이 퍼질 수 있는 롤을 식별.
4) 즉시 활용 가능한 SQL 레시피
4-1. 특정 롤이 포함하고 있는 하위 롤 나열
SELECT granted_role, admin_option, common, inherited
FROM role_role_privs
WHERE role = UPPER(:role_name)
ORDER BY granted_role;
4-2. 사용자가 가진 롤의 “전개된” 하위 롤 전체 (CONNECT BY)
-- :user_name 의 효과적 롤 전체 펼치기
WITH direct_roles AS (
SELECT granted_role
FROM dba_role_privs
WHERE grantee = UPPER(:user_name)
)
SELECT CONNECT_BY_ROOT dr.granted_role AS root_role
, rrp.granted_role AS child_role
, rrp.admin_option
, rrp.common
, rrp.inherited
FROM role_role_privs rrp
JOIN direct_roles dr
ON rrp.role = dr.granted_role
CONNECT BY PRIOR rrp.granted_role = rrp.role
START WITH rrp.role IN (SELECT granted_role FROM direct_roles)
ORDER BY root_role, child_role;
4-3. “이 위험 권한이 어디서 들어왔나?” 역추적 (재귀 CTE)
-- SYSDBA 등 특정 롤(:target_role)이 최종적으로 부여되는 경로 탐색
WITH role_tree (role, granted_role, level_no) AS (
SELECT role, granted_role, 1
FROM role_role_privs
WHERE granted_role = UPPER(:target_role)
UNION ALL
SELECT r.role, r.granted_role, t.level_no + 1
FROM role_role_privs r
JOIN role_tree t
ON r.granted_role = t.role
)
SELECT * FROM role_tree ORDER BY level_no, role, granted_role;
4-4. ADMIN_OPTION이 있는 상위 롤 찾기
SELECT role, granted_role
FROM role_role_privs
WHERE admin_option = 'YES';
4-5. COMMON 롤 포함 관계만 보기(CDB)
SELECT role, granted_role
FROM role_role_privs
WHERE common = 'YES';
5) 보안 점검 체크리스트
- 위험 권한을 품은 롤이 다른 범용 롤에 포함되어 있는가?
- ADMIN_OPTION으로 재배포가 가능한가? 재배포 체인을 끊어야 하는 위치는?
- COMMON='YES'인 롤이 PDB에 과도한 영향력을 주지 않는가?
- 업무 종료/조직 개편 이후 더 이상 쓰지 않는 롤이 상속 체인에 남아 있는가?
- 테스트/임시 목적의 롤이 운영 계정에 우회적으로 연결되어 있지 않은가?
6) 성능과 운영 팁
- 정기 스냅샷: 월간/분기별로
ROLE_ROLE_PRIVS와DBA_ROLE_PRIVS를 덤프해 변경 이력을 남기면 감사 대응이 빨라집니다. - 재귀 탐색 최적화: CONNECT BY/재귀 CTE 결과를 임시 테이블에 캐시해 대시보드 응답속도를 확보합니다.
- 네이밍 규칙: “업무영역_권한수준_환경” 패턴(예:
AR_READ_ONLY_PROD)으로 롤 의미를 자가설명적으로 유지. - 단위 테스트: 새 롤 설계 시 “이 롤을 부여하면 어떤 시스템 권한이 간접으로 들어오는가?”를 자동 검증.
7) 자주 하는 실수와 해결법
- “사용자에겐 롤을 하나만 줬는데 왜 권한이 많지?”
→ 그 롤이 다른 롤을 여러 단계로 포함하고 있을 수 있습니다. 4-2, 4-3 쿼리로 전개/역추적하세요. - COMMON 롤 오해
→ CDB 전역 롤은 영향 범위가 큽니다. 꼭 필요한지 재검토하고, PDB 한정 롤로 분리하세요. - ADMIN_OPTION 남발
→ 관리 권한은 권한 확산의 지렛대입니다. 발급·회수 정책과 로그를 결합해 관리 범위를 최소화하세요.
8) 운영 시나리오 예시
- 감사 주간: “고위험 롤 포함 체인” 리포트 자동 생성 → 보안팀 공유 → 승인/차단 액션.
- 조직개편: 퇴직/이관 인원 롤 회수 시, 간접 상속까지 끊겼는지 회귀 테스트.
- 신규 서비스 오픈: 필요 권한만 묶은 기능 기반 롤 설계 → 상위 표준 롤에 선택적으로 포함.
9) 버전/환경 주의
멀티테넌트 도입(12c+) 이후 COMMON, INHERITED와 같은 열이 등장/확장되었습니다. 운영 DB의 정확한 열 목록은 아래 문서(출처)에서 버전별로 확인하세요.
10) 마무리
ROLE_ROLE_PRIVS는 롤 설계의 품질과 보안 책임을 가늠하는 지표입니다. 이 뷰를 중심으로 DBA_ROLE_PRIVS, ROLE_SYS_PRIVS, ROLE_TAB_PRIVS를 함께 엮어 “누가, 무엇을, 왜 가졌는가”를 설명할 수 있다면 감사·장애·운영 변경에 모두 강한 데이터베이스를 운영할 수 있습니다.
출처
- Oracle Database Reference, Data Dictionary (버전별
ROLE_ROLE_PRIVS정의) - Oracle Database Security Guide (최소 권한 원칙, 롤 설계 모범 사례)
- Oracle Multitenant Admin Guide (CDB/PDB 및 COMMON 롤 개념)
추천 태그: ORACLE,ROLE_ROLE_PRIVS,DBA_ROLE_PRIVS,권한관리,데이터베이스보안,멀티테넌트,SQL
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ROLE_TAB_PRIVS 뷰 완벽 해설 – 사용자별 테이블 권한 확인 가이드 (0) | 2025.10.09 |
|---|---|
| [ORACLE] ROLE_SYS_PRIVS 뷰 완벽 해설 : 시스템 권한과 역할 매핑 구조 (0) | 2025.10.09 |
| [ORACLE] RESOURCE_COST 뷰 완벽 가이드 (0) | 2025.09.10 |
| [ORACLE] NLS_INSTANCE_PARAMETERS 뷰 완벽 가이드 (0) | 2025.09.10 |
| [ORACLE] NLS_SESSION_PARAMETERS 뷰 완벽 가이드 (0) | 2025.09.10 |