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

Date de la dernière mise à jour : 08/11/2021

Je possède une instance de base de données Amazon Relational Database Service (Amazon RDS) qui exécute Oracle. Je souhaite connaître la procédure de gestion des privilèges et des rôles des utilisateurs pour cette instance de base de données.

Brève description

Un utilisateur principal par défaut est créé lors de la création d'une instance de base de données Amazon RDS for Oracle. Il bénéficie des autorisations d'utilisateur maximales sur l'instance de base de données avec certaines restrictions. Pour toute tâche administrative comme la création de comptes d'utilisateurs supplémentaires dans la base de données, utilisez ce compte. Amazon RDS étant un service géré, les utilisateurs SYS et SYSTEM ne peuvent pas être utilisés par défaut.

Pour obtenir la liste des rôles et privilèges accordés à l'utilisateur principal Amazon RDS for Oracle, consultez Privilèges du compte utilisateur principal.

Amazon RDS étant un service géré, les privilèges suivants pour le rôle d'administrateur de base de données ne sont pas fournis :

  • MODIFIER LA BASE DE DONNÉES
  • SYSTÈME ALTER
  • CRÉER N'IMPORTE QUEL RÉPERTOIRE
  • SUPPRIMER UN RÉPERTOIRE
  • ACCORDEZ N'IMPORTE QUEL PRIVILÈGE
  • ACCORDER UN RÔLE EN PARTICULIER

Pour plus d'informations, consultez la section Limitations des privilèges Oracle pour les administrateurs de bases de données.

Résolution

Pour accorder des privilèges sur des objets SYS dans Amazon RDS, utilisez la procédure Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. La procédure accorde uniquement les privilèges déjà accordés à l'utilisateur principal par le biais d'un rôle ou d'une attribution directe.

Exécutez une commande similaire à la suivante pour accorder des privilèges SELECT sur l'objet V_$SQLAREA à l'utilisateur MYUSER :

Connectez-vous en tant qu'utilisateur principal RDS et exécutez la procédure suivante :

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

Exécutez une commande similaire à la suivante pour accorder des privilèges SELECT sur l'objet V_$SQLAREA à l'utilisateur MYUSER grâce à l'option autorisation :

Remarque : utilisez des majuscules pour définir toutes les valeurs de paramètres, à moins que vous n'ayez créé l'utilisateur avec un identifiant qui tient compte des majuscules/minuscules.

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

Exécutez les requêtes suivantes pour attribuer les rôles SELECT_CATALOG_ROLE et EXECUTE_CATALOG_ROLE à l'utilisateur MYUSER grâce à l'option administrateur. En utilisant ces rôles, MYUSER peut accorder l'accès aux objets SYS qui ont été accordés à SELECT_CATALOG_ROLE et EXECUTE_CATALOG_ROLE.

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

Exécutez les requêtes suivantes pour afficher les autorisations associées au rôle 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;

Pour plus d'informations, consultezAttribution de privilèges SELECT ou EXECUTE aux objets SYS.

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

Exécutez la commande suivante pour révoquer les privilèges SELECT sur l'objet V_$SQLAREA de l'utilisateur MYUSER :

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

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

Utilisez les options de dépannage suivantes en fonction de votre problème et de votre cas d'utilisation.

Réinitialisation des privilèges utilisateur principal

Attribution de RDS_MASTER_ROLE à des utilisateurs autres que les utilisateurs principaux

Le rôle RDS_MASTER_ROLE ne peut pas être accordé à des utilisateurs autres que les utilisateurs principaux. Ce rôle est créé par SYS par défaut lors de la création de l'instance de bases de données. Le RDS_MASTER_ROLE doit être accordé uniquement à l'utilisateur principal. Exécutez la requête suivante pour répertorier les utilisateurs auxquels le RDS_MASTER_ROLE est accordé :

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

Le résultat doit être similaire au suivant :

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

Vous pouvez remarquer dans le résultat de la requête que l'utilisateur principal ne dispose pas de l'option administrateur. Par conséquent, le rôle RDS_MASTER_ROLE ne peut être accordé à aucun autre utilisateur.

Pour plus d'informations, consultez la section Attribution de privilèges à des utilisateurs autres que les utilisateurs principaux.

Révocation des privilèges accordés à PUBLIC

La révocation des privilèges PUBLIC pour les packages DBMS_* et UTL_* clés n'est pas une bonne pratique, car plusieurs applications Oracle sont conçues pour s'appuyer sur ces privilèges. Pour plus d'informations, consultez le document MOSC Doc 247093.1. Les packages clés DBMS_* et UTL_* comprennent 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.

Dépannage de l'erreur lors de la création d'un rôle avec mot de passe

Supposons que vous exécutiez la requête suivante pour créer un rôle avec un mot de passe et accorder des privilèges à l'aide de 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');

Puis, 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, créez un rôle sans mot de passe.

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

Dépannage de l'erreur ORA-01031 : privilèges insuffisants

Les exemples suivants illustrent les cas d'utilisation au cours desquels vous pouvez obtenir cette erreur :

Vous avez exécuté la requête ALTER SYSTEM. Par exemple, la requête suivante échoue avec l'erreur ORA-01031 :

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

Il est toutefois possible de modifier les valeurs des paramètres dans un groupe de paramètres de base de données personnalisé. Cependant, vous ne pouvez pas modifier les valeurs des paramètres dans un groupe de paramètres de base de données par défaut.

Vous utilisez un déclencheur de base de données et les modifications que vous avez apportées à la structure de la table sous-jacente ont fait passer le statut du déclencheur à INVALIDE. Au prochain lancement du déclencheur, vous constaterez peut-être que la compilation implicite du déclencheur échoue avec l'erreur suivante :

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

Pour résoudre ce problème, accordez explicitement le privilège administrer le déclencheur de base de données au propriétaire du déclencheur. Ce privilège permet de modifier correctement le déclencheur de la base de données :

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

Vous avez exécuté une procédure stockée. Cette erreur s'affiche lorsque vous exécutez une procédure stockée, car les privilèges acquis à l'aide de rôles ne fonctionnent pas dans les procédures stockées nommées qui s'exécutent avec les droits du définisseur. Ces privilèges fonctionnent dans les blocs SQL Plus et PL/SQL anonymes.

Exemple :

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

Pour résoudre ce problème, connectez-vous en tant qu'utilisateur principal et accordez explicitement les privilèges requis.

Exemple :

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

L'utilisateur principal ne bénéficie pas des privilèges associés à l'option d'autorisation. Cette erreur s'affiche lorsque les conditions suivantes sont réunies :

  • L'utilisateur principal ne bénéficie pas du privilège correspondant à un objet avec l'option d'autorisation.
  • L'utilisateur principal tente d'accorder ce privilège à un autre utilisateur.

Pour résoudre ce problème, accordez explicitement les privilèges requis à l'utilisateur principal avec l'option d'autorisation.

Exemple :

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;

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?