Amazon RDS for Oracle DB 인스턴스에서 사용자 권한 및 역할을 관리하려면 어떻게 해야 하나요?

6분 분량
0

Oracle을 실행하는 Amazon Relational Database Service(Amazon RDS) DB 인스턴스가 있습니다. 이 데이터베이스 인스턴스에 대한 사용자 권한 및 역할을 관리하는 절차를 알고 싶습니다.

간략한 설명

Amazon RDS for Oracle Database 인스턴스를 생성하면 기본 마스터 사용자가 생성되고 몇 가지 제한과 함께 DB 인스턴스에 대한 최대 사용자 권한이 부여됩니다. 데이터베이스에 추가 사용자 계정 생성과 같은 모든 관리 태스크에 이 계정을 사용합니다. Amazon RDS는 관리형 서비스이므로 SYS 및 SYSTEM 사용자는 기본적으로 사용할 수 없습니다.

Amazon RDS for Oracle 마스터 사용자에게 부여된 역할 및 권한 목록은 마스터 사용자 계정 권한을 참조하세요.

Amazon RDS는 관리형 서비스이므로 DBA 역할에 대해 다음과 같은 권한이 제공되지 않습니다.

  • ALTER DATABASE
  • ALTER SYSTEM
  • CREATE ANY DIRECTORY
  • DROP ANY DIRECTORY
  • GRANT ANY PRIVILEGE
  • GRANT ANY ROLE

자세한 내용은 Oracle DBA 권한에 대한 제한 사항을 참조하세요.

해결 방법

Amazon RDS의 SYS 객체에 대한 권한을 부여하려면 Amazon RDS 프로시저 rdsadmin.rdsadmin_util.grant_sys_object를 사용합니다. 이 프로시저는 마스터 사용자에게 역할 또는 직접 부여를 통해 이미 부여된 권한만 부여합니다.

다음과 유사한 명령을 실행하여 객체 V_$SQLAREA에 대한 SELECT 권한을 사용자 EXAMPLE-USERNAME에게 부여합니다.

RDS 마스터 사용자로 로그인하고 다음 프로시저를 실행합니다.

EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name  => 'V_$SQLAREA',p_grantee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');

다음과 유사한 명령을 실행하여 권한 부여 옵션이 있는 사용자 EXAMPLE-USERNAME에게 객체 V_$SQLAREA에 대한 SELECT 권한을 부여합니다.

참고: 대/소문자를 구분하는 식별자로 사용자를 생성하지 않은 경우 대문자를 사용하여 모든 파라미터 값을 정의하세요.

EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name  => 'V_$SQLAREA',p_grantee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);

다음 쿼리를 실행하여 관리자 옵션이 있는 사용자 EXAMPLE-USERNAME에게 역할 SELECT_CATALOG_ROLE 및 EXECUTE_CATALOG_ROLE을 부여합니다. 이러한 역할을 통해 EXAMPLE-USERNAME은 SELECT_CATALOG_ROLE 및 EXECUTE_CATALOG_ROLE에 부여된 SYS 객체에 대한 액세스 권한을 부여할 수 있습니다.

SQL> GRANT SELECT_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;
SQL> GRANT EXECUTE_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;

다음 쿼리를 실행하여 역할 SELECT_CATALOG_ROLE과 연결된 권한 부여를 확인합니다.

SELECT type, owner, table_name, privilege, grantor, grantable FROM dba_tab_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION
SELECT 'SYS' AS type, NULL as owner, NULL as table_name, privilege, NULL, admin_option AS grantable FROM dba_sys_privs WHERE grantee = upper('SELECT_CATALOG_ROLE')
UNION
SELECT 'ROLE' AS type, NULL AS owner, NULL AS table_name, granted_role AS privilege, NULL, admin_option AS grantable FROM dba_role_privs WHERE grantee = upper('SELECT_CATALOG_ROLE')
ORDER BY type, owner, table_name, privilege;

자세한 내용은 SYS 객체에 SELECT 또는 EXECUTE 권한 부여를 참조하세요.

단일 객체에 대한 권한을 취소하려면 RDS 프로시저 rdsadmin.rdsadmin_util.revoke_sys_object를 사용합니다.

다음 명령을 실행하여 사용자 EXAMPLE-USERNAME으로부터 객체 V_$SQLAREA에 대한 SELECT 권한을 취소합니다.

