0Pricing
Cloud & IT Cert Prep · 강의

KMS, ACM 및 암호화 패턴

AWS KMS로 암호화 키를 관리하고, ACM으로 TLS 인증서를 프로비저닝하고 교체하며, 클라이언트 측·서버 측·전송 중 암호화 중 적합한 방식을 선택합니다.

KMS, ACM 및 암호화 패턴은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

AWS 암호화 개요

암호화는 스토리지 매체가 손상되거나 다른 방식으로 액세스 권한을 획득하더라도 데이터 기밀성을 보호하는 기본적인 보안 제어 수단입니다. AWS는 저장 중 데이터(데이터베이스, S3, EBS에 저장된 데이터)와 전송 중 데이터(네트워크를 통해 이동하는 데이터)에 암호화를 제공합니다. 주요 서비스는 다음과 같습니다. AWS Key Management Service(KMS)는 저장 중 데이터 암호화를 위한 암호화 키를 관리합니다. AWS Certificate Manager(ACM)는 전송 중 데이터 암호화를 위한 TLS 인증서를 발급하고 관리합니다. SAA-C03 Security Architecture 영역에서는 각각을 언제 어떻게 적용해야 하는지 이해하는 것이 필수적입니다.

# Encryption coverage on AWS:
# At rest (KMS):
#   S3, EBS, RDS, DynamoDB, EFS, SQS,
#   Lambda env vars, Secrets Manager, SSM Parameter Store

# In transit (ACM/TLS):
#   ALB listeners (HTTPS), API Gateway, CloudFront,
#   Direct Connect, VPN, inter-service communication

# Both:
#   S3 Server-Side Encryption + HTTPS only policy

AWS KMS: 키 관리 서비스

AWS KMS는 암호화 키를 생성하고 제어하는 완전 관리형 서비스입니다. KMS는 키를 보호하기 위해 Hardware Security Modules(HSMs)를 사용하며, 키 자료는 암호화되지 않은 상태로 HSM 밖으로 나가지 않습니다. KMS는 대부분의 AWS 서비스와 통합되어 서버 측 암호화를 제공합니다. 키 유형은 다음과 같습니다. AWS Managed Keys는 무료이고 매년 자동으로 rotation되며 직접 제어할 수 없습니다. Customer Managed Keys(CMK)는 키당 월 $1이며 rotation, 키 정책 및 삭제를 직접 제어할 수 있습니다. Custom Key Store는 전용 HSM을 요구하는 규정 준수 요건을 충족하기 위해 자체 CloudHSM 클러스터를 사용합니다.

# Create a Customer Managed Key (CMK)
aws kms create-key \
  --description 'Production database encryption key' \
  --key-usage ENCRYPT_DECRYPT \
  --origin AWS_KMS \
  --tags TagKey=Purpose,TagValue=RDS-Encryption

# Create an alias for the key
aws kms create-alias \
  --alias-name alias/prod-db-key \
  --target-key-id arn:aws:kms:us-east-1:123:key/abc-def

# CMK costs: $1/month + $0.03 per 10,000 API calls

KMS 키 정책 및 권한 부여

모든 KMS 키에는 누가 키를 사용하고 관리할 수 있는지 제어하는 리소스 기반 정책인 키 정책이 있습니다. 자격 증명 기반인 IAM 정책과 달리 키 정책은 필수입니다. IAM 정책이 적용되려면 키 정책에서 액세스 권한을 명시적으로 부여해야 합니다. 모범 사례는 키 관리(키를 관리할 수 있는 사람)와 키 사용(암호화 및 복호화를 수행할 수 있는 서비스와 역할)을 분리하는 것입니다. 키 권한 부여는 임시로 위임된 액세스에 사용하십시오. 예를 들어 키 정책을 수정하지 않고 EMR 클러스터에 작업 동안 KMS 키를 임시로 사용할 권한을 부여할 수 있습니다.

# KMS key policy: grant RDS and admin access
{
  'Statement': [
    {
      'Sid': 'Enable root account full access',
      'Principal': {'AWS': 'arn:aws:iam::123:root'},
      'Action': 'kms:*',
      'Effect': 'Allow'
    },
    {
      'Sid': 'Allow RDS to use this key',
      'Principal': {'Service': 'rds.amazonaws.com'},
      'Action': ['kms:Encrypt','kms:Decrypt','kms:GenerateDataKey'],
      'Effect': 'Allow'
    }
  ]
}

