🚫

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

2023/07/24に公開

はじめに

今回はs3の特定タグのついたオブジェクトをダウンロード不可にしました。
オペミスなどの不注意対策に有効だと思います。

適用するバケットポリシー

  • タグキーが「Scan」
  • タグバリューが「malicious」である
  • すべてのs3オブジェクトを対象に
  • s3:GetObjectアクションを
  • Denyする

といったバケットポリシーをs3に適用します。

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

検証イメージ

検証

環境用意(Terraform)

  • s3バケット
  • 先述のバケットポリシー

を用意します。

もしくはTerraformで環境再現できるようにしているため、必要であれば参照ください。
s3:ExistingObjectTagの値を編集すれば別タグにも応用可能です。

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
}

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

バケット名を変数に設定

コマンドをシンプルにするために設定します。

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

コンソール

コンソールでもCLIと同様、ng.txtをダウンロードすると403エラーで弾かれます。

おわりに

s3のオブジェクトへのアクセス制御をタグで実施することが出来ました。
応用がきくと思うので、ぜひ参考にしてみてください。

参考

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys
https://dev.classmethod.jp/articles/s3-de-abac/

Discussion