학습 목표

상황

금융 관련 서비스가 외부 감사를 받게 되었습니다. 감사관이 요구한 항목은 다음과 같습니다.

  1. 지난 1년간 누가 어떤 API를 호출했는지 전부 제출할 것. 여러 계정을 쓰고 있다면 계정별로 빠짐없이.
  2. 보안 그룹·버킷·데이터베이스의 구성이 내부 규칙을 지키고 있었는지, 지키지 않은 기간이 있었다면 언제부터 언제까지인지 제시할 것.
  3. 거래 기록 파일이 보존 기간 동안 수정·삭제되지 않았음을 증명할 것. 관리자 권한을 가진 사람도 지울 수 없어야 함.
  4. 암호화 키를 누가 언제 사용했는지 제시하고, 교체 정책을 설명할 것.
  5. 고객 데이터가 지정된 리전 밖에서 처리되지 않았음을 보일 것.

현재 상태는 이렇습니다.

현재 상태와 요구 항목의 간극
요구 현재 간극
1. API 호출 기록 계정마다 개별 추적이 있고 일부는 단일 리전만 계정 간 통합이 없고 누락 리전이 있다
2. 구성 준수 이력 점검을 사람이 분기마다 수동으로 위반이 언제 시작됐는지 알 수 없다
3. 기록 불변성 버킷 정책으로 삭제를 제한 정책은 바꿀 수 있다. 증명이 되지 않는다
4. 키 사용 기록 대부분 서비스 기본 암호화 사용 키 사용 주체를 세밀하게 제시하기 어렵다
5. 데이터 레지던시 합의는 있으나 기술적 제약이 없다 다른 리전에 리소스를 만들 수 있다
CloudTrail · AWS Config · CloudWatch 에 질문을 하나씩 배정 세 서비스를 세 열로 놓고 각 열 맨 위에 그 서비스가 답하는 질문을 하나씩 붙였습니다. 첫째 열의 질문은 누가 무엇을 호출했는가입니다. 답하는 서비스는 AWS CloudTrail 이며 API 호출 이벤트를 남깁니다. 호출자 신원, 시각, 소스 IP, 요청과 응답 요소가 기록되므로 감사 추적과 누가 삭제했는지 조사하는 시나리오가 이 서비스를 지목합니다. 둘째 열의 질문은 리소스 구성이 규칙을 지키는가입니다. 답하는 서비스는 AWS Config 이며 리소스의 구성 항목 스냅샷과 변경 이력, 그리고 규칙 준수 여부를 남깁니다. 규정 준수 평가와 설정이 언제 어떻게 바뀌었는지를 묻는 시나리오가 이 서비스를 지목합니다. 셋째 열의 질문은 지금 얼마나 잘 동작하는가입니다. 답하는 서비스는 Amazon CloudWatch 이며 지표와 로그, 알람 상태, 대시보드를 다룹니다. 성능과 사용률 감시, 임계값을 넘으면 알림을 보내라는 시나리오가 이 서비스를 지목합니다. 감사와 규정 준수 시나리오에서 서비스를 고르는 유일한 기준은 문제문이 이 세 질문 가운데 어느 것을 하고 있는가입니다. 질문이 서비스를 고릅니다 누가 무엇을 호출했는가 AWS CloudTrail 남기는 것 API 호출 이벤트 호출자 · 시각 · 소스 IP 요청과 응답 요소 문제문의 신호 감사 추적이 필요하다 누가 지웠는지 조사 리소스 구성이 규칙을 지키는가 AWS Config 남기는 것 구성 항목 스냅샷 구성 변경 이력 규칙 준수 여부 문제문의 신호 규정 준수를 평가 설정이 언제 바뀌었나 지금 얼마나 잘 동작하는가 Amazon CloudWatch 남기는 것 지표와 로그 알람 상태 대시보드 문제문의 신호 성능 · 사용률 감시 임계값을 넘으면 알림 서비스를 고르는 유일한 기준은 문제문이 어느 질문을 하고 있는가입니다
"누가 무엇을 호출했는가"(CloudTrail), "리소스 구성이 규칙을 지키는가"(AWS Config), "얼마나 잘 동작하는가"(CloudWatch) 세 질문을 각 서비스에 배정한 구분. 감사 시나리오에서 서비스를 고르는 기준은 이 질문 구분 하나입니다

질문마다 서비스를 배정한다

감사 질문과 대응 서비스
질문 서비스 제출물
누가 무엇을 호출했는가 AWS CloudTrail 이벤트 기록과 무결성 검증용 다이제스트 파일
구성이 규칙을 지켰는가 AWS Config 구성 항목 이력과 규칙 평가 결과의 시계열
기록이 변조되지 않았는가 Amazon S3 Object Lock 보존 모드와 기간, 법적 보존 설정
키를 누가 언제 썼는가 AWS KMS + CloudTrail 키 정책과 키 사용 API 호출 기록
데이터가 지정 리전을 벗어나지 않았는가 서비스 제어 정책(SCP) + Config 가드레일 정책과 위반 없음을 보이는 평가 결과
얼마나 잘 동작했는가 Amazon CloudWatch 지표와 알람 (감사 항목은 아니지만 혼동 대상)

요구사항과 제약

