Salta al contenuto

Come posso gestire i privilegi e i ruoli utente della mia istanza database Amazon RDS per Oracle?

7 minuti di lettura
0

Desidero gestire i privilegi e i ruoli utente della mia istanza database Amazon Relational Database Service (Amazon RDS) per Oracle.

Breve descrizione

Poiché Amazon RDS è un servizio gestito, per impostazione predefinita non puoi utilizzare utenti SYS e SYSTEM.

Per l'elenco dei ruoli e dei privilegi che il database Amazon RDS per Oracle concede all'utente principale, consulta Privilegi dell'account utente principale. Per un elenco dei privilegi che il database Amazon RDS per Oracle non concede al ruolo di amministratore del database (DBA), consulta Limitazioni per i privilegi del DBA in Oracle.

Risoluzione

Nota: nelle sezioni seguenti, sostituisci EXAMPLE-USERNAME con il nome utente al quale stai concedendo privilegi o per il quale ne stai revocando.

Concedi privilegi

Per concedere privilegi su oggetti SYS, utilizza la procedura di Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. La procedura concede solo i privilegi che l'utente principale possiede già.

Per concedere il privilegio SELECT sull'oggetto V_$SQLAREA a un utente, accedi come utente principale RDS. Quindi esegui questo comando:

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

Per concedere il privilegio SELECT sull'oggetto V_$SQLAREA a un utente con l'opzione grant, esegui questo comando:

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

Nota: a meno che tu non abbia creato l'utente con un identificatore che distingue tra maiuscole e minuscole, utilizza le lettere maiuscole per definire tutti i valori dei parametri.

Per assegnare i ruoli SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE a un utente con l'opzione admin, esegui questi comandi:

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

L'utente può quindi concedere l'accesso sugli stessi oggetti SYS per i quali possono concederlo i ruoli SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE.

Per visualizzare le concessioni associate a SELECT_CATALOG_ROLE, esegui questi comandi:

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 su oggetti SYS.

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

Per revocare all'utente il privilegio SELECT sull'oggetto V_$SQLAREA, esegui questi comandi:

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

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

Reimposta i privilegi dell'utente principale

Se hai revocato i ruoli e i privilegi dell'utente principale, puoi reimpostarli. Per ulteriori informazioni, consulta Come posso reimpostare la password amministratore per la mia istanza database Amazon RDS?

Concedi li ruolo RDS_MASTER_ROLE all'utente principale

Non puoi concedere il ruolo RDS_MASTER_ROLE a utenti non principali. Quando crei l'istanza database, SYS crea il ruolo RDS_MASTER_ROLE per impostazione predefinita. Puoi concedere il ruolo RDS_MASTER_ROLE solo all'utente principale. Per elencare gli utenti ai quali hai concesso il ruolo RDS_MASTER_ROLE, esegui questo comando:

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

Esempio di output:

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

Poiché l'utente master non ha l'opzione admin, non puoi concedere il ruolo RDS_MASTER_ROLE ad altri utenti. Per ulteriori informazioni, consulta Concessione di privilegi a utenti non principali.

Revoca i privilegi del ruolo PUBLIC ai pacchetti delle chiavi DBMS_* e UTL_*

Non è consigliabile revocare i privilegi dei ruoli PUBLIC ai pacchetti delle chiavi DBMS_* e UTL_* perché diverse applicazioni Oracle si basano su tali privilegi. I pacchetti delle chiavi 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.

Risolvi l'errore "invalid schema" quando crei un ruolo con password

Ad esempio, hai utilizzato rdsadmin_util.grant_sys_object per creare un ruolo con password e concedere privilegi nei seguenti comandi:

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

Nell'output del comando, ricevi 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 il problema, crea un ruolo senza password eseguendo questo comando:

SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;

Risolvi l'errore "ORA-01031: insufficient privileges"

Di seguito sono riportati alcuni esempi di casi d'uso che possono generare l'errore ORA-01031.

Esegui il comando ALTER SYSTEM SET

L'errore ORA-01031 si verifica quando esegui questo comando:

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

Non puoi modificare i valori dei parametri in un gruppo di parametri del database predefinito. Modifica piuttosto i valori dei parametri in un gruppo di parametri del database personalizzato.

Utilizzi un trigger del database e le modifiche che apporti alla struttura della tabella sottostante modificano lo stato del trigger in NON VALIDO

La volta successiva che un evento attiva il trigger, la compilazione implicita del trigger non riesce con il seguente errore:

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

Per risolvere il problema, concedi esplicitamente il privilegio administer database trigger al proprietario del trigger in modo che possa modificare il trigger del database eseguendo questo comando:

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

Output atteso:

Trigger altered.

Esegui una procedure archiviata

Ricevi l'errore "ORA-01031" perché non puoi utilizzare i privilegi ottenuti dai ruoli presenti in procedure archiviate denominate che vengono eseguite con diritti definer. Utilizza piuttosto i privilegi che ottieni dai ruoli presenti in SQL Plus e dai blocchi PL/SQL anonimi.

La seguente procedura archiviata ha esito negativo perché l'utente utilizza i privilegi di un ruolo presente in una procedura archiviata denominata per creare una tabella. L'utente poi elimina la tabella e tenta di utilizzare la procedure archiviata per creare la stessa tabella:

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

L'output mostra il seguente errore:

"Error report -ORA-01031: insufficient privileges"

Per risolvere il problema, connettiti come utente principale, quindi esegui questo comando per concedere il privilegio CREATE TABLE:

SQL> GRANT CREATE TABLE TO test_user;

Esegui la procedura archiviata con questo comando:

SQL> EXEC TEST_PROC

Output atteso:

PL/SQL procedure successfully completed.

Non concedi all'utente principale privilegi con l'opzione grant

L'errore "ORA-04043" si verifica quando non concedi all'utente principale un privilegio con l'opzione grant su un oggetto.

Il seguente esempio di procedura di concessione ha esito negativo perché l'utente principale non ha il privilegio SELECT con l'opzione grant sull'oggetto DBA_TABLESPACE_USAGE_METRICS:

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

L'output mostra il messaggio di errore "ERROR: ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist".

Quando l'utente principale tenta di concedere a un altro utente il privilegio SELECT sull'oggetto DBA_TABLESPACE_USAGE_METRICS, l'utente principale riceve l'errore "ORA-01031: insufficient privileges".

Per risolvere il problema, concedi esplicitamente all'utente principale il privilegio SELECT con l'opzione grant eseguendo questi comandi:

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;

Dopo aver concesso il privilegio SELECT, l'utente principale può quindi eseguire correttamente il comando SELECT:

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Informazioni correlate

Configuring privilege and role authorization (Configurazione dell'autorizzazione di privilegi e ruoli) sul sito web Oracle