Amazon RDS for Oracle DB 인스턴스에서 사용자 권한 및 역할을 관리하려면 어떻게 해야 합니까?
Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스에서 사용자 권한 및 역할을 관리하고 싶습니다.
간략한 설명
Amazon RDS는 관리형 서비스이므로 기본적으로 SYS 및 SYSTEM 사용자를 사용할 수 없습니다.
Amazon RDS for Oracle 데이터베이스가 마스터 사용자에게 부여하는 역할 및 권한 목록은 마스터 사용자 계정 권한을 참조하십시오. Amazon RDS for Oracle 데이터베이스가 데이터베이스 관리자(DBA) 역할에 부여하지 않는 권한 목록은 Oracle DBA 권한에 대한 제한 사항을 참조하십시오.
해결 방법
참고: 다음 섹션에서 EXAMPLE-USERNAME을 권한을 부여하거나 권한을 취소하려는 사용자 이름으로 바꾸십시오.
권한 부여
SYS 객체에 대한 권한을 부여하려면 rdsadmin.rdsadmin_util.grant_sys_object Amazon RDS 프로시저를 사용하십시오. 이 프로시저는 마스터 사용자에게 이미 있는 권한만 부여합니다.
V_$SQLAREA 객체에 대한 SELECT 권한을 사용자에게 부여하려면 RDS 마스터 사용자로 로그인합니다. 그리고 나서 다음 명령을 실행합니다.
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
grant 옵션을 사용하여 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);
참고: 대소문자를 구분하는 식별자로 사용자를 생성한 경우가 아니라면 대문자를 사용하여 모든 파라미터 값을 정의하십시오.
admin 옵션을 사용하여 SELECT_CATALOG_ROLE 및 EXECUTE_CATALOG_ROLE 역할을 사용자에게 부여하려면 다음 명령을 실행합니다.
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 및 EXECUTE_CATALOG_ROLE 역할이 할 수 있는 것과 동일한 SYS 객체에 대한 액세스 권한을 부여할 수 있습니다.
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 권한 부여를 참조하십시오.
단일 객체에 대한 권한을 취소하려면 rdsadmin.rdsadmin_util.revoke_sys_object RDS 프로시저를 사용하십시오.
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 권한 취소를 참조하십시오.
마스터 사용자 권한 재설정
마스터 사용자의 역할 및 권한을 취소한 경우 이를 재설정할 수 있습니다. 자세한 내용은 Amazon RDS DB 인스턴스의 관리자 사용자 암호를 재설정하려면 어떻게 해야 합니까?를 참조하십시오.
마스터 사용자에게 RDS_MASTER_ROLE 부여
마스터가 아닌 사용자에게는 RDS_MASTER_ROLE 역할을 부여할 수 없습니다. DB 인스턴스를 생성할 때 SYS는 기본적으로 RDS_MASTER_ROLE을 생성합니다. 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을 다른 사용자에게 부여할 수 없습니다. 자세한 내용은 마스터가 아닌 사용자에게 권한 부여를 참조하십시오.
주요 DBMS_* 및 UTL_* 패키지에 대한 PUBLIC 역할 권한 취소
여러 Oracle 애플리케이션은 이 권한을 필요로 하기 때문에 주요 DBMS_* 및 UTL_* 패키지에 대한 PUBLIC 역할 권한을 취소하는 것은 모범 사례가 아닙니다. 주요 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이 포함됩니다.
암호가 있는 역할을 생성할 때 발생하는 ‘invalid schema’ 오류 해결
예를 들어, 다음 명령에서 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"
이 문제를 해결하려면 다음 명령을 실행하여 암호 없이 역할을 생성하십시오.
SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;
‘ORA-01031: insufficient privileges’ 오류 해결
다음은 ORA-01031 오류가 발생할 수 있는 사용 사례의 예입니다.
ALTER SYSTEM SET 명령을 실행함
ORA-01031 오류는 다음 명령을 실행할 때 발생합니다.
SQL> ALTER SYSTEM SET processes=200 scope=spfile;
기본 DB 파라미터 그룹에서는 파라미터 값을 변경할 수 없습니다. 대신 사용자 지정 DB 파라미터 그룹의 파라미터 값을 수정하십시오.
데이터베이스 트리거를 사용하고 기본 테이블 구조를 변경하여 트리거 상태를 INVALID로 변경함
다음에 이벤트에서 트리거를 해제하면 트리거의 암시적 컴파일이 다음 오류로 실패합니다.
"ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges"
이 문제를 해결하려면 다음 명령을 실행하여 소유자가 데이터베이스 트리거를 변경할 수 있도록 트리거 소유자에게 데이터베이스 트리거 관리 권한을 명시적으로 부여하십시오.
SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner; SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
예상 출력:
Trigger altered.
저장 프로시저를 실행함
정의자 권한으로 실행되는 명명된 저장 프로시저의 역할에서 얻은 권한은 사용할 수 없으므로 ‘ORA-01031’ 오류가 발생합니다. 대신 SQL Plus의 역할에서 얻은 권한과 익명 PL/SQL 블록을 사용하십시오.
다음 저장 프로시저는 사용자가 명명된 저장 프로시저에 있는 역할의 권한을 사용하여 테이블을 만들기 때문에 실패합니다. 그러면 사용자는 테이블을 삭제하고 저장 프로시저를 사용하여 동일한 테이블을 만들려고 합니다.
SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> GRANT connect, resource TO EXAMPLE-USERNAME SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30)); Table DEPT created.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"
이 문제를 해결하려면 마스터 사용자로 연결한 후 다음 명령을 실행하여 CREATE TABLE 권한을 부여하십시오.
SQL> GRANT CREATE TABLE TO test_user;
다음 명령을 실행하여 저장 프로시저를 실행합니다.
SQL> EXEC TEST_PROC
예상 출력:
PL/SQL procedure successfully completed.
grant 옵션을 사용하여 마스터 사용자에게 권한을 부여하지 않음
‘ORA-04043’ 오류는 마스터 사용자에게 객체에 대한 grant 옵션을 사용하여 권한을 부여하지 않을 때 발생합니다.
다음 권한 부여 프로시저의 예는 마스터 사용자에게 DBA_TABLESPACE_USAGE_METRICS 객체에 대한 grant 옵션과 함께 SELECT 권한이 없기 때문에 실패합니다.
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’ 오류 메시지가 표시됩니다.
마스터 사용자가 다른 사용자에게 DBA_TABLESPACE_USAGE_METRICS 객체에 대한 SELECT 권한을 부여하려고 하면 마스터 사용자는 ‘ORA-01031: insufficient privileges’ 오류를 받습니다.
이 문제를 해결하려면 다음 명령을 실행하여 마스터 사용자에게 grant 옵션과 함께 SELECT 권한을 명시적으로 부여하십시오.
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;
SELECT 권한을 부여하면 마스터 사용자가 SELECT 명령을 성공적으로 실행할 수 있습니다.
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;
관련 정보
Oracle 웹 사이트에서 권한 및 역할 권한 부여 구성
관련 콘텐츠
질문됨 2년 전

