KMS、ACM、暗号化パターン
AWS KMSで暗号化キーを管理し、ACMでTLS証明書をプロビジョニング・ローテーションして、クライアント側、サーバー側、転送中の暗号化から適切な方式を選びます。
「KMS、ACM、暗号化パターン」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。
AWS の暗号化:概要
暗号化は、ストレージメディアが侵害された場合や別の手段でアクセスを取得された場合でも、データの機密性を保護する基本的なセキュリティ対策です。AWS では、保存時(データベース、S3、EBS に保存されている状態)と転送中(ネットワーク上を移動している状態)のデータを暗号化できます。主なサービスは次のとおりです。AWS Key Management Service (KMS)は、保存時の暗号化に使用する暗号化キーを管理します。AWS Certificate Manager (ACM)は、転送中の暗号化に使用する TLS 証明書を発行および管理します。それぞれをいつ、どのように適用するかを理解することは、SAA-C03 のセキュリティアーキテクチャ分野に不可欠です。
# 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 policyAWS KMS:Key Management Service
AWS KMSは、暗号化キーの作成と管理を行うフルマネージドサービスです。KMS はHardware Security Modules (HSMs)を使用してキーを保護します。キーマテリアルが暗号化されていない状態で HSM の外部に出ることはありません。KMS は、サーバーサイド暗号化のためにほとんどの AWS サービスと統合できます。キーの種類には、AWS Managed Keys(無料で、毎年自動的にローテーションされ、直接制御できません)とCustomer Managed Keys (CMK)(1 キーあたり月額 $1。ローテーション、キーポリシー、削除を制御できます)があります。Custom Key Storeは独自の CloudHSM クラスターを使用し、専用 HSM が必要なコンプライアンス要件に対応します。
# 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 callsKMS キーポリシーと Grants
すべての KMS キーにはキーポリシーがあります。これは、そのキーを誰が使用および管理できるかを制御するリソースベースのポリシーです。アイデンティティベースの IAM ポリシーとは異なり、キーポリシーは必須です。IAM ポリシーを有効にするには、キーポリシーでアクセスを明示的に許可する必要があります。ベストプラクティスは、キーの管理(キーを管理できるユーザー)とキーの使用(暗号化または復号を行えるサービスとロール)を分離することです。一時的な委任アクセスにはkey grantsを使用してください。たとえば、キーポリシーを変更せずに、ジョブの実行中だけ 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 キーで 4 KB を超えるデータを直接暗号化することはできません。代わりに、KMS がData Encryption Key (DEK)(実際のデータをローカルで暗号化するためのランダムなキー)を生成します。次に、DEK を KMS キー(Key Encryption Key)で暗号化します。暗号化された 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.binKMS キーローテーション
キーローテーションは、暗号化キーのマテリアルを定期的に置き換えるセキュリティのベストプラクティスです。キーが侵害された場合の影響期間を限定できます。Customer Managed Keysでは、毎年の自動ローテーションを有効にできます。KMS は新しいキーマテリアルを生成して新しい暗号化処理に使用し、既存データの復号に必要な古いキーマテリアルは保持します。AWS Managed Keysは毎年自動的にローテーションされます。Imported key materialは自動ローテーションをサポートしていないため、手動でローテーションする必要があります。ローテーション後は、アプリケーションを変更しなくても、新しい 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 は 3 つのサーバーサイド暗号化オプションをサポートしています。SSE-S3 — S3 が AES-256 を使用してキーを管理します。無料で、制御性は最小限です。SSE-KMS — KMS キー(AWS managed または 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 は証明書のライフサイクルを自動的に処理します。証明書の有効期限が切れる 60 日前に更新し、更新された証明書を透過的にデプロイします。所有するドメインの証明書をリクエストすることも、サードパーティーの証明書をインポートすることもできます(DNS または E メールで検証します)。ACM 証明書はダウンロードできません
# 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 デバイス)に証明書を発行するための、完全マネージド型のプライベート CA 階層を作成できます。インターネットに公開するサービスで使用するパブリック ACM 証明書とは異なり、プライベート CA 証明書は任意の内部ホスト名や IP アドレスに対して発行できます。Private CA は、マイクロサービス間の相互 TLS(mTLS)、証明書ベースの VPN 認証、内部 PKI に関するコンプライアンス要件などに使用します。Private CA の料金は、CA 1 つにつき月額 400 ドル、発行する証明書 1 件につき 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/xxxEBS と RDS の暗号化
EBS ボリュームの暗号化は、ボリュームの作成時に有効にします(または、既存のボリュームを暗号化を有効にしてコピーします)。スナップショットを含むボリューム上のすべてのデータは、指定した KMS キーを使用して暗号化されます。EBS 暗号化はオペレーティングシステムから透過的に扱われるため、アプリケーションの変更は必要ありません。RDS の暗号化は、DB インスタンスの作成時に有効にします。既存の暗号化されていない RDS インスタンスを直接暗号化することはできません。回避策として、暗号化されていないインスタンスから暗号化済みのスナップショットを作成し、それを新しい暗号化済みインスタンスに復元します。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クライアントサイド暗号化とサーバーサイド暗号化
サーバーサイド暗号化とクライアントサイド暗号化の違いを理解することは、SAA-C03 試験において重要です。サーバーサイド暗号化では、AWS がデータを受信した後に暗号化し、配信する前に復号します。アプリケーションと AWS の間では、データは平文のままです。クライアントサイド暗号化では、AWS に送信する前にデータを暗号化します。AWS に保存されるのは暗号文だけで、AWS が平文を見ることはありません。医療記録や厳格な規制の対象となる金融データなど、クラウドプロバイダーが平文を扱うことを信頼できない、特に高い機密性が求められるデータには、クライアントサイド暗号化を使用します。
# 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 policyKMS のクロスアカウントアクセス
KMS キーは、クロスアカウント暗号化の用途で AWS アカウント間で共有できます。たとえば、Account A のアプリケーションが Account B の所有する S3 バケットに暗号化データを書き込む場合、Account A の KMS キーで Account B のプリンシパルによる使用を許可する必要があります。Account A のKMS キーポリシーを設定してクロスアカウントアクセスを許可し、続いて Account B にIAM ポリシーを作成して、ロールが Account A のキーを使用できるようにします。このパターンは、中央アカウントが暗号化キーを管理するデータ共有やマルチアカウントアーキテクチャで一般的に使用されます。
# 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クイックチェック
このレッスンで学んだ AWS Solutions Architect(SAA-C03)の概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、KMS は HSM による保護付きで暗号化キーを管理し、きめ細かなアクセス制御と監査証跡のために CMK をサポートすること、ACM は AWS サービス向けの TLS 証明書を無料で発行し、自動更新すること、そして暗号化はサーバーサイド(KMS)またはクライアントサイドで適用でき、AWS ネイティブのワークロードではサーバーサイドが最も一般的なパターンであることを学びました。暗号化されていない操作を拒否するバケットポリシーを使用して、暗号化を強制します。次は GuardDuty、Inspector、Macie について学びます。
よくある質問
「KMS、ACM、暗号化パターン」レッスンは無料ですか?
はい。「KMS、ACM、暗号化パターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。
「KMS、ACM、暗号化パターン」で何を学びますか?
AWS KMSで暗号化キーを管理し、ACMでTLS証明書をプロビジョニング・ローテーションして、クライアント側、サーバー側、転送中の暗号化から適切な方式を選びます。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AWS Solutions Architectを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「KMS、ACM、暗号化パターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAWS Solutions Architectレッスンでコードを書いて実行できますか?
はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。