Amazon S3のセキュリティベストプラクティスにおける「送信時のデータ暗号化」についてメモする。
用語・概念
-
TLS (Transport Layer Security):
ネットワーク通信の暗号化プロトコル。 -
HTTPS (HyperText Transfer Protocol Secure):
TLSにより暗号化されたHTTPプロトコル。これにより、通信経路上でのデータの盗聴や改竄を防止する。 -
aws:SecureTransport:
AWSのIAM条件キーの1つ。リクエストが暗号化(HTTPS/TLS)されているかどうかを判定し、暗号化されていないリクエストを拒否するために使用される。
設定が必要な理由 (設定しない場合のリスク)
-
中間者攻撃の防止:
HTTPS (TLS) により、ネットワーク上での通信が暗号化されるため、攻撃者が通信を盗聴したり改竄するリスクを大幅に低減できる。 -
データの完全性と信頼性:
暗号化された接続では、データが転送中に改ざんされるリスクが少なく、受信側が正しいデータを確実に受け取ることができる。 -
規制やコンプライアンスの遵守:
業界によっては、送信時のデータ暗号化が必須とされる場合があり、これにより法令や内部ポリシーに準拠した運用が可能になる。
中間者攻撃例
AWS CLIによる設定方法
バケットポリシー
- S3バケットポリシーにおいて、aws:SecureTransport 条件を利用し、暗号化されていないリクエスト(
aws:SecureTransport=false
)を拒否する設定を適用する。 - 以下のJSONポリシー例は、指定されたS3バケットへの全リクエストのうち、HTTPS (TLS) 経由でのアクセスのみを許可し、暗号化されていないリクエストは拒否する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnencryptedConnections",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
],
"Condition": {
"Bool": {"aws:SecureTransport": "false"}
}
}
]
}
AWS CLIでの設定手順
- 既存のバケットに対して、上記のポリシーを適用する場合は、
put-bucket-policy
コマンドを使用する。
aws s3api put-bucket-policy \
--bucket your-bucket-name \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnencryptedConnections",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
],
"Condition": {
"Bool": {"aws:SecureTransport": "false"}
}
}
]
}'