일일 정리

권한과 Role, 패스워드 보안 및 리소스 관리, Profile 관리

mysecurity 2025. 4. 22. 22:53

목차

1. 권한과 Role

1-1 유저에 대한 권한과 롤 조회

1-2 시스템 권한 할당과 해제

1-3 객체 권한 할당과 해제

1-4 롤 생성과 권한 할당

1-5 디폴트 롤과 SET 명령을 이용한 롤 사용

1-6 보안 강화를 위한 유저와 롤 구현 실습

 

2. 패스워드 보안 및 리소스 관리

2-1  프로파일 - 패스워드 관리

2-2 암호 설정

2-3 프로파일 - 리소스 관리

 

3. Profile 관리

3-1 프로파일 조회

3-2 프로파일 생성과 제한 설정

3-3 프로파일 할당과 적용

 

 

1. 권한과 Role

1-1 유저에 대한 권한과 롤 조회

● 사용 명령어

SQL> SELECT grantee, privilege, admin_option FROM dba_sys_privs;

- 유저 또는 롤에 할당된 시스템 권한을 조회한다.

- GRANTEE : 권한을 할당받은 유저

- PRIVILEGE : 권한

- ADMIN_OPTION : 할당받은 권한을 관리자와 동일하게 사용할 수 있는지에 대한 여부

 

SQL> SELECT grantee, owner, table_name, privilege, grantor FROM dba_tab_privs;

- 유저 또는 롤에 할당된 객체 권한을 조회한다.

- OWNER : 대상 오브젝트의 소유자

- TABLE_NAME : 객체 권한이 할당된 테이블 명

- GRANTOR : 객체 권한을 할당해 준 유저 (sys로 작업할 경우 오너와 동일하게 표시된다.)

 

SQL> SELECT grantee, granted_role FROM dba_role_privs;

- 유저 또는 롤에 할당된 role을 조회한다.

- GRANT_ROLE : 할당된 롤 명

 

● 실습

- 실습용 유저 생성 후 확인한다.

 

- 실습용 롤 생성 후 확인한다.

 

- 유저에게 시스템 권한을 할당한다.

- 롤에 시스템 권한을 할당한다.

- 롤과 유저에 할당된 시스템 권한을 확인한다.

 

- 객체 권한 할당을 위한 테이블을 생성한다.

- 유저와 롤에 객체 권한을 할당한다.

- 유저와 롤에 할당된 객체 권한을 확인한다. sys로 작업했음에도 오너가 준 것으로 인식한다.

 

- u1 유저에 r1, r2 롤을 할당한다.

- u2 유저에 r2 롤을 할당한다.

- 유저와 롤에 할당된 롤을 확인한다.

 

1-2 시스템 권한 할당과 해제

● 사용 명령어

SQL> GRANT <시스템 권한>,<시스템 권한> .......
 2   TO [<user명 | role명>,<user명 | role명> ...... | PUBLIC];
 3   [WITH ADMIN OPTION];

- 유저 또는 롤에 시스템 권한을 할당한다.

- PUBLIC : DB의 모든 유저에게 권한을 할당한다.

- WITH ADMIN OPTION : 할당된 권한을 SYS 관리자와 동일하게 할당하거나 해제할 수 있다.

 

SQL> REVOKE <시스템 권한>,<시스템 권한> .......
 2   FROM [<user명 | role명>,<user명 | role명> ...... | PUBLIC];

- 유저 또는 롤의 시스템 권한을 해제한다.

- 퍼블릭으로 부여한 권한은 퍼블릭으로만 해제 가능하다.

 

● 실습

- 예제용 유저의 권한을 조회한다.

- 유저에게 권한 부여 후 확인한다.

 

- u1은 any 키워드로 create table 권한을 얻었으므로 u1으로 모든 스키마에 테이블 생성이 가능하다.

- u1이 할당받은 create sequence 권한을 u2에게 with admin option으로 다시 할당한다.

- u2가 할당받은 create sequence 권한을 u3에게 다시 할당한다. (u1 - u2 - u3 순서로 할당)

