내용 목차
본 장에서는 레이블을 통하여 사용자의 접근을 제어하는 기능인 Label Security에 대해서 설명한다.
Label Security는 특정 테이블의 열 및 사용자에게 할당 된 레이블을 이용하여 대상 테이블의 행에 대한 접근을 제어하는 기능이다.
기본적으로 Label Security는 행 레이블과 사용자 레이블을 비교하여 사용자의 접근을 제어하는 방식으로 동작하며, 민감한 정보를 승인된 사용에게만 접근 가능하도록 설정할 수 있다.
Label Security 기능을 사용하기 위해선 접근 제어 지표인 레이블과 접근 제어 관련 정보를 관리하는 정책이 필요하다.
레이블
레이블은 다음과 같은 조건을 만족해야 한다.
| 구분 | 설명 |
|---|---|
| Level | 데이터의 민감한 정도를 수직적으로 나타낸다. (예: 공개, 대외비, 기밀) |
| Compartment | 데이터의 구성을 수평적으로 나타낸다. 개별 프로젝트에 대한 접근을 제어하는 데 도움이 된다. (예: 알파, 베타, 감마) |
| Group | 데이터의 구성을 tree 형태로 나타낸다. 계층형 구조의 데이터에 대한 접근을 제어하는 데 도움이 된다. (예: 티맥스 – 티맥스데이터, 티맥스소프트) |
정책
접근 제어 관련 정보를 관리하는 메인 컨테이너이다.
예를 들어 데이터의 민감도가 공개자료, 대외비, 기밀 3 단계의 level로 이루어져 있을 때 특정 사용자에게 대외비까지 접근할 수 있는 level이 부여되었다면 그 사용자가 기밀 데이터에 접근하는 것은 불가능하다.
Label Security 기능을 사용하기 위해서는 레이블 기반 보안 방식에 및 레이블 구성 요소에 대한 이해가 필요하다.
레이블은 크게 데이터 레이블과 사용자 레이블로 나누어 생각할 수 있다.
데이터 레이블
행 데이터의 민감한 정도와 특성을 나타내며, 사용자가 해당 행에 접근하기 위해 충족해야 하는 기준이 된다.
사용자 레이블
사용자의 민감한 정도와 레이블이 지정된 데이터에 대한 사용자의 접근을 제한하는 기준이 된다. 각 사용자에게는 레벨, 구획, 그룹의 범위가 할당되며 해당 범위 내의 레이블이 있는 데이터에 접근 가능하다.
레이블을 구성하는 요소는 레벨, 구획, 그룹으로 나뉜다. 해당 요소들을 적절하게 결합하여 레이블을 생성할 수 있다.
레벨은 레이블 정보의 민감도를 등급화 한 지표이다. 큰 레벨 값은 정보의 민감도가 높다는 것을 의미한다.
다음과 같이 레벨을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 30 | 기밀 (SECRET) | S |
| 20 | 대외비 (CONFIDENTIAL) | C |
| 10 | 공개 (PUBLIC) | P |
구획은 레이블이 지정된 데이터 정보의 민감도를 더 세분화하는 영역이다. 특정 프로젝트와 관련 있는 모든 데이터는 동일한 구획으로 레이블을 지정할 수 있다.
다음과 같이 구획을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 80 | 알파 (ALPHA) | A |
| 50 | 베타 (BETA) | B |
| 20 | 감마 (GAMMA) | G |
그룹은 계층적 구조로 레이블이 지정된 데이터 정보의 민감도를 더 세분화하는 영역이다. 조직 구성을 기반으로 데이터에 레이블을 지정할 수 있으며, 특정 부서와 관련있는 모든 데이터는 레이블에 해당 부서의 그룹을 포함할 수 있다.
다음과 같이 그룹을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 | 부모 그룹 |
|---|---|---|---|
| 1000 | TMAX | T | |
| 1100 | TMAX_DATA | T_DATA | T |
| 1200 | TMAX_SOFT | T_SOFT | T |
레이블 구성 요소를 정의한 후 특정 레벨, 구획, 그룹 집합을 결합하여 데이터 레이블을 생성할 수 있다.
다음과 같은 구문 형태로 레이블 문자열 표현이 가능하다.
LEVEL:COMPARTMENT1,…,COMPARTMENTn:GROUP1,…,GROUPn
SECRET:ALPHA,BETA:TMAX_DATA CONFIDENTIAL:GAMMA:TMAX PUBLIC SECRET::TMAX_SOFT
레벨은 레이블 정보의 민감도를 등급화한 지표이다. 큰 레벨 값은 정보의 민감도가 높다는 것을 의미한다.
다음과 같이 레벨을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 30 | 기밀 (SECRET) | S |
| 20 | 대외비 (CONFIDENTIAL) | C |
| 10 | 공개 (PUBLIC) | P |
구획은 레이블이 지정된 데이터 정보의 민감도를 더 세분화하는 영역이다. 특정 프로젝트와 관련 있는 모든 데이터는 동일한 구획으로 레이블을 지정할 수 있다.
다음과 같이 구획을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 80 | 알파 (ALPHA) | A |
| 50 | 베타 (BETA) | B |
| 20 | 감마 (GAMMA) | G |
그룹은 계층적 구조로 레이블이 지정된 데이터 정보의 민감도를 더 세분화하는 영역이다. 조직 구성을 기반으로 데이터에 레이블을 지정할 수 있으며, 특정 부서와 관련있는 모든 데이터는 레이블에 해당 부서의 그룹을 포함할 수 있다.
다음과 같이 그룹을 정의할 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 | 부모 그룹 |
|---|---|---|---|
| 1000 | TMAX | T | |
| 1100 | TMAX_DATA | T_DATA | T |
| 1200 | TMAX_SOFT | T_SOFT | T |
Label Security 관리자가 설정 한 권한에 따라 사용자의 접근을 제어한다.
관리자는 사용자에게 Label Security 정책에 대한 레벨 권한을 명시적으로 설정할 수 있다.
| 권한 부여 | 설명 |
|---|---|
| 사용자 최대 레벨 | 사용자가 읽기/쓰기 작업 중 접근 가능한 최대 레벨 |
| 사용자 최소 레벨 | 사용자가 쓰기 작업 중 접근 가능한 최소 레벨(사용자 최대 레벨은 사용자 최소 레벨보다 크거나 같아야 한다.) |
| 사용자 기본 레벨 | 기본적으로 설정되는 레벨 |
| 사용자 기본 행 레벨 | 데이터를 삽입할 때 기본적으로 사용되는 레벨 |
관리자는 사용자가 접근할 수 있는 구획을 명시적으로 지정할 수 있다. 쓰기 권한이 없는 구획이 포함된 행을 직접 삽입, 업데이트 또는 삭제할 수 없다.
다음은 사용자에게 지정한 구획에 대한 예이다.
| 짧은 이름 | 긴 이름 | 쓰기 | 기본 | 행 |
|---|---|---|---|---|
| A | 알파 (ALPHA) | YES | YES | YES |
| B | 베타(BETA) | YES | YES | NO |
| C | 감마(GAMMA) | YES | YES | NO |
본 절에서는 Label Security의 정책을 생성하는 방법과 그 과정을 설명한다.
Label Security 정책 컨테이너는 정책에 대한 메타 데이터를 저장한다. 이 컨테이너는 정책의 이름, 정책을 부여할 테이블에 추가되는 열의 이름, 정책에 대한 기본 옵션을 담고있다.
다음은 정책을 생성하는 구문에 대한 예이다.
BEGIN
SA_SYSDBA.CREATE_POLICY (
policy_name => 'tls_pol',
column_name => 'lb_col',
default_options => 'read_control');
END;
/
Default option은 정책을 특정 테이블에 적용할 때, 테이블 옵션을 부여하지 않을 경우 설정되는 기본 옵션이다.
데이터 레이블은 테이블 행 의 민감도를 나타낸다. 데이터 레이블의 구성요소는 레벨, 구획, 그룹이 있다.
| 구성요소 | 설명 |
|---|---|
| 레벨 | 등급에 따른 구분 (예: 기밀(SECRET), 대외비(CONFIDENTIAL), 공개(PUBLIC)) |
| 구획 | 영역에 따른 구분 (예: 알파(ALPHA), 베타(BETA), 감마(GAMMA)) |
| 그룹 | 계층에 따른 구분 (예: TMAX, TMAX_DATA, TMAX_SOFT) |
레벨은 등급에 따른 구분이다. 숫자가 클수록 높은 보안 등급을 의미한다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 30 | 기밀 (SECRET) | S |
| 20 | 대외비 (CONFIDENTIAL) | C |
| 10 | 공개 (PUBLIC) | P |
다음은 정책에 대한 레벨을 생성하는 예이다.
BEGIN
SA_COMPONENTS.CREATE_LEVEL(
policy_name => 'tls_pol',
level_num => 30,
short_name => 'S',
long_name => 'SECRET'
);
SA_COMPONENTS.CREATE_LEVEL(
policy_name => 'tls_pol',
level_num => 20,
short_name => 'C',
long_name => 'CONFIDENTIAL'
);
SA_COMPONENTS.CREATE_LEVEL(
policy_name => 'tls_pol',
level_num => 10,
short_name => 'P',
long_name => 'PUBLIC'
);
END;
/
구획은 영역에 따른 구분이다. 사용자는 자신이 속한 영역의 데이터를 읽을 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 |
|---|---|---|
| 80 | 알파 (ALPHA) | A |
| 50 | 베타 (BETA) | B |
| 20 | 감마 (GAMMA) | G |
다음은 정책에 대한 구획을 생성하는 예이다.
BEGIN
SA_COMPONENTS.CREATE_COMPARTMENT (
policy_name => 'tls_pol',
comp_num => '80',
short_name => 'A',
long_name => 'ALPHA’
);
SA_COMPONENTS.CREATE_COMPARTMENT (
policy_name => 'tls_pol',
comp_num => '50',
short_name => 'B',
long_name => 'BETA')
;
SA_COMPONENTS.CREATE_COMPARTMENT (
policy_name => 'tls_pol',
comp_num => '20',
short_name => 'G',
long_name => 'GAMMA')
;
END;
/
그룹은 계층에 따른 구분이다. 사용자는 자신이 속한 조직의 데이터를 읽을 수 있다.
| 숫자 형식 | 긴 형식 | 짧은 형식 | 부모 그룹 |
|---|---|---|---|
| 1000 | TMAX | T | |
| 1100 | TMAX_DATA | T_DATA | T |
| 1200 | TMAX_SOFT | T_SOFT | T |
다음은 정책에 대한 그룹을 생성하는 예이다.
BEGIN
SA_COMPONENTS.CREATE_GROUP (
policy_name => 'tls_pol',
group_num => 1000,
short_name => 'T’,
long_name => 'TMAX')
;
SA_COMPONENTS.CREATE_GROUP (
policy_name => 'tls_pol',
group_num => 1100,
short_name => 'T_DATA',
long_name => 'TMAX_DATA’,
parent_name => 'T')
;
SA_COMPONENTS.CREATE_GROUP (
policy_name => 'tls_pol',
group_num => 1200,
short_name => 'T_SOFT',
long_name => 'TMAX_SOFT',
parent_name => 'T')
;
END;
/
SA_LABEL_ADMIN.CREATE_LABEL을 통해 데이터 레이블을 생성할 수 있다.
다음은 데이터 레이블을 생성하는 예이다.
BEGIN
SA_LABEL_ADMIN.CREATE_LABEL(
policy_name => 'tls_pol',
label_tag => 300000,
label_value => 'S',
data_label => TRUE
);
SA_LABEL_ADMIN.CREATE_LABEL(
policy_name => 'tls_pol',
label_tag => 200000,
label_value => 'C',
data_label => TRUE
);
SA_LABEL_ADMIN.CREATE_LABEL(
policy_name => 'tls_pol',
label_tag => 100000,
label_value => 'P',
data_label => TRUE
);
END;
/
모든 정책에 대해 레이블 테그(label_tag)는 유일해야 하며, 같은 정책 내에서 같은 레이블 값(label_value)에 서로 다른 레이블 테그를 설정하는 것은 불가능하다. 하지만 다른 정책에 대해서는 레이블 값이 동일 하더라도 서로 다른 레이블 테그를 설정할 수 있다.
사용자 레이블은 SA_USER_ADMIN.SET_LEVELS, SA_USER_ADMIN.SET_COMPARTMENTS, SA_USER_ADMIN.SET_GROUPS 프러시저를 통해 부여할 수 있다.
레벨은 SA_USER_ADMIN.SET_LEVELS 프러시저를 통해 부여할 수 있다.
다음은 정책에 대한 사용자 레벨을 부여하는 예이다.
BEGIN
SA_USER_ADMIN.SET_LEVELS(
policy_name => 'tls_pol',
user_name => 'tibero',
max_level => 'S',
min_level => 'C',
def_level => 'C',
row_level => 'C')
;
END;
/
| 매개 변수 | 설명 |
|---|---|
| policy_name | 정책 이름 |
| user_name | 정책이 적용될 사용자 이름 |
| max_level | 사용자가 읽기/쓰기 작업 중 접근 가능한 최대 레벨 |
| min_level | 사용자가 쓰기 잡업 중 접근 가능한 최소 레벨(사용자 최대 레벨은 사용자 최소 레벨보다 크거나 같아야 한다.) |
| def_level | 기본적으로 설정되는 레벨 |
| row_level | 데이터를 삽입할 때 기본적으로 사용되는 레벨 |
레벨을 설정한 후 선택적으로 구획을 사용자에게 부여할 수 있다. SA_USER_ADMIN.SET_COMPARTMENTS 프러시저를 통해 부여할 수 있다.
다음은 정책에 대한 사용자 구획을 부여하는 예이다.
BEGIN
SA_USER_ADMIN.SET_COMPARTMENTS (
policy_name => 'tls_pol',
user_name => 'tibero',
read_comps => 'A, B, G',
write_comps => 'A, B',
def_comps => 'A, B',
row_comps => 'A, B')
;
END;
/
| 매개 변수 | 설명 |
|---|---|
| policy_name | 정책 이름 |
| user_name | 정책이 적용될 사용자 이름 |
| read_comps | 읽기 가능한 구획 |
| write_comps | 쓰기 가능한 구획 |
| def_comps | 기본적으로 설정되는 구획 |
| row_comps | 데이터를 삽입할 때 기본적으로 사용되는 구획 |
레벨을 설정한 후 선택적으로 그룹을 사용자에게 부여할 수 있다. SA_USER_ADMIN.SET_GROUPS 프러시저를 통해 부여할 수 있다.
다음은 정책에 대한 사용자 그룹을 부여하는 예이다.
BEGIN
SA_USER_ADMIN.SET_GROUPS (
policy_name => 'tls_pol',
user_name => 'tibero',
read_groups => 'T',
write_groups => 'T',
def_groups => 'T',
row_groups => 'T')
;
END;
/
| 매개 변수 | 설명 |
|---|---|
| policy_name | 정책 이름 |
| user_name | 정책이 적용될 사용자 이름 |
| read_groups | 읽기 가능한 그룹 |
| write_groups | 쓰기 가능한 그룹 |
| def_groups | 기본적으로 설정되는 그룹 |
| row_groups | 데이터를 삽입할 때 기본적으로 사용되는 그룹 |
테이블에 대한 정책 적용은 SA_POLICY_ADMIN.APPLY_TABLE_POLICY 프러시저를 통해 할 수 있다.
다음은 데이터베이스 테이블에 정책을 적용하는 예이다.
BEGIN
SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
policy_name => 'tls_pol',
schema_name => 'tibero',
table_name => 'test_table',
table_options =>‘read_control’)
;
END;
/
| 매개 변수 | 설명 |
|---|---|
| policy_name | 정책 이름 |
| schema_name | 스키마 이름 |
| table_name | 정책이 적용될 테이블 이름 |
| table_options | 정책 시행 옵션 |
| label_function | Label 함수의 문자열 |
| predicate | Read control과 함께 쓰이는 조건 |