Closed8
特定のタグがついたオブジェクトをs3からダウンロードできないようにする
参考
検証用Terraformファイル
main.tf
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "bucket" {
}
resource "aws_s3_bucket_policy" "bucket_policy" {
bucket = aws_s3_bucket.bucket.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Sid" : "DenyGetObjectForMalicious",
"Effect" : "Deny",
"Principal" : "*",
"Action" : "s3:GetObject",
"Resource" : "${aws_s3_bucket.bucket.arn}/*",
"Condition" : {
"StringEquals" : {
"s3:ExistingObjectTag/Scan" : "malicious"
}
}
}
]
})
}
output "s3bucket_name" {
value = aws_s3_bucket.bucket.bucket
}
イメージ図
方針
s3のバケットポリシーで特定タグのついたオブジェクトをGetObject
不可とし、ファイルのダウンロードを防ぐ
バケットポリシー
s3バケット内のすべてのオブジェクトに対し、s3:GetObject
をDeny
している
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyGetObjectForMalicious",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "<s3バケットArn>/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/Scan": "malicious"
}
}
}
]
}
テスト用ファイルのアップロード
バケット名を変数に設定
シンプルにするためです
export S3Bucket=<先述のバケットポリシーを適用したs3バケット名>
アップロード
okとngで2種類アップロード。中身は同じ
$ aws s3 cp ./test.txt s3://$S3Bucket/ok.txt
$ aws s3 cp ./test.txt s3://$S3Bucket/ng.txt
タグ付け
ダウンロードできないようにng.txt
にタグ付けします。
$ aws s3api put-object-tagging \
> --bucket $S3Bucket \
> --key ng.txt \
> --tagging 'TagSet=[{Key=Scan,Value=malicious}]'
動作確認
CLI
aws s3 cp
でローカルに落とせるかどうか確認します。
タグがついていない方は問題なく落とせます。
$ aws s3 cp s3://$S3Bucket/ok.txt .
download: s3://略/ok.txt to ./ok.txt
タグをつけたng.txt
は403エラーでダウンロードできません。
$ aws s3 cp s3://$S3Bucket/ng.txt .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
コンソール
コンソールでもおなじく403エラーでダウンロード不可です
このスクラップは2023/07/24にクローズされました