데이터베이스

Total 205
Today 0
profile_image
슈퍼아이피
09-12-10 15:05 0개 590회
Oracle
권한과 Role
권한과 Role

=====================================================================================

실습 2.1 User에 대한 권한와 Role 조회 (필)

=====================================================================================

  <?xml:namespace prefix = o /><?XML:NAMESPACE PREFIX = O />

SQL> create tablespace usr ← User용 tablespace를 생성한다. 항상 user 생성 이전에 만드는 것이 좋다.

2 datafile '/app/ora10g/oradata/disk1/usr01.dbf' size 5M;

Tablespace created.

 

SQL> create user u1 ← 예제용 User를 생성한다.

2 identified by u1

3 default tablespace usr

4 quota unlimited on usr;

User created.

 

SQL> create user u2

2 identified by u2

3 default tablespace usr

4 quota unlimited on usr;

User created.

 

SQL> create user u3

2 identified by u3

3 default tablespace usr

4 quota unlimited on usr;

User created.

 

SQL> @user ← 생성된 User를 확인한다.

 

USERNAME DEFAULT_TA TEMPORARY_ ACCOUNT_STATUS PROFILE

---------- ---------- ---------- -------------------- ----------

...........

...........

U1 USR TEMP OPEN DEFAULT

U2 USR TEMP OPEN DEFAULT

U3 USR TEMP OPEN DEFAULT

 

SQL> create role r1; ← Role을 생성한다.

Role created.

 

SQL> create role r2;

Role created.

 

SQL> desc dba_roles;

Name Null? Type

--------------------------------- -------- -----------------

ROLE NOT NULL VARCHAR2(30)

PASSWORD_REQUIRED VARCHAR2(8)

 

SQL> select role from dba_roles ← 생성된 role을 확인한다.

2 order by 1;

 

ROLE

------------------------------

..........

..........

R1

R2

..........

..........

 

SQL> grant create session to u1,u2,u3; ← User에게 시스템 권한을 할당한다.

Grant succeeded.

 

SQL> grant create table to r1; ← Role에 시스템 권한을 할당한다.

Grant succeeded.

 

SQL> desc dba_sys_privs;

Name Null? Type

----------------------------------------------------- -------- ------------------------------------

GRANTEE NOT NULL VARCHAR2(30)

PRIVILEGE NOT NULL VARCHAR2(40)

ADMIN_OPTION VARCHAR2(3)

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3','R1','R2')

3 order by 1; ← where절에 정의한 role과 user에 할당된 시스템 권한을 확인한다.

 

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

R1 CREATE TABLE NO

U1 CREATE SESSION NO

U2 CREATE SESSION NO

U3 CREATE SESSION NO

 

SQL> create table u2.u21 (no number); ← 객체 권한 할당을 위한 예제 table을 생성한다.

Table created.

 

SQL> create table u3.u31 (no number);

Table created.

 

SQL> grant select on u2.u21 to u1; ← User에게 객체 권한을 할당한다.

Grant succeeded.

SQL> grant select on u3.u31 to r2; ← Role에 객체 권한을 할당한다.

Grant succeeded.

 

SQL> desc dba_tab_privs;

Name Null? Type

----------------------------------------------------- -------- ------------------------------------

GRANTEE NOT NULL VARCHAR2(30)

OWNER NOT NULL VARCHAR2(30)

TABLE_NAME NOT NULL VARCHAR2(30)

GRANTOR NOT NULL VARCHAR2(30)

PRIVILEGE NOT NULL VARCHAR2(40)

GRANTABLE VARCHAR2(3)

HIERARCHY VARCHAR2(3)

 

SQL> select grantee, owner, table_name, privilege, grantor from dba_tab_privs

2 where grantee in ('U1','U2','U3','R1','R2')

3 order by 1; ← Role과 User에 할당된 객체 권한을 확인한다.

 

GRANTEE OWNER TABLE_NAME PRIVILEGE GRANTOR

---------- ---------------- --------------- ----------- ----------

R2 U3 U31 SELECT U3

U1 U2 U21 SELECT U2

 

SQL> grant r1,r2 to u1; ← u1 user에 r1,r2 role을 할당한다.

Grant succeeded.

SQL> grant r2 to u2; ← u2 user에 r2 role을 할당한다..

Grant succeeded.

 

SQL> desc dba_role_privs

Name Null? Type

----------------------------------------------------- -------- ------------------------------------

GRANTEE VARCHAR2(30)

GRANTED_ROLE NOT NULL VARCHAR2(30)

ADMIN_OPTION VARCHAR2(3)

DEFAULT_ROLE VARCHAR2(3)

 

SQL> select grantee, granted_role from dba_role_privs

2 where grantee in ('U1','U2','U3','R1','R2')

3 order by 1; ← Role과 User에 할당된 role을 확인한다.

 

GRANTEE GRANTED_ROLE

---------- ------------------------------

U1 R1

U1 R2

U2 R2

 

-------------------------------------------------------------------------------------

 

 

 

=====================================================================================

실습 2.2 시스템 권한 할당(grant)과 해제(revoke) (필)

=====================================================================================

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3')

3 order by 1; ← 예제용 스키마의 권한을 조회한다.

(사용자가 없다면 실습 2.1을 참고 해서 생성한다.)

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

U1 CREATE SESSION NO

U2 CREATE SESSION NO

U3 CREATE SESSION NO

 

SQL> grant create any table to u1; ← 각 사용자에게 [표 2-2]에 제시한 것과 같이 권한을 할당한다.

Grant succeeded.

 

SQL> grant create sequence to u1

2 with admin option;

Grant succeeded.

 

SQL> grant create table to u2;

Grant succeeded.

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3')

