데이터 레이크에는 의도하지 않은 PII(개인식별정보)가 섞여 들어온다. 자유 입력 필드에 적힌 주민번호, 로그에 찍힌 카드번호 같은 것들이다. 이를 찾아내는 서비스가 Amazon Macie 다. Macie 가 만드는 발견(finding)은 두 범주다.
범주 무엇을 보고하나 언제 생기나 유형 예 정책 발견(policy finding) 버킷의 보안·접근 설정이 약해진 변화 Macie 를 켠 이후 의 변경을 상시 감시 퍼블릭 액세스 차단 해제, 버킷 공개, 조직 밖 계정과 공유·복제 민감 데이터 발견(sensitive data finding) 객체 안에서 찾은 민감 데이터 탐색 작업을 돌리거나 자동 탐색이 분석할 때 Financial, Personal, Credentials, CustomIdentifier, Multiple
정책 발견은 Macie 를 켜기 전부터 열려 있던 설정에는 생기지 않는다. "이미 공개된 버킷을 찾아라"는 버킷 인벤토리를 직접 보거나 다른 도구(Config 등)의 영역이다.
발견은 90일간 보관된다. 더 오래 남기려면 EventBridge·Security Hub 로 내보내거나, 탐색 결과를 S3 로 저장하도록 설정한다.
Macie 의 분석 대상은 S3 다. Redshift 테이블이나 RDS 안의 PII 는 Macie 가 직접 보지 않는다.
항목 자동 민감 데이터 탐색 민감 데이터 탐색 작업(job) 범위 계정·조직의 범용 버킷 전체(제외 가능) 지정한 버킷·접두사 방식 버킷 인벤토리를 계속 평가하고 표본 객체를 골라 분석 범위 안의 객체를 일회성 또는 주기적으로 분석 결과 버킷별 민감도 점수·통계, 민감 데이터 발견 민감 데이터 발견, 객체별 분석 기록 쓰임 "수천 개 버킷 중 어디가 위험한가"의 넓은 지도 "이 버킷을 빠짐없이 확인"의 정밀 조사 설정 주체 조직의 Macie 관리자 계정 또는 단독 계정 계정별
자동 탐색은 버킷마다 대표 객체를 골라 본다. 그렇게 고른 객체는 실제로 가져와 내용을 검사한다. 전체를 훑지 않는다는 것이지 내용을 안 본다는 뜻이 아니다.
둘은 순서대로 쓴다. 자동 탐색으로 위험한 버킷을 좁히고, 그 버킷에 탐색 작업을 돌려 전수 확인한다.
관리형 데이터 식별자 : 신용카드 번호, 각국의 신분증·여권 번호, AWS 비밀 키 같은 자격 증명 등 AWS 가 만들어 둔 탐지 기준.
맞춤 데이터 식별자 : 조직 고유의 패턴(사번, 고객 계정 번호)을 정규식과 보조 조건으로 정의.
허용 목록(allow list) : 탐지에서 빼고 싶은 값. 공개된 대표 전화번호 같은 것을 넣어 오탐을 줄인다.
{
"name" : "internal-employee-id" ,
"regex" : "EMP-[0-9]{6}" ,
"keywords" : [ "employee" , "사번" ],
"ignoreWords" : [ "EMP-000000" ],
"maximumMatchDistance" : 50
}
구성 요소 역할 한도 정규식 찾을 텍스트 패턴 최대 512자. 역참조·전후방 탐색 같은 일부 구문은 지원하지 않는다 키워드 패턴 근처에 있어야 하는 단어 최대 50개, 각 3~90자, 대소문자 구분 없음 최대 일치 거리 키워드와 패턴 사이에 허용되는 글자 수 1~300, 기본 50 무시 단어 패턴에 맞아도 결과에서 뺄 값 최대 10개, 각 4~90자, 대소문자 구분
키워드는 오탐을 줄이는 장치다. 여섯 자리 숫자는 어디에나 있지만, "사번"이라는 단어 뒤 50자 안의 여섯 자리 숫자는 사번일 가능성이 높다. CSV 처럼 열이 있는 데이터에서는 열 이름 에 키워드가 있어도 인정된다.
맞춤 데이터 식별자는 만든 뒤 수정할 수 없다. 과거 발견의 기준이 바뀌지 않도록 하기 위해서다. 고치려면 새로 만든다. 그래서 만들기 전에 샘플 데이터로 시험한다.
객체의 암호화 Macie 가 분석할 수 있는가 SSE-S3 가능 SSE-KMS·DSSE-KMS(AWS 관리형 키) 가능 SSE-KMS·DSSE-KMS(고객 관리형 키) 키 정책이 Macie 의 서비스 연결 역할에 kms:Decrypt 를 허용해야 가능 SSE-C 불가. 메타데이터만 보고 클라이언트 측 암호화 불가. 메타데이터만 보고
"Macie 를 돌렸는데 발견이 없다"가 곧 "민감 데이터가 없다"는 아니다. 고객 관리형 키의 키 정책에 Macie 를 넣지 않았다면 내용을 열어 보지 못한 것이다. 키가 다른 계정 소유라면 키 정책 허용에 더해 grant 를 만들어야 한다.
💡 관련 이론 : Macie 는 탐지 도구다. 결과는 "어디에 무엇이 있는지"까지이고, 마스킹·격리·삭제는 하지 않는다. 시험 보기에서 "Macie 로 마스킹한다", "Macie 로 삭제한다"는 오답이다. 탐지 뒤의 조치는 EventBridge 로 이어 붙인 다른 서비스가 한다.
[Macie 발견] → [EventBridge 규칙] → [Lambda]
→ 버킷 정책으로 접근 제한 / 객체 태깅 / SNS 알림 / Security Hub 기록
{
"source" : [ "aws.macie" ],
"detail-type" : [ "Macie Finding" ],
"detail" : { "type" : [{ "prefix" : "SensitiveData:S3Object/" }] }
}
자동 대응으로 객체를 삭제하지 않는다. 증거가 사라지고, 오탐이었을 때 되돌릴 수 없다. 접근을 좁히고 태그를 달아 사람이 판단하게 한다.
발견을 Security Hub 로 모으면 다른 보안 서비스의 발견과 한 화면에서 우선순위를 매길 수 있다.
기법 결과 되돌릴 수 있나 조인·집계 맞는 상황 전체 마스킹(redaction) 고정 문자열로 대체 불가 불가 값이 전혀 필요 없는 조회 부분 마스킹 일부만 노출(****-****-****-1234) 불가 제한적 상담·확인용 화면 해싱(결정적) 같은 입력 → 같은 해시 불가 동등 조인 가능 원본 없이 식별자로만 연결 토큰화 무의미한 토큰으로 치환, 매핑은 볼트에 보관 가능(권한 있는 시스템만) 가능 나중에 원본이 필요한 업무(결제) 암호화 암호문 가능(키 보유자) 일반적으로 불가 저장·전송 보호 컬럼 제외 값 자체를 주지 않음 해당 없음 불가 볼 이유가 없는 사용자
지문에 "조인은 유지" + "원본 복원 가능"이 함께 나오면 토큰화다. "복원할 필요 없음"이면 마스킹이나 해싱이다.
값의 가짓수가 적은 컬럼(성별, 우편번호)을 해싱하면 가능한 값을 전부 해싱해 맞춰 보는 식으로 역추적된다. 해싱은 만능 익명화가 아니다.
💡 관련 이론 : 토큰화는 조인·분석을 유지하면서 원본을 숨길 수 있어 PCI-DSS 같은 결제 규정에서 선호된다. 원본과 토큰의 매핑이 담긴 볼트가 새로운 보호 대상이 된다는 점이 비용이다. 볼트에 접근할 수 있는 시스템을 최소로 줄이는 것이 설계의 핵심이다.
위치 수단 특징 ETL 단계(쓰기 전) Glue 의 민감 데이터 탐지(Detect PII) 변환, Spark UDF 저장되는 값 자체가 바뀐다. 한 번 가리면 모든 소비자에게 적용 카탈로그 권한(읽을 때) Lake Formation 데이터 필터 민감 컬럼·행을 반환하지 않는다 웨어하우스 쿼리(읽을 때) Redshift 동적 데이터 마스킹 저장값은 그대로, 역할에 따라 가린 값을 보여 준다
Glue Detect PII 변환 은 두 가지 방식으로 스캔한다. 모든 셀을 검사하는 방식과, 행을 표본 추출해 "PII 가 들어 있는 컬럼"만 찾아내는 방식이다. 후자는 비용이 적게 든다. 찾은 값에는 고정 문자열로 대체, 부분 대체, SHA-256 해시 적용 같은 조치를 고른다.
Macie 와 역할이 다르다. Macie 는 이미 S3 에 쌓인 객체를 조사하고, Glue 변환은 파이프라인을 흐르는 데이터를 그 자리에서 처리한다.
-- Redshift 동적 데이터 마스킹
CREATE MASKING POLICY mask_card_full
WITH (card_number VARCHAR ( 20 ))
USING ( '****-****-****-****' :: TEXT );
CREATE MASKING POLICY mask_card_last4
WITH (card_number VARCHAR ( 20 ))
USING ( '****-****-****-' || RIGHT (card_number, 4 ));
-- 전체 사용자는 완전 마스킹, 분석가 역할은 뒤 4자리(우선순위가 높은 쪽이 적용)
ATTACH MASKING POLICY mask_card_full
ON payments(card_number) TO PUBLIC;
ATTACH MASKING POLICY mask_card_last4
ON payments(card_number) TO ROLE analyst_role PRIORITY 10 ;
DDM 은 데이터를 변형해 저장하지 않고 쿼리 시점에 표현만 바꾼다. 개인정보 요건이 바뀌어도 원본과 SQL 을 손대지 않고 정책만 고친다.
정책을 만들고 붙이는 것은 슈퍼유저나 sys:secadmin 역할을 가진 주체만 할 수 있다.
한 컬럼에 여러 정책이 걸리면 우선순위(PRIORITY)가 높은 정책 이 적용된다. 우선순위를 생략하면 0 이다. PUBLIC 에 건 정책보다 특정 역할의 정책이 적용되게 하려면 더 높은 우선순위를 준다.
마스킹 표현식에는 SQL 뿐 아니라 사용자 정의 함수도 쓸 수 있다. 해시로 가리면 원본을 보지 않고도 조인할 수 있다.
마스킹이 "가린 값을 보여 준다"면 데이터 필터는 "값을 반환하지 않는다". 둘을 겹치면 다층 방어가 된다.
일반 Parquet 테이블에서 한 사람의 행을 지우려면 그 행이 든 파일을 통째로 다시 써야 한다. Iceberg·Hudi 같은 오픈 테이블 포맷은 행 수준 DELETE 를 지원해 이 작업을 테이블 연산으로 만든다.
그러나 Iceberg 의 DELETE 는 "이 행은 삭제됨"이라는 표시(삭제 파일)를 추가하는 것이다. 원래 데이터 파일과, 삭제 이전 시점을 가리키는 스냅샷 은 남아 있고 시간 여행 쿼리로 다시 읽을 수 있다.
-- 1) 논리 삭제
DELETE FROM lake_clean . payments WHERE customer_id = 'GDPR-REQ-2026-042' ;
-- 2) 삭제 표시를 데이터 파일에 합쳐 다시 쓰기
OPTIMIZE lake_clean . payments REWRITE DATA USING BIN_PACK;
-- 3) 오래된 스냅샷 만료 + 어디에도 속하지 않는 파일 제거
VACUUM lake_clean . payments ;
남는 곳 조치 삭제 이전 스냅샷과 옛 데이터 파일 스냅샷 보존 기간을 줄이고 VACUUM S3 버전 관리의 이전 버전 이전 버전 만료 수명 주기 규칙 raw 존의 원본, 격리 버킷, 백업 같은 요청을 각 저장소에 따로 적용 다운스트림 사본(Redshift, 추출 파일) 계보로 사본 위치를 추적(내일)
"버전 관리를 켠다"는 삭제 요건에 역행한다. 사본을 더 남긴다.
요구 대표 규정 AWS 수단 민감 데이터 위치 파악 공통 Macie 접근 최소화 공통 IAM, Lake Formation 저장·전송 보호 PCI-DSS, HIPAA KMS, TLS 강제 카드 데이터 비노출 PCI-DSS 토큰화, 마스킹 삭제 요청(잊힐 권리) GDPR Iceberg·Hudi 행 수준 DELETE + 스냅샷 정리 접근 기록 공통 CloudTrail, Security Hub 데이터 거주(특정 리전 밖 금지) 데이터 주권 요건 SCP 의 리전 제한, 버킷 정책
{
"Effect" : "Deny" ,
"Action" : "*" ,
"Resource" : "*" ,
"Condition" : {
"StringNotEquals" : { "aws:RequestedRegion" : [ "ap-northeast-2" ] }
}
}
위와 같은 SCP 는 허용한 리전 밖에서의 작업을 계정 전체에서 막는다. 실제로는 IAM 처럼 리전이 없는 전역 서비스를 예외로 빼야 한다. 리전 제한과 함께 교차 리전 복제·스냅샷 복사 설정도 점검해야 데이터가 밖으로 나가지 않는다.
증상 원인 조치 Macie 발견이 0건 고객 관리형 키 정책에 Macie 없음, 또는 SSE-C·클라이언트 측 암호화 키 정책에 서비스 연결 역할 허용 사번 탐지에 오탐이 쏟아짐 정규식만 있고 키워드가 없음 키워드·최대 일치 거리·무시 단어 추가(식별자는 새로 생성) 석 달 전 발견을 찾을 수 없음 발견 보관 90일 EventBridge·Security Hub·S3 로 내보내기 분석가가 마스킹된 값이 아니라 원본을 봄 더 높은 우선순위의 정책이 걸렸거나 정책 미부착 우선순위와 부착 대상 확인 삭제한 고객 데이터가 시간 여행 쿼리로 보임 스냅샷이 남음 스냅샷 만료 + VACUUM 토큰화 후 테이블 간 조인이 깨짐 테이블마다 다른 토큰 매핑 같은 볼트·같은 매핑 사용
지문 단서 정답 "어느 버킷에 카드번호·주민번호가 있는지 모른다" Amazon Macie "조직 고유 형식의 식별자를 탐지" 맞춤 데이터 식별자 "조인 유지 + 원본 숨김 + 나중에 복원" 토큰화 "같은 테이블, 역할에 따라 다른 가시성(Redshift)" 동적 데이터 마스킹 "민감 컬럼을 아예 반환하지 않기(데이터 레이크)" Lake Formation 데이터 필터 "ETL 중에 PII 를 찾아 가리기" Glue 민감 데이터 탐지 변환 "탐지 즉시 격리·통보" Macie → EventBridge → Lambda + SNS "특정 고객의 행만 영구 삭제" Iceberg·Hudi 행 수준 DELETE(+ 스냅샷 정리) "데이터가 특정 리전을 벗어나면 안 됨" SCP·버킷 정책의 리전 제한
내일은 데이터를 찾고(카탈로그), 믿고(계보), 나누고(공유), 추적하는(감사) 거버넌스를 다룬다.
PII : 개인을 식별할 수 있는 정보. 이름, 주민번호, 카드번호, 이메일 등.
관리형 데이터 식별자 : Macie 가 기본으로 제공하는 민감 데이터 탐지 기준.
맞춤 데이터 식별자 : 정규식과 키워드로 직접 정의하는 탐지 기준. 만든 뒤에는 수정할 수 없다.
발견(finding) : Macie 가 찾은 문제 한 건에 대한 보고. 버킷 설정 문제와 민감 데이터 두 범주가 있다.
마스킹 : 값을 가리거나 일부만 보여 주는 것. 보통 원본으로 되돌릴 수 없다.
토큰화 : 민감한 값을 의미 없는 토큰으로 바꾸고 원본과의 매핑을 따로 보관하는 것.
볼트(vault) : 토큰과 원본의 매핑을 보관하는 보호된 저장소.
동적 데이터 마스킹 : 저장된 값은 두고 조회하는 순간에 역할에 따라 가려서 보여 주는 Redshift 기능.
스냅샷(Iceberg) : 특정 시점의 테이블 상태. 지운 데이터도 옛 스냅샷이 남아 있으면 다시 읽힌다.
데이터 거주 : 데이터를 정해진 국가·리전 안에만 두어야 한다는 요건.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
수천 개의 S3 버킷 중 어디에 신용카드 번호·주민번호가 저장돼 있는지 모른다. 민감 데이터의 위치와 유형을 자동으로 발견하는 서비스는?
A AWS Config B AWS Glue DataBrew C Amazon Macie D Amazon Inspector 결제 분석을 위해 카드번호로 거래를 조인해야 하지만 원본 카드번호는 숨겨야 한다. 나중에 권한 있는 시스템이 원본을 복원할 수도 있어야 한다. 가장 적합한 기법은?
A 비가역 마스킹 B 컬럼 삭제 C Glacier 보관 D 토큰화 Redshift에서 동일 테이블을 두 역할이 조회하되, 분석가에게는 카드번호 뒤 4자리만, 관리자에게는 전체를 보여주려 한다. 가장 적절한 기능은?
A S3 버킷 정책 B Redshift 동적 데이터 마스킹(DDM) C KMS 키 교체 D 파티션 프로젝션 Macie가 민감 데이터를 탐지한 직후 자동으로 해당 버킷을 격리하고 보안팀에 알리고자 한다. 가장 적절한 아키텍처는?
A Macie 발견 → EventBridge → Lambda(버킷 정책 제한) + SNS 알림 B S3 수명주기 정책으로 객체 삭제 C CloudFront 배포 생성 D Redshift 스냅샷 생성 GDPR "잊힐 권리"에 따라 특정 고객의 데이터를 데이터레이크에서 행 단위로 영구 삭제해야 한다. 가장 적절한 방법은?
A 전체 테이블을 다시 적재 B S3 버킷 버전 관리만 활성화 C Macie 분류 작업 재실행 D Iceberg/Hudi 테이블에서 행 수준 DELETE 실행