Passer au contenu

Comment gérer les privilèges et les rôles des utilisateurs dans mon instance de base de données Amazon RDS for Oracle ?

Lecture de 8 minute(s)
0

Je souhaite gérer les privilèges et les rôles des utilisateurs sur mon instance de base de données Amazon Relational Database Service (Amazon RDS) for Oracle.

Brève description

Dans la mesure où Amazon RDS est un service géré, vous ne pouvez pas utiliser les utilisateurs SYS et SYSTEM par défaut.

Pour obtenir la liste des rôles et privilèges que la base de données Amazon RDS for Oracle accorde à l'utilisateur principal, consultez la section Privilèges du compte utilisateur principal. Pour obtenir la liste des privilèges que la base de données Amazon RDS for Oracle n'accorde pas au rôle d'administrateur de base de données (DBA), consultez la section Limitations des privilèges Oracle DBA.

Résolution

Remarque : Dans les sections suivantes, remplacez EXAMPLE-USERNAME par le nom d'utilisateur auquel vous accordez des privilèges ou dont vous révoquez des privilèges.

Octroyer des privilèges

Pour accorder des privilèges sur des objets SYS, utilisez la procédure Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. La procédure n'accorde que les privilèges dont dispose déjà l'utilisateur principal.

Pour accorder le privilège SELECT sur l'objet V_$SQLAREA à un utilisateur, connectez-vous en tant qu'utilisateur principal RDS. Puis, exécutez la commande suivante :

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

Pour accorder le privilège SELECT sur l'objet V_$SQLAREA à un utilisateur avec l'option d'octroi, exécutez la commande suivante :

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

Remarque : À moins que vous n'ayez créé l'utilisateur avec un identifiant sensible à la casse, utilisez des majuscules pour définir toutes les valeurs de paramètres.

Pour accorder les rôles SELECT_CATALOG_ROLE et EXECUTE_CATALOG_ROLE à un utilisateur doté de l'option d’administration, exécutez les commandes suivantes :

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

L'utilisateur peut ensuite accorder l'accès aux mêmes objets SYS que les rôles SELECT_CATALOG_ROLE et EXECUTE_CATALOG_ROLE.

Pour afficher les autorisations associées à SELECT_CATALOG_ROLE, exécutez les commandes suivantes :

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;

Pour plus d'informations, consultez la section Octroi de privilèges SELECT ou EXECUTE à des objets SYS.

Pour révoquer des privilèges sur un seul objet, utilisez la procédure RDS rdsadmin.rdsadmin_util.revoke_sys_object.

Pour révoquer les privilèges SELECT de l'utilisateur sur V_$SQLAREA, exécutez les commandes suivantes :

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

Pour plus d'informations, consultez la section Révocation des privilèges SELECT ou EXECUTE sur les objets SYS.

Réinitialiser les privilèges de l'utilisateur principal

Si vous avez révoqué les rôles et privilèges de l'utilisateur principal, vous pouvez les réinitialiser. Pour plus d’informations, consultez la section Comment puis-je réinitialiser le mot de passe administrateur de mon instance de base de données Amazon RDS ?

Accorder le rôle RDS_MASTER_ROLE à l'utilisateur principal

Vous ne pouvez pas accorder le rôle RDS_MASTER_ROLE à des utilisateurs non principaux. Lorsque vous créez l'instance de base de données, SYS crée RDS_MASTER_ROLE par défaut. Vous ne pouvez accorder RDS_MASTER_ROLE qu'à l'utilisateur principal. Pour répertorier les utilisateurs auxquels vous avez accordé RDS_MASTER_ROLE, exécutez la commande suivante :

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

Exemple de sortie :

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

Comme l'utilisateur principal ne dispose pas de l'option d’administration, vous ne pouvez accorder RDS_MASTER_ROLE à aucun autre utilisateur. Pour plus d'informations, consultez la section Octroi de privilèges ’à des utilisateurs non principaux.

Révoquer les privilèges de rôle PUBLIC sur les principaux packages DBMS_* et UTL_*

