Anonymization & Data Masking for PostgreSQL

이세현·2024년 8월 16일
0

PostgreSQL for DBA

목록 보기
4/19

Anonymization & Data Masking for PostgreSQL

데이터 보안 및 개인 정보 보호는 현대 데이터베이스 관리의 중요한 측면입니다. PostgreSQL에서 개인 식별 정보(PII)나 상업적으로 민감한 데이터를 안전하게 처리하기 위해 postgresql_anonymizer 확장을 활용할 수 있습니다. 이 블로그 포스트에서는 PostgreSQL의 데이터 익명화와 마스킹 기법을 소개하고, 이를 활용하는 방법과 장점, 결론에 대해 다루겠습니다.


[이미지 출처: https://www.bytebase.com/blog/postgres-data-masking/]

PostgreSQL Anonymizer 개요

postgresql_anonymizer는 PostgreSQL 데이터베이스에서 개인 식별 정보(PII)와 상업적으로 민감한 데이터를 마스킹하거나 익명화하는 확장입니다. 이 확장은 데이터의 안전성을 보장하면서도 데이터가 여전히 유용하게 사용될 수 있도록 다양한 익명화 기술을 제공합니다.

익명화 기술

  • 랜덤화 (Randomization): 데이터의 특정 값을 무작위로 변경하여 원본 데이터를 보호합니다.
  • 가짜 데이터 (Faking): 실제 데이터를 무작위로 생성한 가짜 데이터로 교체합니다.
  • 부분 스크램블링 (Partial Scrambling): 데이터의 일부를 변형하여 원본의 일부는 남기면서 민감한 정보를 숨깁니다.
  • 셔플링 (Shuffling): 데이터의 순서를 변경하여 식별 정보를 보호합니다.
  • 노이즈 추가 (Adding Noise): 데이터에 무작위 노이즈를 추가하여 실제 값의 식별을 어렵게 합니다.
  • 사용자 정의 함수 (Custom Functions): 사용자가 정의한 특정 함수로 데이터를 익명화합니다.

접근 방식

  • 정적 마스킹 (Static Masking): 데이터가 저장되기 전에 PII를 제거합니다.
  • 동적 마스킹 (Dynamic Masking): 특정 사용자에 대해 데이터가 조회될 때만 PII를 숨깁니다.
  • 익명화 덤프 (Anonymous Dumps): 마스킹된 데이터를 SQL 파일로 내보냅니다.
  • 일반화 (Generalization): 데이터 분석 및 통계에 적합하도록 데이터를 일반화합니다.

PostgreSQL Anonymizer 설치 및 설정

PostgreSQL 설치 및 초기화

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql16-server
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16

PostgreSQL Anonymizer 설치

sudo yum install postgresql_anonymizer_16 -y
#Anonymizer 확장 설정
#PostgreSQL 데이터베이스에 접속하여 anon 확장을 설정합니다

ALTER DATABASE postgres SET session_preload_libraries = 'anon';
CREATE EXTENSION anon;
SELECT anon.init();

데이터베이스와 테이블 생성

CREATE TABLE people (
    id SERIAL PRIMARY KEY,
    firstname VARCHAR(50),
    lastname VARCHAR(50),
    phone VARCHAR(15)
);

INSERT INTO people (firstname, lastname, phone) VALUES
('Sarah', 'Conor', '0609110911'),
('John', 'Doe', '0708123456'),
('Jane', 'Smith', '0809123456'),
('Michael', 'Johnson', '0908234567'),
('Emily', 'Davis', '0612345678'),
('Daniel', 'Wilson', '0723456789'),
('Laura', 'Martinez', '0834567890'),
('David', 'Brown', '0945678901'),
('Sophia', 'Taylor', '0656789012'),
('Matthew', 'Anderson', '0767890123');

익명화 규칙 설정

SELECT anon.start_dynamic_masking();

CREATE ROLE skynet LOGIN;
ALTER USER postgres WITH PASSWORD 'postgres';
ALTER USER skynet WITH PASSWORD 'skynet';

SECURITY LABEL FOR anon ON ROLE skynet IS 'MASKED';
SECURITY LABEL FOR anon ON COLUMN people.lastname IS 'MASKED WITH FUNCTION anon.fake_last_name()';
SECURITY LABEL FOR anon ON COLUMN people.phone IS 'MASKED WITH FUNCTION anon.partial(phone,2,$$******$$,2)';

peer 인증 방식

peer 인증 방식은 PostgreSQL 서버가 운영 체제 사용자와 데이터베이스 사용자 간의 매칭을 확인하는 방법입니다. 즉, 데이터베이스 사용자 이름이 운영 체제 사용자 이름과 일치해야 하며, 서버가 이 이름을 통해 인증을 시도합니다.

운영 체제 사용자 확인

PostgreSQL의 peer 인증 방식은 데이터베이스 사용자와 운영 체제 사용자가 일치해야 합니다. 현재 skynet이라는 운영 체제 사용자가 PostgreSQL 데이터베이스 사용자와 일치하지 않기 때문에 인증에 실패하고 있습니다.(예상되는 에러)

운영 체제에서 현재 사용자와 데이터베이스 사용자를 확인하고, 일치하도록 수정하거나 skynet 사용자를 운영 체제에 추가해야 합니다.

pg_hba.conf 파일 수정:

pg_hba.conf 파일은 PostgreSQL의 인증 방식을 정의하는 설정 파일입니다. 이 파일을 수정하여 인증 방식을 변경할 수 있습니다.

pg_hba.conf 파일의 위치는 PostgreSQL 데이터 디렉토리 안에 있으며, 파일을 열어 peer 인증 방식을 md5나 password로 변경할 수 있습니다.

예를 들어, pg_hba.conf 파일에서 peer를 md5로 변경하려면 다음과 같이 수정합니다:

# "local" is for Unix domain socket connections only
local   all             all                                     md5
그런 다음 PostgreSQL 서버를 재시작해야 변경 사항이 적용
sudo systemctl restart postgresq

장점 및 사용 이유

  • 개인정보 보호: postgresql_anonymizer는 개인정보 보호 규정(GDPR, CCPA 등)에 따라 민감한 정보를 안전하게 보호할 수 있도록 도와줍니다.

  • 개발 및 테스트: 개발 및 테스트 환경에서 실제 데이터를 사용하면서도 민감한 정보를 숨길 수 있어 데이터의 유용성을 유지할 수 있습니다.

  • 데이터 분석: 익명화된 데이터로 통계 분석 및 데이터 분석을 수행할 수 있어 비즈니스 인사이트를 얻으면서도 개인정보를 보호할 수 있습니다.

  • 데이터 공유: 외부 파트너나 클라이언트와 데이터를 공유할 때, 데이터의 민감성을 보호하면서도 분석에 필요한 정보를 제공할 수 있습니다.

결과

postgres=# \c - skynet
Password for user skynet:
You are now connected to database "postgres" as user "skynet".
postgres=>  SELECT * FROM people;
 id | firstname | lastname |   phone
----+-----------+----------+------------
  1 | Sarah     | Cardenas | 06******11
  2 | John      | Bowen    | 07******56
  3 | Jane      | Henson   | 08******56
  4 | Michael   | Cummings | 09******67
  5 | Emily     | Haley    | 06******78
  6 | Daniel    | Oconnor  | 07******89
  7 | Laura     | Clayton  | 08******90
  8 | David     | Kelly    | 09******01
  9 | Sophia    | Whitaker | 06******12
 10 | Matthew   | Hale     | 07******23
(10 rows)

postgres=> \c - postgres
Password for user postgres:
You are now connected to database "postgres" as user "postgres".
postgres=#  SELECT * FROM people;
 id | firstname | lastname |   phone
----+-----------+----------+------------
  1 | Sarah     | Conor    | 0609110911
  2 | John      | Doe      | 0708123456
  3 | Jane      | Smith    | 0809123456
  4 | Michael   | Johnson  | 0908234567
  5 | Emily     | Davis    | 0612345678
  6 | Daniel    | Wilson   | 0723456789
  7 | Laura     | Martinez | 0834567890
  8 | David     | Brown    | 0945678901
  9 | Sophia    | Taylor   | 0656789012
 10 | Matthew   | Anderson | 0767890123
(10 rows)

결론

postgresql_anonymizer는 PostgreSQL 데이터베이스에서 개인정보와 민감한 정보를 안전하게 처리하기 위한 강력한 도구입니다. 다양한 익명화 기술과 접근 방식을 제공하여 데이터의 보안성을 높이는 동시에 데이터의 유용성을 유지할 수 있습니다.
이를 통해 데이터 보호 규정을 준수하면서도 비즈니스 분석 및 개발에 필요한 데이터를 활용할 수 있습니다. PostgreSQL의 강력한 기능과 postgresql_anonymizer 확장을 결합하여 데이터 보안과 개인정보 보호를 효과적으로 관리해 보세요.

profile
pglover_12

0개의 댓글