- 시스템 권한을 그랜터를 관리하지 않으므로 권한 할당의 선후 관계를 확인할 수 없다.

 

- 권한 할당의 선후 관계를 확인할 수 없으므로 u2가 u1의 권한을 해제할 수 있다.

 

- 퍼블릭으로 생성한 권한만을 퍼블릭으로 해제할 수 있다.

 

1-3 객체 권한 할당과 해제

● 사용 명령어

SQL> GRANT <객체 권한>,<객체 권한> ....... ON <[user명].객체명>, <[user명].객체명> ......
 2   TO [<user명 | role명>,<user명 | role명> ...... | PUBLIC];
 3   [WITH GRANT OPTION];

- 유저 또는 롤에 객체 권한을 할당한다.

- PUBLIC : DB의 모든 유저에게 권한을 할당한다.

- WITH GRANT OPTION : 할당된 권한을 다른 유저에게 할당할 수 있다.

 

SQL> REVOKE <객체 권한>,<객체 권한> ....... ON <[user명].객체명>, <[user명].객체명> ......
 2   FROM [<user명 | role명>,<user명 | role명> ...... | PUBLIC];

- 유저 또는 롤에 객체 권한을 해제한다.

- 직접 할당한 권한만 해제 가능하다.

 

● 실습

- u11 테이블 생성 후 해당 테이블에 대한 select 권한을 u2에게 with grant option으로 할당한다.

- u2는 해당 테이블에 대한 select 권한을 u3에게 할당한다.

- 권한을 부여해준 사용자를 그랜터로 인식한다.

 

- u1 소유인 테이블에 대한 권한이라도 u1이 할당한 권한이 아니라면 권한 해제가 불가능하다.

- u3의 그랜터인 u2의 권한을 해제하여 종속된 u3의 권한까지 해제한다.

- 객체 권한을 부여하는 경우 그에 따른 책임은 그랜터에게 부과된다.

 

- sys 관리자가 일반 유저 테이블의 객체 권한을 할당하는 경우 대상 객체의 오너를 그랜터로 인식한다.

 

1-4 롤 생성과 권한 할당

● 사용 명령어

SQL> CREATE ROLE <role 명>
 2   [IDENTIFIED BY <암호>];

- 롤을 생성한다.

 

SQL> DROP ROLE <role 명>;

- 롤을 삭제한다.

 

SQL> GRANT <role 명> TO <user명 | role 명>;

- 롤을 유저나 롤에 할당한다.

- 롤이 롤에 할당되는 경우 순환으로 할당될 수 없다.

 

● 실습

- 새로운 롤을 만들 경우 참조용으로 미리 만들어진 롤이 존재한다.

 

- 사용할 롤을 생성한다.

- 롤에 시스템 권한을 부여한다.

- 롤에 부여된 시스템 권한을 조회한다. role_sys_privs의 정보는 모두 dba_sys_privs에서 조회 가능하다.

 

- 롤에 객체 권한을 부여한다.

- 롤에 부여된 객체 권한을 조회한다. role_tab_privs의 정보는 모두 dba_tab_privs에서 조회 가능하다.

- 롤에 롤을 부여한다.

- 롤에 부여된 롤을 조회한다. role_role_privs의 정보는 모두 dba_role_privs에서 조회 가능하다.

 

- 롤에 롤을 부여하는 경우 순환해서는 안된다.

 

1-5 디폴트 롤과 SET 명령을 이용한 롤 사용

● 사용 명령어

SQL> ALTER USER <user 명>
 2   DEFAULT ROLE { <role 명>, ...... | ALL [EXCEPT <role 명>] | none };

- 사용자에 부여된 롤 중 디폴트 롤을 지정한다.

- EXCEPT : 전체 롤 중 디폴트에서 제외될 롤을 지정한다.

 

SQL> SET role 
 2   { <role 명> [IDENTIFIED BY <암호>, ...... ] || ALL [EXCEPT <role 명>] | none }

- 현재 세션에서 사용할 롤을 지정한다.

SQL> SELECT * FROM SESSION_ROLES;

- 현재 세션에서 사용 중인 롤을 조회한다.

 