KMS 봉투 암호화

KMS는 대량의 데이터를 효율적으로 보호하기 위해 봉투 암호화를 사용합니다. KMS 키로 4KB를 초과하는 데이터를 직접 암호화할 수는 없습니다. 대신 KMS가 실제 데이터를 로컬에서 암호화하는 데 사용하는 임의의 키인 Data Encryption Key(DEK)를 생성합니다. 그런 다음 KMS 키(Key Encryption Key)로 DEK를 암호화합니다. 암호화된 DEK는 암호화된 데이터와 함께 저장합니다. 복호화할 때는 먼저 KMS를 호출하여 DEK를 복호화한 다음, 로컬에서 평문 DEK를 사용해 데이터를 복호화합니다. S3, EBS 및 RDS 암호화는 내부적으로 이 방식으로 작동합니다.

# Generate a Data Key (for envelope encryption)
aws kms generate-data-key \
  --key-id alias/my-key \
  --key-spec AES_256

# Response contains:
# Plaintext: base64-encoded DEK (use to encrypt data locally)
# CiphertextBlob: KMS-encrypted DEK (store alongside data)

# To decrypt:
# 1. Call kms:Decrypt(CiphertextBlob) -> plaintext DEK
# 2. Use plaintext DEK to decrypt data locally
# 3. Zeroize plaintext DEK from memory
aws kms decrypt --ciphertext-blob fileb://encrypted-dek.bin

KMS 키 rotation

키 rotation은 암호화 키 자료를 주기적으로 교체하여 키가 손상되었을 때 노출될 수 있는 기간을 제한하는 보안 모범 사례입니다. Customer Managed Keys의 경우 매년 자동 rotation을 활성화할 수 있습니다. KMS는 새 키 자료를 생성하여 새로운 암호화 작업에 사용하고, 기존 데이터를 복호화할 수 있도록 이전 키 자료는 유지합니다. AWS Managed Keys는 매년 자동으로 rotation됩니다. 가져온 키 자료는 자동 rotation을 지원하지 않으므로 수동으로 rotation해야 합니다. rotation 후에는 애플리케이션을 변경하지 않아도 새로운 KMS 작업에서 새 키 자료가 자동으로 사용됩니다.

# Enable automatic annual key rotation
aws kms enable-key-rotation \
  --key-id alias/prod-db-key

# Verify rotation is enabled
aws kms get-key-rotation-status \
  --key-id alias/prod-db-key

# Manual rotation (for imported key material):
# 1. Create a new CMK
# 2. Update all services to use new key
# 3. Re-encrypt existing data with new key
# 4. Schedule old key for deletion (minimum 7-day waiting period)

S3 서버 측 암호화 옵션

S3는 세 가지 서버 측 암호화 옵션을 지원합니다. SSE-S3는 S3가 AES-256을 사용하여 키를 관리하는 방식으로, 무료이며 제어 수준이 가장 낮습니다. SSE-KMS는 KMS 키(AWS 관리형 키 또는 CMK)를 사용하고, CloudTrail에서 키 감사 추적을 제공하며, 키 정책을 지원하지만 KMS API 호출별 비용이 발생합니다. SSE-C는 각 요청마다 사용자가 키 자료를 제공하고 관리하는 방식이며, S3는 키를 저장하지 않습니다. 누가 언제 키를 사용했는지 감사할 수 있어야 한다면 SSE-KMS를 사용하십시오. 단순성과 비용이 중요한 민감도가 낮은 데이터에는 SSE-S3를 사용하십시오. 암호화 없이 이루어진 PutObject를 거부하는 버킷 정책으로 암호화를 강제하십시오.

# Enforce SSE-KMS on all new S3 objects
aws s3api put-bucket-policy \
  --bucket my-secure-bucket \
  --policy '{
    "Statement": [{
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-secure-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        }
      }
    }]
  }'

# Set default encryption for bucket
aws s3api put-bucket-encryption \
  --bucket my-secure-bucket \
  --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/my-key"}}]}'

AWS Certificate Manager(ACM)

