今回はIAMポリシーとIAMポリシーをJSON形式で記載する際に必要となる
知識について記載しようと思います。
JSON形式を知らなくてもビジュアルエディタを使用すれば
ポリシー自体は作成できるので必須ではないですが、せっかくなので。
というのも、長い間、ResourcesとActionsの違いがわかっておらず、
あまり気にしてませんでした。自分の復習と情報整理を兼ねたいと思います。
■IAMポリシーについて
ざっくりいえば、「誰がどのAWSサービスの操作をどのリソースに対して許可/拒否するか」を記載します。
JSON形式で使用する要素(Effect/Actions/Resources/Condition/Principal)との対応は
下記の通りです。
「誰が」
→ Principal or IAMユーザ/IAMグループ
「どのAWSサービスの操作を」
→ Actions
「どのリソースに対して」
→ Resources
「許可/拒否するか」
→ Effect
といったことを記述/指定します。
■JSON形式を使う前に知っておきたいこと
私はここが曖昧のままIAMポリシーの作成に着手してしまったため、最初つまずきました。
まず、IAMポリシーには記述パターンがあり、大別すると下記の2種類が存在します。
※正確にはもう1つ(ロールベース)あるのですが、それは下記2パターンを理解してからで大丈夫かと。
1.ユーザベース
「誰が」にあたる部分を記載しないパターンです。
(=Principalの指定がないパターンです)
これは、IAMユーザやIAMグループにポリシーを紐づけることを前提としているため、
「誰が」の部分がすでに決まっており、
あえてポリシー内で定義する必要がないポリシーのことです。
また、「どのリソースに対して(=Resources)」も指定しないことが多いです。
そのため、JSON形式で見たときは「"Resource": "*"」と記載されていること多いです。
※"多い"だけで指定していることもあります。
以下はサンプルポリシーです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "*" } ] }
2.リソースベース
「どのリソースに対して(=Resources)、どのユーザが(=Principal)」を記載するポリシーのことです。
リソースに記載するのは、AWSサービス(例:S3)によって作成されたモノ(例:バケット)を指定します。
そのため、「リソース固有のポリシー(=リソースベースポリシー)」と呼ばれ。ARN(Amazonリソースネーム)番号を指定します。
「どのユーザが」に該当する部分は、IAMユーザ(ARN形式で記載)を指定することが多いです。
以下はサンプルポリシーです。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::123456789123:user/testuser"}, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::testbucket/*" } }
■ユーザベースとリソースベースの見分け方について
見分け方ですが・・・実は自信がなく・・・
語弊もあるかもしれないことを前置きしておきしておきます。。。(申し訳ないです)
Principalに着目し、
記載がなければユーザベース
記載があればリソースベース
です!!!
■各要素について
ここからはよく使う要素について記載します。
<Effect>
許可(Allow)と拒否(Deny)を指定します。これだけです。
<Actions>
「S3に対して閲覧のみ」とか「EC2に対して停止不可」とかを定義します。
注意したいのは、ここで定義するのは「AWSサービス」という大きな括りです。
何が言いたいかというと、
・特定インスタンスに対して停止を許可
・特定バケットに対して閲覧のみ
とかの具体的な指定はResourcesで指定します。
<Resources>
前述の通り、「具体的な指定」に該当するARNを定義します
<Principal>
IAMユーザやIAMグループをARN形式で指定します。
「特定ユーザだけ」って時に使います。
<Condition>
いろいろできるので下記サイトに纏めております。
以上です。