Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Σε αυτό το άρθρο θα δούμε πώς μπορούμε να βρίσκουμε εύκολα τι privileges έχει ένας χρήστης είτε πάνω σε objects όπως τους πίνακες, είτε συστημικά δικαιώματα όπως π.χ. το δικαίωμα να φτιάχνει χρήστες. Στην αρχή θα δούμε ένα ένα τα views που υπάρχουν με αυτή τη πληροφορία βλέποντας απλά query και μετα θα δούμε κάποια queries που έχω φτιάξει που μπορούμε να δούμε συνδιαστικά όλη την πληροφορία πολύ εύκολα.
Πριν ξεκινήσουμε να βλέπουμε πώς βρίσκουμε τα δικαιώματα θα πρέπει να γνωρίζουμε ότι τα δικαιώματα δεν δίνονται μόνο πάνω σε χρήστες αλλά και σε ρόλους χρηστών. Οι ρόλοι χρηστών είναι μία ομάδα δικαιώματων που μπορεί να περιέχει και δικαιώματα πάνω σε objects όπως πίνακες αλλά και συστημικά δικαιώματα όπως το δικαίωμα να φτιάξεις ένα καινούργιο χρήστη. Τους ρόλους τους χρησιμοποιούμε ώστε να μην χρειάζεται κάθε φορά που φτιάχνουμε έναν χρήστη να δίνουμε ένα ένα τα δικαιώματα που θέλουμε αλλά να μπορούμε απλά να προστέσουμε αυτόν τον χρήστη σε έναν ρόλο που ήδη τα έχει. Επίσης θα πρέπει να γνωρίσουμε ότι υπάρχουν κάποιοι ρόλοι με συστημικά δικαιώματα που είναι φτιαγμένοι από default, αλλά μπορούμε να φτιάξουμε και τους δικούς μας. Τέλος δεν ξεχνάμε ότι στα objects του ο κάθε χρήστης έχει πλήρη δικαιώματα, π.χ. ο χρήστης Scott
μπορεί να κάνει ότι θέλει στα δεδομένα του πίνακα του Scott.Dept
, για αυτό τον λόγο στα views που θα δούμε δεν εμφανίζονται τα δικαιώματα στα objects του ιδίου χρήστη.
Πώς βλέπουμε σε ποιούς ρόλους ανήκει ένας χρήστης
Για το παράδειγμα μας θέλουμε να ψάξουμε αν ανήκει σε κάποιο ρόλο ο χρήστης, για να το δούμε αυτό τρέχουμε το παρακάτω query από το view dba_role_privs
:
select * from DBA_ROLE_PRIVS where GRANTEE = 'SCOTT'
Οπότε βλέπουμε ότι ο χρήστης (GRANTEE
) έχει τους δύο ρόλους connect και resource (GRANTED_ROLE
).
Πώς βλέπουμε τι δικαιώματα και σε ποιούς πίνακες έχει ένας χρήστης
Για να δούμε τι δικαιώματα πάνω σε objects / πίνακες έχει ο χρήστης τρέχουμε το παρακάτω query από το view dba_tab_privs
:
select * from DBA_TAB_PRIVS where GRANTEE = 'SCOTT';
Για να καταλάβουμε το παραπάνω όπου GRANTEE
είναι το όνομα του χρήστη, OWNER
είναι το όνομα του schema που ανήκει το object, TABLE_NAME
το όνομα του object / πίνακα, PRIVILEGE
το δικαιώμα που έχει, GRANTABLE
αν μπορεί να το δώσει σε άλλον και τέλος TYPE
τι τύπου object είναι π.χ. πίνακας.
Όμως τι γίνεται αν αυτός ο χρήστης άνηκε σε κάποιον custom ρόλο ο οποίος του έδινε πρόσβαση σε περισσότερα objects; Τότε το παραπάνω query δεν θα το έφερνε, για να το δούμε αυτό θα πρέπει να τρέξουμε το παρακάτω query που φέρνει τα δικαιώματα για τους ρόλους που ανήκει:
select * from DBA_SYS_PRIVS WHERE 1=1 AND (GRANTEE = 'SCOTT' OR GRANTEE IN (SELECT granted_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT'));
Πώς βλέπουμε σε έναν πίνακα ποιοι χρήστες έχουν δικαιώματα και ποια είναι αυτά
Αντίστοιχα για να δούμε ποιοι χρήστες ή ρόλοι και τι δικαιώματα έχουν σε έναν πίνακα τρέχουμε το παρακάτω query:
select * from DBA_TAB_PRIVS where TABLE_NAME = 'DEPT';
Πώς βλέπουμε τι συστημικά δικαιώματα έχει ένας χρήστης
Για να δούμε τι συστημικά δικαιώματα έχει ο χρήστης τρέχουμε το παρακάτω query από το view dba_sys_privs
:
select * from DBA_SYS_PRIVS where GRANTEE = 'SCOTT'
Για να πιάσουμε όμως και τα συστημικά δικαιώματα που μπορεί να έχει ο χρήστης και από ρόλο τρέχουμε το παρακάτω query:
select * from DBA_SYS_PRIVS WHERE 1=1 AND (GRANTEE = 'SCOTT' OR GRANTEE IN (SELECT granted_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT'));
Πώς βλέπουμε συνολικά τι δικαιώματα έχει ένας χρήστης
Πάμε τώρα στα πιο χρήσιμα queries του άρθρου συνδυάζοντας ότι είδαμε πριν.
Με το παρακάτω query που έχω γράψει μπορούμε να βρούμε όλα τα δικαιώματα που έχει ένας χρήστης είτε είναι συστημικά, είτε πάνω σε object, όπως και επίσης τους ρόλους που μπορεί να έχει:
select fake.OWNER,fake.GRANTEE, fake.TABLE_NAME, fake.PRIVILEGE, case WHEN fake.OWNER is null then 'grant '||fake.privilege||' to '||grantee||';' ELSE 'grant '||fake.privilege||' on '||fake.owner||'.'||fake.table_name||' to '||grantee||';' end "GRANT STATEMENTS" from( SELECT OWNER,GRANTEE, TABLE_NAME ,PRIVILEGE FROM DBA_TAB_PRIVS union all SELECT null,GRANTEE, ' IT IS A SYSTEM PRIV', PRIVILEGE FROM DBA_SYS_PRIVS union all SELECT null, GRANTEE, ' IT IS A ROLE', GRANTED_ROLE from DBA_ROLE_PRIVS ) fake where 1=1 --and fake.OWNER='HR' and GRANTEE='SCOTT' order by fake.TABLE_NAME;
Όπως βλέπουμε στην τελευταία στήλη έχω προσθέσει το command που μπορούμε να τρέξουμε ώστε να τα ξανα δημιουργήσουμε, είτε για να τρέξουμε σε άλλο περιβάλλον είτε σε άλλον χρήστη.
Πώς βλέπουμε συγκεντρωτικά τι τύπου δικαιώματα έχει ένας χρήστης
Με το παρακάτω query που έχω φτιάξει μπορούμε να δούμε συγκεντρωτικά τι τύπου δικαιώματα έχει ένας χρήστης και αν μπορεί να τα δώσει σε άλλον. Για παράδειγμα μπορούμε να δούμε αν ένας χρήστης έχει δικαίωμα update, insert σε κάποιο objects ενός σχήματος, ή αν έχει δικαίωμα να φτιάχνει χρήστες:
select fake.owner,fake.GRANTEE,fake.PRIVILEGE,fake.ADMIN_OPTION,fake.GRANTABLE from ( select owner,GRANTEE,PRIVILEGE,null as ADMIN_OPTION, GRANTABLE from dba_tab_privs --where OWNER = 'HR' union all select null,GRANTEE,PRIVILEGE, ADMIN_OPTION, null as GRANTABLE from dba_sys_privs ) fake WHERE 1=1 --and fake.PRIVILEGE in ('INSERT','DELETE','UPDATE','ALTER') and fake.GRANTEE='SCOTT' or GRANTEE IN(SELECT granted_role FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT') GROUP BY fake.owner,fake.GRANTEE,fake.PRIVILEGE,fake.ADMIN_OPTION,fake.GRANTABLE ORDER BY fake.GRANTEE;
Αφαιρώντας και προσθέτοντας τα σχόλια από τα φίλτρα, μπορούμε να δούμε συγκεκριμένα δικαιώματα για όλους τους χρήστες ή για συγκεκριμένα σχήματα (OWNERS
).