Direkt zum Inhalt

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

Lesedauer: 7 Minute
0

Ich möchte Benutzerrechte und Rollen auf meiner Amazon Relational Database Service (Amazon RDS) für Oracle DB-Instance verwalten.

Kurzbeschreibung

Da Amazon RDS ein verwalteter Service ist, kannst du standardmäßig keine SYS- und SYSTEM-Benutzer verwenden.

Eine Liste der Rollen und Rechte, die die Amazon RDS für Oracle-Datenbank dem Hauptbenutzer gewährt, findest du unter Rechte für das Hauptbenutzerkonto. Eine Liste der Rechte, die Amazon RDS für Oracle-Datenbank der Rolle des Datenbankadministrators (DBA) nicht gewährt, findest du unter Einschränkungen für Oracle DBA-Rechte.

Lösung

Hinweis: Ersetze in den folgenden Abschnitten EXAMPLE-USERNAME durch den Benutzernamen, dem du Rechte gewährst oder dem du Rechte entziehst.

Rechte gewähren

Um Rechte für SYS-Objekte zu gewähren, verwende das Amazon RDS-Verfahren rdsadmin.rdsadmin_util.grant_sys_object. Das Verfahren gewährt nur Rechte, über die der Hauptbenutzer bereits verfügt.

Um einem Benutzer das SELECT-Privileg für das V_$SQLAREA-Objekt zu gewähren, melde dich als RDS-Hauptbenutzer an. Führe dann den folgenden Befehl aus:

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

Um einem Benutzer mit der Option Gewähren das SELECT-Privileg für das V_$SQLAREA-Objekt zu gewähren, führe den folgenden Befehl aus:

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

Hinweis: Verwende Großbuchstaben, um alle Parameterwerte zu definieren, sofern du den Benutzer nicht mit einem Bezeichner erstellt hast, bei dem zwischen Groß- und Kleinschreibung unterschieden wird.

Führe die folgenden Befehle aus, um einem Benutzer mit der Admin-Option die Rollen SELECT_CATALOG_ROLE und EXECUTE_CATALOG_ROLE zu gewähren:

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

Der Benutzer kann dann Zugriff auf dieselben SYS-Objekte gewähren wie die Rollen SELECT_CATALOG_ROLE und EXECUTE_CATALOG_ROLE.

Führe die folgenden Befehle aus, um die mit SELECT_CATALOG_ROLE verknüpften Rechte 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 findest du unter Erteilen von Rechten wie SELECT oder EXECUTE für SYS-Objekte.

Um Rechte für ein einzelnes Objekt zu entziehen, verwende das RDS-Verfahren rdsadmin.rdsadmin_util.revoke_sys_object.

Um dem Benutzer die Rechte SELECT auf V_$SQLAREA zu entziehen, führe die folgenden Befehle aus:

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

Weitere Informationen findest du unter Entziehen der Rechte SELECT oder EXECUTE für SYS-Objekte.

Die Rechte des Hauptbenutzers zurücksetzen

Wenn du die Rollen und Rechte des Hauptbenutzers widerrufen hast, kannst du sie zurücksetzen. Weitere Informationen findest du unter Wie setze ich das Admin-Benutzerpasswort für meine Amazon RDS-DB-Instance zurück?

Dem Hauptbenutzer RDS_MASTER_ROLE gewähren

Du kannst die Rolle RDS_MASTER_ROLE nicht Benutzern gewähren, die keine Hauptbenutzer sind. Wenn du die DB-Instance erstellst, erstellt SYS standardmäßig RDS_MASTER_ROLE. Du kannst RDS_MASTER_ROLE nur dem Hauptbenutzer gewähren. Führe den folgenden Befehl aus, um Benutzer aufzulisten, denen du RDS_MASTER_ROLE gewährt hast:

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

Beispielausgabe:

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

Da der Hauptbenutzer nicht über die Admin-Option verfügt, kannst du RDS_MASTER_ROLE keinem anderen Benutzer gewähren. Weitere Informationen findest du unter Rechte für Nicht-Hauptbenutzer gewähren.

Die PUBLIC-Rollenrechte für wichtige Pakete wie DBMS_* und UTL_* entziehen

Es ist keine bewährte Methode, PUBLIC-Rollenberechtigungen für wichtige DBMS_*- und UTL_*-Pakete zu entziehen, da mehrere Oracle-Anwendungen auf die Rechte angewiesen sind. Zu den wichtigsten DBMS_*- und UTL_*-Paketen gehören 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_SYS_SQL.