● 실습

- 실습용 테이블 스페이스, 유저를 생성한다.

 

- 실습용 롤을 생성한다. ro2와 ro3는 암호를 정의한다.

- 각 롤에 권한을 부여한다.

- 생성된 세 개의 롤을 insa 유저에 할당한다.

- insa 유저의 디폴트 롤을 ro1으로 지정한다. (디폴트 롤 기본값 = all)

 

- insa 유저로 접속 시 디폴트 롤인 ro1 만이 활성화된다.

- 롤에 지정된 패스워드는 set role 수행 시 반드시 작성한다.

 

- 재접속 시 다시 디폴트 롤만이 활성화된다.

 

1-6 보안 강화를 위한 유저와 롤 구현 실습

● DB 구축 환경

- 프로젝트명 : insa

- User

  * insa_ma : 프로젝트 관련 table 소유 스키마로 세그먼트 생성 시에만 사용된다.

  * insa_al : insa_ma 세그먼트에 대한 ALTER 작업만을 수행한다.

  * insa_in : data 입력과 검색만을 수행한다.

  * insa_up : data 수정과 검색을 수행한다.

 

insa_ma와 insa_al과 같은 유저는 주로 모델러, insa_in과 insa_up과 같은 유저는 주로 애플리케이션 개발자가 이용한다.

 

- Tablespace

  * insa T/S : 세그먼트 저장용 테이블스페이스이다.

  * indx T/S : 인덱스용 테이블스페이스이다.

 

- Role

  * r_basic : 접속 관련 권한

  * r_master : segment에 대한 생성 권한 (default role로 지정하지 않는다.)

  * r_alter : insa_ma segment에 대한 ALTER 권한

  * r_insert : insa_ma segment에 대한 INSERT 권한

  * r_update : insa_ma segment에 대한 UPDATE, DELETE 권한

 

- Table

  * insa_ma 스키마의 table 목록 in01, in02, in03 테이블의 구조는 임의로 결정한다.

 

● 구현 과정

① 테이블스페이스 생성

② 유저 생성

③ 롤 생성

④ 롤에 권한 할당

⑤ 유저에 롤 할당

 

● 실습

 테이블스페이스 생성

- insa 테이블과 인덱스 테이블을 생성한다.

 

② 유저 생성

- 유저를 생성한다.

- insa_ma 외의 유저는 입력, 수정, 검색 등 만을 하므로 쿼타 할당이나 디폴트 테이블스페이스는 필요하지 않다.

 

- 치환 변수 &를 이용해 insa_ma 유저에 테이블을 생성한다.

- '/'는 직전 sql문을 실행한다.

 

③ 롤 생성

- in_master 롤은 암호를 설정한다.

- 'R#_%' ESCAPE '#' : '#'을 이스케이프 문자로 이용해 본래 와일드 문자인 '_'을 일반 문자열로 인식시켜 'R_'로 시작하는 문자열을 검색한다.

 

④ 롤에 권한 할당

- create table, create sequence, create trigger, create procedure, create view 가 가장 기본적인 크리에이트 권한이다.

 

- 각 롤에 할당된 시스템 권한과 객체 권한을 확인한다.

 

⑤ 유저에 롤 할당

- insa_ma 유저에 롤을 할당한다.

- r_master 롤은 매우 중요하므로 디폴트로 활성화시키지 않는다.

- 유저별 업무 권한을 분리하여 보안을 강화한다.

 

2. 패스워드 보안 및 리소스 관리

2-1  프로파일 - 패스워드 관리

데이터베이스의 보안과 효율적인 관리를 위해 데이터베이스 관리자는 프로파일을 사용하여 패스워드 관리 및 리소스 관리를 한다.

프로파일이란 패스워드 및 리소스 제한을 명명한 집합으로, create user 혹은 alter user 명령으로 유저에게 할당한다.

활성화/비활성화가 가능하며 기본적으로 DEFAULT 프로파일을 따른다

● 패스워드 계정 잠금

로그인 일정 횟수 이상 실패 시 계정에 락을 건다. 락의 지속기간을 설정할 수 있다.