요구사항과 제약
구분 내용 설계에 주는 함의
요구 1 기록은 계정 전체·리전 전체를 포함한다 조직 추적과 다중 리전 설정이 필요하다
요구 2 기록 자체가 변조되지 않았음을 보여야 한다 로그 파일 무결성 검증과 저장소 잠금이 함께 필요하다
요구 3 위반 여부를 상시 판정한다 수동 점검은 이력을 만들지 못한다
제약 1 운영 계정의 관리자도 기록을 지울 수 없어야 한다 로그 저장 계정을 분리한다
제약 2 보존 기간은 규정이 정한 값을 정확히 지킨다 너무 길게 잡으면 비용과 개인정보 위험이 늘어난다
제약 3 운영에 큰 부담을 주지 않는다 관리형 서비스와 자동 평가를 우선한다

배경 개념은 16장 보안 · 암호화 · 거버넌스와 17장 모니터링 · 운영 · 계정 관리에 있습니다.

후보 설계안 비교

후보 설계안 3종 비교 — 감사 요구를 어디까지 충족하는가
항목 A · 계정마다 개별 추적 유지 B · 조직 추적 + 중앙 로그 계정 C · B + Object Lock + Config 규칙 + SCP 가드레일
전 계정 포괄 누락 위험이 상존 조직 단위로 자동 포함 동일
운영 계정 관리자의 삭제 가능 로그 계정 권한 분리로 제한 보존 모드로 구조적으로 차단
위반 시점 특정 불가 부분적 규칙 평가 이력으로 특정
리전 이탈 방지 없음 없음 SCP로 사전 차단
운영 부담 계정이 늘 때마다 수동 작업 낮다 초기 설계 후 낮다
판정 오답 필요하지만 불충분 선택

선택과 근거

C안을 고릅니다. 요구별로 나눠 구성합니다.

1 · 조직 추적으로 기록을 모은다

create-org-trail.sh — 전 계정·전 리전 추적과 로그 파일 무결성 검증 (이름과 ARN은 예시입니다)
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) 방식으로 보호합니다. 보존 모드는 두 가지이고, 이 선택이 감사 대응의 성패를 가릅니다.

Object Lock 보존 모드 비교
항목 거버넌스 모드(GOVERNANCE) 규정 준수 모드(COMPLIANCE)
보존 기간 중 삭제 특별한 권한을 가진 주체는 해제할 수 있다 누구도 할 수 없다
보존 기간 단축 특별한 권한으로 가능 불가 — 연장만 가능
루트 사용자 해제 가능 해제 불가
쓰임 내부 정책 강제, 실수 방지 규제 대응, 감사 증빙

요구 3(관리자도 지울 수 없어야 함)은 규정 준수 모드를 지목합니다. 다만 이 모드는 되돌릴 수 없으므로, 보존 기간을 잘못 길게 설정하면 그 기간 내내 비용을 부담해야 합니다(제약 2). 기간은 규정 문서에서 그대로 가져오고, 임의로 넉넉하게 잡지 않습니다.

object-lock.sh — 버전 관리와 Object Lock 기본 보존 설정 (버킷 이름과 기간은 예시입니다)
# 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는 리소스 구성 변경을 기록하고, 규칙으로 준수 여부를 평가합니다. 평가 결과가 시간축에 남으므로 "언제부터 언제까지 위반 상태였는가"를 그대로 제시할 수 있습니다.

config-status.sh — 기록기 상태와 규칙 평가 결과 확인
# 구성 기록기가 켜져 있는지 확인합니다.
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(키 사용 주체와 교체 정책)는 고객 관리형 키를 쓸 때 가장 명확하게 답할 수 있습니다.

KMS 키 종류와 감사·통제 범위
키 종류 키 정책 통제 교체 감사 관점
AWS 소유 키 불가 AWS가 관리 키 단위로 제시할 것이 없다
AWS 관리형 키 직접 편집 불가 매년 자동 교체. 켜고 끌 수 없다 사용 기록은 남지만 접근 통제를 우리가 정할 수 없다
고객 관리형 키 키 정책으로 직접 통제 자동 교체를 켤 수 있고 주기를 조정할 수 있다 누가 언제 어떤 키를 썼는지 제시할 수 있다

자동 교체의 기본 주기는 약 365일이고 필요하면 조정할 수 있습니다. 자동 교체는 대칭 암호화 키에만 적용되며, 비대칭 키·HMAC 키·가져온 키 재료·사용자 지정 키 스토어는 대상이 아닙니다. 이 경계를 모른 채 "모든 키를 자동 교체한다"고 답하면 감사에서 다시 질문을 받습니다.

kms-rotation.sh — 고객 관리형 키의 자동 교체 설정과 확인 (키 ID는 예시입니다)
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는 합의가 아니라 기술적 제약으로 답해야 합니다. 서비스 제어 정책으로 승인되지 않은 리전에서의 호출을 거부하면, "만들 수 없었다"는 것이 곧 증거가 됩니다.

deny-outside-regions.json — 승인된 리전 밖 호출을 거부하는 SCP (리전 코드는 예시입니다)
{
  "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 계정마다 콘솔을 확인하는 안

이어서 볼 곳

공식 문서 출처