Den Fehler „invalid schema“ beheben, wenn du eine Rolle mit einem Passwort erstellst

Du hast beispielsweise rdsadmin_util.grant_sys_object verwendet, um eine Rolle mit Passwort zu erstellen und Rechte in den folgenden Befehlen zu gewähren:

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

In der Ausgabe des Befehls erhältst du die folgende Fehlermeldung:

„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, führe den folgenden Befehl aus, um eine Rolle ohne Passwort zu erstellen:

SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;

Den Fehler „ORA-01031: insufficient privileges“ beheben

Im Folgenden findest du Beispiele für Anwendungsfälle, die zum Fehler ORA-01031 führen können.

Den Befehl ALTER SYSTEM SET ausführen

Der Fehler ORA-01031 tritt auf, wenn du den folgenden Befehl ausführst:

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

Die Parameterwerte in einer Standard-DB-Parametergruppe kannst du nicht ändern. Stattdessen,ändere die Parameterwerte in einer benutzerdefinierten DB-Parametergruppe.

Du verwendest einen Datenbank-Trigger und die Änderungen an der zugrunde liegenden Tabellenstruktur ändern den Triggerstatus in INVALID

Wenn ein Ereignis den Trigger das nächste Mal freigibt, schlägt die implizite Kompilierung des Triggers mit dem folgenden Fehler fehl:

„ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges“

Um dieses Problem zu beheben, führe den folgenden Befehl aus, um dem Besitzer des Triggers explizit die Administratorrechte für den Datenbank-Trigger zu gewähren, sodass der Besitzer den Datenbank-Trigger ändern kann:

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

Erwartetes Ergebnis:

Trigger altered.

Eine gespeicherte Prozedur ausführen

Du erhältst den Fehler „ORA-01031", weil du Rechte, die du von Rollen in benannten gespeicherten Verfahren erhältst, die mit Definer-Rechten ausgeführt werden, nicht verwenden kannst. Verwende stattdessen Rechte, die du von Rollen in SQL Plus und anonymen PL/SQL-Blöcken erhältst.

Das folgende gespeicherte Verfahren schlägt fehl, weil der Benutzer Rechte aus einer Rolle verwendet, die sich in einem benannten gespeicherten Verfahren befindet, um eine Tabelle zu erstellen. Der Benutzer löscht dann die Tabelle und versucht, die gespeicherte Prozedur zu verwenden, um dieselbe Tabelle zu erstellen:

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

Die Ausgabe zeigt den folgenden Fehler:

„"Error report -ORA-01031: insufficient privileges“

Um dieses Problem zu beheben, stelle eine Verbindung als Hauptbenutzer her und führe dann den folgenden Befehl aus, um das Recht CREATE TABLE zu gewähren:

SQL> GRANT CREATE TABLE TO test_user;

Führe den folgenden Befehl aus, um ein gespeichertes Verfahren auszuführen:

SQL> EXEC TEST_PROC

Erwartetes Ergebnis:

PL/SQL procedure successfully completed.

Du gewährst dem Hauptbenutzer keine Rechte mit der Option „gewähren“

Der Fehler „ORA-04043" tritt auf, wenn du dem Hauptbenutzer mit der Option „gewähren“ für ein Objekt kein Recht gewähren.

Das folgende Beispiel für ein Gewährungsverfahren schlägt fehl, weil der Hauptbenutzer nicht über das Recht SELECT mit der Option „gewähren“ für das Objekt DBA_TABLESPACE_USAGE_METRICS verfügt:

SQL> SHOW USER;  
USER is \"EXAMPLE-USERNAME\"  
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Die Ausgabe zeigt die Fehlermeldung „ERROR: ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist“.

Wenn der Hauptbenutzer versucht, einem anderen Benutzer das Recht SELECT für das Objekt DBA_TABLESPACE_USAGE_METRICS zu gewähren, erhält der Hauptbenutzer den Fehler „ORA-01031: insufficient privileges“.

Um dieses Problem zu beheben, führe die folgenden Befehle aus, um dem Hauptbenutzer das SELECT-Recht mit der Option „gewähren“ explizit zu gewähren:

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;

Nachdem du die SELECT-Rechte erteilt haben, kann der Hauptbenutzer den SELECT-Befehl erfolgreich ausführen:

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Ähnliche Informationen

Konfiguration der Rechte- und Rollenautorisierung auf der Oracle-Website