파라미터 설명
FAILED_LOGIN_ATTEMPTS 계정 잠금 전 가능한 로그인 시도 실패 횟수
PASSWORD_LOCK_TIME 지정된 로그인 시도 실패 횟수 이후 계정이 잠기는 일 수
- 1/24, 5/24와 같이 분수를 이용하여 시간 단위로도 설정 가능하다.

 

● 패스워드 만기일 및 유예기간

패스워드의 만기일을 정하고 이후 유예기간 동안은 반드시 패스워드를 변경하도록 설정할 수 있다.

파라미터 설명
PASSWORD_LIFE_TIME 한 암호의 최대 사용 기간
PASSWORD_GRACE_TIME 암호 만기 이후 암호 변경까지의 유예기간

 

● 패스워드 히스토리

이전에 사용한 패스워드를 기억하여 이전 패스워드 재사용에 대한 제약을 설정할 수 있다.

파라미터 설명
FAILED_LOGIN_ATTEMPTS 주어진 일 수 동안 암호 재사용할 수 없도록 지정
PASSWORD_LOCK_TIME 주어진 횟수만큼 암호를 변경해야만 이전 암호 재사용이 가능하도록 지정

- 둘을 동시에 지정 시 어떤 설정이 적용될지 모르므로 동시에 지정하지 않는다.

 

● 패스워드 확인

패스워드 생성 시 복잡도를 설정할 수 있다. 

파라미터 설명
PASSWORD_VERIFY_FUNCTION 암호 생성 전 암호 복잡성을 검사하는 PL/SQL 함수

 

 

● 사용자 제공 패스워드 함수

function_name(
 userid_parameter IN VARCHAR2(30),
 password_parameter IN VARCHAR2(30),
 old_password_parameter IN VARCHAR2(30))
RETURN BOOLEAN

 

 

● 암호 확인 함수 VERIFY_FUNCTION

오라클은 utlpwdmg.sql 스크립트에 의해 VERIFY_FUNCTION이라는 기본 PL/SQL 함수 형태로 복잡성 확인 함수를 제공한다.

규칙은 다음과 같다.

- 최소 길이는 4글자이다.

- 암호는 유저 이름과 달라야 한다.

- 암호는 최소한 영문자 1개, 숫자 1개, 특수 문자 1개로 구성되어야 한다.

- 암호는 최소한 3글자까지 이전 암호와 달라야 한다.

 

2-2 암호 설정

● 프로파일 생성 - 암호 설정

다음과 같이 암호 설정 프로파일을 생성한다.

CREATE PROFILE grace_5 LIMIT
 FAILED_LOGIN_ATTEMPTS 3
 PASSWORD_LOCK_TIME UNLIMITED
 PASSWORD_LIFE_TIME 30
 PASSWORD_REUSE_TIME 30
 PASSWORD_VERIFY_FUNCTION verify_function
 PASSWORD_GRACE_TIME 5;

- 상단의 LIMIT은 문법이므로 빼서는 안된다.

 

● 프로파일 변경 - 암호 설정

ALTER PROFILE을 이용해 암호 제한을 변경한다.

ALTER PROFILE default LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10;

- default라는 이름의 프로파일은 실제로는 절대 바꾸지 않는다. 예제용 문장일 뿐이다.

 

● 프로파일 삭제 - 암호 설정

DROP PROFILE을 이용해 프로파일을 삭제하며, 이때 DEFAULT 프로파일은 삭제할 수 없다.

DROP PROFILE developer_prof;

DROP PROFILE developer_prof CASCADE;

- cascade는 할당한 유저로부터 프로파일을 취소한다. 이 경우 디폴트 프로파일로 돌아간다.

 

2-3 프로파일 - 리소스 관리

리소스 관리 제한은 세션 레벨, 호출 레벨 혹은 두 레벨 모두에서 시행 가능하다.

  * 세션 레벨: 세션 접속 한 번당 사용가능한 리소스량을 제한한다.

  * 호출 레벨: 문장 하나가 사용할 수 있는 리소스량을 제한한다.

