Re: User List for Certain Privs

From: Sanjay Mishra <smishra_97_at_yahoo.com>
Date: Tue, 19 May 2009 11:37:50 -0700 (PDT)
Message-ID: <740931.94798.qm_at_web51307.mail.re2.yahoo.com>


Thanks Karl




________________________________
From: Karl Arao <karlarao_at_gmail.com>
To: Mark.Bobak_at_proquest.com
Cc: "smishra_97_at_yahoo.com" <smishra_97_at_yahoo.com>; "oracle-l_at_freelists.org" <oracle-l@freelists.org>
Sent: Monday, May 18, 2009 10:09:31 PM
Subject: Re: User List for Certain Privs

Hi Sanjay, 

You could also take a look at Effective Oracle Database 10g Security by Design, very nice security book!

http://www.mhprofessional.com/product.php?cat=7&isbn=0072231300

scripts here http://www.mhprofessional.com/downloads/products/0072231300/0072231300_code_old.zip




Below will show you direct/indirect roles granted to a user:


CREATE ROLE a; 
CREATE ROLE b; 
CREATE ROLE c; 
CREATE ROLE d; 
CREATE ROLE e; 
GRANT a TO b; 
GRANT b TO c; 
GRANT c TO d; 
GRANT e TO c; 
GRANT c TO d; 
GRANT e TO c; 
-- Granting D to SCOTT will give SCOTT all roles 
GRANT d TO scott; 

-- Create a table and grant privileges to role A 
CREATE TABLE obj_of_interest AS SELECT * FROM DUAL; 
GRANT SELECT ON obj_of_interest TO a; 

EXEC show_roles.display('scott') 
Direct Role:   CONNECT   
Direct Role:   D 
Indirect Role: ..C via D 
Indirect Role: ....B via C 
Indirect Role: ......A via B 
Indirect Role: ....E via C   
Direct Role:   RESOURCE     
PL/SQL procedure successfully completed.

scott_at_KNOX10g> COL privilege format a20   
scott_at_KNOX10g> COL object format a20   
scott_at_KNOX10g> COL grantee format a20   
scott_at_KNOX10g> SELECT privilege, object, grantee   
  2    FROM user_object_privs     
  3   WHERE owner = 'SEC_MGR' AND OBJECT = 'OBJ_OF_INTEREST'; 
 
PRIVILEGE            OBJECT               GRANTEE   
-------------------- -------------------- --------------------   
SELECT               OBJ_OF_INTEREST      A 





CREATE OR REPLACE PACKAGE show_roles
AS
  PROCEDURE display (p_username IN VARCHAR2);
END;
/

CREATE OR REPLACE PACKAGE BODY show_roles
AS
--------------------------------------------------------
  FUNCTION convert_level (p_level IN NUMBER)
    RETURN VARCHAR2
  AS
    l_str  VARCHAR2 (32767);
  BEGIN
    FOR i IN 1 .. p_level
    LOOP
      l_str := l_str || '..';
    END LOOP;

    RETURN l_str;
  END;

--------------------------------------------------------
  PROCEDURE recursive_role_getter (
    p_role   IN  VARCHAR2,
    p_level  IN  NUMBER)
  AS
  BEGIN
    FOR irec IN (SELECT   granted_role
                     FROM dba_role_privs
                    WHERE grantee = UPPER (p_role)
                 ORDER BY 1)
    LOOP
      DBMS_OUTPUT.put_line (   'Indirect Role: '
                            || convert_level (p_level)
                            || irec.granted_role
                            || ' via '
                            || p_role);
      recursive_role_getter (irec.granted_role,
                             p_level + 1);  -- recurse
    END LOOP;
  EXCEPTION
    WHEN OTHERS
    THEN
      NULL;
  END;

--------------------------------------------------------
  PROCEDURE display (p_username IN VARCHAR2)
  AS
  BEGIN
    FOR rec IN (SELECT   granted_role
                    FROM dba_role_privs
                   WHERE grantee = UPPER (p_username)
                ORDER BY 1)
    LOOP
      DBMS_OUTPUT.put_line (   'Direct Role:   '
                            || rec.granted_role);
      recursive_role_getter (rec.granted_role, 1);
    END LOOP;
  END;
--------------------------------------------------------
END;
/






- Karl Arao
http://karlarao.wordpress.com









On Tue, May 19, 2009 at 2:41 AM, Bobak, Mark <Mark.Bobak_at_proquest.com> wrote:

Sanjay,
 
I just saw a similar discussion on MetaLink Forum (Community, whatever) just now.
 
Someone posted this that you may find useful:
undef username 
col "User/Role" for a40 
col "Priv/Role" for a30 
select lpad(' ',level*2,' ')||c "User/Role" ,p "Priv/Role",a "With Admin" from ( 
select granted_role p, grantee c, admin_option a from dba_role_privs 
union 
select 'PUBLIC' p, upper('&&username') c, 'NO' a from dual 
union 
select privilege p, grantee c, admin_option a from dba_sys_privs 
order by c 
) x 
connect by c = prior p 
start with c = upper('&&username'); 
 
 
Hope that helps,
 
-Mark
From:oracle-l-bounce_at_freelists.org [mailto:oracle-l-bounce_at_freelists.org] On Behalf Of Sanjay Mishra
Sent: Monday, May 18, 2009 12:40 PM  

To: smishra_97_at_yahoo.com; oracle-l_at_freelists.org
Subject: Re: User List for Certain Privs
 
I am trying the following and if somebody can suggest more effeciently
  1  select grantee, 'DIRECT' from dba_sys_privs where grantee not in (select role from role_sys_privs where privilege='CREATE SESSION')
  2  union
  3* select grantee ,granted_role from dba_role_privs where granted_role in (select role from role_sys_privs where privilege='CREATE SESSION')
 

________________________________

From:Sanjay Mishra <smishra_97_at_yahoo.com>
To: oracle-l_at_freelists.org
Sent: Monday, May 18, 2009 12:31:02 PM
Subject: User List for Certain Privs
Hi
 
Can somebody shared the SQL who can give the list of user based on PRIVILEGE passed to the script. e. I want to create a list of user who has CREATE SESSION privlege. It should only show me the username or if possible to include Direct/Role 
 
I need to create a report that can list the output as 
Username        Direct/Role
sanjay                Direct
santosh              Role
 
Thanks
Sanjay


      
--
http://www.freelists.org/webpage/oracle-l
Received on Tue May 19 2009 - 13:37:50 CDT

Original text of this message