3 order by 1;

 

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

U1 CREATE ANY TABLE NO

U1 CREATE SEQUENCE YES

U1 CREATE SESSION NO

U2 CREATE SESSION NO

U2 CREATE TABLE NO

U3 CREATE SESSION NO

 

SQL> conn u1/u1

Connected.

 

SQL> create table u3.test (no number); ← ANY 키워드는 관리 권한의 하나로 모든 스키마를 대상으로 한다.

Table created. 즉 u1은 모든 스키마에 table을 생성 할 수 있다.

 

SQL> conn u3/u3

Connected.

 

SQL> select * from tab;

 

TNAME TABTYPE CLUSTERID

------------------------------ ------- ----------

U31 TABLE

TEST TABLE ← u1이 생성한 table 그러나 u3 소유이다.

 

SQL> conn u1/u1

Connected.

 

SQL> grant create sequence to u2 ← with admin option으로 권한을 다시 u2에게 할당한다.

2 with admin option;

Grant succeeded.

 

SQL> conn u2/u2

Connected.

 

SQL> grant create sequence to u3; ← 권한은 u1-u2-u3 순으로 할당 되어졌다.

Grant succeeded.

 

SQL> conn / as sysdba

Connected.

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3') and privilege = 'CREATE SEQUENCE'

3 order by 1;

 

GRANTEE PRIVILEGE ADM ← 시스템 권한은 현재 권한의 소유 여부만 저장될 뿐 누구로부터 할당 되었는지

---------- ----------------------- --- 관리하지 않음으로 할당의 선후 관계를 확인 할 수 없다.

U1 CREATE SEQUENCE YES

U2 CREATE SEQUENCE YES

U3 CREATE SEQUENCE NO

 

SQL> conn u2/u2

Connected.

 

SQL> revoke create sequence from u1; ← u2는 자신에게 create sequence 권한을 할당한 user가 비록 u1이지만

Revoke succeeded. 시스템 권한은 할당한 사용자를 관리하지 않음으로 해제가 가능하다.

객체 권한과의 운영상의 가장 큰 차이점이다.

SQL> conn / as sysdba;

Connected.

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3') and privilege = 'CREATE SEQUENCE'

3 order by 1;

 

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

U2 CREATE SEQUENCE YES

U3 CREATE SEQUENCE NO

 

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3')

3 order by 1;

 

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

U1 CREATE ANY TABLE NO

U1 CREATE SESSION NO

U2 CREATE SEQUENCE YES

U2 CREATE SESSION NO

U2 CREATE TABLE NO

U3 CREATE SEQUENCE NO

U3 CREATE SESSION NO

 

SQL> revoke create any table, create table, create sequence from public;

revoke create any table, create table, create sequence from public

*

ERROR at line 1:

ORA-01952: system privileges not granted to 'PUBLIC' ← Public으로 할당된 권한만 public으로 해제 할 수 있다.

 

SQL> revoke create any table from u1; ← 다양한 권한이 다양한 user에게 직접 할당 된 경우

Revoke succeeded. 모두 하나씩 해제해야 한다.

 

SQL> revoke create table from u2;

Revoke succeeded.

 

SQL> revoke create sequence from u2,u3;

Revoke succeeded.

 

SQL> select grantee, privilege, admin_option from dba_sys_privs

2 where grantee in ('U1','U2','U3')

3 order by 1;

 

GRANTEE PRIVILEGE ADM

---------- ------------------------------- ---

U1 CREATE SESSION NO

U2 CREATE SESSION NO

U3 CREATE SESSION NO

-------------------------------------------------------------------------------------

 

 

=====================================================================================

실습 2.3 객체 권한 할당(grant)과 해제(revoke) (필)

=====================================================================================

 

 

SQL> conn u1/u1

Connected.

 

SQL> create table u11 (no number);

Table created.

 

SQL> select * from tab;

 

TNAME TABTYPE CLUSTERID

------------------------------ ------- ----------

U11 TABLE

 

SQL> grant select on u11 to u2 with grant option; ← u11 table에 대한 select 권한을 u2에게

Grant succeeded. with grant option으로 할당

 

SQL> conn u2/u2

Connected.

 

SQL> grant select on u1.u11 to u3; ← u2는 u1.u11에 대한 select 권한을 u3에게 할당

Grant succeeded.

 

SQL> conn u1/u1

Connected.

 

SQL> select grantee, owner, table_name, privilege, grantor from user_tab_privs

2 where table_name = 'U11';

 

GRANTEE OWNER TABLE_NAME PRIVILEGE GRANTOR ← u11에 대한 권한을 u2에게만 주었지만 with grant option으로

---------- ---------- --------------- ------------- ---------- 인해 u3까지 권한이 할당됨

U2 U1 U11 SELECT U1

U3 U1 U11 SELECT U2

 

SQL> revoke select on u11 from u3; ← 비록 자신이 소유한 table의 권한이지만 직접 할당하지 않은 권한이므로 해제 불가능

revoke select on u11 from u3

*

ERROR at line 1:

ORA-01927: cannot REVOKE privileges you did not grant

 

SQL> revoke select on u11 from u2; ← u2의 권한을 해제하면 u2가 할당한 권한까지 cascade하게 해제 된다.

Revoke succeeded.

 

SQL> select grantee, owner, table_name, privilege, grantor from user_tab_privs

2 where table_name = 'U11';

no rows selected

 

SQL> conn /as sysdba

Connected.

 

SQL> grant select on u1.u11 to u2; ← sys 관리자가 일반 user table의 객체 권한을 할당 하는 경우

Grant succeeded. grantor가 객체 소유자가 된다.

 

추천 0 비추천 0

댓글목록

등록된 댓글이 없습니다.