AWS Certificate Manager(ACM)은 AWS 서비스용 SSL/TLS 인증서를 무료로 발급하고 관리하며 자동 갱신합니다. ACM 인증서는 ALB, NLB, CloudFront, API Gateway 및 AppSync와 함께 사용할 수 있습니다. ACM은 인증서 lifecycle을 자동으로 처리합니다. 만료 60일 전에 인증서를 갱신하고 갱신된 인증서를 중단 없이 배포합니다. 사용자가 소유한 도메인에 대해 인증서를 요청할 수 있으며(DNS 또는 이메일로 검증), 타사 인증서를 가져올 수도 있습니다. ACM 인증서는 다운로드할 수 없습니다. 인증서가 연결된 AWS 서비스에 귀속됩니다.

# Request a public ACM certificate
aws acm request-certificate \
  --domain-name app.example.com \
  --subject-alternative-names '*.example.com' \
  --validation-method DNS

# ACM returns a CNAME record to add to Route 53
# Add the CNAME -> ACM validates domain ownership
# Certificate is issued and auto-renews annually

# Attach to ALB listener (HTTPS:443)
aws elbv2 create-listener \
  --load-balancer-arn <ALB-ARN> \
  --protocol HTTPS --port 443 \
  --certificates CertificateArn=arn:aws:acm:us-east-1:123:certificate/abc \
  --default-actions Type=forward,TargetGroupArn=<TG-ARN>

ACM Private Certificate Authority

ACM Private CA(Certificate Authority)를 사용하면 EC2 인스턴스, 컨테이너, 내부 API, IoT 디바이스와 같은 내부 리소스에 인증서를 발급하기 위한 완전 관리형 Private CA 계층 구조를 만들 수 있습니다. 인터넷에 연결된 서비스에 사용하는 퍼블릭 ACM 인증서와 달리 Private CA 인증서는 모든 내부 호스트 이름이나 IP 주소에 대해 발급할 수 있습니다. 다음과 같은 경우 Private CA를 사용합니다: 마이크로서비스 간 상호 TLS(mTLS), VPN의 인증서 기반 인증, 내부 PKI에 대한 규정 준수 요구 사항입니다. Private CA 비용은 CA에 월 400달러, 발급된 인증서당 0.75달러입니다.

# Create ACM Private Certificate Authority
aws acm-pca create-certificate-authority \
  --certificate-authority-type ROOT \
  --certificate-authority-configuration '{
    "KeyAlgorithm": "RSA_2048",
    "SigningAlgorithm": "SHA256WITHRSA",
    "Subject": {
      "Country": "US",
      "Organization": "Example Corp",
      "CommonName": "Example Corp Internal CA"
    }
  }'

# Issue certificate from private CA
aws acm request-certificate \
  --domain-name internal-service.example.internal \
  --certificate-authority-arn arn:aws:acm-pca:us-east-1:123:certificate-authority/xxx

EBS 및 RDS Encryption

EBS 볼륨 Encryption은 볼륨을 생성할 때 활성화해야 합니다(또는 Encryption이 활성화된 기존 볼륨을 복사해야 합니다). 스냅샷을 포함한 볼륨의 모든 데이터는 지정한 KMS 키를 사용하여 Encryption됩니다. EBS Encryption은 운영 체제에서 투명하게 처리되므로 애플리케이션을 변경할 필요가 없습니다. RDS Encryption은 DB 인스턴스를 생성할 때 활성화해야 하며, 기존의 암호화되지 않은 RDS 인스턴스를 직접 Encryption할 수는 없습니다. 해결 방법은 암호화되지 않은 인스턴스에서 암호화된 스냅샷을 만든 다음, 이를 새 암호화 인스턴스로 복원하는 것입니다. EBS와 RDS의 암호화된 스냅샷은 복사할 때도 암호화된 상태로 유지됩니다.

# Enable account-level EBS default encryption
aws ec2 enable-ebs-encryption-by-default
aws ec2 modify-ebs-default-kms-key-id \
  --kms-key-id alias/prod-ebs-key

# Encrypt an existing unencrypted RDS instance:
# 1. Create unencrypted snapshot
aws rds create-db-snapshot \
  --db-instance-identifier mydb \
  --db-snapshot-identifier mydb-plain-snapshot

# 2. Copy snapshot with encryption
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier mydb-plain-snapshot \
  --target-db-snapshot-identifier mydb-encrypted-snapshot \
  --kms-key-id alias/prod-db-key

Client-Side Encryption과 Server-Side Encryption 비교

