nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【AWS】S3のアクセス権制御についてまとめてみた

こんにちは!nomurabbitです。
AWSのサービスってどれも魅力的で便利ですよね。

ところで、アクセス権の制御は大丈夫?

ついつい動かすことに夢中になって、
ふと気づくと、

「あれ?このサービスって、アクセス権って大丈夫だっけ?」

って不安になることないですか?

…私、しょっちゅうあります。

そこで、この記事ではAWSのアクセス権制御について、
今回はS3に絞ってまとめてみたいと思います。

S3のアクセス権制御は全部で三種類

S3のアクセス権は、ACL、IAMポリシー、
バケットポリシーの三種類の方法で制御できます。

まずACLですが、
ACLは一つのバケットに一つくっつけることができます。
設定できる項目は三種類のなかで一番粗く、

  • バケット所有者 (AWS アカウント)
  • 全員 (パブリックアクセス)
  • Authenticated Users グループ (AWS アカウントを持つすべてのユーザー)
  • S3 ログ配信グループ

に対して、
それぞれバケットそのものや
バケット内のオブジェクト一式の
読み書きを 一括で 制御できます。

言い方を変えると、
一括でしか制御できない のがACLです。

次にIAMポリシーですが、
こちらはJSON形式でポリシーを記述することによって、
細かなアクセス権制御 が可能です。

要はIAMなので、その名の通りIAMポリシーを
ユーザーやロールにくっつけて制御します。

最後にバケットポリシーです。

IAMポリシーと同様JSON形式で 細かい制御 ができます。
こちらもバケットポリシーを
バケットにくっつけて制御します。

どうやって使い分けたらいいの?

実際はケースバイケースなのですが、
私ならこんな感じで使う
というのを紹介していきます。

参考にしていただければと思います。

ACLの使い方

  1. バケット所有者 (AWS アカウント)のみ、すべてチェックする。
  2. その他はすべてチェックをはずす。

ACLはもともと細かい制御ができません。
そのため、最低限の許可を与えることにしております。

IAMポリシーの使い方

ここで紹介するのは、
作業用のユーザーやロールのためのポリシーだよ。

どこまで制御するか迷いましたが、
Actionの一覧を眺めた上で、
必要そうなActionだけ許可することにしました。

DeleteBucket などの許可には注意が必要ですね。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]

上記のほかに、MultipartUpload系のActionを
追加してもいいかも!

バケットポリシーの使い方

IAMポリシーで許可したロール以外は全て拒否したいと思います。
ポリシーの中身はこんな感じになると思います。

{
    "Version": "2012-10-17",
    "Id": "Policy1234567890",
    "Statement": [
        {
            "Sid": "Stmt1234567890",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "~RoleId~:*"
                    ]
                }
            }
        }
    ]
}

この設定、最初全然わからなかったんですけど、
クラスメソッド様の神エントリーがありました。

dev.classmethod.jp

ありがてぇです!

とまあ、こんな感じで
S3のアクセス権制御についてまとめてみました。

よかったら試してみてください。
では!

参考記事

docs.aws.amazon.com