PostgreSQL 익명화 도구를 사용한 데이터 마스킹
Databases for PostgreSQL 익명화 도구는 Databases for PostgreSQL 데이터베이스에서 개인 식별 정보 및 민감한 비즈니스 정보를 마스킹하거나 대체하여 데이터를 익명화하도록 설계된 PostgreSQL 확장 프로그램입니다.
이 확장 프로그램은 다양한 사용 사례에 적합한 다음과 같은 마스킹 전략을 지원합니다:
- 정적 마스킹: 규칙에 따라 PII를 제거합니다.
- 동적 마스킹: 마스킹된 사용자에 대해서만 PII를 숨깁니다.
- 익명 덤프: 마스킹된 데이터를 SQL 파일로 내보내기만 하면 됩니다.
- 일반화: 특정 값을 더 광범위하고 덜 정확한 범주 또는 범위로 대체합니다.
정적 마스킹
스태틱 마스킹은 민감한 정보를 합성적으로 생성된 값으로 비가역적으로 대체하는 데이터 익명화 기술입니다, 포맷을 보존하는 값으로 대체하는 기술입니다. 이 프로세스를 통해 원본 데이터를 완전하고 영구적으로 제거하여 재식별 또는 재구성 가능성을 제거합니다. 자세한 내용은 스태틱 마스킹을 참조하세요.
정적 마스킹 활성화
-
익명화 확장 프로그램을 설치합니다.
CREATE EXTENSION IF NOT EXISTS anon; -
익명화 프로그램을 초기화합니다.
select public.run_anon_init(); -
마스킹 규칙을 정의합니다.
SECURITY LABEL FOR anon ON COLUMN <table_name>.<column_name> IS 'MASKED WITH FUNCTION anon.<masking_function>()'; -
적용된 마스킹 규칙을 확인합니다.
SELECT objoid::regclass, provider, label FROM pg_seclabel WHERE provider = 'anon' AND objoid = '<table_name>'::regclass; -
규칙을 영구적으로 적용합니다. 아래 명령은 지정된 테이블의 원본 데이터를 마스킹된 데이터로 영구적으로 대체합니다.
SELECT anon.anonymize_table('<table_name>');
-
스태틱 마스킹은 느린 프로세스입니다. 정적 마스킹의 원칙은 마스킹된 열이 하나 이상 포함된 모든 테이블의 모든 행을 업데이트하는 것입니다. 즉, PostgreSQL 은 디스크의 모든 데이터를 다시 작성합니다. 데이터베이스 크기, 하드웨어, 인스턴스 구성에 따라 익명화된 데이터를 내보낸 후 데이터베이스에 다시 로드하는 것이 더 빠를 수 있습니다.
-
표에 새로 삽입된 행에 마스킹을 적용하려면 다음 명령을 실행합니다.
SELECT anon.anonymize_table('<table_name>');이 명령은 테이블에 추가된 모든 새 데이터가 구성된 익명화 규칙에 따라 마스킹되도록 합니다.
동적 마스킹
동적 마스킹을 사용하면 데이터베이스 소유자가 특정 사용자의 민감한 데이터를 숨길 수 있습니다, 권한이 있는 사용자는 마스킹되지 않은 원본 값에 액세스하고 수정할 수 있도록 허용합니다. 자세한 내용은 동적 마스킹을 참조하세요.
동적 마스킹 활성화
-
익명화 확장 프로그램을 설치합니다.
CREATE EXTENSION IF NOT EXISTS anon; -
익명화 프로그램을 초기화합니다.
select public.run_anon_init(); -
동적 마스킹 엔진을 활성화합니다.
show anon.transparent_dynamic_masking; select public.enable_dynamic_masking ('<database_name>');anon.transparent_dynamic_masking 이 꺼짐으로 표시되면 세션을 다시 시작합니다.
-
마스크된 액세스를 위한 역할을 만듭니다.
CREATE ROLE <role_name> LOGIN; -
역할을 마스킹된 사용자로 표시합니다.
SECURITY LABEL FOR anon ON ROLE <role_name> IS 'MASKED'; -
마스킹 테이블에 대한 권한을 역할에 부여합니다.
grant select on <schema_name>.<table_name> to <role_name> ; -
마스킹 규칙을 선언합니다.
SECURITY LABEL FOR anon ON COLUMN <table_name>.<column_name> IS 'MASKED WITH FUNCTION anon.<masking_function>()'; -
마스킹 규칙을 확인합니다.
SELECT objoid::regclass, provider, label FROM pg_seclabel WHERE provider = 'anon' AND objoid = '<table_name>'::regclass; -
마스크된 역할을 사용하여 데이터베이스에 연결하고 테이블을 쿼리합니다. 정의된 규칙에 따라 마스킹된 데이터가 표시되어야 합니다.
select * from <table_name>;
참고:
- 익명화 기능은 쿼리하는 사용자에 따라 데이터를 마스킹합니다.
- 마스킹된 역할은 데이터를 삽입, 업데이트 또는 삭제할 수 없도록 해야 합니다.
- 여러 스키마에서 테이블을 마스킹할 수 있습니다.
- 마스킹 규칙으로 인해 데이터 무결성이 손상될 수 있습니다. 예를 들어, UNIQUE 제약 조건이 있는 열을 NULL 값으로 마스킹할 수 있습니다. 마스크 사용자에게 데이터 무결성이 필요한지 여부는 사용자가 결정할 수 있습니다.
- 가면 역할은 EXPLAIN을 사용할 수 없습니다.
익명 덤프
익명 덤프는 원래의 민감한 값이 아닌 익명화되거나 비식별화된 데이터가 포함된 데이터베이스를 내보내는 프로세스를 말합니다. 이는 일반적으로 개인 식별 정보 또는 민감한 속성을 노출하지 않고 데이터를 안전하게 공유, 마이그레이션 또는 분석하기 위해 수행됩니다 개인 식별 정보(PII) 또는 민감한 속성을 노출하지 않고 데이터를 안전하게 공유 및 마이그레이션하고 분석하기 위해 수행됩니다. 자세한 내용은 익명 덤프를 참조하세요.
익명 덤프 사용
-
익명화 확장 프로그램을 설치합니다.
CREATE EXTENSION IF NOT EXISTS anon; -
익명화 프로그램을 초기화합니다.
select public.run_anon_init(); -
사용자 지정 마스킹 함수를 위한 전용 스키마를 만듭니다.
CREATE SCHEMA IF NOT EXISTS <schema_name>; -
마스크된 데이터를 내보내기 위한 역할을 만듭니다.
CREATE ROLE <role_name> LOGIN PASSWORD '<enter_password>'; -
역할에 대해 마스킹을 사용 설정합니다.
select public.enable_masking_for_dump('<role_name>','<schema_name>'); -
다음 예시와 같이 사용자 지정 마스킹 함수를 정의합니다.
CREATE OR REPLACE FUNCTION <schema_name>.remove_content(j JSONB) RETURNS JSONB AS $func$ SELECT j - ARRAY['content'] $func$ LANGUAGE SQL; -
마스킹 규칙을 만듭니다.
SECURITY LABEL FOR anon ON COLUMN <table_name>.<column_name> IS 'MASKED WITH FUNCTION <schema_name>.<custom_masking_function>()'; -
역할에 마스킹된 역할로 레이블을 지정합니다.
SECURITY LABEL FOR anon ON ROLE <schema_name> IS 'MASKED'; -
마스크된 스키마에 대한 액세스 권한을 부여합니다.
GRANT USAGE ON SCHEMA <schema_name> TO <masked_role>; -
마스크된 테이블에 Select 액세스 권한을 부여합니다.
grant select ON <schema_name>.<table_name> to <masked_role>;
- Pg_dump를 마스킹된 역할로 사용하여 마스킹된 데이터를 내보냅니다.
자세한 내용은 pg 덤프 명령을 참조하세요.
마스크된 데이터를 내보내려면 마스크된 역할을 사용하여 pg_dump를 실행합니다. 관리자 사용자가 pg_dump를 실행하면 마스킹 없이 데이터가 내보내집니다.
일반화
일반화의 주요 아이디어는 원본 데이터를 흐리게 처리하는 것입니다. 자세한 내용은 일반화를 참조하세요.
일반화 사용
-
익명화 확장 프로그램을 설치합니다.
CREATE EXTENSION IF NOT EXISTS anon; -
익명화 프로그램을 초기화합니다.
select public.run_anon_init(); -
일반화 함수를 사용하여 뷰를 만듭니다.
CREATE MATERIALIZED VIEW <view_name> AS SELECT anon.generalize_daterange(<date_column_1>, 'month') AS <generalized_date_1>, anon.generalize_daterange(<date_column_2>, 'month') AS <generalized_date_2> FROM <source_table>; -
간접 식별자를 선언합니다.
SECURITY LABEL FOR k_anonymity ON COLUMN <view_name>.<generalized_date_1> IS 'INDIRECT IDENTIFIER'; SECURITY LABEL FOR k_anonymity ON COLUMN <view_name>.<generalized_date_2> IS 'INDIRECT IDENTIFIER'; -
K-익명성에 대한 액세스 권한을 부여합니다.
select public.k_anonymity(); -
뷰 또는 테이블에서 k-익명성 검사를 실행합니다.
SELECT anon.k_anonymity('<view_name/table_name>');
역할 마스크 해제
다음 명령을 사용하여 역할의 마스크를 해제합니다.
SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;
마스킹 규칙 비활성화
다음 명령을 사용하여 마스킹 역할을 비활성화할 수 있습니다.
SECURITY LABEL FOR anon
ON COLUMN <table_name>.<column_name>
IS NULL;