Amazon RDS for Oracle DB 인스턴스에서 사용자 권한 및 역할을 관리하려면 어떻게 해야 하나요?
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 설명서
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 10달 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전