La récupération de tous les privilèges utilisateur au sein d'Oracle peut aller d'une simple tâche utilisant une requête SQL de base à un script avancé, en fonction principalement de l'implication des rôles et des privilèges dans la configuration du serveur.
Dans ce bref didacticiel, nous couvrirons à la fois la méthode de requête SQL de base ainsi que la méthode de script avancée afin que vous n'ayez aucun problème quelle que soit la complexité de votre configuration.
Interroger les vues de privilège DBA/USER
Un administrateur de base de données (DBA) pour Oracle peut simplement exécuter une requête pour afficher les lignes dans DBA_SYS_PRIVS
, DBA_TAB_PRIVS
, et DBA_ROLE_PRIVS
pour récupérer des informations sur les privilèges des utilisateurs liés au system
, tables
, et roles
, respectivement.
Par exemple, un DBA souhaitant visualiser tous les éléments system
les privilèges accordés à tous les utilisateurs émettraient la requête suivante :
SELECT
*
FROM
DBA_SYS_PRIVS;
Le DBA_SYS_PRIVS
la vue contient trois colonnes de données :
GRANTEE
est le nom, le rôle ou l'utilisateur auquel le privilège a été attribué.PRIVILEGE
est le privilège qui est attribué.ADMIN_OPTION
indique si le privilège accordé inclut également leADMIN
option.
Pour déterminer quels utilisateurs ont direct accorder l'accès à une table
nous utiliserons le DBA_TAB_PRIVS
afficher :
SELECT
*
FROM
DBA_TAB_PRIVS;
Vous pouvez consulter la documentation officielle pour plus d'informations sur les colonnes renvoyées par cette requête, mais les colonnes critiques sont :
GRANTEE
est le nom de l'utilisateur auquel l'accès est accordé.TABLE_NAME
est le nom de l'objet (table, index, séquence, etc).PRIVILEGE
est le privilège attribué auGRANTEE
pour l'objet associé.
Enfin, interroger le DBA_ROLE_PRIVS
la vue a une grande partie des mêmes informations mais s'applique aux roles
à la place, où le GRANTED_ROLE
colonne précise le rôle en question :
SELECT
*
FROM
DBA_ROLE_PRIVS;
Interroger les privilèges de l'utilisateur actuel
Si l'accès DBA n'est pas possible ou nécessaire, il est également possible de modifier légèrement les requêtes ci-dessus pour afficher les privilèges uniquement pour l'utilisateur actuel .
Cela se fait en interrogeant alternativement USER_
versions du DBA_
ci-dessus vues. Ainsi, au lieu de regarder DBA_SYS_PRIVS
nous interrogerions USER_SYS_PRIVS
, comme ceci :
SELECT
*
FROM
USER_SYS_PRIVS;
Depuis le USER_
les vues de privilège sont effectivement les mêmes que leur DBA_
homologues, mais spécifiques à l'utilisateur actuel uniquement, le type de données renvoyées et les noms de colonne sont tous identiques à ceux lors de l'interrogation de DBA_
vues à la place.
Script avancé pour rechercher tous les privilèges
Bien que les méthodes ci-dessus fonctionnent pour les configurations système de base, les choses commencent à devenir désordonnées dans Oracle lorsque de nombreux rôles existent qui accordent à leur tour des privilèges de rôle à d'autres rôles, et ainsi de suite dans le terrier du lapin. Depuis le DBA_
et USER_
les vues privilégiées n'affichent que les GRANTEES
avec directement affecté l'accès, souvent les privilèges hérités d'autres rôles ne seront pas facilement affichés.
Pour résoudre cela, il est conseillé d'utiliser un script avancé tel que le travail de confiance de Pete Finnigan et son find_all_privs.sql
scénario. Vous pouvez également opter pour une version modifiée par David Arthur, find_all_privs2.sql
.
Dans les deux cas, le but de ces scripts est de vous permettre de récursivement localiser tous les privilèges accordés à un utilisateur particulier. Lorsque le script localise un role
pour l'utilisateur, il recherche de manière récursive d'autres rôles et privilèges accordés à ce rôle, répétant le processus tout au long de la chaîne. Les résultats du script peuvent être affichés à l'écran ou dans un fichier, au choix.
Vous trouverez plus d'informations sur ces scripts et leur utilisation sur petefinnigan.com.