EXECUTE rdsadmin.rdsadmin_util.revoke_sys_object( p_obj_name  => 'V_$SQLAREA', p_revokee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');

자세한 내용은 SYS 객체에 대한 SELECT 또는 EXECUTE 권한 취소를 참조하세요.

문제 및 사용 사례에 따라 다음 문제 해결 옵션을 사용합니다.

마스터 사용자 권한 재설정

마스터 사용자의 역할과 권한을 취소한 경우 RDS DB 인스턴스의 마스터 사용자 암호를 변경하여 재설정할 수 있습니다.

마스터가 아닌 사용자에게 RDS_MASTER_ROLE 부여

역할 RDS_MASTER_ROLE은 마스터가 아닌 사용자에게 부여할 수 없습니다. 이 역할은 DB 인스턴스가 생성될 때 기본적으로 SYS에 의해 생성됩니다. RDS_MASTER_ROLE은 마스터 사용자에게만 부여해야 합니다. 다음 쿼리를 실행하여 RDS_MASTER_ROLE이 부여된 사용자를 나열합니다.

SQL> SELECT * FROM sys.dba_role_privs WHERE granted_role = 'RDS_MASTER_ROLE';

출력은 다음과 유사합니다.

GRANTEE        GRANTED_ROLE        ADM      DEL     DEF     COM     INH
--------       ---------------     ---      ---     ---     ---     ---
MASTER         RDS_MASTER_ROLE     NO       NO      YES     NO      NO
SYS            RDS_MASTER_ROLE     YES      NO      YES     YES     YES

쿼리 출력에서 마스터 사용자에게 admin 옵션이 없음을 확인할 수 있습니다. 따라서 다른 사용자에게 역할 RDS_MASTER_ROLE을 부여할 수 없습니다.

자세한 내용은 마스터가 아닌 사용자에게 권한 부여를 참조하세요.

PUBLIC에 부여된 권한 취소

여러 Oracle 애플리케이션이 PUBLIC 권한을 사용하도록 설계되었기 때문에 키 DBMS_* 및 UTL_* 패키지에 대한 PUBLIC 권한을 취소하는 것은 모범 사례가 아닙니다. 자세한 내용은 MOSC Doc 247093.1을 참조하세요. 키 DBMS_* 및 UTL_* 패키지에는 UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE 및 DBMS_SYS_SQL이 포함됩니다.

암호가 있는 역할을 생성할 때 발생하는 오류 해결

다음 쿼리를 실행하여 암호가 있는 역할을 생성하고 rdsadmin_util.grant_sys_object를 사용하여 권한을 부여한다고 가정합니다.

SQL> CREATE ROLE ROLE_NAME IDENTIFIED BY EXAMPLE-PASSWORD;
SQL> EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBMS_JOB', 'ROLE_NAME');

그러면 다음 오류가 발생합니다.

ORA-20199: Error in rdsadmin_util.grant_sys_object. ORA-44001: invalid schema
ORA-06512: at "RDSADMIN.RDSADMIN_UTIL", line 268
ORA-44001: invalid schema

이 문제를 해결하려면 암호 없이 역할을 생성합니다.

-- Create a role without a password
ALTER ROLE ROLE_NAME NOT IDENTIFIED;

오류 ORA-01031: 권한 부족 해결

다음은 이 오류가 발생할 수 있는 사용 사례의 몇 가지 예입니다.

ALTER SYSTEM 쿼리를 실행했습니다. 예를 들어 다음 쿼리는 ORA-01031 오류와 함께 실패합니다.

SQL> ALTER SYSTEM SET processes=200 scope=spfile;

대신 사용자 정의 DB 파라미터 그룹의 파라미터 값을 수정할 수 있습니다. 하지만 기본 DB 파라미터 그룹의 파라미터 값은 변경할 수 없습니다.

데이터베이스 트리거를 사용 중이고 기본 테이블 구조 변경으로 인해 트리거 상태가 INVALID가 되었습니다. 다음에 트리거가 실행될 때 트리거의 암시적 컴파일이 다음 오류와 함께 실패함을 확인할 수 있습니다.

ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIG
ORA-01031: insufficient privileges

이 문제를 해결하려면 트리거 소유자에게 데이터베이스 트리거 관리 권한을 명시적으로 부여합니다. 이 권한은 데이터베이스 트리거를 성공적으로 변경하는 데 필요합니다.

SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner;
SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
Trigger altered.

저장 프로시저를 실행했습니다. 역할을 사용하여 획득한 권한이 정의자의 권한으로 실행되는 명명된 저장 프로시저에서 작동하지 않기 때문에 저장 프로시저를 실행할 때 이 오류가 발생합니다. 이러한 권한은 SQL Plus 및 익명 PL/SQL 블록에서 작동합니다.

예:

SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD;
SQL> GRANT connect, resource TO EXAMPLE-USERNAME

-- Connect as EXAMPLE-USERNAME
SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30));
Table DEPT created.

-- Drop the table and try to create the same table using the stored procedure. When you run the procedure, you get the error ORA-01031.
SQL> DROP table DEPT;
SQL> CREATE OR REPLACE PROCEDURE test_proc AS
BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE DEPT (DeptNo number, DeptName varchar2(30))';
END;
/
Procedure TEST_PROC created
SQL> EXEC TEST_PROC
Error report -
ORA-01031: insufficient privileges

이 문제를 해결하려면 마스터 사용자로 연결하고 필요한 권한을 명시적으로 부여합니다.

예:

-- Connect as master user and grant the CREATE TABLE privilege.
SQL> GRANT CREATE TABLE TO test_user;
-- Connect as EXAMPLE-USERNAME
SQL> EXEC TEST_PROC
PL/SQL procedure successfully completed.

grant 옵션이 있는 마스터 사용자에게 권한이 부여되지 않았습니다. 다음과 같은 조건에 해당하는 경우 이 오류가 발생합니다.

  • grant 옵션이 있는 마스터 사용자에게 객체에 대한 특정 권한이 부여되지 않았습니다.
  • 마스터 사용자가 다른 사용자에게 이 권한을 부여하려고 합니다.

이 문제를 해결하려면 grant 옵션이 있는 마스터 사용자에게 필요한 권한을 명시적으로 부여합니다.

예:

SQL> SHOW USER;
USER is "EXAMPLE-USERNAME"

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

ERROR:
ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist

-- Grant fails on the object DBA_TABLESPACE_USAGE_METRICS because master user is not granted the SELECT privilege on DBA_TABLESPACE_USAGE_METRICS with the grant option.

SQL> SHOW USER;
USER is "ADMIN"

SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME;
GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME
                    *
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> EXECUTE  rdsadmin.rdsadmin_util.grant_sys_object(  p_obj_name => 'DBA_TABLESPACE_USAGE_METRICS', p_grantee => 'ADMIN', p_privilege => 'SELECT', p_grant_option => true);

SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME;

-- After the privileges are granted, connect to EXAMPLE-USERNAME and then query DBA_TABLESPACE_USAGE_METRICS.
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

관련 정보

권한 및 역할 권한 부여 구성에 대한 Oracle 설명서

AWS 공식
AWS 공식업데이트됨 2년 전