S3バケットのアクセスをオブジェクト単位で制限!ユーザー単位のアクセス制限方法はこれだ!

S3バケットのアクセスをオブジェクト単位で制限!ユーザー単位のアクセス制限方法はこれだ!

こんにちは!

今回は、S3 バケットのアクセス制限について解説していきます!要件によってはユーザーによって公開する情報の範囲が異なるかと思います。そんなときにこちらを参考にしていただければ幸いです!

想定する読者

  • S3 バケットのアクセス制限をしたいヒト
  • AWS のアクセス制限について知りたいヒト

はじめに

S3 バケットのアクセス制限には IAM を利用いたします。

本記事では、バケット単位のみならずオブジェクト単位でのアクセス制限に関する情報なども提供いたしますので、細かいアクセス制限を行う際の参考にしてみてください!

S3 バケットに関するアクセス制限

S3 バケットにアクセスされる場合、ユーザーの IAM ロールに付与する IAM ポリシーをカスタマイズすることで、アクセス制限を実現できます。

以下、様々なパターンに応じて設定方法を説明します。

バケット単位による制限

バケット単位で制限する場合は、以下のようなポリシーをユーザーに付与しましょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::mybucket"
        }
    ]
}

注目する部分は Resource パラメータの部分になります。こちらでアクセスさせたいバケットを指定します。

特定のS3バケットはアクセスを拒否し、それ以外はすべて許可する設定にしたい場合は、Effect パラメータを Deny にして特定の S3 バケットを指定します。

その際は、ほかのポリシーで S3 に対するアクセスを許可してください。例えば AdministratorAccess のポリシーを付与している状態で、特定の S3 バケットを拒否しているポリシーを付与する形が考えられます。

IAM ポリシーはデフォルトですべてを拒否しているので、その点を考慮して IAM ポリシーを設計してください。

フォルダおよびオブジェクト単位による制限

次にフォルダ単位での制限を説明いたします。こちらは以下の IAM ポリシーで実現できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket/test1/*",
                "arn:aws:s3:::mybucket/test2/serverless-bot-framework.pdf"
            ]
        }
    ]
}

先程紹介した、バケット単位でのアクセス制限の IAM ポリシーにパスを追加するだけです。

記述例では、test1 フォルダすべてと test2 フォルダにある serverless-bot-framework.pdf のアクセスを許可しています。

この状態でマネジメントコンソールを確認してみましょう。ファイルを開こうとすると AccessDenied とエラーが表示されます。

エラー画面

ユーザーごとのアクセス制限の運用

これまでの説明を通じて、S3 バケットに対するアクセス制限は、ポリシーの Resource パラメータにてパスを指定するだけという、とても単純な仕組みで成り立っていることがご理解いただけたかと思います。

しかし方法は簡単でも運用していく上において、ユーザー単位でポリシーを適用する場合などは手間になるときもあるでしょう。ここではいくつかのアクセス制限に関する運用方法をご紹介します。

IAM グループによるアクセス制限

こちらは文字通り、いくつかの IAM グループを作成し、IAM グループに対し IAM ポリシーを付与することで、ユーザーのアクセス制限を行います。

例えば、S3バケット内にグループごとのフォルダを作成し、IAM グループにはグループ名と同じフォルダ名にしかアクセスさせないようなIAMポリシーを付与すれば、ユーザーをグループ単位でアクセス制限することができます。

アクセス制限の粒度にもよりますが、第一に考えるアクセス制限の運用方法として、IAM グループを利用して制限するというものがあります。

ユーザーごとにフォルダを準備する

例えば、Googleドライブのようにユーザーが何かのファイルを自分にしか見れない場所にアップロードする場合、S3バケットにユーザー名ごとのフォルダを事前に作成します。

そして IAM ポリシーには自分の名前のフォルダにしかアクセスできないように制限をかけることで、ユーザーは自分がアップロードしたリソースにしかアクセスできないようにすることができます。

この場合、以下のような IAM ポリシーを利用します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"]
    }
  ]
}

上記のように変数を用いてアクセスできるフォルダを限定することができます。変数名の通り、変数にはユーザー名が自動的に代入されます。これをグループのポリシーにアタッチしておけば、そのグループに属するユーザーは自分のフォルダしか操作できないようになります。

参考にしたドキュメントはこちらになりますので、ぜひ応用してみてください。

Cognito ユーザーに応じたアクセス制限

Cognito ユーザーの S3 に対するアクセスを制限したい場合、以下のようなポリシーでユーザー ID に応じたフォルダにしかアクセスできないよう権限をコントロールすることができます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}}
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"]
    }
  ]
}

このポリシーは Cognito Identity Pool の承認ロールに付与します。

上記のポリシーは、S3 バケットのパスに記載している変数に Cognito ユーザーの ID を代入します。これによりユーザー ID ごとのフォルダにアクセスできるよう権限を自動的に付与することができます。

なおこの部分は Cognito UserPool の UI 画面でいうと以下の部分となります。

Cognito に関するほかの変数をポリシーに利用したい場合はこちらをご確認ください。

関連記事

まとめ

S3 バケットやオブジェクトのアクセス制限のポリシーは、変数をうまく活用することで柔軟な自動化されたポリシーの作成が可能となります。特にユーザーごとのフォルダをバケット内に用意する場合には相性がいいので、積極的に活用していただければと思います。

IAM と S3 のポリシーに関する AWS ドキュメントでは、さらに詳細な情報が記載されておりますので、興味ある方はそちらでさらに理解を深めるのもいいですね。

当ブログでは、AWS の記事をどんどん公開しておりますので、ご興味のある方はほかの記事もご覧いただければと思います。

AWS に関する開発は、お気軽にお問い合わせください。