Wie verwalte ich Benutzerrechte und Rollen in meiner DB-Instance von Amazon RDS für Oracle?

Zuletzt aktualisiert: 03.06.2022

Ich habe eine Amazon Relational Database Service (Amazon RDS)-DB-Instance, die Oracle ausführt. Ich möchte wissen, wie Benutzerrechte und Rollen für diese Datenbank-Instance verwaltet werden.

Kurzbeschreibung

Wenn Sie eine Instance von Amazon RDS for Oracle Database erstellen, wird der Standard-Master-Benutzer erstellt und erhält mit einigen Einschränkungen die maximalen Benutzerberechtigungen für die DB-Instance. Verwenden Sie dieses Konto für alle administrativen Aufgaben, z. B. das Erstellen zusätzlicher Benutzerkonten in der Datenbank. Da Amazon RDS ein verwalteter Service ist, können SYS- und SYSTEM-Benutzer nicht standardmäßig verwendet werden.

Eine Liste der Rollen und Berechtigungen, die dem Master-Benutzer von Amazon RDS for Oracle gewährt wurden, finden Sie unter Master-Benutzerkonten-Berechtigungen.

Da Amazon RDS ein verwalteter Service ist, werden die folgenden Berechtigungen für die DBA-Rolle nicht bereitgestellt:

  • DATENBANK ÄNDERN
  • SYSTEM ÄNDERN
  • EIN BELIEBIGES VERZEICHNIS ERSTELLEN
  • EIN BELIEBIGES VERZEICHNIS LÖSCHEN
  • JEDE BERECHTIGUNG GEWÄHREN
  • JEDE ROLLE GEWÄHREN

Weitere Informationen finden Sie unter Beschränkungen für Oracle-DBA-Berechtigungen.

Auflösung

Um Berechtigungen für SYS-Objekte in Amazon RDS zu gewähren, verwenden Sie das Amazon-RDS-Verfahren rdsadmin.rdsadmin_util.grant_sys_object. Das Verfahren gewährt nur Berechtigungen, die dem Master-Benutzer bereits durch eine Rolle oder eine direkte Erteilung gewährt wurden.

Führen Sie einen Befehl ähnlich dem folgenden aus, um dem Benutzer EXAMPLE-USERNAME SELECT-Berechtigungen für das Objekt V_$SQLAREA zu gewähren:

Melden Sie sich als RDS-Master-Benutzer an und führen Sie das folgende Verfahren aus:

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

Führen Sie einen Befehl ähnlich dem folgenden aus, um dem Benutzer EXAMPLE-USERNAME mit der Gewährungsoption SELECT-Berechtigungen für das Objekt V_$SQLAREA zu gewähren:

Hinweis: Verwenden Sie Großbuchstaben, um alle Parameterwerte zu definieren, es sei denn, Sie haben den Benutzer mit einem Bezeichner erstellt, bei dem die Groß-/Kleinschreibung beachtet wird.

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

Führen Sie die folgenden Abfragen aus, um dem Benutzer EXAMPLE-USERNAME mit Administrator-Option die Rollen SELECT_CATALOG_ROLE und EXECUTE_CATALOG_ROLE zu gewähren. Mit diesen Rollen kann EXAMPLE-USERNAME Zugriff auf SYS-Objekte gewähren, die SELECT_CATALOG_ROLE und EXECUTE_CATALOG_ROLE gewährt wurden.

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

Führen Sie die folgenden Abfragen aus, um die mit der Rolle SELECT_CATALOG_ROLE verknüpften Gewährungen anzuzeigen:

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;

Weitere Informationen finden Sie unter SELECT- oder EXECUTE-Berechtigungen für SYS-Objekte gewähren.

Um Berechtigungen für ein einzelnes Objekt zu widerrufen, verwenden Sie das RDS-Verfahren rdsadmin.rdsadmin_util.revoke_sys_object.

Führen Sie den folgenden Befehl aus, um SELECT-Berechtigungen für das Objekt V_$SQLAREA vom Benutzer EXAMPLE-USERNAME zu widerrufen:

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

Weitere Informationen finden Sie unter SELECT- oder EXECUTE-Berechtigungen für SYS-Objekte widerrufen.

Verwenden Sie die folgenden Optionen zur Fehlerbehebung basierend auf Ihrem Problem und Anwendungsfall.

Zurücksetzen der Master-Benutzerrechte

Wenn Sie die Rollen und Berechtigungen des Master-Benutzers widerrufen haben, können Sie sie zurücksetzen, indem Sie das Master-Benutzerkennwort für Ihre RDS-DB-Instance ändern.