Il n'est pas recommandé de révoquer les privilèges de rôle PUBLIC sur les packages DBMS_* et UTL_* clés, car plusieurs applications Oracle s'appuient sur ces privilèges. Les principaux packages DBMS_* et UTL_* incluent UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE et DBMS_SYS_SQL

Résoudre l'erreur « invalid schema » lorsque vous créez un rôle avec un mot de passe

Par exemple, vous avez utilisé rdsadmin_util.grant_sys_object pour créer un rôle avec mot de passe et octroyer des privilèges dans les commandes suivantes :

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

Dans la sortie de la commande, vous obtenez l'erreur suivante :

« 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 »

Pour résoudre ce problème, exécutez la commande suivante pour créer un rôle sans mot de passe :

SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;

Résoudre l'erreur « ORA-01031: insufficient privileges »

Voici des exemples de cas d'utilisation qui peuvent entraîner l'erreur ORA-01031.

Vous exécutez la commande ALTER SYSTEM SET

L'erreur ORA-01031 se produit lorsque vous exécutez la commande suivante :

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

Vous ne pouvez pas modifier les valeurs des paramètres dans un groupe de paramètres de base de données par défaut. À la place, modifiez les valeurs des paramètres dans un groupe de paramètres de base de données personnalisé.

Vous utilisez un déclencheur de base de données et les modifications apportées à la structure de la table sous-jacente font passer le statut du déclencheur à INVALID

La prochaine fois qu'un événement lancera le déclencheur, la compilation implicite du déclencheur échouera avec l'erreur suivante :

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

Pour résoudre ce problème, exécutez la commande suivante pour accorder explicitement le privilège administrer le déclencheur de base de données au propriétaire du déclencheur afin que celui-ci puisse modifier le déclencheur de base de données :

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

Sortie attendue :

Trigger altered.

Vous exécutez une procédure stockée

L'erreur « ORA-01031 » s'affiche car vous ne pouvez pas utiliser les privilèges que vous obtenez grâce aux rôles dans des procédures stockées nommées qui s'exécutent avec les droits du definer. Utilisez plutôt les privilèges que vous obtenez grâce aux rôles dans SQL Plus et aux blocs PL/SQL anonymes.

La procédure stockée suivante échoue car l'utilisateur utilise les privilèges d'un rôle figurant dans une procédure stockée nommée pour créer une table. L'utilisateur supprime ensuite la table et essaie d'utiliser la procédure stockée pour créer la même table :

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

La sortie affiche l'erreur suivante :

« Error report -ORA-01031: insufficient privileges »

Pour résoudre ce problème, connectez-vous en tant qu'utilisateur principal, puis exécutez la commande suivante pour accorder le privilège CREATE TABLE :

SQL> GRANT CREATE TABLE TO test_user;

Utilisez la commande suivante pour exécuter la procédure stockée.

SQL> EXEC TEST_PROC

Sortie attendue :

PL/SQL procedure successfully completed.

Vous n'accordez pas de privilèges à l'utilisateur principal avec l'option d'octroi

L'erreur « ORA-04043 » se produit lorsque vous n'accordez aucun privilège à l'utilisateur principal avec l'option d’octroi sur un objet.

L'exemple de procédure d'octroi suivant échoue car l'utilisateur principal ne dispose pas du privilège SELECT associé à l'option d'octroi sur l'objet DBA_TABLESPACE_USAGE_METRICS :

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

La sortie affiche le message « ERROR:  ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist ».

Lorsque l'utilisateur principal essaie d'accorder à un autre utilisateur le privilège SELECT sur l'objet DBA_TABLESPACE_USAGE_METRICS, l'utilisateur principal reçoit le message d'erreur « ORA-01031: insufficient privileges ».

Pour résoudre ce problème, exécutez les commandes suivantes pour accorder explicitement le privilège SELECT avec l'option d’octroi à l'utilisateur principal :

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;

Une fois que vous avez accordé les privilèges SELECT, l'utilisateur principal peut exécuter correctement la commande SELECT :

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Informations connexes

Configuration de l'autorisation des privilèges et des rôles sur le site Web d'Oracle