[Oracle] 31.사용자 관리
권한의 역할과 종류
권한은 사용자가 특정 테이블을 접근할 수 있도록 하거나
해당 테이블에 SQL(SELECT/INSERT/UPDATE/DELETE) 문을 사용할 수 있도록 제한을 두는 것을 말합니다.
데이터베이스 보안을 위한 권한은 시스템 권한(System Privileges)과 객체 권한(Object Privileges)으로 나뉩니다.
시스템 권한은 사용자의 생성과 제거, DB 접근 및 각종 객체를 생성할 수 있는 권한 등 주로 DBA에 의해 부여되며
그 권한의 수가 80 가지가 넘기에 대표적인 시스템 권한만 정리하고 넘어가겠습니다.
데이터베이스를 관리하는 권한으로 다음과 같은 것이 있습니다.
이러한 권한은 시스템 관리자가 사용자에게 부여하는 권한입니다.
객체 권한은 객체를 조작할 수 있는 권한입니다.
객체는 우리가 학습한 것 중에서 테이블, 뷰 등을 예로 들 수 있고,
이미 학습한 시퀀스, 인덱스 등과 앞으로 배울 동의어가 모두 객체에 해당됩니다.
사용자 생성
사용자 계정을 발급 받기 위해서 시스템 권한을 가진 SYSTEM으로 접속해야 합니다!
사용자 계정을 생성하려면 다음과 같이 합니다.
-- SYSTEM 계정
CREATE user user01 identified by 1234;
user01이 생성되었다고 해서 바로 Oracle에 접속할 수 있는 것은 아닙니다~
데이터베이스에 접근할 수 있게 다음과 같이 접속 권한을 주어야합니다.
-- SYSTEM 계정
-- 사용자 접속 권한 줌 : 세션 권한 안주면 접속 불가
GRANT CREATE SESSION TO user01;
사용자에게 시스템 권한을 WITH ADMIN OPTION과 함께 부여하면 그 사용자는 데이터베이스 관리자가 아닌데도 불구하고
부여받은 시스템 권한을 다른 사용자에게 부여할 수 있는 권한도 함께 부여 받게 됩니다.
--SYSTEM 계정
GRANT CREATE SESSION TO user01 WITH ADMIN OPTION;
그러면 user01이 다른 사용자에게 데이터베이스 접근 권한을 줄 수 있습니다.
--user01 계정
GRANT CREATE SESSION TO user02;
시스템 권한을 다시 빼앗으려면 다음과 같이합니다.
--SYSTEM 계정
REVOKE CREATE SESSION FROM user01;
테이블 생성 권한
사용자 user01에게 테이블 생성 권한을 주려면 다음과 같이 합니다!
--SYSTEM 계정
--테이블 생성 권한 줌 (그래도 테이블 생성 불가-> tablespace 권한도 추가해주어야함)
GRANT CREATE TABLE TO user01;
-- 테이블 스페이스 권한도 추가해주어야함 -> 테이블 삭제, 생성, 변경 가능
GRANT UNLIMITED TABLESPACE TO user01;
객체 권한
객체 권한은 특정 객체에 조작을 할 수 있는 권한입니다.
객체의 소유자는 객체에 대한 모든 권한을 가집니다.
다음은 객체와 권한 설정할 수 있는 명령어를 매핑시켜 놓은 표입니다!
객체 권한은 테이블이나 뷰나 시퀀스나 함수 등과 같은 객체별로
DML문(SELECT, INSERT, DELETE)을 사용할 수 있는 권한을 설정하는 것입니다!
객체 권한은 다음과 같이 부여합니다(테이블 소유주 또는 SYSTEM 계정)
-- HR 계정--
--USER01에게 EMP 테이블 조회 권한을 줌
GRANT SELECT ON emp TO user01;
권한을 받은 user01은 HR 계정의 emp 테이블을 다음과 같이 조회할 수 있습니다.
-- user01 계정 --
SELECT *
FROM hr.emp;
위와 같이 hr은 테이블을 소유한 사용자명인데, 이를 스키마라고 합니다!
자신이 소유한 객체가 아닌 경우에는 그 객체를 소유한 사용자명(스키마)을 반드시 기술해야 합니다.
다음과 같이 속성에 대한 권한만 줄 수도 있습니다.
-- HR 계정 --
GRANT UPDATE(salary) on emp to user01;
사용자에게 부여된 권한 조회
이제 사용자와 관련된 권한을 조회해보도록 합시다!
user_tab_privs_made 데이터 딕셔너리는 현재 사용자가 다른 사용자에게 부여한 권한 정보를 알려줍니다!
--HR계정
--테이블에 대해 준 권한
SELECT
*
FROM
user_tab_privs_made;
아까 user01에게 준 EMP 테이블 조회 권한이 보입니다!
컬럼에 대해 준 권한은 user_col_privs_made 데이터 딕셔너리에서 조회 가능합니다!
--HR계정
--컬럼에 대해 준 권한
SELECT
*
FROM
user_col_privs_made;
그렇다면 받은 권한을 조회할 때는 어떻게 할까요?
user_tab_privs_recd 데이터 딕셔너리와 user_col_privs_recd 데이터 딕셔너리를 이용합니다!
--user01 계정
--테이블에 대해 받은 권한
SELECT
*
FROM
user_tab_privs_recd;
--user01 계정
--컬럼에 대해 받은 권한
SELECT
*
FROM
user_col_privs_recd;
권한 철회
권한을 다시 철회할 때는 REVOKE 문을 이용합니다!
--HR 계정
REVOKE SELECT ON emp FROM user01;
테이블에 대한 모든 권한을 철회할 때는 다음과 같이 합니다.
--HR 계정
REVOKE ALL SELECT ON emp FROM user01;
WITH GRANT OPTION
사용자에게 시스템 권한을 WITH ADMIN OPTION과 함께 부여하면 그 사용자는 데이터베이스 관리자가 아닌데도 불구하고
부여받은 시스템 권한을 다른 사용자에게 부여할 수 있는 권한도 함께 부여 받게 된다고 했습니다.
객체 권한에서는 WITH GRANT OPTION이 같은 기능을 합니다!
GRANT SELECT ON emp TO user01 WITH GRANT OPTION;