server-side Encryption과 client-side Encryption의 차이를 이해하는 것은 SAA-C03 시험에서 중요합니다. Server-side encryption: AWS가 데이터를 받은 후 Encryption하고 전달하기 전에 Decrypt합니다. 따라서 애플리케이션과 AWS 사이에서는 데이터가 평문 상태입니다. Client-side encryption: AWS로 보내기 전에 사용자가 데이터를 Encrypt합니다. 따라서 AWS에는 암호문만 저장되며 평문은 AWS에 노출되지 않습니다. 의료 기록이나 엄격한 규제를 받는 금융 데이터처럼 클라우드 제공자가 평문을 처리하는 것을 신뢰할 수 없는 가장 민감한 데이터에는 client-side encryption을 사용합니다.

# Client-side encryption with AWS Encryption SDK
# (conceptual Python example)

# 1. Application encrypts data locally using KMS DEK
# from aws_encryption_sdk import KmsKeyProvider, encrypt

# key_provider = KmsKeyProvider(key_ids=['alias/my-key'])
# ciphertext, _ = encrypt(
#     source=b'Sensitive patient data',
#     key_provider=key_provider
# )

# 2. Send ciphertext to S3
# s3.put_object(Bucket='hipaa-data', Key='record.enc', Body=ciphertext)

# AWS only stores ciphertext - cannot decrypt without your key policy

KMS 계정 간 액세스

계정 간 Encryption 시나리오에서는 KMS 키를 여러 AWS 계정에서 공유할 수 있습니다. 예를 들어 Account A의 애플리케이션이 Account B가 소유한 S3 버킷에 암호화된 데이터를 쓰는 경우, Account A의 KMS 키에서 Account B의 Principal이 해당 키를 사용하도록 허용해야 합니다. Account A에서 KMS 키 정책을 구성하여 계정 간 액세스 권한을 부여한 다음, Account B에서 IAM 정책을 생성하여 역할이 Account A의 키를 사용하도록 허용합니다. 이 패턴은 중앙 계정에서 Encryption 키를 관리하는 데이터 공유 및 다중 계정 아키텍처에서 일반적으로 사용됩니다.

# KMS key policy: allow cross-account access
# (in Account A's key policy)
{
  'Sid': 'Allow Account B to use this key',
  'Effect': 'Allow',
  'Principal': {
    'AWS': 'arn:aws:iam::999999999999:root'
  },
  'Action': [
    'kms:Encrypt',
    'kms:Decrypt',
    'kms:ReEncrypt*',
    'kms:GenerateDataKey*',
    'kms:DescribeKey'
  ],
  'Resource': '*'
}

# Account B IAM policy also needed to allow the role to use it

빠른 확인

이 lesson에서 다룬 AWS Solutions Architect (SAA-C03) 개념을 얼마나 이해했는지 확인해 보십시오.

lesson 복습

이 lesson에서는 다음을 배웠습니다: KMS는 HSM 보호 기능을 사용하여 Encryption 키를 관리하고, 세분화된 액세스 제어와 감사 추적을 위해 CMK를 지원합니다. 또한 ACM은 AWS 서비스용 TLS 인증서를 무료로 프로비저닝하고 자동 갱신합니다. 그리고 Encryption은 server-side(KMS) 또는 client-side로 적용할 수 있으며, AWS 네이티브 워크로드에서는 server-side 방식이 가장 일반적입니다. 암호화되지 않은 작업을 거부하는 버킷 정책으로 Encryption을 강제할 수 있습니다. 다음 lesson에서는 GuardDuty, Inspector, Macie를 살펴봅니다.

자주 묻는 질문

“KMS, ACM 및 암호화 패턴” 강의는 무료인가요?

네 — “KMS, ACM 및 암호화 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“KMS, ACM 및 암호화 패턴”에서 뭘 배우나요?

AWS KMS로 암호화 키를 관리하고, ACM으로 TLS 인증서를 프로비저닝하고 교체하며, 클라이언트 측·서버 측·전송 중 암호화 중 적합한 방식을 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“KMS, ACM 및 암호화 패턴” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. KMS, ACM 및 암호화 패턴
  2. GuardDuty, Inspector 및 Macie
  3. Secrets Manager 및 Parameter Store
  4. WAF, Shield 및 Network Firewall
← Cloud & IT Cert Prep(으)로 돌아가기