S3バケットの操作権限をバケット名で制限する – 複数部署や複数ベンダー環境で役立つTips –

2018.09.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

S3を複数部署や、複数ベンダーなど、色々な人が操作する場合に、このバケットはこの人しかさわれない、というような制限の方式を考えてみます。

EC2やRDSだと、リソースのタグをベースに権限を制限することができます。このタグが付いてたら、操作を許可するというIAMポリシーを書けます。

参考:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_ec2_tag-owner.html

これをS3でやればできるじゃん!と思ったんですが、実際みてみたらEC2の「ec2:ResourceTag」にあたるキーはあったんですが、オブジェクトレベルのタグを取得する感じでした(s3:ExistingObjectTag)。そのため、オブジェクトレベルでEC2と同じようにタグによってアクセス制御できます。

ただ、今回やりたいことはオブジェクトレベルではなく、S3バケットレベルです。では、どんな方式がありそうか考えてみました。

考えた方式

S3バケットポリシーに許可するIAMポリシーを書く

これでも、実現できますが、S3バケット作成したあと、毎回バケットポリシー適用する必要があります。これは、正直面倒です。面倒という悪は運用でカバーせずになんとか別の方法で回避したいものです。バケットポリシー以外の方法を考えてみます。

IAMポリシーで許可対象のS3を制限する

これだと、S3バケット作成ごとにバケットポリシーを設定しなくても済みます。ただし!今度はIAMポリシー側に、毎回許可するS3バケットを指定しないといけないです。そもそもIAMポリシーをいじれる権限があるとすると、なんでもできちゃうのでいけてないです。なので、以下のようなIAMポリシーを考えてみました。

  • 特定の文字列がバケット名に入っている場合に操作権限を許可する > 特定の文字列とは、部署とかグループ名とか役割とか組織に合わせて指定します

このIAMポリシーを作ると、インフラ側で毎回何も変更せずに意図した権限を付与します。利用者は、S3バケットを作成するときに、バケット名に特定の文字列を入れるだけです。自動的にバケット名にも命名規則ができて整理もしやすいという副次効果もありそうです。

やってみた

ということで、実際に特定の文字列が入ったバケットしか操作できないようなIAMを作成してみました。

以下のポリシーを、IAMグループやIAMロールに適用してみます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::awsgroup-*",
                "arn:aws:s3:::awsgroup-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}

このポリシーでは、以下のことを行なっています。

  • awsgroup-hogehogeというバケットポリシーのみ操作を許可(ワイルドカード指定なので、hogehogeは自由に指定できる)
  • どんなバケットがあるかリスト表示する権限

実際に、IAMポリシーを適用したロールで動作確認してみました。

awsgroup-という名前以外のバケットを操作

バケット作成できません!

中身も見れません!

awsgroup-という名前のバケットを操作

作成できました!

アップロード、ファイル削除もできました!

その他の操作も問題なさそうです。

まとめ

沢山の役割が存在する環境での、S3の操作権限についてお送りしました。やりかたは色々あるため、悩ましいですが、運用も考慮してベストな構成を選択できると、後々幸せが訪れます。だかのお役に立てられたら嬉しいです。それではまた!