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

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

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>
 AWSサービスに対する動作を指定します。
 「S3に対して閲覧のみ」とか「EC2に対して停止不可」とかを定義します。
 注意したいのは、ここで定義するのは「AWSサービス」という大きな括りです。
 何が言いたいかというと、
 ・特定インスタンスに対して停止を許可
 ・特定バケットに対して閲覧のみ
 とかの具体的な指定はResourcesで指定します。

<Resources>
 前述の通り、「具体的な指定」に該当するARNを定義します。

<Principal>
 IAMユーザやIAMグループをARN形式で指定します。
 「特定ユーザだけ」って時に使います。

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

www.guri2o1667.work




以上です。