CREATE PROFILE 명령을 이용해 프로파일에서 리소스 제한을 정의할 수 있다.

 

●  자원 제한 활성화

ALTER SYSTEM 명령을 이용해 초기화 파라미터 RESOURCE_LIMIT을 TRUE로 설정하여 파라미터를 활성화한다. 해당 값이 FALSE일 경우 프로파일의 리소스 관련 설정은 적용되지 않는다.

ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;

 

 

●  세션 레벨에서 자원 제한 설정

세션 레벨에서의 설정은 세션 연결 시마다 시행된다. 자원 제한 설정은 다음과 같다.

자원 설명
CPU_PER_SESSION 총 cpu 사용 가능 시간 (1/100초 단위)
- 100일 경우 1초이다.
SESSIONS_PER_USER 한 계정이 동시에 접속 가능한 세션 수 
CONNECT_TIME 접속 후 사용 가능 시간 (분 단위)
IDLE_TIME 아무 동작 없이 세션 유지 가능한 시간 (분 단위)
LOGICAL_READS_PER _SESSION 데이터 블록 수 (물리적 및 논리적 읽기)
- 논리적 읽기는 메모리를 의미하며 데이터 버퍼 캐시에서 읽는다.
- 물리적 읽기는 데이터 파일을 읽는다.

 

 

●  호출 레벨에서 자원 제한 설정

호출 레벨에서의 설정은 sql문 실행 중 호출 시마다 시행된다. 자원 제한 설정은 다음과 같다.

자원 설명
CPU_PER_CALL 문장 하나가 cpu를 읽을 수 있는 시간 (1/100초 단위)
LOGICAL_READS_PER_CALL 문장 하나가 읽을 수 있는 블록 갯수
- 풀 테이블 스캔을 막기 위해 설정한다.

 

 

● 프로파일 생성 - 자원 제한

다음과 같이 자원 제한 프로파일을 생성한다.

CREATE PROFILE developer_prof LIMIT
 SESSIONS_PER_USER 2
 CPU_PER_SESSION 10000
 IDLE_TIME 60
 CONNECT_TIME 480;

 

3. Profile 관리

3-1 프로파일 조회

● 사용 명령어

SQL> SELECT DISTINCT profile FROM DBA_PROFILES;

- 프로파일의 목록을 확인한다.

 

SQL> SELECT * FROM DBA_PROFILES
 2   ORDER BY PROFILE, RESOUECE_TYPE;

- 각 프로파일에 정의된 설정 값을 확인한다.

 

SQL> SELECT username, profile FROM DBA_USERS;

- 각 유저에게 할당된 프로파일을 조회한다.

 

● 실습

- 프로파일 목록이 저장된 딕셔너리를 확인한다.

 

- 프로파일의 목록을 확인한다. DEFAULT는 오라클의 디폴트 프로파일의 이름으로, 삭제가 불가능하다.

- 각 프로파일에 정의된 제한 사항을 확인한다.

- 각 유저 별로 정의된 프로파일을 조회한다. 모든 유저가 DEFAULT 프로파일에 따라 제한된다.

 

3-2 프로파일 생성과 제한 설정

● 사용 명령어

SQL> CREATE[| ALTER] PROFILE <profile 명> LIMITED
 2   COMPOSITE_LIMIT [<설정값> | UNLIMITED | DEFAULT]     
 3   SESSIONS_PER_USER [<설정값> | UNLIMITED | DEFAULT]     
 4   PRIVATE_SGA  [<설정값> | UNLIMITED | DEFAULT]                
 5   CONNECT_TIME  [<설정값> | UNLIMITED | DEFAULT]                
 6   IDLE_TIME  [<설정값> | UNLIMITED | DEFAULT]                   
 7   LOGICAL_READS_PER_CALL  [<설정값> | UNLIMITED | DEFAULT]      
 8   LOGICAL_READS_PER_SESSION  [<설정값> | UNLIMITED | DEFAULT]   
 9   CPU_PER_CALL  [<설정값> | UNLIMITED | DEFAULT]                
