【小ネタ】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 ポリシーエレメントの参照 を確認していろいろ試してみてください。
