

# 데이터 마스킹 정책 관리 절차
<a name="AuroraPostgreSQL.Security.DynamicMasking.Procedures"></a>

`pg_columnmask` 확장에서 제공하는 절차를 사용하여 마스킹 정책을 관리할 수 있습니다. 마스킹 정책을 생성, 수정 또는 삭제하려면 다음 권한 중 하나가 있어야 합니다.
+ `pg_columnmask` 정책을 생성하려는 테이블의 소유자입니다.
+ `rds_superuser`의 구성원입니다.
+ `pgcolumnmask.policy_admin_rolname` 파라미터로 설정된 `pg_columnmask` 정책 관리자 역할의 구성원입니다.

다음 명령은 후속 섹션에서 사용되는 테이블을 생성합니다.

```
CREATE TABLE public.customers (
    id SERIAL PRIMARY KEY,
    name TEXT,
    phone TEXT,
    address TEXT,
    email TEXT
);
```

## CREATE\_MASKING\_POLICY
<a name="AuroraPostgreSQL.Security.DynamicMasking.Procedures.CreateMaskingPolicy"></a>

다음 절차에서는 사용자 테이블에 대한 새 마스킹 정책을 생성합니다.

**구문**:

```
create_masking_policy(
    policy_name,
    table_name,
    masking_expressions,
    roles,
    weight,
    predicate_allow_list)
```

