Closed8

特定のタグがついたオブジェクトをs3からダウンロードできないようにする

not75743not75743

検証用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
}
not75743not75743

方針

s3のバケットポリシーで特定タグのついたオブジェクトをGetObject不可とし、ファイルのダウンロードを防ぐ

not75743not75743

バケットポリシー

s3バケット内のすべてのオブジェクトに対し、s3:GetObjectDenyしている

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyGetObjectForMalicious",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "<s3バケットArn>/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/Scan": "malicious"
                }
            }
        }
    ]
}
not75743not75743

テスト用ファイルのアップロード

バケット名を変数に設定

シンプルにするためです

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}]'
not75743not75743

動作確認

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にクローズされました