콘텐츠로 이동

D-04: 데이터베이스 관리자 권한을 꼭 필요한 계정 및 그룹에 대해서만 허용

분류: DBMS

중요도: 상


개요

점검 내용

관리자 권한이 필요한 계정 및 그룹에만 관리자 권한을 부여하였는지 점검

점검 목적

관리자 권한이 필요한 계정과 그룹에만 관리자 권한을 부여하였는지 점검하여 관리자 권한의 남용을 방지하여 계정 유출로 인한 비인가자의 DB 접근 가능성을 최소화하고자 함

보안 위협

관리자 권한이 필요한 계정 및 그룹에만 관리자 권한을 부여하지 않으면 관리자 권한이 부여된 계정이 비인가자에게 유출될 경우 DB에 접근할 수 있는 위험이 존재함

참고

  • -

점검 대상 및 판단 기준

대상

Oracle DB, MSSQL, MySQL, Altibase, Tibero, PostgreSQL, Cubrid 등

판단 기준

✅ 양호: 관리자 권한이 필요한 계정 및 그룹에만 관리자 권한이 부여된 경우

❌ 취약: 관리자 권한이 필요 없는 계정 및 그룹에 관리자 권한이 부여된 경우

조치 방법

관리자 권한이 필요한 계정 및 그룹에만 관리자 권한 부여

조치 시 영향

일반적인 경우 영향 없음

점검 및 조치 사례

Oracle DB

Step 1) SYSDBA 권한 점검

SQL> SELECT username FROM v$pwfile_users WHERE username NOT IN (SELECT grantee FROM d ba_role_privs WHERE granted_role='DBA') AND username != 'INTERNAL' AND SYSDBA = 'TRUE';
-- 어떠한 계정이라도 나오는 경우 취약

Step 2) Admin에 부적합 계정 존재 여부 점검

SQL> SELECT grantee, privilege FROM dba_sys_privs WHERE grantee NOT IN ('SYS', 'SYSTEM', 'AQ_ ADMINISTRATOR_ROLE', 'DBA', 'DSYS', 'BACSYS', 'HEDULER_ADMIN', 'MSYS') AND admin_opti on= 'YES' AND grantee NOT IN (SELECT grantee FROM dba_role_privs WHERE granted_role='DBA');
-- 어떠한 계정이라도 나오는 경우 취약

Step 3) 관리자 권한이 불필요한 계정에서 관련 권한을 제거

SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = '계정명';
-- 불필요하게 시스템 권한을 부여한 계정의 권한 변경 필요
REVOKE <권한> FROM <계정명>;

-- 시스템 권한 부여가 필요한 경우 필요한 테이블별 권한 부여
GRANT <권한> ON <테이블명> TO <계정명>;

-- 인가된 사용자는 관리자 권한에 role을 grant한 후, 시스템 권한을 grant하고 role을 인가된 사용자에게 grant 함
GRANT <Role_name> TO <계정명>;

MSSQL

Step 1) sysadmin서버 역할의 계정 목록을 확인 후 서버 역할에 불필요한 계정이 있는 경우 서버 역할에서 삭제

EXEC sp_droprolemember 'user_name', 'sysadmin';
-- 예시) user01계정을 sysadmin서버 역할에서 삭제
EXEC sp_dropsrvrolemember 'user01', 'sysadmin';

서버 역할에서 불필요 계정 삭제 예시

MySQL

Step 1) SUPER 권한(관리자 권한)이 부여되어 있는 계정 확인

SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE PRIVILEGE_TYPE = 'SUPER';

Step 2) 불필요하게 SUPER 권한이 부여되어 있는 계정에 대해 SUPER 권한 회수

REVOKE SUPER ON *.* FROM '<계정명>';
FLUSH PRIVILEGES;

참고

만약 관리자 test@localhost 계정이 바이너리 로그 정리 및 시스템 변수 수정을 위해 SUPER 권한을 필요로 하는 경우 아래와 같은 명령문으로 필요한 권한으로 제한.

GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'test'@'localhost';
REVOKE SUPER ON *.* FROM 'test'@'localhost';
FLUSH PRIVILEGES;

Altibase

Step 1) 계정별 부여된 시스템 권한 목록에서 grantee 확인

SELECT grantee_id FROM system_.sys_grant_system_;

Step 2) 계정별 부여된 시스템 권한 목록에서 user_id 확인

SELECT user_id, user_name FROM system_.sys_users_;

Step 3) 계정별 부여된 시스템 권한 목록에서 priv_id 확인

SELECT priv_id, priv_name FROM system_.sys_privileges_;

Step 4) 일반 사용자 계정 생성 시 시스템에 의해 부여되는 기본 권한 외 입력된 경우 해당 권한 삭제

  • 시스템에 의해 자동으로 부여되는 권한 privileged_id
    • create session create table create sequence create procedure create view create trigger create synonym create materialized view create library

Tibero

Step 1) 계정별 부여된 시스템 권한 목록 확인 후, 아래 명령어 모두 입력

SELECT * FROM dba_users;
SELECT * FROM dba_sys_privs;

Step 2) dba_users 결과값에서 시스템 계정, 일반 계정 확인

시스템 계정, 일반 계정 확인

Step 3) dba_sys_privs 결과값에서 일반 계정임에도 시스템 권한을 불필요하게 부여받고 있는지 확인

일반 계정 권한 불필요하게 부여되어 있는지 확인

Step 4) 일반 계정에 불필요한 시스템 권한이 부여된 경우 권한 삭제

PostgreSQL

Step 1) 계정의 용도 파악 후 불필요한 계정은 삭제, 새로운 계정 생성 시 적절한 권한을 부여하여 생성

  • 모든 사용자 확인
    -- 쿼리문 조회
    SELECT * FROM pg_user;
    -- or
    SELECT username, usesuper FROM pg_shadow;
    -- 명령어 조회
    \du
    

Step 2) 불필요하게 관리자 권한이 부여된 경우 권한 회수

ALTER ROLE <계정명> NOSUPERUSER;
ALTER ROLE <계정명> NOCREATEROLE;
ALTER ROLE <계정명> NOCREATEDB;
ALTER ROLE <계정명> NOREPLICATION;
ALTER ROLE <계정명> NOBYPASSRLS;

Cubrid

Step 1) 계정의 용도 파악 후 불필요한 계정은 삭제, 새로운 계정 생성 시 적절한 권한을 부여하여 생성

Step 2) DBA 권한을 가진 사용자 계정 확인

SELECT a.name FROM db_user a, table(direct_groups) AS t(roles) WHERE roles.name = 'DBA';

DBA 권한을 가진 사용자 중 권한이 불필요한 계정의 권한 회수 or 계정 삭제

  1. DBA가 가진 권한 한 번에 회수
    REVOKE ALL PRIVILEGES ON test FROM 'GRANT_TEST';
    
  2. DBA가 가진 권한을 명시적으로 회수
    REVOKE SELECT ON test FROM 'GRANT_TEST';
    REVOKE INSERT ON test FROM 'GRANT_TEST';
    REVOKE UPDATE ON test FROM 'GRANT_TEST';
    REVOKE DELETE ON test FROM 'GRANT_TEST';
    REVOKE ALTER ON test FROM 'GRANT_TEST';
    REVOKE DROP ON test FROM 'GRANT_TEST';
    REVOKE EXECUTE ON test FROM 'GRANT_TEST';
    REVOKE INDEX ON test FROM 'GRANT_TEST';
    REVOKE REFERENCES ON test FROM 'GRANT_TEST';
    
  3. DBA 권한을 가진 불필요 계정 삭제
    DROP USER 'GRANT_TEST';
    

Step 3) 필요할 경우 적절한 권한을 부여하여 새로운 계정 생성

CREATE USER [계정명] PASSWORD '비밀번호' GROUPS [그룹명];
-- 예시)
CREATE USER test_db PASSWORD 'password' GROUPS DB_USER;