自由気ままに書いちゃおう

好きなことをつらつらと・・・

IAMポリシーの種類とEffect/Actions/Resources/Condition/Principal要素について

今回は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>


 いろいろできるので下記サイトに纏めております。
 

www.guri2o1667.work




以上です。