내용 목차
본 장에서는 레이블을 통하여 사용자의 접근을 제어하는 기능인 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과 함께 쓰이는 조건 |