아키텍처 케이스 · 10
규정 준수 감사에 대응하라
감사 대응은 서비스를 나열하는 일이 아니라 질문마다 답할 서비스를 배정하는 일입니다. "누가 무엇을 했는가", "구성이 규칙을 지키는가", "기록이 변조되지 않았는가", "키를 누가 언제 썼는가" — 네 질문에 각각 다른 서비스가 대응합니다.
학습 목표
- 감사 요구를 네 가지 질문으로 나누고 각각에 서비스를 배정할 수 있습니다.
- CloudTrail, AWS Config, CloudWatch가 답하는 질문의 차이를 설명할 수 있습니다.
- S3 Object Lock의 거버넌스 모드와 규정 준수 모드를 구분해 고를 수 있습니다.
- 고객 관리형 키를 쓰는 이유를 감사 관점에서 설명할 수 있습니다.
- 데이터 레지던시 요구를 조직 수준 가드레일로 고정할 수 있습니다.
상황
금융 관련 서비스가 외부 감사를 받게 되었습니다. 감사관이 요구한 항목은 다음과 같습니다.
- 지난 1년간 누가 어떤 API를 호출했는지 전부 제출할 것. 여러 계정을 쓰고 있다면 계정별로 빠짐없이.
- 보안 그룹·버킷·데이터베이스의 구성이 내부 규칙을 지키고 있었는지, 지키지 않은 기간이 있었다면 언제부터 언제까지인지 제시할 것.
- 거래 기록 파일이 보존 기간 동안 수정·삭제되지 않았음을 증명할 것. 관리자 권한을 가진 사람도 지울 수 없어야 함.
- 암호화 키를 누가 언제 사용했는지 제시하고, 교체 정책을 설명할 것.
- 고객 데이터가 지정된 리전 밖에서 처리되지 않았음을 보일 것.
현재 상태는 이렇습니다.
| 요구 | 현재 | 간극 |
|---|---|---|
| 1. API 호출 기록 | 계정마다 개별 추적이 있고 일부는 단일 리전만 | 계정 간 통합이 없고 누락 리전이 있다 |
| 2. 구성 준수 이력 | 점검을 사람이 분기마다 수동으로 | 위반이 언제 시작됐는지 알 수 없다 |
| 3. 기록 불변성 | 버킷 정책으로 삭제를 제한 | 정책은 바꿀 수 있다. 증명이 되지 않는다 |
| 4. 키 사용 기록 | 대부분 서비스 기본 암호화 사용 | 키 사용 주체를 세밀하게 제시하기 어렵다 |
| 5. 데이터 레지던시 | 합의는 있으나 기술적 제약이 없다 | 다른 리전에 리소스를 만들 수 있다 |
질문마다 서비스를 배정한다
| 질문 | 서비스 | 제출물 |
|---|---|---|
| 누가 무엇을 호출했는가 | AWS CloudTrail | 이벤트 기록과 무결성 검증용 다이제스트 파일 |
| 구성이 규칙을 지켰는가 | AWS Config | 구성 항목 이력과 규칙 평가 결과의 시계열 |
| 기록이 변조되지 않았는가 | Amazon S3 Object Lock | 보존 모드와 기간, 법적 보존 설정 |
| 키를 누가 언제 썼는가 | AWS KMS + CloudTrail | 키 정책과 키 사용 API 호출 기록 |
| 데이터가 지정 리전을 벗어나지 않았는가 | 서비스 제어 정책(SCP) + Config | 가드레일 정책과 위반 없음을 보이는 평가 결과 |
| 얼마나 잘 동작했는가 | Amazon CloudWatch | 지표와 알람 (감사 항목은 아니지만 혼동 대상) |
요구사항과 제약
| 구분 | 내용 | 설계에 주는 함의 |
|---|---|---|
| 요구 1 | 기록은 계정 전체·리전 전체를 포함한다 | 조직 추적과 다중 리전 설정이 필요하다 |
| 요구 2 | 기록 자체가 변조되지 않았음을 보여야 한다 | 로그 파일 무결성 검증과 저장소 잠금이 함께 필요하다 |
| 요구 3 | 위반 여부를 상시 판정한다 | 수동 점검은 이력을 만들지 못한다 |
| 제약 1 | 운영 계정의 관리자도 기록을 지울 수 없어야 한다 | 로그 저장 계정을 분리한다 |
| 제약 2 | 보존 기간은 규정이 정한 값을 정확히 지킨다 | 너무 길게 잡으면 비용과 개인정보 위험이 늘어난다 |
| 제약 3 | 운영에 큰 부담을 주지 않는다 | 관리형 서비스와 자동 평가를 우선한다 |
배경 개념은 16장 보안 · 암호화 · 거버넌스와 17장 모니터링 · 운영 · 계정 관리에 있습니다.
후보 설계안 비교
| 항목 | A · 계정마다 개별 추적 유지 | B · 조직 추적 + 중앙 로그 계정 | C · B + Object Lock + Config 규칙 + SCP 가드레일 |
|---|---|---|---|
| 전 계정 포괄 | 누락 위험이 상존 | 조직 단위로 자동 포함 | 동일 |
| 운영 계정 관리자의 삭제 | 가능 | 로그 계정 권한 분리로 제한 | 보존 모드로 구조적으로 차단 |
| 위반 시점 특정 | 불가 | 부분적 | 규칙 평가 이력으로 특정 |
| 리전 이탈 방지 | 없음 | 없음 | SCP로 사전 차단 |
| 운영 부담 | 계정이 늘 때마다 수동 작업 | 낮다 | 초기 설계 후 낮다 |
| 판정 | 오답 | 필요하지만 불충분 | 선택 |
선택과 근거
C안을 고릅니다. 요구별로 나눠 구성합니다.
1 · 조직 추적으로 기록을 모은다
aws cloudtrail create-trail \
--name org-audit-trail \
--s3-bucket-name example-central-audit-logs \
--is-multi-region-trail \
--is-organization-trail \
--enable-log-file-validation \
--kms-key-id arn:aws:kms:ap-northeast-2:123456789012:key/12345678-1234-1234-1234-123456789012
aws cloudtrail start-logging --name org-audit-trail
# 설정이 의도대로 들어갔는지 확인합니다.
aws cloudtrail describe-trails \
--query 'trailList[].[Name,IsMultiRegionTrail,IsOrganizationTrail,LogFileValidationEnabled,KmsKeyId]' \
--output table
저장 위치는 별도의 로그 아카이브 계정으로 둡니다(제약 1). 운영 계정의 관리자가 아무리 강한 권한을 가져도 다른 계정의 버킷에는 그 권한이 미치지 않습니다. 계정 경계가 가장 강한 격리라는 원칙이 여기서도 그대로 적용됩니다.
2 · Object Lock으로 불변성을 만든다
S3 Object Lock은 객체를 쓰기 한 번, 읽기 여러 번(WORM) 방식으로 보호합니다. 보존 모드는 두 가지이고, 이 선택이 감사 대응의 성패를 가릅니다.
| 항목 | 거버넌스 모드(GOVERNANCE) |
규정 준수 모드(COMPLIANCE) |
|---|---|---|
| 보존 기간 중 삭제 | 특별한 권한을 가진 주체는 해제할 수 있다 | 누구도 할 수 없다 |
| 보존 기간 단축 | 특별한 권한으로 가능 | 불가 — 연장만 가능 |
| 루트 사용자 | 해제 가능 | 해제 불가 |
| 쓰임 | 내부 정책 강제, 실수 방지 | 규제 대응, 감사 증빙 |
요구 3(관리자도 지울 수 없어야 함)은 규정 준수 모드를 지목합니다. 다만 이 모드는 되돌릴 수 없으므로, 보존 기간을 잘못 길게 설정하면 그 기간 내내 비용을 부담해야 합니다(제약 2). 기간은 규정 문서에서 그대로 가져오고, 임의로 넉넉하게 잡지 않습니다.
# Object Lock 은 버전 관리를 전제로 합니다.
aws s3api put-bucket-versioning \
--bucket example-transaction-records \
--versioning-configuration Status=Enabled
# 새 객체에 기본으로 적용될 보존 규칙을 정합니다.
# 모드와 기간이 함께 필요하고, Days 와 Years 를 동시에 지정할 수 없습니다.
aws s3api put-object-lock-configuration \
--bucket example-transaction-records \
--object-lock-configuration '{
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": { "Mode": "COMPLIANCE", "Years": 7 }
}
}'
# 개별 객체에 법적 보존을 걸면 보존 기간과 무관하게 삭제가 막힙니다.
aws s3api put-object-legal-hold \
--bucket example-transaction-records \
--key 2026/07/ledger.parquet \
--legal-hold Status=ON
3 · Config로 준수 이력을 만든다
요구 2(위반 기간 제시)는 상시 평가가 있어야 답할 수 있습니다. AWS Config는 리소스 구성 변경을 기록하고, 규칙으로 준수 여부를 평가합니다. 평가 결과가 시간축에 남으므로 "언제부터 언제까지 위반 상태였는가"를 그대로 제시할 수 있습니다.
# 구성 기록기가 켜져 있는지 확인합니다.
aws configservice describe-configuration-recorder-status \
--query 'ConfigurationRecordersStatus[].[name,recording,lastStatus]' \
--output table
# 규칙별 준수 여부를 조회합니다.
aws configservice describe-compliance-by-config-rule \
--query 'ComplianceByConfigRules[].[ConfigRuleName,Compliance.ComplianceType]' \
--output table
# 특정 리소스의 구성 변경 이력을 가져옵니다.
aws configservice get-resource-config-history \
--resource-type AWS::EC2::SecurityGroup \
--resource-id sg-0123456789abcdef0 \
--query 'configurationItems[].[configurationItemCaptureTime,configurationItemStatus]' \
--output table
규칙은 감사 항목에서 그대로 도출합니다 —
퍼블릭 액세스가 켜진 버킷, 0.0.0.0/0이 허용된 보안 그룹,
암호화되지 않은 볼륨과 데이터베이스, 로그가 꺼진 리소스.
각각 케이스 4와
케이스 1에서 다룬 사고의 상시 탐지판입니다.
4 · 고객 관리형 키로 키 사용을 감사한다
요구 4(키 사용 주체와 교체 정책)는 고객 관리형 키를 쓸 때 가장 명확하게 답할 수 있습니다.
| 키 종류 | 키 정책 통제 | 교체 | 감사 관점 |
|---|---|---|---|
| AWS 소유 키 | 불가 | AWS가 관리 | 키 단위로 제시할 것이 없다 |
| AWS 관리형 키 | 직접 편집 불가 | 매년 자동 교체. 켜고 끌 수 없다 | 사용 기록은 남지만 접근 통제를 우리가 정할 수 없다 |
| 고객 관리형 키 | 키 정책으로 직접 통제 | 자동 교체를 켤 수 있고 주기를 조정할 수 있다 | 누가 언제 어떤 키를 썼는지 제시할 수 있다 |
자동 교체의 기본 주기는 약 365일이고 필요하면 조정할 수 있습니다. 자동 교체는 대칭 암호화 키에만 적용되며, 비대칭 키·HMAC 키·가져온 키 재료·사용자 지정 키 스토어는 대상이 아닙니다. 이 경계를 모른 채 "모든 키를 자동 교체한다"고 답하면 감사에서 다시 질문을 받습니다.
aws kms enable-key-rotation \
--key-id 12345678-1234-1234-1234-123456789012
aws kms get-key-rotation-status \
--key-id 12345678-1234-1234-1234-123456789012
# 키 정책은 누가 이 키를 쓸 수 있는지를 정합니다.
aws kms get-key-policy \
--key-id 12345678-1234-1234-1234-123456789012 \
--policy-name default
5 · 데이터 레지던시를 가드레일로 고정한다
요구 5는 합의가 아니라 기술적 제약으로 답해야 합니다. 서비스 제어 정책으로 승인되지 않은 리전에서의 호출을 거부하면, "만들 수 없었다"는 것이 곧 증거가 됩니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyOutsideApprovedRegions",
"Effect": "Deny",
"NotAction": [
"iam:*",
"organizations:*",
"cloudfront:*",
"route53:*",
"support:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["ap-northeast-2"]
}
}
}
]
}
리전 개념이 없는 글로벌 서비스는 NotAction으로 빼 둡니다.
빼지 않으면 IAM 사용자 생성이나 DNS 레코드 수정까지 막혀 조직이 마비됩니다.
SCP의 성질 두 가지를 기억합니다. SCP는 권한을 부여하지 않고 상한만 정합니다. 그리고 멤버 계정의 루트 사용자에게도 적용됩니다. 루트를 통제할 수 있는 유일한 수단이라는 점이 감사 대응에서 중요합니다.
비용과 운영에 미치는 영향
| 항목 | 비용 성격 | 운영 성격 |
|---|---|---|
| CloudTrail 조직 추적 | 기록량과 저장 용량에 비례 | 데이터 이벤트를 무분별하게 켜면 양이 급증한다. 대상 리소스를 한정한다 |
| AWS Config | 기록되는 구성 항목과 규칙 평가 수에 비례 | 기록 대상 리소스 유형을 필요한 범위로 좁힌다 |
| Object Lock 규정 준수 모드 | 보존 기간 동안 저장 요금이 고정된다 | 기간을 줄일 수 없다. 설정 전에 반드시 검토 |
| 고객 관리형 키 | 키와 API 호출이 항목이 된다 | 키 정책 관리, 삭제 시 대기 기간 고려 |
| 로그 보관 | 수명 주기로 아카이브 클래스로 내리면 줄어든다 | 보존 규정과 만료 규칙이 충돌하지 않게 맞춘다 |
| SCP 가드레일 | 추가 항목 없음 | 예외 요청 처리 절차가 필요하다 |
감사 대응 체크리스트
기록
불변성
준수 판정
데이터 보호
관련 시험 포인트
| 문제문의 신호 | 고르는 것 | 소거하는 것 |
|---|---|---|
| 누가 이 리소스를 변경했는지 찾아야 한다 | AWS CloudTrail | AWS Config, CloudWatch |
| 규칙을 위반한 리소스를 상시 찾아야 한다 | AWS Config 규칙 | CloudTrail |
| 관리자도 지울 수 없어야 한다 | S3 Object Lock 규정 준수 모드 | 버킷 정책, IAM 정책, 버전 관리만 켜는 안 |
| 실수 삭제는 막되 예외는 허용 | Object Lock 거버넌스 모드 | 규정 준수 모드(되돌릴 수 없다) |
| 키 사용을 감사하고 교체를 통제해야 한다 | 고객 관리형 KMS 키 | AWS 관리형 키, AWS 소유 키 |
| 모든 계정의 활동을 빠짐없이 | 조직 추적 + 다중 리전 | 계정마다 개별 추적을 만드는 안 |
| 데이터가 특정 리전을 벗어나면 안 된다 | SCP로 aws:RequestedRegion 제한 |
IAM 정책만으로 통제하는 안(루트에 적용되지 않는다) |
| S3의 민감 데이터를 찾아내야 한다 | Amazon Macie | Amazon GuardDuty, Amazon Inspector |
| 여러 계정의 보안 결과를 한곳에서 | AWS Security Hub | 계정마다 콘솔을 확인하는 안 |
이어서 볼 곳
- 16장 · 보안 · 암호화 · 거버넌스 KMS 키 종류와 키 정책, 봉투 암호화, 탐지 서비스의 역할 분담을 정면으로 다룹니다.
- 17장 · 모니터링 · 운영 · 계정 관리 CloudTrail, Config, Organizations, Control Tower와 다중 계정 랜딩 존을 다룹니다.
- 실습 11 · KMS 고객 관리형 키로 암호화 키 정책과 봉투 암호화, 교체를 직접 구성하고 사용 기록을 확인합니다.
- 케이스 1 · EC2에 액세스 키를 심어 배포했다 이 케이스의 Config 규칙이 상시로 잡아내야 하는 사고의 원형입니다.
- 케이스 8 · 리전 장애에 대비한 DR을 설계하라 데이터 레지던시 요구와 리전 간 복제가 충돌하는 지점을 함께 봅니다.
- 보안 아키텍처 설계 (30%) 데이터 보안 제어를 포함한 과제 진술 3개의 출제 포인트를 정리했습니다.
공식 문서 출처
- AWS CloudTrail API 레퍼런스 — CreateTrail
—
IsMultiRegionTrail·IsOrganizationTrail·EnableLogFileValidation의 기본값이 모두false라는 서술과 KMS 키 지정 - AWS CloudTrail 사용 설명서 — 개념 — 관리 이벤트와 데이터 이벤트의 구분
- Amazon S3 사용 설명서 — Object Lock으로 객체 잠그기 — WORM 보호의 개념과 버전 관리 전제
- Amazon S3 사용 설명서 — Object Lock 개요 — 거버넌스 모드와 규정 준수 모드의 차이, 법적 보존의 동작
- Amazon S3 API 레퍼런스 — PutObjectLockConfiguration
— 기본 보존 설정에 모드와 기간이 함께 필요하고
Days와Years를 동시에 지정할 수 없다는 제약 - AWS Config API 레퍼런스 — GetResourceConfigHistory — 리소스 구성 항목이 시간축으로 기록된다는 동작
- AWS KMS API 레퍼런스 — EnableKeyRotation — 자동 교체의 기본 주기, 대칭 암호화 키에만 적용된다는 제약, AWS 관리형 키의 매년 교체
- AWS KMS API 레퍼런스 — PutKeyPolicy — 키 정책이 키 접근을 통제하는 방식
- AWS Organizations 사용 설명서 — SCP 전략 — SCP가 권한을 부여하지 않고 상한만 정한다는 점, 허용 목록과 거부 목록 전략
- AWS Backup 개발자 안내서 — 볼트 잠금 — 백업 복구 지점의 삭제와 보존 기간 변경을 막는 설정