🚫
特定のタグがついたオブジェクトをs3からダウンロードできないようにする
はじめに
今回は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のオブジェクトへのアクセス制御をタグで実施することが出来ました。
応用がきくと思うので、ぜひ参考にしてみてください。
参考
Discussion