=====================================================================================
실습 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가 객체 소유자가 된다.

댓글목록
등록된 댓글이 없습니다.