AWS 신규 계정 보안 베이스라인: 첫 1시간에 해야 할 일

새 AWS 계정을 받았을 때 가장 먼저 적용해야 할 보안 설정을 우선순위와 CLI 명령으로 정리했다.

신규 계정은 기본 설정 그대로 두면 루트 사용자 노출, 퍼블릭 S3 버킷, 로깅 부재라는 세 가지 기본 위협에 그대로 노출된다. 계정을 받은 첫 1시간에 적용할 베이스라인을 우선순위 순서로 정리한다.

0순위: 루트 사용자 봉인

루트는 IAM 정책으로 제한할 수 없는 유일한 주체다. 따라서 “쓰지 않게” 만드는 것이 통제의 전부다.

  • 하드웨어 또는 앱 기반 MFA 활성화
  • 액세스 키 삭제 (루트의 프로그래밍 접근은 어떤 경우에도 불필요)
  • 루트 이메일은 개인 메일이 아닌 팀 배포 리스트로 — 퇴사자 리스크 제거
  • 일상 작업용 관리자는 별도 IAM Role/Identity Center로 생성

루트가 마지막으로 언제 쓰였는지는 자격 증명 보고서로 확인한다.

aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d \
  | head -2 | cut -d, -f1,5,11 # 사용자, 비밀번호 마지막 사용, 키1 마지막 사용

1순위: CloudTrail — 무조건, 가장 먼저

사고가 났을 때 CloudTrail이 없으면 조사 자체가 불가능하다. 비용 우려로 미루는 경우가 있는데, 관리 이벤트 첫 사본은 무료다.

aws cloudtrail create-trail \
  --name org-trail \
  --s3-bucket-name my-cloudtrail-logs \
  --is-multi-region-trail \
  --enable-log-file-validation

aws cloudtrail start-logging --name org-trail

핵심 옵션 두 가지:

  • --is-multi-region-trail: 공격자는 주로 안 쓰는 리전에서 움직인다
  • --enable-log-file-validation: 로그 무결성 검증 — 로그 조작 탐지

로그 버킷은 가능하면 별도 계정에 두고, 운영 계정에서는 읽기만 가능하게 한다.

2순위: S3 계정 수준 퍼블릭 액세스 차단

버킷 단위가 아니라 계정 수준으로 차단한다. 이후 생성되는 모든 버킷에 자동 적용된다.

aws s3control put-public-access-block \
  --account-id 123456789012 \
  --public-access-block-configuration \
  BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

정적 웹 호스팅 등 의도적 퍼블릭이 필요하면 그 워크로드만 별도 계정으로 분리하는 것이 정석이다.

3순위: 탐지 서비스 활성화

# GuardDuty — 켜는 데 1분, 에이전트 불필요
aws guardduty create-detector --enable

# Security Hub + 기본 표준
aws securityhub enable-security-hub \
  --enable-default-standards

GuardDuty는 크리덴셜 유출 사용, 코인 마이닝, 비정상 API 호출을 ML로 탐지한다. Security Hub는 AWS Foundational Security Best Practices 기준으로 설정 상태를 지속 점검한다.

4순위: IAM 기본 정책

  • 계정 비밀번호 정책 강화 (길이 14+, 재사용 금지)
  • IAM User 생성 금지 원칙 — 사람은 Identity Center, 워크로드는 Role
  • 불가피하게 만든 액세스 키는 수명 감사 스크립트로 주기 점검
aws iam update-account-password-policy \
  --minimum-password-length 14 \
  --require-symbols --require-numbers \
  --require-uppercase-characters --require-lowercase-characters \
  --password-reuse-prevention 24

5순위: 청구 알림

보안 설정은 아니지만, 크리덴셜 유출의 가장 빠른 탐지 신호는 의외로 비용 급증이다. Budget 알림 하나가 GuardDuty보다 먼저 우는 경우가 실제로 있다.

aws budgets create-budget \
  --account-id 123456789012 \
  --budget '{"BudgetName":"monthly-guard","BudgetLimit":{"Amount":"50","Unit":"USD"},"TimeUnit":"MONTHLY","BudgetType":"COST"}' \
  --notifications-with-subscribers '[{"Notification":{"NotificationType":"ACTUAL","ComparisonOperator":"GREATER_THAN","Threshold":80},"Subscribers":[{"SubscriptionType":"EMAIL","Address":"security@example.com"}]}]'

체크리스트 요약

  • 루트 MFA + 액세스 키 삭제
  • CloudTrail 멀티 리전 + 로그 검증
  • S3 계정 수준 퍼블릭 차단
  • GuardDuty + Security Hub 활성화
  • 비밀번호 정책 + IAM User 생성 금지 원칙
  • 예산 알림

이 베이스라인을 Terraform 모듈로 코드화하면 계정이 늘어나도 동일한 기준을 보장할 수 있다. 다음 글에서 다룰 예정이다.