IAM ポリシーにおける S3 アクションの対象範囲について
はじめに
こんにちは、さすけです!
S3 アクションを ARN を使用して制限する際に覚えておくべきルールのようなものをご紹介しようかと思います。
以前、私が書いた こちらのブログ の補足的な内容にもなっておりますので、具体例を交えて理解したい方はぜひこちらも読んでいただければと思います。
概要
先述のブログを振り返る意味でも、今回お話しすることの概要を簡単に説明させていただきます。
「s3:GetObject アクションと s3:ListBucket アクションで特定のパスへ制限をかけるポリシーの書き方が違う理由」についてです。
文字では何を言っているのかわかりにくいと思いますので、早速本題に入っていきましょう。
2 つのポリシーの違い
まずは、目的としては list-deny
バケット内にある testdata
フォルダにあるオブジェクトに対して制限をかけたいというものです。
それぞれ以下のようになります。
{
"Sid": "GetDeny01",
"Action": "s3:GetObject",
"Effect": "Deny",
"Resource": "arn:aws:s3:::list-deny/testdata/*"
}
{
"Sid": "ListDeny01",
"Action": "s3:ListBucket",
"Effect": "Deny",
"Resource": "arn:aws:s3:::list-deny",
"Condition": {
"StringLike": {
"s3:prefix": "testdata/*"
}
}
}
2 つの違いとして、パスを指定する場合に s3:GetObject に関しては「Resource」でフォルダ配下のオブジェクトまで指定できている。
対して、s3:ListBucket に関しては、「Resource」ではバケットまで指定しており、フォルダおよびオブジェクトの指定に関しては s3:prefix で指定している点です。
なぜ違うのか
では、この 2 つのポリシーはなぜオブジェクトへのパスを指定する方法を変えなければならないのでしょうか。
これは単純に「当該 S3 アクションは "オブジェクト" を対象としているのか "バケット" を対象としているのか」という違いです。
s3:GetObject アクションは、"Object" とアクション名に入っているように "オブジェクト" を対象としています。そのため、「Resource」だけでオブジェクトまでパスを指定できます。
それに対して、s3:ListBucket アクションは、"Bucket" とアクション名に入っています。そのことから対象を "バケット" としていることがわかります。この場合には「Resource」では バケットまでしか指定できません。
まとめ
IAM ポリシーの S3 アクションにおける対象範囲についてお話しさせていただきました。
この 2 つのポリシーが違うことに気がついた際には「なんとなく違うものなんだなぁ」という認識でしかなかったのですが、「なぜ違うのか」を調べてみたら至極単純なものでしたね(当たり前だろって思った人も少なくないかも!)。
とはいえ私は知りませんでしたし、これさえ覚えておけば、今後 IAM ポリシーを書く際にほんの少しだけ迷うことが減るのかなぁと思ったりしています。
小ネタ的感覚で書いたブログですので、今回は以上となります。ありがとうございました!
参考資料
アノテーション株式会社
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。