10   CPU_PER_SESSION  [<설정값> | UNLIMITED | DEFAULT]             
11   PASSWORD_VERIFY_FUNCTION  [<설정값> | NULL | DEFAULT]    
12   PASSWORD_REUSE_MAX  [<설정값> | UNLIMITED | DEFAULT]         
13   PASSWORD_REUSE_TIME  [<설정값> | UNLIMITED | DEFAULT]       
14   PASSWORD_LIFE_TIME  [<설정값> | UNLIMITED | DEFAULT]         
15   FAILED_LOGIN_ATTEMPTS   [<설정값> | UNLIMITED | DEFAULT]     
16   PASSWORD_LOCK_TIME  [<설정값> | UNLIMITED | DEFAULT]         
17   PASSWORD_GRACE_TIME  [<설정값> | UNLIMITED | DEFAULT];

- 프로파일을 생성한다.

- UNLIMITED : 제한하지 않는다.

- DEFAULT : DEFAULT 프로파일과 동일한 값을 가진다.

- COMPOSITE_LIMIT : CONNECT_TIME, PRIVATE_SGA, CPU_PER_SESSION, READ_PER_SESSION 등의 값을 통합해서 제한한다.

- SESSIONS_PER_USER : 계정 당 접속 가능한 세션 숫자

- PRIVATE_SGA : Shared server환경에서 SGA에 사용가능한 SP 전용 메모리 크기 (MB)

- CONNECT_TIME : 접속 유효 시간 (분)

- IDLE_TIME : 비활성 접속 한계 (분)

- LOGICAL_READS_PER_CALL : 한 문장에서 읽기 가능한 블록 개수

- LOGICAL_READS_PER_SESSION : 한 세션에서 읽기 가능한 블록 개수

- CPU_PER_CALL : 한 문장에서 사용 가능한 CPU 시간 (1/100 초)

- CPU_PER_SESSION : 한 세션에서 사용 가능한 CPU 시간 (1/100 초)

- PASSWORD_VERIFY_FUNCTION : 패스워드 복잡성을 확인하는 함수

- PASSWORD_REUSE_MAX : 패스워드 재사용까지 변경 횟수

- PASSWORD_REUSE_TIME : 패스워드 재사용까지 제한 기간

- PASSWORD_LIFE_TIME : 패스워드 유효 기간

- FAILED_LOGIN_ATTEMPTS : 패스워드 오류 허용 횟수

- PASSWORD_LOCK_TIME : 패스워드 오류에 의한 락 유지 기간 (일)

- PASSWORD_GRACE_TIME : 패스워드 만료 이후 암호 변경까지 유예 기간

- 프로파일에 대한 ALTER 문장은 CREATE 문장과 동일하다.

 

● 실습

- resource_limit 파라미터를 확인한다.

- 값이 false인 경우 프로파일의 리소스 관련 설정이 무시되므로 true로 설정한다.

- insa 프로파일을 생성한다.

    : 계정 당 접속 가능한 세션 수: 1개, 비활성 접속 한계 시간: 1분, 접속 유효 시간 2분

 

- 패스워드 오류 허용 횟수 : 3회, 패스워드 오류에 의한 락 유지 기간: 1일로 수정한다.

 

3-3 프로파일 할당과 적용

● 사용 명령어

SQL> ALTER USER <user 명>
 2   PROFILE <profile 명>;

- 사용자에게 프로파일을 할당한다.

- CREATE USER 명령을 통해 할당하는 것도 가능하다.

- 유저에 프로파일을 지정하지 않으면 디폴트 프로파일에 적용받는다.

 

● 실습

- emp 유저를 생성한다.

- emp에게 connect, resource 권한을 부여한다.

- emp 유저에 insa 프로파일을 지정한다.

 

- 첫 번째 세션에서 emp로 접속한다.

 

- 두 번째 세션에서 emp로 접속 시도 시 계정 당 접속 가능한 세션 수를 1개로 설정했으므로 접속이 불가하다.

 

- 패스워드 오류 허용 횟수가 3회이므로 이후 정상적인 입력에도 접속이 불가하다.

- 관리자로 접속하여 emp 유저의 락을 해제한다.