IAMユーザーにS3のそのIAMユーザー名ディレクトリのみアクセスを許可したい

記事タイトルとURLをコピーする

ひょっとするとタイトルのようなことをしないといけない時が来るかもしれません。

以下のドキュメントを参考にしました。

Amazon S3: IAM ユーザーが自分の S3 ホームディレクトリにプログラムおよびコンソールでアクセスすることを許可する

下記のIAMポリシーをIAMユーザーへ適用してやればOKです。 ドキュメントと違いはhomeディレクトリはなしを想定しています。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::バケット名",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::バケット名/${aws:username}",
                "arn:aws:s3:::バケット名/${aws:username}/*"
            ]
        }
    ]
}

ConditionでS3プレフィックスを指定することでそのフォルダしか操作できません。

しかし上記のポリシーだと、マネコンからの操作で一番上に空のフォルダが作れてしまうようです。

なので下記のようにしてみました。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::バケット名",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "PutObject",
            "Resource": "arn:aws:s3:::バケット名/*",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "${aws:username}/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::バケット名/${aws:username}",
                "arn:aws:s3:::バケット名/${aws:username}/*"
            ]
        }
    ]
}

PutObjectにもConditionでS3プレフィックスを指定してやれば作れなくなりました。