[D-18] 인가되지 않은 Object Owner
점검 내용
점검 내용을 보기전에 개념을 먼저 정리하자 . .
Object란 무엇인가?
데이터베이스에서 "Object(객체)"란 데이터베이스 내에서 특정한 역할이나 기능을 수행하는 구성 요소를 의미합니다. 쉽게 말해, 데이터베이스에서 다루는 데이터나 구조를 구성하는 모든 것을 객체라고 할 수 있습니다.
객체의 종류와 예시:
- 테이블 (Table):
- 뷰 (View):
- 인덱스 (Index):
이처럼 데이터베이스의 객체는 데이터를 저장하고, 관리하고, 처리하는 데 필요한 다양한 구성 요소를 포함하고 있습니다. 각 객체는 특정한 기능을 가지고 있으며, 이러한 객체들이 함께 작동하여 효율적인 데이터 관리를 가능하게 합니다.
Object owner란?
특정 데이터베이스 객체(예: 테이블, 뷰, 인덱스, 프로시저 등)의 소유자를 나타내는 개념.
객체 소유자는 해당 객체에 대한 권한을 가진 사용자를 의미하며, 이 사용자는 객체를 생성한 사용자 또는 특정 권한을 부여받은 사용자일 수 있습니다.
진단 기준은 아래와 같다.
양호: Object Owner 의 권한이 SYS, SYSTEM, 관리자 계정 등으로 제한된 경우
취약: Object Owner 의 권한이 일반 사용자에게도 부여되어있는 경우
결국 DB 객체를 일반 사용자(담당자 기준) 따위가 "소유" 하고 있는지 검토하는것이라고 보면 된다.
관리자 혹은 인가된 사용자 만이 '소유' 할 수 있다 . . 다만 여기서 "관리자" 라는게 말이 애매한데,
1) 시스템상에서 SYS,SYSTEM, superuser로 설정되어있는 계정
2) 시스템상에서 일반 사용자로 설정되어있으나, object 권한 관리를 위해 생성한 계정.(담당자가 불필요한 계정이아니라, 인가된 계정이 맞다고 인터뷰 답변한 계정.)
이렇게 두가지로 볼 수 있다. 가이드상에서는 1번으로 확인하라고 하는듯한데, 필드에 나갔을때는 오히려 관리자가 object도 관리하게 되면 너무 권한이 많이 부여되어있어서 더 위험하다고 판단하기도 한다. 권한을 최대한 분리하는게 안전하기 때문이다. 따라서 실제 진단할때는 object를 소유한 계정 목록에 대해서 불필요한 계정이 없는지만 판단하면 되겠다.
진단 방법
1) DBA도 아닌데 객체를 소유하고 있는 OWNER 와 그들이 소유한 Object 상세 출력
oracle 에서 object owner를 확인하는 쿼리는 아래와 같다
SELECT DISTINCT owner, object_name, object_type, status
FROM dba_objects
WHERE owner NOT IN ('SYS', 'SYSTEM', 'MDSYS', 'CTXSYS', 'ORDSYS', 'ORDPLUGINS',
'AURORA$JIS$UTILITY$', 'HR', 'ODM', 'ODM_MTR', 'OE',
'OLAPDBA', 'OLAPSYS', 'OSE$HTTP$ADMIN', 'OUTLN', 'LBACSYS',
'MTSYS', 'PM', 'PUBLIC', 'QS', 'QS_ADM', 'QS_CB',
'QS_CBADM', 'DBSNMP', 'QS_CS', 'QS_ES', 'QS_OS',
'QS_WS', 'RMAN', 'SH', 'WKSYS', 'WMSYS', 'XDB')
AND owner NOT IN (SELECT grantee FROM dba_role_privs WHERE granted_role='DBA')
AND owner IN (SELECT username FROM dba_users WHERE account_status='OPEN');
해당 쿼리는 DBA가 아닌 소유자가 소유하고 있는 오브젝트 이름, 타입, 상태 그리고 누가 소유하고 있는지를 모두 출력해준다. (상세 쿼리 설명은 아래 더보기 참고)
1. SELECT DISTINCT owner, object_name, object_type, status:
- 이 부분은 쿼리의 결과로 반환할 컬럼을 지정합니다. DISTINCT를 사용하여 중복된 결과를 제거하고, 각 객체의 소유자(owner), 객체 이름(object_name), 객체 유형(object_type), 그리고 객체 상태(status)를 선택합니다.
2. FROM dba_objects:
- dba_objects는 데이터베이스의 모든 객체에 대한 정보를 담고 있는 데이터 딕셔너리 뷰입니다. 이 뷰를 통해 테이블, 뷰, 인덱스, 프로시저 등의 객체에 대한 정보를 조회할 수 있습니다.
3. WHERE 조건:
- 이 부분에서 여러 조건을 통해 결과를 필터링합니다.
- 첫 번째 NOT IN 절:
- owner NOT IN (...)는 쿼리에서 나열된 소유자 목록에 포함되지 않는 객체 소유자만 선택합니다. 이 목록은 일반적으로 시스템 계정 및 기본 제공 계정으로, 이러한 계정은 일반 사용자와는 다른 역할을 수행합니다.
- 두 번째 NOT IN 절:
- AND owner NOT IN (SELECT grantee FROM dba_role_privs WHERE granted_role='DBA')는 DBA 역할이 부여된 사용자를 제외합니다. 이 사용자들은 모든 객체에 대한 권한을 가지고 있으므로, 이 쿼리는 DBA 역할이 없는 일반 사용자들만의 객체를 포함합니다.
- 세 번째 IN 절:
- AND owner IN (SELECT username FROM dba_users WHERE account_status='OPEN')는 현재 활성 상태인 사용자 계정만 선택합니다. 즉, 계정 상태가 'OPEN'인 사용자들만 포함시키며, 비활성 계정이나 잠긴 계정은 제외됩니다.
결과 해석:
- 이 쿼리를 실행하면, 시스템 계정이나 DBA 역할을 가진 사용자가 아닌, 활성 상태의 일반 사용자들이 소유한 데이터베이스 객체의 소유자, 객체 이름, 객체 유형, 그리고 상태를 반환합니다.
결과예시는 아래와 같은데, 내용이 아주 많다.
OWNER | OBJECT_NAME | OBJECT_TYPE | STATUS |
USER_A | EMPLOYEES | TABLE | VALID |
USER_B | DEPARTMENTS | VIEW | VALID |
USER_C | SALARIES | TABLE | VALID |
실제 출력하면 너무 많아서 어지러울 지경. . 담당자 검토도 어렵다. 따라서 owner만 검토할 수 있도록 아래 쿼리를 애용하는편이다.
2) DBA도 아닌데 객체를 소유하고 있는 OWNER 만 출력
쿼리는 아래와 같다. 다른 절은 같고 SELECT 만 다르다.
SELECT DISTINCT owner
FROM dba_objects
WHERE owner NOT IN ('SYS', 'SYSTEM', 'MDSYS', 'CTXSYS', 'ORDSYS', 'ORDPLUGINS',
'AURORA$JIS$UTILITY$', 'HR', 'ODM', 'ODM_MTR', 'OE',
'OLAPDBA', 'OLAPSYS', 'OSE$HTTP$ADMIN', 'OUTLN', 'LBACSYS',
'MTSYS', 'PM', 'PUBLIC', 'QS', 'QS_ADM', 'QS_CB',
'QS_CBADM', 'DBSNMP', 'QS_CS', 'QS_ES', 'QS_OS',
'QS_WS', 'RMAN', 'SH', 'WKSYS', 'WMSYS', 'XDB')
AND owner NOT IN (SELECT grantee FROM dba_role_privs WHERE granted_role='DBA')
AND owner IN (SELECT username FROM dba_users WHERE account_status='OPEN');
결과는 아래와 같다. 아주 심플/.
OWNER |
USER_A |
USER_B |
USER_C |
USER_D |
USER_E |
해당 계정들은 관리자 계정도 아닌데 Object를 소유하고 있는 애들이다. 담당자 확인해서 인가된 애들이 맞는지 확인.
상세하게 어떤걸 소유하고 있는지 보고 싶다면 위를, 근데 너무 많이 나와서 owner 만 출력해서 검토하는걸 추천,.