【小ネタ】S3 オブジェクトのアクセス制御

お久しぶりです、インフラストラクチャー部の沼沢です。

今回は S3 のオブジェクトに対するアクセス制御についてです。
User Agent で S3 オブジェクトへのアクセス制御したいという要望があり、ググっても意外と出てこなかったので書きました。

どうやって S3 オブジェクトへのアクセスを制御するか

結論から言うと、バケットポリシーで簡単に設定できます。
まずはポリシーの例を挙げます。

{
    "Version": "2012-10-17",
    "Id": "PolicyXXXXXXXXXXXXX",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXXXXX",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::numatest/numachi/index.html",
            "Condition": {
                "StringLike": {
                    "aws:UserAgent": "* numatest *"
                }
            }
        }
    ]
}

上記の例では以下の要件を満たしています。

「User Agent に “ numatest ” (前後に半角スペースあり)が含まれている場合のみ、numatest バケット内の numachi/index.html への GetObject を許可する」

このようにすることで、オブジェクトを公開状態に設定すること無く、特定のオブジェクトへのアクセスを許可することが可能です。

S3 オブジェクトを ◯◯ でアクセス制御したいという要件があった場合に重要になるのは、"Effect"、"Resource"、"Condition" の3つだと考えています。

IAM ポリシーと同じ書き方をするため、見慣れている方からすれば特に難しいことは無いと思いますが、少し解説します。

Effect

条件に一致した場合に許可(Allow)するのか拒否(Deny)するのかを指定します。
指定できるのは “Allow” または “Deny” のみです。
余談ですが、ここで “Deny” を定義することを 明示的な拒否 と言ったりしますが、これはまた別の機会があればお話したいと思います。

Resource

アクセス制御をしたいオブジェクトの ARN を指定します。
これは、以下のフォーマットで指定します。

...
"Resource": "arn:aws:s3:::<BucketName>/<ObjectKey>",
...

例ではそれぞれ、BucketName=numatest、ObjectKey=numachi/index.html ということになります。
また、配列で定義することで複数オブジェクトを指定できます。

...
"Resource": [
    "arn:aws:s3:::numatest/numachi/index.html",
    "arn:aws:s3:::numatest/numachi/help.html",
    ...
],
...

Condition

このポリシーを適用する条件を指定します。
これは、以下のフォーマットで指定します。

...
"Condition": {
    "<条件演算子>": {
        "<条件キー>": "<評価値>"
    },
    ...
},
...

例では、"StringLike" を使って User Agent の Like 検索を実施しています。
“StringLike” では、ワイルドカード(任意の複数文字一致 “*"、または任意の 1 文字一致の ”?“)を利用することが可能です。
仮に、「アクセス元の IP アドレス(xxx.xxx.xxx.xxx/24)での制御も入れてほしい」となった場合には、以下のように指定することで実現できます。

...
"Condition": {
    "StringLike": {
        "aws:UserAgent": "* numatest *"
    },
    "IpAddress": {
        "aws:SourceIp": "xxx.xxx.xxx.xxx/24"
    }
},
...

上記のように、Condition に複数条件を指定すると、AND 条件で判定されるため、どちらも一致した場合のみ、条件に一致したことになります。

まとめ

今回はメインの User Agent でのアクセス制御方法(+α)をご紹介しましたが、 Condition の条件演算子や条件キーには他にもいろいろなものが指定可能です。
詳しくは IAM ポリシーエレメントの参照 を確認していろいろ試してみてください。