Gewähren von RDS_MASTER_ROLE an Nicht-Master-Benutzer

Die Rolle RDS_MASTER_ROLE kann Nicht-Master-Benutzern nicht gewährt werden. Diese Rolle wird standardmäßig von SYS erstellt, wenn die DB-Instance erstellt wird. Die RDS_MASTER_ROLE darf nur dem Master-Benutzer gewährt werden. Führen Sie die folgende Abfrage aus, um Benutzer aufzulisten, denen die RDS_MASTER_ROLE gewährt wurde:

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

Die Ausgabe sieht wie folgt aus:

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

Möglicherweise stellen Sie an der Ausgabe der Abfrage fest, dass der Master-Benutzer nicht über die Administrator-Option verfügt. Daher kann die Rolle RDS_MASTER_ROLE keinem anderen Benutzer gewährt werden.

Weitere Informationen finden Sie unter Gewähren von Berechtigungen für Nicht-Master-Benutzer.

Widerruf von Berechtigungen, die PUBLIC gewährt wurden

Das Widerrufen von PUBLIC-Berechtigungen für wesentliche Pakete von DBMS_*- und UTL_* ist keine bewährte Methode, da mehrere Oracle-Anwendungen so konzipiert sind, dass sie auf diese Berechtigungen angewiesen sind. Weitere Informationen finden Sie unter MOSC Doc 247093.1. Die wesentlichen Pakete von DBMS_* und UTL_* beinhalten UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE und DBMS_BACKUP_RESTORE und DBMS_OBFUSCATION_TOOLKIT MS_SYS_SQL.

Beheben des Fehlers beim Erstellen einer Rolle mit Passwort

Angenommen, Sie führen die folgende Abfrage aus, um eine Rolle mit Passwort zu erstellen und Berechtigungen mit dem rdsadmin_util.grant_sys_object zu gewähren:

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

Dann wird der folgende Fehler angezeigt:

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

Um dieses Problem zu beheben, erstellen Sie eine Rolle ohne Passwort.

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

Fehlerbehebung ORA-01031: unzureichende Berechtigungen

Im Folgenden finden Sie einige Beispiele für Anwendungsfälle, in denen dieser Fehler möglicherweise auftritt:

Sie haben die Abfrage ALTER SYSTEM ausgeführt. Beispielsweise schlägt die folgende Abfrage mit dem Fehler ORA-01031 fehl:

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

Stattdessen können Sie die Parameterwerte in einer benutzerdefinierten DB-Parametergruppe ändern. Sie können die Parameterwerte jedoch nicht in einer standardmäßigen DB-Parametergruppe ändern.

Sie verwenden einen Datenbank-Auslöser und Ihre Änderungen an der zugrunde liegenden Tabellenstruktur haben dazu geführt, dass der Auslöserstatus UNGÜLTIG wurde. Wenn der Auslöser das nächste Mal ausgelöst wird, stellen Sie möglicherweise fest, dass die implizite Kompilierung des Auslösers mit dem folgenden Fehler fehlschlägt:

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

Um dieses Problem zu beheben, gewähren Sie dem Besitzer des Auslösers explizit das Auslöserrecht für die Verwaltungsdatenbank. Diese Berechtigung ist erforderlich, um den Datenbank-Auslöser erfolgreich zu ändern:

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

Sie haben ein gespeichertes Verfahren ausgeführt. Sie erhalten diesen Fehler, wenn Sie ein gespeichertes Verfahren ausführen, da mit Rollen erworbene Berechtigungen nicht in benannten gespeicherten Verfahren funktionieren, die mit den Rechten des Definierern ausgeführt werden. Diese Berechtigungen funktionieren in SQL Plus und anonymen PL/SQL-Blöcken.

Beispiel:

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

Um dieses Problem zu beheben, melden Sie sich als Master-Benutzer an und gewähren Sie explizit die erforderlichen Berechtigungen.

Beispiel:

-- 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.

Dem Master-Benutzer werden die Berechtigungen mit der Gewährungsoption nicht gewährt. Dieser Fehler wird möglicherweise angezeigt, wenn die folgenden Bedingungen zutreffen:

  • Dem Master-Benutzer wird keine bestimmte Berechtigungen für ein Objekt mit der Gewährungsoption gewährt.
  • Der Master-Benutzer versucht, diese Berechtigung einem anderen Benutzer zu gewähren.

Um dieses Problem zu beheben, gewähren Sie dem Master-Benutzer die erforderlichen Berechtigungen explizit mit der Gewährungsoption.

Beispiel:

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;

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?