既存のAWSリソースを暗号化する方法完全ガイド - 15のサービス別暗号化手順と注意点
運用中のAWSリソースを暗号化するための実践的なガイドです。EBS、EFS、S3、RDS、DynamoDB、ElastiCacheなど15の主要サービスの暗号化手順と注意点を解説し、セキュリティ向上のための具体的なステップを提供します。
目次
- はじめに - AWS暗号化の重要性
- 暗号化対象リソース一覧と準備事項
- ストレージサービスの暗号化
- データベースサービスの暗号化
- メッセージングサービスの暗号化
- 分析・キャッシュサービスの暗号化
- 暗号化作業時の注意点とベストプラクティス
- 終わりに
はじめに
AWS環境でのデータ暗号化は、セキュリティとコンプライアンス要件を満たすために不可欠です。多くのAWSサービスでは、デフォルトで暗号化が有効になっていない場合があり、明示的に設定する必要があります。
本記事では、運用中のAWSリソースを安全に暗号化する方法を、サービス別に詳しく解説します。
暗号化対象リソース一覧
主要な暗号化対象サービス
| サービス分類 | サービス名 | 暗号化方式 | 既存リソース直接暗号化 | 暗号化方法 |
|---|---|---|---|---|
| ストレージ | EBS | KMS | ❌ 不可 | スナップショット→新規作成 |
| ストレージ | EFS | KMS | ❌ 不可 | 新規作成→データ移行 |
| ストレージ | S3 | KMS, S3管理 | ⚠️ 設定のみ | バケット設定変更(既存オブジェクトは個別対応) |
| データベース | RDS | KMS | ❌ 不可 | スナップショット→新規作成 |
| データベース | Aurora | KMS | ❌ 不可 | スナップショット→新規作成(クラスター単位) |
| データベース | DynamoDB | KMS | ❌ 不可 | 新規テーブル作成→データ移行 |
| メッセージング | SQS | KMS | ✅ 可能 | 既存キュー属性変更 |
| メッセージング | SNS | KMS | ✅ 可能 | 既存トピック属性変更 |
| メッセージング | Kinesis | KMS | ✅ 可能 | 既存ストリーム暗号化有効化 |
| 分析・キャッシュ | ElastiCache | KMS | ❌ 不可 | 新規作成→データ移行(Redis のみ) |
| 分析・キャッシュ | EMR | KMS | ❌ 不可 | 新規クラスター作成 |
| 分析・キャッシュ | Redshift | KMS | ❌ 不可 | 新規クラスター作成 |
準備事項
-
AWS KMS キーの準備
- カスタマー管理キーの作成
- 適切な IAM ポリシーの設定
- マルチアカウント環境での クロスアカウント設定
-
バックアップの取得
- データ損失防止のための完全バックアップ
-
メンテナンス時間の確保
- サービス停止時間の計画
ストレージサービスの暗号化
EBS(Elastic Block Store)
⚠️ 重要:既存EBSボリュームは直接暗号化できません
EBSボリュームは作成後に暗号化設定を変更することができません。暗号化するには、スナップショット経由で新しいボリュームを作成する必要があります。
現状確認
# 暗号化されていないEBSボリュームの確認
aws ec2 describe-volumes --filters Name=encrypted,Values=false --query 'Volumes[*].{VolumeId:VolumeId,Size:Size,State:State,Attachments:Attachments[0].InstanceId}' --region us-east-1
暗号化手順
-
事前準備(重要)
- インスタンスの停止(データボリュームの場合)
- アプリケーションの停止とデータの整合性確保
-
スナップショット作成
# スナップショット作成
aws ec2 create-snapshot --volume-id vol-1234567890abcdef0 --description "Pre-encryption backup $(date +%Y%m%d-%H%M%S)" --region us-east-1
- 暗号化されたスナップショット作成
# 暗号化コピー作成
aws ec2 copy-snapshot --source-region us-east-1 --source-snapshot-id snap-066877671789bd71b --description "Encrypted snapshot" --encrypted --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- 新しいボリューム作成
# 暗号化されたボリューム作成(--encrypted フラグは不要:暗号化スナップショットから作成する場合は自動的に引き継がれる)
aws ec2 create-volume --size 8 --snapshot-id snap-066877671789bd71b --availability-zone us-east-1a --region us-east-1
- ボリュームの付け替え
# 既存ボリュームのデタッチ
aws ec2 detach-volume --volume-id vol-1234567890abcdef0 --region us-east-1
# 新ボリュームのアタッチ
aws ec2 attach-volume --volume-id vol-新しいボリューム --instance-id i-1234567890abcdef0 --device /dev/sdf --region us-east-1
注意点
- 直接暗号化は不可能:既存ボリュームの暗号化設定は変更できません
- copy-snapshot 使用時の制限:元のスナップショットがすでに暗号化されている場合は再暗号化できません
- ダウンタイム発生:EC2インスタンスの停止が必要
- ルートボリュームの場合:インスタンスの再作成またはAMI経由での移行が必要
- パフォーマンス影響:暗号化により約5-10%程度のI/O性能低下
EFS(Elastic File System)
⚠️ 重要:既存EFSは直接暗号化できません
EFSファイルシステムは作成後に暗号化設定を変更することができません。暗号化するには、新しいEFSファイルシステムを作成してデータを移行する必要があります。
現状確認
# 暗号化されていないEFSの確認
aws efs describe-file-systems --query 'FileSystems[?Encrypted==`false`].{FileSystemId:FileSystemId,CreationTime:CreationTime,Name:Name}' --region us-east-1
暗号化手順
- 新しい暗号化EFS作成
# 暗号化EFS作成
aws efs create-file-system --creation-token encrypted-efs-$(date +%s) --performance-mode generalPurpose --throughput-mode provisioned --provisioned-throughput-in-mibps 100 --encrypted --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- マウントターゲット作成
# マウントターゲット作成
aws efs create-mount-target --file-system-id fs-12345678 --subnet-id subnet-12345678 --security-groups sg-12345678 --region us-east-1
- データ移行(AWS DataSync推奨)
# DataSyncタスク作成
aws datasync create-task --source-location-arn arn:aws:datasync:us-east-1:123456789012:location/loc-abcdef01234567890 --destination-location-arn arn:aws:datasync:us-east-1:123456789012:location/loc-1234567890abcdef0 --region us-east-1
注意点
- 直接暗号化は不可能:既存EFSの暗号化設定は変更できません
- 新規作成・移行が必要:データ移行による一時的な複製コスト
- 大容量データの考慮:移行時間とネットワーク帯域の計画が必要
- AWS DataSync使用推奨:効率的で安全なデータ移行
S3(Simple Storage Service)
✅ 既存バケットの暗号化設定は変更可能
S3バケットは既存のバケットに対してデフォルト暗号化設定を追加・変更できます。ただし、既存のオブジェクトは個別に暗号化する必要があります。
現状確認
# バケットの暗号化設定確認
aws s3api get-bucket-encryption --bucket my-bucket-name --region us-east-1
暗号化手順
- バケットデフォルト暗号化設定(既存バケット対応)
# SSE-S3での暗号化設定
aws s3api put-bucket-encryption --bucket my-bucket-name --server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}
]
}' --region us-east-1
- KMS暗号化設定(既存バケット対応)
# SSE-KMSでの暗号化設定
aws s3api put-bucket-encryption --bucket my-bucket-name --server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
}
}
]
}' --region us-east-1
- 既存オブジェクトの暗号化(個別対応必要)
# 既存オブジェクトの暗号化(メタデータ変更も含む)
aws s3 cp s3://my-bucket-name/my-object s3://my-bucket-name/my-object --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --metadata-directive REPLACE --region us-east-1
- S3 Batch Operations による大量暗号化
# S3 Batch Operations ジョブ作成(マニフェストファイルとIAMロールが事前に必要)
aws s3control create-job --account-id 123456789012 --region us-east-1 --operation '{
"S3PutObjectCopy": {
"TargetResource": "arn:aws:s3:::my-bucket-name",
"CannedAccessControlList": "private",
"SSEAwsKmsKeyId": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012",
"StorageClass": "STANDARD"
}
}' --manifest '{
"Spec": {
"Format": "S3BatchOperations_CSV_20180820",
"Fields": ["Bucket", "Key"]
},
"Location": {
"ObjectArn": "arn:aws:s3:::my-bucket-name/manifest.csv",
"ETag": "example-etag"
}
}' --role-arn arn:aws:iam::123456789012:role/batch-operations-role --priority 10
注意点
- バケット設定変更は即座に反映:新しくアップロードされるオブジェクトから暗号化適用
- 既存オブジェクトは個別対応必要:デフォルト暗号化設定は既存オブジェクトに適用されない
- 再アップロード時の注意:メタデータ変更がない場合は再暗号化されない可能性あり
- S3 Batch Operations使用時の前提条件:マニフェストファイルとIAMロールの事前準備が必要
- 大量オブジェクトの場合:S3 Batch Operationsの使用を強く推奨
- コスト考慮:KMS暗号化の場合、リクエスト料金が発生
データベースサービスの暗号化
RDS(Relational Database Service)
⚠️ 重要:既存RDSインスタンスは直接暗号化できません
RDSインスタンスは作成後に暗号化設定を変更することができません。暗号化するには、スナップショット経由で新しいインスタンスを作成する必要があります。
現状確認
# 暗号化されていないRDSインスタンスの確認
aws rds describe-db-instances --query 'DBInstances[?StorageEncrypted==`false`].{DBInstanceIdentifier:DBInstanceIdentifier,Engine:Engine,DBInstanceStatus:DBInstanceStatus,MultiAZ:MultiAZ}' --region us-east-1
暗号化手順
-
事前準備
- メンテナンスウィンドウの設定
- アプリケーションの停止またはリードレプリカへの切り替え
-
スナップショット作成
# スナップショット作成
aws rds create-db-snapshot --db-instance-identifier mydb --db-snapshot-identifier mydb-snapshot-$(date +%Y%m%d-%H%M%S) --region us-east-1
- 暗号化されたスナップショット作成
# 暗号化コピー作成
aws rds copy-db-snapshot --source-db-snapshot-identifier mydb-snapshot-20240101 --target-db-snapshot-identifier mydb-encrypted-snapshot --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- 新しいインスタンス作成
# 暗号化されたインスタンス作成
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier mydb-encrypted --db-snapshot-identifier mydb-encrypted-snapshot --db-instance-class db.t3.micro --region us-east-1
- エンドポイント切り替え
# 既存インスタンスの停止(必要に応じて)
aws rds stop-db-instance --db-instance-identifier mydb --region us-east-1
# DNSまたはアプリケーション設定でエンドポイントを新インスタンスに変更
注意点
- 直接暗号化は不可能:既存インスタンスの暗号化設定は変更できません
- ダウンタイム発生:通常30分〜1時間程度(データベースサイズによる)
- 料金への影響:暗号化による追加料金はほとんどなし
- パフォーマンス影響:暗号化による性能低下は最小限(1-5%程度)
Aurora
⚠️ 重要:既存Auroraクラスターは直接暗号化できません
Auroraはクラスター単位での暗号化設定となり、インスタンス単位ではありません。暗号化するには、スナップショット経由で新しいクラスターを作成する必要があります。
現状確認
# 暗号化されていないAuroraクラスターの確認
aws rds describe-db-clusters --query 'DBClusters[?StorageEncrypted==`false`].{DBClusterIdentifier:DBClusterIdentifier,Engine:Engine,Status:Status}' --region us-east-1
暗号化手順
- クラスタースナップショット作成
# クラスタースナップショット作成
aws rds create-db-cluster-snapshot --db-cluster-identifier myauroracluster --db-cluster-snapshot-identifier myauroracluster-snapshot-$(date +%Y%m%d-%H%M%S) --region us-east-1
- 暗号化されたスナップショット作成
# 暗号化コピー作成
aws rds copy-db-cluster-snapshot --source-db-cluster-snapshot-identifier myauroracluster-snapshot-20240101 --target-db-cluster-snapshot-identifier myauroracluster-encrypted-snapshot --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- 新しいクラスター作成
# 暗号化されたクラスター作成
aws rds restore-db-cluster-from-snapshot --db-cluster-identifier myauroracluster-encrypted --snapshot-identifier myauroracluster-encrypted-snapshot --region us-east-1
注意点
- クラスター単位の暗号化:Auroraでは個別インスタンスではなくクラスター全体が暗号化対象
- 直接暗号化は不可能:既存クラスターの暗号化設定は変更できません
- 全インスタンスが影響:クラスター内の全インスタンスが同じ暗号化設定を共有
DynamoDB
❌ 重要:既存テーブルの暗号化キー変更は基本的に不可能
DynamoDBでは既存テーブルの暗号化方式(AWS管理キー→カスタマー管理キー)を変更することはできません。暗号化キーを変更したい場合は、新しいテーブルを作成してデータを移行する必要があります。
現状確認
# テーブルの暗号化設定確認
aws dynamodb describe-table --table-name MyTable --query 'Table.SSESpecification' --region us-east-1
暗号化手順
- 新しいテーブル作成(暗号化設定付き)
# 暗号化設定付きテーブル作成
aws dynamodb create-table --table-name MyTable-Encrypted --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- データ移行
# AWS Data Pipelineまたは DynamoDB Streamsを使用したデータ移行
# または、アプリケーションレベルでの段階的なデータ移行
- 設定確認
# 新テーブルの設定確認
aws dynamodb describe-table --table-name MyTable-Encrypted --query 'Table.SSESpecification' --region us-east-1
注意点
- 暗号化キー変更は不可能:既存テーブルの暗号化方式は変更できません
- 新規テーブル作成が必要:データ移行による一時的な複製コスト
- 段階的移行推奨:アプリケーションの影響を最小限に抑えるため
- DynamoDB Streamsの活用:リアルタイムデータ同期に有効
メッセージングサービスの暗号化
SQS(Simple Queue Service)
✅ 既存キューの暗号化設定は変更可能
SQSキューは既存のキューに対して暗号化設定を追加・変更できます。
現状確認
# キューの暗号化設定確認
aws sqs get-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue --attribute-names KmsMasterKeyId --region us-east-1
暗号化手順
# 既存キューの暗号化設定
aws sqs set-queue-attributes --queue-url https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue --attributes KmsMasterKeyId=arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012,KmsDataKeyReusePeriodSeconds=300 --region us-east-1
注意点
- 既存キューの暗号化設定変更が可能:ダウンタイムなしで実行
- 新しいメッセージから暗号化適用:既存メッセージは暗号化されない
- KMS料金が発生:メッセージの送受信時にKMS APIが呼ばれる
SNS(Simple Notification Service)
✅ 既存トピックの暗号化設定は変更可能
SNSトピックは既存のトピックに対して暗号化設定を追加・変更できます。
現状確認
# トピックの暗号化設定確認
aws sns get-topic-attributes --topic-arn arn:aws:sns:us-east-1:123456789012:MyTopic --query 'Attributes.KmsMasterKeyId' --region us-east-1
暗号化手順
# 既存トピックの暗号化設定
aws sns set-topic-attributes --topic-arn arn:aws:sns:us-east-1:123456789012:MyTopic --attribute-name KmsMasterKeyId --attribute-value arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
注意点
- 既存トピックの暗号化設定変更が可能:ダウンタイムなしで実行
- 新しいメッセージから暗号化適用:設定変更後のメッセージから暗号化
- 購読者への影響:購読者がKMSキーにアクセスできる必要あり
Kinesis Data Streams
✅ 既存ストリームの暗号化設定は変更可能
現状確認
# ストリームの暗号化状態確認
aws kinesis describe-stream-summary --stream-name MyStream --query 'StreamDescriptionSummary.EncryptionType' --region us-east-1
暗号化手順
# ストリームの暗号化有効化(事前に暗号化状態を確認してから実行)
aws kinesis enable-stream-encryption --stream-name MyStream --encryption-type KMS --key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
注意点
- 既存ストリームの暗号化設定変更が可能:ダウンタイムなしで実行
- 事前確認が重要:既に暗号化が有効な場合は再実行時にエラーとなる可能性
- 新しいレコードから暗号化適用:設定変更後のレコードから暗号化
分析・キャッシュサービスの暗号化
ElastiCache
⚠️ 重要:既存クラスターは直接暗号化できません(Redis のみ対応)
ElastiCacheでは暗号化はRedisのみサポートされており、Memcachedは暗号化に対応していません。既存クラスターの暗号化設定変更はできないため、新規作成が必要です。
現状確認
# 暗号化されていないRedisクラスターの確認
aws elasticache describe-cache-clusters --query 'CacheClusters[?AtRestEncryptionEnabled==`false` && Engine==`redis`].{CacheClusterId:CacheClusterId,Engine:Engine}' --region us-east-1
暗号化手順
- 新しいクラスター作成(Redis)
# 暗号化されたRedisクラスター作成(保存時暗号化と転送時暗号化を両方有効化)
aws elasticache create-cache-cluster --cache-cluster-id myredis-encrypted --engine redis --cache-node-type cache.t3.micro --num-cache-nodes 1 --at-rest-encryption-enabled --transit-encryption-enabled --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- データ移行
# Redis CLIやアプリケーションを使用したデータ移行
# redis-cli --rdb でバックアップ取得後、新クラスターへリストア
注意点
- Redisのみ対応:Memcachedは暗号化に対応していない
- 既存クラスターの暗号化は不可:新規作成が必要
- 保存時・転送時両方の暗号化:TransitEncryptionEnabled と AtRestEncryptionEnabled の両方を有効にする
- データの移行作業が必要:移行時の一時的な複製コスト
EMR(Elastic MapReduce)
⚠️ 重要:既存クラスターは直接暗号化できません
EMRクラスターは作成時にのみ暗号化設定が可能です。暗号化を有効にするには、新しいクラスターを作成する必要があります。
暗号化手順
- セキュリティ設定作成
# セキュリティ設定作成(事前に必要)
aws emr create-security-configuration --name MySecurityConfiguration --security-configuration file://security-config.json --region us-east-1
- 暗号化設定付きクラスター作成
# 暗号化設定付きクラスター作成
aws emr create-cluster --name "Encrypted EMR Cluster" --
### EMR(Elastic MapReduce)
**⚠️ 重要:既存クラスターは直接暗号化できません**
EMRクラスターは作成時にのみ暗号化設定が可能です。暗号化を有効にするには、新しいクラスターを作成する必要があります。
**セキュリティ設定ファイルの例(security-config.json)**
```json
{
"EncryptionConfiguration": {
"EnableInTransitEncryption": true,
"EnableAtRestEncryption": true,
"AtRestEncryptionConfiguration": {
"S3EncryptionConfiguration": {
"EncryptionMode": "SSE-KMS",
"AwsKmsKey": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
},
"LocalDiskEncryptionConfiguration": {
"EncryptionKeyProviderType": "AwsKms",
"AwsKmsKey": "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012"
}
},
"InTransitEncryptionConfiguration": {
"TLSCertificateConfiguration": {
"CertificateProviderType": "PEM",
"S3Object": "s3://my-bucket/certificates/certificateBundle.pem"
}
}
}
}
暗号化手順
- セキュリティ設定作成
# セキュリティ設定作成
aws emr create-security-configuration --name MySecurityConfiguration --security-configuration file://security-config.json --region us-east-1
- 暗号化設定付きクラスター作成
# 暗号化設定付きクラスター作成
aws emr create-cluster --name "Encrypted EMR Cluster" --release-label emr-6.15.0 --instance-type m5.xlarge --instance-count 3 --security-configuration MySecurityConfiguration --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --region us-east-1
注意点
- クラスター作成時のみ設定可能:既存クラスターの暗号化は不可
- S3とローカルディスクの両方を暗号化:包括的なデータ保護
- 転送時暗号化の証明書管理:TLS証明書の事前準備が必要
- パフォーマンス影響:暗号化により5-15%程度の性能低下
Redshift
⚠️ 重要:既存クラスターは直接暗号化できません
Redshiftクラスターは作成時にのみ暗号化設定が可能です。暗号化を有効にするには、新しいクラスターを作成する必要があります。
現状確認
# 暗号化されていないRedshiftクラスターの確認
aws redshift describe-clusters --query 'Clusters[?Encrypted==`false`].{ClusterIdentifier:ClusterIdentifier,ClusterStatus:ClusterStatus,NodeType:NodeType}' --region us-east-1
暗号化手順
- 既存クラスターのスナップショット作成
# 手動スナップショット作成
aws redshift create-cluster-snapshot --cluster-identifier myredshift --snapshot-identifier myredshift-snapshot-$(date +%Y%m%d-%H%M%S) --region us-east-1
- 暗号化されたクラスター作成
# 暗号化設定付きクラスター作成
aws redshift create-cluster --cluster-identifier myredshift-encrypted --node-type dc2.large --master-username admin --master-user-password MyPassword123! --encrypted --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
- データ復元
# スナップショットからデータ復元
aws redshift restore-from-cluster-snapshot --cluster-identifier myredshift-encrypted --snapshot-identifier myredshift-snapshot-20240101 --region us-east-1
注意点
- クラスター作成時のみ設定可能:既存クラスターの暗号化は不可
- 大容量データの移行時間:数TB〜数PBのデータ移行は数時間〜数日要する場合あり
- 暗号化によるパフォーマンス影響:通常3-8%程度の性能低下
- コスト考慮:KMS暗号化の場合、キー使用料が発生
アプリケーションサービスの暗号化
Lambda(関数の環境変数)
✅ 既存関数の暗号化設定は変更可能
Lambda関数の環境変数は既存の関数に対して暗号化設定を追加・変更できます。
現状確認
# 関数の暗号化設定確認
aws lambda get-function-configuration --function-name MyFunction --query 'KMSKeyArn' --region us-east-1
暗号化手順
# 既存関数の環境変数暗号化設定
aws lambda update-function-configuration --function-name MyFunction --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
注意点
- 既存関数の設定変更が可能:ダウンタイムなしで実行
- 環境変数のみ暗号化:関数コード自体は暗号化されない
- デプロイ時の暗号化:環境変数は保存時に暗号化される
CloudWatch Logs
✅ 既存ロググループの暗号化設定は変更可能
現状確認
# ロググループの暗号化設定確認
aws logs describe-log-groups --log-group-name-prefix "/aws/lambda/" --query 'logGroups[?!kmsKeyId].logGroupName' --region us-east-1
暗号化手順
# 既存ロググループの暗号化設定
aws logs associate-kms-key --log-group-name /aws/lambda/MyFunction --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
注意点
- 既存ロググループの暗号化設定変更が可能:ダウンタイムなしで実行
- 新しいログから暗号化適用:設定変更後のログから暗号化
- KMS料金が発生:ログの書き込み・読み取り時にKMS APIが呼ばれる
CloudTrail
✅ 既存証跡の暗号化設定は変更可能
現状確認
# 証跡の暗号化設定確認
aws cloudtrail describe-trails --query 'trailList[?!KMSKeyId].{Name:Name,S3BucketName:S3BucketName}' --region us-east-1
暗号化手順
# 既存証跡の暗号化設定
aws cloudtrail update-trail --name MyTrail --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
注意点
- 既存証跡の暗号化設定変更が可能:ダウンタイムなしで実行
- 新しいログから暗号化適用:設定変更後のログから暗号化
- S3バケットとの連携:S3バケット側の暗号化設定も確認推奨
暗号化作業時の注意点とベストプラクティス
作業前の準備チェックリスト
1. 権限の確認
# KMS権限の確認
aws kms describe-key --key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --region us-east-1
2. バックアップの取得
# 包括的なバックアップスクリプト例
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_BUCKET="my-backup-bucket"
# EBS スナップショット
aws ec2 create-snapshot --volume-id vol-1234567890abcdef0 --description "Pre-encryption backup $DATE"
# RDS スナップショット
aws rds create-db-snapshot --db-instance-identifier mydb --db-snapshot-identifier mydb-backup-$DATE
# S3 バックアップ(別バケットへのコピー)
aws s3 sync s3://my-source-bucket s3://$BACKUP_BUCKET/backup-$DATE/
3. 依存関係の確認
- アプリケーション間の依存関係
- 他のAWSサービスとの連携
- 外部システムとの接続
段階的な暗号化アプローチ
フェーズ1: 影響の少ないリソースから開始
- CloudWatch Logs
- CloudTrail
- Lambda環境変数
- 新規作成予定のリソース
フェーズ2: メッセージングサービス
- SQS
- SNS
- Kinesis Data Streams
フェーズ3: ストレージサービス
- S3(バケット設定のみ)
- EFS(新規作成・移行)
- EBS(スナップショット経由)
フェーズ4: データベースサービス
- DynamoDB(新規作成・移行)
- RDS(スナップショット経由)
- Aurora(クラスター単位)
フェーズ5: 分析・キャッシュサービス
- ElastiCache
- EMR
- Redshift
作業時の監視とログ
1. CloudTrail による操作ログ監視
# 暗号化関連の操作ログ確認
aws logs filter-log-events --log-group-name CloudTrail/MyTrail --filter-pattern "{ ($.eventName = CreateSnapshot) || ($.eventName = CopySnapshot) || ($.eventName = *Encrypt*) }" --start-time 1640995200000 --region us-east-1
2. CloudWatch メトリクスによる監視
# KMS キー使用量の監視
aws cloudwatch get-metric-statistics --namespace AWS/KMS --metric-name NumberOfRequestsSucceeded --dimensions Name=KeyId,Value=12345678-1234-1234-1234-123456789012 --start-time 2024-01-01T00:00:00Z --end-time 2024-01-02T00:00:00Z --period 3600 --statistics Sum --region us-east-1
暗号化後の検証
1. 暗号化状態の確認
# 各サービスの暗号化状態を一括確認するスクリプト例
#!/bin/bash
echo "=== EBS Volumes ==="
aws ec2 describe-volumes --query 'Volumes[*].{VolumeId:VolumeId,Encrypted:Encrypted,KmsKeyId:KmsKeyId}' --output table
echo "=== RDS Instances ==="
aws rds describe-db-instances --query 'DBInstances[*].{DBInstanceIdentifier:DBInstanceIdentifier,StorageEncrypted:StorageEncrypted,KmsKeyId:KmsKeyId}' --output table
echo "=== S3 Buckets ==="
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "Bucket: $bucket"
aws s3api get-bucket-encryption --bucket "$bucket" 2>/dev/null || echo " No encryption configured"
done
2. パフォーマンスの監視
# データベースのパフォーマンス監視
aws rds describe-db-instances --query 'DBInstances[*].{DBInstanceIdentifier:DBInstanceIdentifier,PerformanceInsightsEnabled:PerformanceInsightsEnabled}' --output table
トラブルシューティング
よくある問題と対処法
1. KMS キーへのアクセス権限エラー
# KMS キーポリシーの確認
aws kms get-key-policy --key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --policy-name default --region us-east-1
# IAM ロールの確認
aws iam get-role-policy --role-name MyRole --policy-name MyPolicy
2. 暗号化設定が反映されない
- 設定変更後の新しいデータのみ暗号化される
- 既存データは個別対応が必要
- キャッシュの影響でしばらく反映されない場合がある
3. パフォーマンス低下
- 暗号化によるCPU使用率の増加
- KMS APIコール回数の増加
- 適切なキーローテーション設定の確認
コスト最適化
1. KMS キー使用料の最適化
# KMS キー使用量の確認
aws cloudwatch get-metric-statistics --namespace AWS/KMS --metric-name NumberOfRequestsSucceeded --dimensions Name=KeyId,Value=12345678-1234-1234-1234-123456789012 --start-time 2024-01-01T00:00:00Z --end-time 2024-01-31T00:00:00Z --period 86400 --statistics Sum --region us-east-1
2. 暗号化方式の選択
- AWS 管理キー (SSE-S3):コスト効率的、基本的な暗号化
- カスタマー管理キー (SSE-KMS):詳細な制御、監査機能
- カスタマー提供キー (SSE-C):最大限の制御、管理負荷大
3. データ階層化によるコスト削減
- 重要度に応じた暗号化レベルの選択
- 古いデータのアーカイブ化
- 不要なデータの定期的な削除
暗号化の自動化とIaC
Terraform を使用した暗号化設定
1. KMS キーの定義
# KMS キーの作成
resource "aws_kms_key" "main" {
description = "Main encryption key"
deletion_window_in_days = 10
enable_key_rotation = true
tags = {
Name = "main-encryption-key"
}
}
resource "aws_kms_alias" "main" {
name = "alias/main-encryption-key"
target_key_id = aws_kms_key.main.key_id
}
2. 暗号化設定付きリソースの定義
# 暗号化設定付きRDS
resource "aws_db_instance" "main" {
identifier = "main-db"
engine = "mysql"
storage_encrypted = true
kms_key_id = aws_kms_key.main.arn
# その他の設定...
}
# 暗号化設定付きS3バケット
resource "aws_s3_bucket" "main" {
bucket = "my-encrypted-bucket"
}
resource "aws_s3_bucket_server_side_encryption_configuration" "main" {
bucket = aws_s3_bucket.main.id
rule {
apply_server_side_encryption_by_default {
kms_master_key_id = aws_kms_key.main.arn
sse_algorithm = "aws:kms"
}
}
}
AWS Config を使用した暗号化状態の監視
1. 暗号化ルールの設定
{
"ConfigRuleName": "encrypted-volumes",
"Description": "Checks whether EBS volumes are encrypted",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "ENCRYPTED_VOLUMES"
},
"Scope": {
"ComplianceResourceTypes": [
"AWS::EC2::Volume"
]
}
}
2. 非準拠リソースの自動修復
import boto3
import json
def lambda_handler(event, context):
"""
AWS Config ルール非準拠時の自動修復
"""
config_client = boto3.client('config')
# 非準拠リソースの取得
non_compliant = config_client.get_compliance_details_by_config_rule(
ConfigRuleName='encrypted-volumes',
ComplianceTypes=['NON_COMPLIANT']
)
for resource in non_compliant['EvaluationResults']:
resource_id = resource['EvaluationResultIdentifier']['EvaluationResultQualifier']['ResourceId']
# 自動修復処理(例:アラート送信)
send_alert(resource_id)
return {
'statusCode': 200,
'body': json.dumps('Remediation completed')
}
セキュリティ要件別の暗号化戦略
コンプライアンス要件への対応
1. PCI DSS 準拠
# PCI DSS 要件に適合する暗号化設定
# - 保存時暗号化:AES-256
# - 転送時暗号化:TLS 1.2以上
# - キー管理:HSM使用推奨
# CloudHSM を使用したキー管理
aws cloudhsmv2 create-cluster --hsm-type hsm1.medium --subnet-ids subnet-12345678,subnet-87654321 --region us-east-1
2. HIPAA 準拠
# HIPAA 要件に適合する暗号化設定
# - PHI データの暗号化
# - 監査ログの暗号化
# - アクセスログの暗号化
# 専用テナント設定
aws rds create-db-instance --db-instance-identifier hipaa-compliant-db --storage-encrypted --kms-key-id arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012 --publicly-accessible false --region us-east-1
多層防御戦略
1. データ分類と暗号化レベル
# データ分類に基づく暗号化マトリックス
data_classification:
public:
encryption: optional
key_type: aws_managed
internal:
encryption: required
key_type: aws_managed
confidential:
encryption: required
key_type: customer_managed
key_rotation: enabled
restricted:
encryption: required
key_type: customer_managed
key_rotation: enabled
hsm: required
2. 暗号化チェックリスト
## 暗号化実装チェックリスト
### 保存時暗号化
- [ ] EBS ボリューム
- [ ] RDS インスタンス
- [ ] S3 バケット
- [ ] DynamoDB テーブル
- [ ] EFS ファイルシステム
### 転送時暗号化
- [ ] ALB/NLB での TLS 終端
- [ ] API Gateway での TLS
- [ ] VPC エンドポイント
- [ ] RDS での SSL/TLS
- [ ] ElastiCache での TLS
### キー管理
- [ ] KMS キーの作成
- [ ] キーポリシーの設定
- [ ] キーローテーションの有効化
- [ ] クロスアカウントアクセス設定
### 監査とログ
- [ ] CloudTrail での KMS 操作ログ
- [ ] CloudWatch での KMS メトリクス監視
- [ ] AWS Config での暗号化状態監視
- [ ] 定期的な暗号化状態レポート
終わりに
AWS環境での暗号化は、セキュリティ強化の重要な要素です。本ガイドで解説した手順に従って、段階的かつ計画的に暗号化を実装することで、データの機密性を確保できます。
重要なポイントの再確認
- 事前準備の重要性:バックアップ取得と権限設定は必須
- 段階的な実装:影響の少ないリソースから順次実施
- 継続的な監視:暗号化状態の定期的な確認
- コスト最適化:適切な暗号化方式の選択
次のステップ
- 定期的な暗号化状態の監査
- 新しいAWSサービスの暗号化対応
- 暗号化設定の自動化推進
- セキュリティ要件の継続的な見直し
暗号化は一度設定すれば終わりではなく、継続的な管理とメンテナンスが必要です。定期的な見直しと最新のセキュリティ動向への対応を心がけましょう。
参考文献
AWS公式ドキュメント
暗号化全般
ストレージサービス
データベースサービス
メッセージング・分析サービス
- Amazon SQS 暗号化
- Amazon SNS 暗号化
- Amazon Kinesis Data Streams 暗号化
- Amazon ElastiCache 暗号化
- Amazon EMR 暗号化
- Amazon Redshift 暗号化
免責事項
本記事の内容は執筆時点での情報に基づいています。AWS サービスの仕様変更により、手順や設定方法が変更される可能性があります。実際の運用前には、最新のAWSドキュメントを参照してください。