**참고**  
`predicate_allow_list` 인수를 사용하려면 `pg_columnmask` 확장 버전 1.1 이상(Aurora PostgreSQL 16.11 이상 및 17.7 이상에서 지원)이 필요합니다. 확장을 업데이트하려면 `ALTER EXTENSION pg_columnmask UPDATE;`를 실행하세요. 자세한 내용은 PostgreSQL 설명서에서 [ALTER EXTENSION](https://www.postgresql.org/docs/current/sql-alterextension.html)을 참조하세요.

**인수**


| 파라미터 | 데이터 형식 | 설명 | 
| --- | --- | --- | 
| policy\_name | NAME | 마스킹 정책의 이름입니다. 테이블마다 고유해야 합니다. | 
| table\_name | REGCLASS | 마스킹 정책을 적용할 테이블의 정규화된/비정규화된 이름 또는 oid입니다. | 
| masking\_expressions | JSONB | 열 이름과 마스킹 함수 페어가 포함된 JSON 객체입니다. 각 키는 열 이름이며 해당 값은 해당 열에 적용할 마스킹 표현식입니다. | 
| roles | NAME[] | 이 마스킹 정책이 적용되는 역할입니다. 기본값은 PUBLIC입니다. | 
| weight | INT | 마스킹 정책의 가중치입니다. 지정된 사용자의 쿼리에 여러 정책을 적용할 수 있는 경우 가중치가 가장 높은(높은 정수 수) 정책이 마스킹된 각 열에 적용됩니다.<br />기본값은 0. 테이블의 두 마스킹 정책이 동일한 가중치를 가질 수 없습니다. | 
| predicate\_allow\_list | NAME[] | 이 정책에 따라 마스킹된 경우에도 조건자, 조인 조건 및 기타 필터 표현식에서 참조할 수 있는 열 이름의 배열입니다. 이 설정이 없으면 마스킹된 열에 대한 조건자를 사용할 경우 오류가 발생합니다. 열이 허용 목록에 있으면 조건자는 마스킹된 값을 대상으로 실행됩니다. | 

**반환 유형**

없음

**Example `test_user` 역할의 이메일 열을 마스킹하는 마스킹 정책 생성:**  

```
CALL pgcolumnmask.create_masking_policy(
    'customer_mask',
    'public.customers',
    JSON_OBJECT('{
        "email", "pgcolumnmask.mask_email(email)"
    }')::JSONB,
    ARRAY['test_user'],
    100
);
```

## ALTER\_MASKING\_POLICY
<a name="AuroraPostgreSQL.Security.DynamicMasking.Procedures.AlterMaskingPolicy"></a>

이 절차는 기존 마스킹 정책을 수정합니다. `ALTER_MASKING_POLICY`는 정책 마스킹 표현식, 정책이 적용되는 역할 세트, 마스킹 정책의 조건자 허용 목록을 수정할 수 있습니다. 이러한 파라미터 중 하나를 생략하면 정책의 해당 부분이 변경되지 않습니다.

**구문**:

```
alter_masking_policy(
    policy_name,
    table_name,
    masking_expressions,
    roles,
    weight,
    predicate_allow_list)
```

**참고**  
`predicate_allow_list` 인수를 사용하려면 `pg_columnmask` 확장 버전 1.1 이상(Aurora PostgreSQL 16.11 이상 및 17.7 이상에서 지원)이 필요합니다. 확장을 업데이트하려면 `ALTER EXTENSION pg_columnmask UPDATE;`를 실행하세요. 자세한 내용은 PostgreSQL 설명서에서 [ALTER EXTENSION](https://www.postgresql.org/docs/current/sql-alterextension.html)을 참조하세요.

**인수**


| 파라미터 | 데이터 형식 | 설명 | 
| --- | --- | --- | 
| policy\_name | NAME | 마스킹 정책의 기존 이름입니다. | 
| table\_name | REGCLASS | 마스킹 정책이 포함된 테이블의 정규화된/비정규화된 이름입니다. | 
| masking\_expressions | JSONB | 열 이름과 마스킹 함수 페어 또는 NULL이 포함된 새 JSON 객체입니다. | 
| roles | NAME[] | 이 마스킹 정책이 적용되는 새 역할 목록 또는 그렇지 않으면 NULL입니다. | 
| weight | INT | 마스킹 정책의 새 가중치 또는 그렇지 않으면 NULL입니다. | 
| predicate\_allow\_list | NAME[] | 조건자 및 필터 표현식에 허용되는 열 이름의 새 배열입니다. 변경하지 않으려면 NULL을 지정합니다. | 

**반환 타입**

없음

**Example 다른 정책 속성을 변경하지 않고 기존 마스킹 정책에 분석가 역할을 추가합니다.**  

```
CALL pgcolumnmask.alter_masking_policy(
    'customer_mask',
    'public.customers',
    NULL,
    ARRAY['test_user', 'analyst'],
    NULL 
);

-- Alter the weight of the policy without altering other details
CALL pgcolumnmask.alter_masking_policy(
    'customer_mask',
    'customers',
    NULL,
    NULL,
    4
);
```

## DROP\_MASKING\_POLICY
<a name="AuroraPostgreSQL.Security.DynamicMasking.Procedures.DropMaskingPolicy"></a>

이 절차에서는 기존 마스킹 정책을 제거합니다.

**구문**:

```
drop_masking_policy(
        policy_name,
        table_name)
```

**인수**


| 파라미터 | 데이터 형식 | 설명 | 
| --- | --- | --- | 
| policy\_name | NAME | 마스킹 정책의 이름입니다. | 
| table\_name | REGCLASS | 마스킹 정책이 포함된 테이블의 정규화된/비정규화된 이름입니다. | 

**반환 타입**

없음

**Example 마스킹 정책 customer\_mask 삭제**  

```
-- Drop a masking policy
CALL pgcolumnmask.drop_masking_policy(
    'customer_mask',
    'public.customers'
);
```

## RENAME\_MASKING\_POLICY
<a name="AuroraPostgreSQL.Security.DynamicMasking.Procedures.RenameMaskingPolicy"></a>

이 절차에서는 기존 마스킹 정책의 이름을 변경합니다.

**구문**:

```
rename_masking_policy(
    policy_name,
    table_name,
    new_policy_name)
```

**인수**


| 파라미터 | 데이터 형식 | 설명 | 
| --- | --- | --- | 
| policy\_name | NAME | 마스킹 정책의 현재 이름입니다. | 
| table\_name | REGCLASS | 마스킹 정책이 포함된 테이블의 정규화된/비정규화된 이름 또는 OID입니다. | 
| new\_policy\_name | NAME | 마스킹 정책의 새 이름입니다. 테이블마다 고유해야 합니다. | 

## 관리 보기
<a name="AuroraPostgreSQL.Security.DynamicMasking.AdminViews"></a>

`pgcolumnmask.ddm_policies` 뷰는 사용자가 소유하거나 관리 권한을 가진 테이블에 적용된 마스킹 정책을 보여줍니다.


| 열 이름 | 데이터 유형 | 설명 | 
| --- | --- | --- | 
| schemaname | NAME | 정책이 적용되는 테이블의 스키마입니다. | 
| tablename | NAME | 정책이 적용되는 테이블의 이름입니다. | 
| policyname | NAME | 마스킹 정책의 이름입니다. | 
| 역할 | TEXT[] | 정책이 적용되는 역할입니다. | 
| masked\_columns | TEXT[] | 정책에 따라 마스킹된 열입니다. | 
| masking\_functions | TEXT[] | 마스킹된 열에 적용되는 마스킹 함수입니다. | 
| weight | INT | 정책의 가중치입니다. | 
| predicate\_allow\_list | NAME[] | 정책에 따라 마스킹된 경우에도 조건자 및 필터 표현식에서 허용되는 열 이름의 배열입니다. | 

## 마스킹 정책 내 따옴표로 묶인 식별자
<a name="AuroraPostgreSQL.Security.DynamicMasking.EscapeIdentifiers"></a>

대소문자가 섞여 있거나 예약어인 식별자는 정책 이름, 스키마, 테이블, 열 및 역할 인수에서 큰따옴표로 묶어 이스케이프해야 합니다. JSON 문자열 내부에서는 큰따옴표에 백슬래시를 붙여 이스케이프하세요. 역할 이름은 대소문자를 포함하여 `pg_roles`와 정확히 일치해야 합니다.

**Example 예시 - 따옴표로 묶인 식별자와 묶이지 않은 식별자**  
소문자 식별자(따옴표로 묶을 필요 없음):  

```
CALL pgcolumnmask.create_masking_policy(
    'ssn_policy',
    'public.employees',
    JSON_BUILD_OBJECT('ssn', 'public.mask_ssn(ssn)')::JSONB,
    ARRAY['analyst'],
    10
);
```
대소문자가 섞인 식별자를 사용하는 동일한 정책(따옴표로 묶어야 함):  

```
CALL pgcolumnmask.create_masking_policy(
    '"SSN_Policy"',
    '"Public"."Employees"',
    JSON_BUILD_OBJECT('"SSN"', 'public."Mask_SSN"("SSN")')::JSONB,
    ARRAY['"Analyst"'],
    10
);
```
`pgcolumnmask.ddm_policies`에 저장된 두 정책의 조회 결과:  

```
SELECT schemaname, tablename, policyname, roles, weight
    FROM pgcolumnmask.ddm_policies
    ORDER BY tablename, weight;
 schemaname | tablename | policyname | roles     | weight
------------+-----------+------------+-----------+--------
 Public     | Employees | SSN_Policy | {Analyst} |     10
 public     | employees | ssn_policy | {analyst} |     10
```

**참고**  
Aurora PostgreSQL 16.11 및 17.7 이전 버전에서는 확장이 역할 이름을 자동으로 따옴표로 묶었습니다. 반면 Aurora PostgreSQL 16.11 및 17.7 이상에서는 명시적으로 큰따옴표로 묶은 경우에만 역할 이름이 따옴표로 처리됩니다.