이번 주는 접근 제어, 암호화, 민감 데이터 보호, 거버넌스를 하루씩 봤다. 네 주제는 따로 노는 기능이 아니라, 분석가의 쿼리 한 건이 데이터에 닿기까지 차례로 지나는 관문이다.
분석가의 Athena 쿼리
│
▼ ① 전송: TLS 인가? (aws:SecureTransport, require_ssl) Day 2
▼ ② IAM: 이 API 를 부를 수 있나? (athena, glue, lakeformation:GetDataAccess) Day 1
▼ ③ Lake Formation: 이 테이블을 볼 수 있나? (SELECT, LF-Tags) Day 1
▼ ④ KMS: 복호화할 수 있나? (키 정책, kms:Decrypt) Day 2
▼ ⑤ 무엇을 돌려주나? (데이터 필터, 마스킹, 토큰) Day 1·3
▼ ⑥ 기록: 누가 무엇을 읽었나? (CloudTrail 데이터 이벤트) Day 4
결과
①~④는 통과 여부 를, ⑤는 보이는 범위 를, ⑥은 사후 입증 을 정한다. 문제의 요구가 셋 중 어디에 있는지 보면 보기가 줄어든다.
관문은 서로를 대신하지 못한다. 암호화(④)는 권한 있는 사용자가 PII 를 보는 것을 막지 못하고, 권한(③)은 누가 봤는지를 남기지 못한다.
관찰된 현상 막힌 관문 확인할 것 IAM 정책은 다 허용인데 테이블 조회가 권한 부족으로 실패 ③ Lake Formation 의 SELECT·DESCRIBE, 데이터 필터 부여 Lake Formation 권한도 있는데 실패 ② lakeformation:GetDataAccess권한을 좁혔는데 사용자가 전부 본다 ③이 꺼져 있음 IAMAllowedPrincipals 의 Super, S3 직접 권한메타데이터는 보이는데 읽는 순간 실패 ④ 키 정책의 kms:Decrypt, 고객 관리형 키인지 같은 계정은 되는데 다른 계정만 실패 ②·③·④ 중 한쪽 계정 양쪽 계정의 정책, RAM 초대, 리소스 링크, 키 정책 HTTP 로 접근이 된다는 보안 지적 ① 버킷 정책의 aws:SecureTransport 거부 분석가가 카드번호 원본을 본다 ⑤ 필터·마스킹 정책의 부착 대상과 우선순위 누가 읽었는지 기록이 없다 ⑥ 데이터 이벤트, Redshift 사용자 활동 로그
교차 계정 문제는 세 겹이다. 신뢰 정책(누가 역할을 맡을 수 있나) + 권한 정책(그 역할이 무엇을 할 수 있나) + KMS 키 정책. 지문에서 둘이 갖춰졌다고 말하면 남은 하나가 답이다.
"민감 데이터를 못 보게" 하는 네 수단
수단 작동 시점 저장된 값 사용자에게 보이는 것 맞는 요구 ETL 토큰화·해싱(Glue) 쓰기 전 바뀜 토큰·해시 원본을 레이크에 두지 않겠다 Lake Formation 데이터 필터 읽을 때 그대로 해당 컬럼·행이 없음 역할별로 볼 수 있는 범위를 다르게(데이터 레이크) Redshift 동적 데이터 마스킹 쿼리 시점 그대로 가려진 값 같은 테이블을 역할별로 다르게(웨어하우스) Macie 저장 후 조사 그대로 (탐지 결과만) 어디에 있는지 모르겠다
Macie 는 이 표에서 성격이 다르다. 나머지 셋은 통제 , Macie 는 발견 이다. "보이지 않게 하라"는 요구에 Macie 를 고르면 틀린다.
S3 암호화: 키를 누가 쥐는가
방식 키의 주인 감사·통제 대표 단서 SSE-S3 S3 없음 기본값, 추가 설정 불필요 SSE-KMS KMS 키 키 정책 + CloudTrail 키 사용 감사, 교차 계정 DSSE-KMS KMS 키(이중) 같음 두 겹 암호화 규정 SSE-C 고객이 요청마다 제공 AWS 가 키를 보관 안 함 키를 AWS 에 맡기지 않되 암호화는 S3 가 클라이언트 측 고객 AWS 는 암호문만 AWS 가 평문을 절대 못 봄
공유: 상대가 무엇을 손에 넣는가
방식 상대가 얻는 것 원본 행 노출 Data Exchange 데이터셋(파일 사본 또는 제자리 접근권) 노출 Redshift datashare 라이브 테이블 접근 노출 Lake Formation 교차 계정 공유 카탈로그 테이블(필터 범위) 범위 안에서 노출 S3 버킷 정책 공유 객체 전체 노출 Clean Rooms 합의된 분석의 결과 비노출
감사 로그
질문 로그 누가 정책·키·테이블을 바꿨나 CloudTrail 관리 이벤트 누가 이 객체를 읽었나 CloudTrail 데이터 이벤트 인증에 실패한 요청, 수명 주기가 지운 객체 S3 서버 액세스 로그 Redshift 에서 누가 어떤 SQL 을 실행했나 Redshift 감사 로그(사용자 활동 로그) 민감 데이터가 어디에 있나 Macie 발견(감사 로그가 아니라 탐지 결과)
서비스 접근 제어 저장 암호화 전송 암호화 감사 S3 버킷 정책, IAM 버킷 기본 암호화(SSE-S3·SSE-KMS), 버킷 키 aws:SecureTransport데이터 이벤트, 서버 액세스 로그 Glue Data Catalog Lake Formation 권한, LF-Tags 카탈로그 암호화 설정 TLS CloudTrail Glue ETL 잡 역할(IAM) 보안 구성(S3·로그·북마크) TLS CloudWatch Logs, CloudTrail Athena IAM + Lake Formation 워크그룹의 결과 암호화 TLS CloudTrail, 쿼리 이력 Redshift GRANT·역할, 동적 마스킹 클러스터 암호화(기본 적용) require_ssl감사 로깅, CloudTrail Kinesis IAM 스트림의 서버 측 암호화(KMS) TLS CloudTrail
원본을 SSE-KMS 로 암호화해도 Athena 쿼리 결과 와 Glue 잡의 임시·로그 데이터 는 각자의 설정을 따른다. 민감 데이터가 결과 버킷이나 로그로 새는 경로가 여기다.
영역 항목 값 IAM 평가 순서 명시적 Deny > 명시적 Allow > 묵시적 거부 IAM 교차 계정 양쪽 계정 모두 허용해야 통과 Lake Formation 초기 상태 IAMAllowedPrincipals 에 Super, IAM 만으로 통제Lake Formation 데이터 필터와 함께 주는 권한 SELECT 만Lake Formation 교차 계정 RAM 사용. 같은 조직은 즉시, 조직 밖은 초대 수락 KMS 자동 교체 고객 관리형은 선택(기본 주기 365일), AWS 관리형은 매년 KMS 삭제 대기 기간 7~30일, 기본 30일 S3 기본 암호화 2023년 1월 5일부터 모든 새 객체에 SSE-S3 S3 SSE-C 2026년 4월부터 새 버킷에서 기본 차단 S3 Bucket Key 효과 KMS 요청 비용 최대 99% 절감, DSSE-KMS 미지원 Redshift 암호화 기본 적용. 키를 비활성화하면 14일 뒤 삭제될 수 있다 Macie 발견 보관 90일 Macie 맞춤 식별자 정규식 512자, 키워드 50개, 최대 일치 거리 기본 50(1~300) Redshift DDM 우선순위 기본값 0. 높은 쪽이 적용 Schema Registry 권장 호환성 BACKWARDCloudTrail 기본 기록 관리 이벤트만. 데이터 이벤트는 직접 켠다
최근 바뀐 값이 셋 있다. AWS 관리형 키의 교체 주기(3년 → 1년), SSE-C 의 기본 차단, Redshift 의 기본 암호화다. 시험 자료에는 옛 값으로 나올 수 있다.
요구사항: 결제 데이터를 데이터 레이크에 적재하되, PII 는 탐지·보호하고, 분석가에게는 가려진 데이터만, 파트너와는 원본 노출 없이 협업하고, 모든 접근을 감사하며, GDPR 삭제에 대응한다.
[결제 소스] --Glue ETL(KMS 암호화, 토큰화)--> s3://lake-clean/payments/ (Iceberg)
--Macie 스캔--> [PII 발견] --EventBridge--> [Lambda: 접근 제한/알림]
--Lake Formation(데이터 필터, LF-Tags)--> [분석가: PII 제외 뷰]
--Clean Rooms--> [파트너: 합의된 집계만]
모든 활동 --> CloudTrail(데이터 이벤트) --> 감사 계정 버킷
결정 선택 이 선택이어야 하는 이유 저장 암호화 SSE-KMS(고객 관리형 키) + Bucket Key 키 사용 감사와 통제가 필요하고, ETL 의 대량 읽기에서 KMS 비용을 줄여야 한다 전송 버킷 정책으로 TLS 강제 저장 암호화와 별개의 층이다 카드번호 ETL 에서 토큰화 조인은 유지하되 원본을 레이크에 두지 않는다 탐지 Macie 자동 탐색 + 민감 버킷은 탐색 작업 토큰화를 빠져나간 PII(자유 입력 필드)를 찾는다 접근 제어 LF-Tags + 데이터 필터 테이블이 늘어도 권한이 자동 적용되고, 지역 행만 보이게 한다 파트너 협업 Clean Rooms 원본 행을 서로 볼 수 없어야 한다 감사 민감 버킷에 CloudTrail 데이터 이벤트 객체 수준 접근을 입증한다 삭제 Iceberg 행 수준 DELETE + 스냅샷 정리 한 고객의 행만 지우고 과거 스냅샷에도 남기지 않는다
-- GDPR 삭제 (Iceberg on Athena): 논리 삭제 후 스냅샷까지 정리
DELETE FROM lake_clean . payments WHERE customer_id = 'GDPR-REQ-2026-042' ;
VACUUM lake_clean . payments ;
{
"Name" : "analyst_payments_filter" ,
"ColumnNames" : [ "txn_id" , "region" , "amount_token" , "dt" ],
"RowFilter" : { "FilterExpression" : "region = 'ap-northeast-2'" }
}
Macie 가 이 버킷을 읽으려면 고객 관리형 키의 키 정책이 Macie 를 허용해야 한다. 암호화 결정(Day 2)이 탐지 결정(Day 3)의 전제 조건이 된다.
토큰화했는데도 Macie 를 두는 이유는 설계가 놓친 경로 때문이다. 통제는 "있어야 할 곳"을 막고, 탐지는 "있으면 안 될 곳"을 찾는다.
요청 처리 순서 "신규 분석가에게 매출 데이터를 보여 달라" 역할에 lakeformation:GetDataAccess 확인 → 역할에 맞는 LF-Tag 표현식 부여(개별 테이블 GRANT 를 늘리지 않는다) → PII 가 필요 없으면 필터가 걸린 권한으로 → S3 직접 권한은 주지 않는다 "이 고객의 데이터를 전부 지워 달라" 계보로 사본 위치 파악 → 각 Iceberg 테이블에서 DELETE → 스냅샷 만료·VACUUM → S3 이전 버전·raw 존·백업·웨어하우스 사본 처리 → 처리 기록 보관 "지난달 이 버킷을 누가 읽었는지 내라" 데이터 이벤트가 그 기간에 켜져 있었는지 확인 → 추적이 쌓은 로그를 Athena 로 조회 → 역할 세션이면 AssumeRole 이벤트까지 거슬러 사람을 특정. 켜져 있지 않았다면 소급해 만들 방법은 없다
💡 관련 이론 : 보안·거버넌스는 단일 통제가 아니라 다층 방어다. 암호화(기밀성) + 접근 제어(권한) + 탐지(가시성) + 감사(책임 추적)가 함께 작동해야 규제와 신뢰 요건을 충족한다. 어느 하나가 강하다고 다른 하나를 생략할 수 없다.
Lake Formation 을 켰다고 통제가 걸리는 것은 아니다. IAMAllowedPrincipals 가 남아 있으면 IAM 만으로 읽힌다.
Lake Formation 은 S3 직접 접근을 막지 않는다. 필터를 걸어도 사용자에게 s3:GetObject 가 있으면 원본 파일이 열린다.
KMS 권한은 IAM 정책만으로 끝나지 않는다. 키 정책이 IAM 위임을 허용하거나 직접 허용해야 한다.
키를 교체해도 기존 데이터는 다시 암호화되지 않는다. 기본 암호화를 바꿔도 기존 객체는 그대로다.
버킷 키는 키 통제를 포기하는 것이 아니다. 다만 KMS 이벤트에는 객체가 아니라 버킷 ARN 이 찍힌다.
Macie 는 가리지도 지우지도 않는다. S3 밖(Redshift 테이블)도 보지 않는다.
DELETE 는 물리 삭제가 아니다. 스냅샷을 만료시키기 전에는 시간 여행으로 읽힌다.
datashare·Data Exchange 는 "원본 비노출"이 아니다. 복사를 안 할 뿐 상대는 행을 읽는다.
감사 로깅을 켜도 쿼리 문이 안 남을 수 있다. Redshift 는 enable_user_activity_logging 이 따로다.
지문 단서 정답 "카드번호는 토큰으로, 자기 지역 행만, 새 테이블에 자동 적용" LF-Tags + 데이터 필터 + ETL 토큰화 "어떤 역할이 특정 객체를 읽었는지 입증" CloudTrail 데이터 이벤트 "파트너와는 원본 비노출, 사내 분석가에게는 PII 제외" Clean Rooms + Lake Formation 데이터 필터 "KMS 스로틀·비용 급증 + 평문 HTTP 차단" S3 Bucket Key + aws:SecureTransport 거부 "하나의 통제로 충분한가" 아니다. 암호화·접근 제어·탐지·감사가 함께 "IAM 은 허용인데 조회 실패" Lake Formation 권한 "다른 계정이 암호화된 테이블을 못 읽음" KMS 키 정책(고객 관리형 키) "AWS 도 평문을 볼 수 없어야" 클라이언트 측 암호화
다음 주는 마지막 주다. 도메인 1·2(수집·변환과 스토어 관리)를 통합 복습하는 것으로 시작한다.
다층 방어 : 하나의 통제가 뚫려도 다음 통제가 막도록 여러 겹으로 보호하는 설계.
관문(control point) : 요청이 통과 여부를 판정받는 지점. 전송, IAM, Lake Formation, KMS 가 각각 하나다.
제자리 접근 : 데이터를 복사해 받지 않고 제공자의 저장소를 직접 읽는 공유 방식.
원본 비노출 분석 : 상대의 행 데이터를 보지 못한 채 합의된 집계 결과만 얻는 협업 방식.
논리 삭제 / 물리 삭제 : 삭제됐다고 표시만 하는 것과 저장소에서 실제로 없애는 것. Iceberg 의 DELETE 는 전자다.
감사 계정 : 운영 계정과 분리해 로그를 모아 두는 계정. 운영자가 자기 기록을 고치지 못하게 한다.
책임 추적성 : 어떤 행위를 누가 했는지 사후에 입증할 수 있는 성질.
잊힐 권리 : 개인이 자신의 데이터 삭제를 요구할 수 있는 권리. GDPR 의 삭제 요청이 대표적이다.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
결제 데이터 플랫폼에서 분석가에게 카드번호는 토큰으로, 자기 지역 행만 노출하고, 새 테이블이 추가돼도 권한이 자동 적용되게 하려 한다. 가장 적절한 조합은?
A IAM 와일드카드 정책 + SSE-S3 B S3 버킷 정책 + 클라이언트 측 암호화 C Lake Formation TBAC + 데이터 필터 + ETL 토큰화 D Redshift 스냅샷 공유 + 파티션 프로젝션 보안팀이 "어떤 IAM 역할이 지난달 결제 버킷의 특정 객체를 읽었는지"를 입증해야 한다. 필요한 설정은?
A CloudTrail 데이터 이벤트(S3 객체 수준) 활성화 B Macie 맞춤 식별자 추가 C KMS 키 자동 교체 D Lake Formation TBAC 적용 외부 파트너와 캠페인 효과를 공동 분석하되 양사 고객 원본은 노출하지 않아야 한다. 동시에 사내 분석가에게는 PII를 제외한 데이터를 제공한다. 올바른 서비스 조합은?
A 파트너는 Data Exchange, 분석가는 IAM 와일드카드 B 둘 다 S3 교차 계정 버킷 공유 C 둘 다 Redshift datashare D 파트너는 Clean Rooms, 분석가는 Lake Formation 데이터 필터 SSE-KMS로 암호화된 결제 버킷에서 대량 객체를 읽는 ETL이 KMS 스로틀링과 비용 급증을 겪는다. 동시에 평문 HTTP 접근도 막아야 한다. 가장 적절한 조치 조합은?
A SSE-S3로 전환 + 버전 관리 B S3 Bucket Key 활성화 + aws:SecureTransport: false 거부 C 클라이언트 측 암호화 + Glacier 전환 D KMS 키 매일 교체 + Object Lock 데이터 보안·거버넌스의 "다층 방어"를 가장 정확히 설명한 것은?
A 암호화 하나만 충분히 강하면 다른 통제는 불필요하다 B 접근 제어만 있으면 감사는 필요 없다 C 암호화·접근 제어·탐지·감사가 함께 작동해야 규제·신뢰 요건을 충족한다 D 모든 통제를 IAM 하나로 대체할 수 있다