Come posso gestire i privilegi e i ruoli utente nella mia istanza database Amazon RDS for Oracle?

Ultimo aggiornamento: 08/11/2021

Ho un'istanza database Amazon Relational Database Service (Amazon RDS) che esegue Oracle. Vorrei conoscere la procedura per la gestione dei privilegi e dei ruoli utente per tale istanza database.

Breve descrizione

Quando crei un'istanza database Amazon RDS for Oracle, viene creato l'utente master predefinito e gli vengono concesse le autorizzazioni utente massime per l'istanza database con alcune limitazioni. Utilizza questo account per qualsiasi attività amministrativa, ad esempio la creazione di account utente aggiuntivi nel database. Poiché Amazon RDS è un servizio gestito, gli utenti SYS e SYSTEM non possono essere utilizzati per impostazione predefinita.

Per l'elenco dei ruoli e dei privilegi concessi all'utente master di Amazon RDS for Oracle, consulta Privilegi dell'account utente master.

Poiché Amazon RDS è un servizio gestito, non vengono forniti i seguenti privilegi per il ruolo DBA (Amministratore Database):

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

Per ulteriori informazioni, consulta Limitazioni per i privilegi del DBA (Amministratore Database) in Oracle.

Risoluzione

Per concedere privilegi sugli oggetti SYS in Amazon RDS, utilizza la procedura di Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. La procedura concede solo i privilegi già concessi all'utente master tramite un ruolo o una concessione diretta.

Esegui un comando simile al seguente per concedere i privilegi SELECT sull'oggetto V_$SQLAREA all'utente MYUSER:

Accedi come utente master RDS ed esegui la seguente procedura:

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

Esegui un comando simile al seguente per concedere i privilegi SELECT sull'oggetto V_$SQLAREA all'utente MYUSER con l'opzione concessione:

Nota: utilizza le maiuscole per definire tutti i valori dei parametri, a meno che non sia stato creato l'utente con un identificatore che fa distinzione tra maiuscole e minuscole.

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

Esegui le seguenti query per concedere i ruoli SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE all'utente MYUSER con l'opzione amministratore. Con questi ruoli, MYUSER può concedere l'accesso agli oggetti SYS che sono stati concessi a SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE.

SQL> GRANT SELECT_CATALOG_ROLE TO MYUSER WITH ADMIN OPTION;
SQL> GRANT EXECUTE_CATALOG_ROLE to MYUSER WITH ADMIN OPTION;

Esegui le seguenti query per visualizzare le autorizzazioni associate al ruolo 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;

Per ulteriori informazioni, consulta Concessione dei privilegi SELECT o EXECUTE agli oggetti SYS.

Per revocare i privilegi su un singolo oggetto, utilizza la procedura RDS rdsadmin.rdsadmin_util.revoke_sys_object.

Esegui il seguente comando per revocare i privilegi SELECT sull'oggetto V_$SQLAREA dall'utente MYUSER:

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

Per ulteriori informazioni, consulta Revoca dei privilegi SELECT o EXECUTE sugli oggetti SYS.

Utilizza le seguenti opzioni di risoluzione dei problemi in base al tuo caso d'uso.

Reimpostazione dei privilegi dell'utente master

Se i ruoli e i privilegi dell'utente master sono stati revocati, è possibile reimpostarli modificando la password dell'utente master per l'istanza database RDS.

Concessione del ruolo RDS_MASTER_ROLE a utenti non master

Il ruolo RDS_MASTER_ROLE non può essere concesso agli utenti non master. Questo ruolo viene creato da SYS per impostazione predefinita quando viene creata l'istanza database. RDS_MASTER_ROLE deve essere concesso solo all'utente master. Esegui la seguente query per elencare gli utenti a cui è stato concesso il ruolo RDS_MASTER_ROLE:

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

Dovresti visualizzare un output simile al seguente:

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

Potresti notare dall'output della query che l'utente master non ha l'opzione amministratore. Pertanto, il ruolo RDS_MASTER_ROLE non può essere concesso a nessun altro utente.

Per ulteriori informazioni, consulta Concessione di privilegi a utenti non master.

Revoca dei privilegi concessi a PUBLIC

La revoca dei privilegi PUBLIC ai pacchetti chiave DBMS_* e UTL_* non è una procedura consigliata perché diverse applicazioni Oracle sono progettate per fare affidamento su questi privilegi. Per ulteriori informazioni, consulta il Doc 247093.1 su MOSC (My Oracle Support Community). I pacchetti chiave DBMS_* e UTL_* includono UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE e DBMS_SYS_SQL.

Risoluzione dei problemi relativi all'errore durante la creazione di un ruolo con password

Supponiamo di eseguire la seguente query per creare un ruolo con password e concedere privilegi utilizzando rdsadmin_util.grant_sys_object:

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

Quindi, viene visualizzato il seguente errore:

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

Per risolvere questo problema, crea un ruolo senza password.

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

Risoluzione dei problemi relativi all'errore ORA-01031: privilegi insufficienti

Di seguito sono riportati alcuni esempi di casi d'uso in cui potresti ricevere questo errore:

È stata eseguita la query ALTER SYSTEM. Ad esempio, la seguente query non viene completata e restituisce l'errore ORA-01031:

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

È invece possibile modificare i valori dei parametri in un gruppo parametri del database personalizzato. Tuttavia, non è possibile modificare i valori dei parametri in un gruppo parametri del database predefinito.

Stai utilizzando un trigger di database e le modifiche alla struttura della tabella sottostante hanno fatto sì che lo stato del trigger diventasse NON VALIDO. La prossima volta che viene attivato il trigger, potresti notare che la compilazione implicita del trigger non viene completata e restituisce il seguente errore:

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

Per risolvere questo problema, concedi esplicitamente il privilegio administer database trigger al proprietario del trigger. Questo privilegio è necessario per modificare correttamente il trigger del database:

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

Hai eseguito una stored procedure. Questo errore viene visualizzato quando si esegue una stored procedure, poiché i privilegi acquisiti utilizzando i ruoli non funzionano nelle stored procedure denominate eseguite con i diritti del definer. Questi privilegi funzionano in SQL Plus e nei blocchi PL/SQL anonimi.

Esempio:

SQL> CREATE USER MYUSER IDENTIFIED BY PASSWORD;
SQL> GRANT connect, resource TO MYUSER

-- Connect as MYUSER
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

Per risolvere questo problema, connettiti come utente master e concedi esplicitamente i privilegi richiesti.

Esempio:

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

All'utente master non vengono concessi i privilegi con l'opzione concessione. È possibile ricevere questo errore quando si verificano le seguenti condizioni:

  • All'utente master non viene concesso un determinato privilegio su un oggetto con l'opzione concessione.
  • L'utente master tenta di concedere questo privilegio a un altro utente.

Per risolvere questo problema, concedi esplicitamente i privilegi richiesti all'utente master con l'opzione concessione.

Esempio:

SQL> SHOW USER;
USER is "MYUSER"

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 MYUSER;
GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to MYUSER
                    *
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 MYUSER;

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

Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?