【AWS】IAM ~ IAM Policy 編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2017/02/26/231046

の続き、又は、以下の関連記事の一部。

https://dk521123.hatenablog.com/entry/2020/09/29/165636

 今回は、
IAM(Identity and Access Management)のIAM Policy(ポリシー)
について、メモする。

目次

【1】IAM Policy
【2】ポリシーの種類
 1)インラインポリシー (Inline policies)
 2)管理ポリシー (Managed policies)
【3】アクセス許可境界
【4】IAM Policy / JSON要素
 1)Version
 2)Statement
 3)Sid
 4)Effect
 5)Action
 6)Resource
 7)Condition
 8)Principal
【5】サンプル
 例1:Hello world
 例2:EC2 の開始・停止
 例3:EC2 の ReadOnly

【1】IAM Policy

* S3を含むAWSリソースへのアクセス権・実行権限を
 JSON形式で定義・コントロールできる

もう少し、深堀りすると

* 以下のルールに基づき、AWSの各サービスに対して、
 アクセス権・実行権限をコントロールできる
~~~~
 a) Action
 b) Resource
 c) Effect (許可 Allow / 拒否 deny)
~~~~

* 更に、深堀りするなら、以下のサイトが勉強になりそう。

https://dev.classmethod.jp/articles/iam-group-policy-for-s3-bucket-control/

【2】ポリシーの種類

* ポリシーには、以下の2種類がある
1)インラインポリシー
2)管理ポリシー

1)インラインポリシー (Inline policies)

* 対象(ユーザ・グループ)ごとに作成・付与するポリシー

注意点

* 複数ユーザ・グループに同種の権限を付与することには向かない

2)管理ポリシー (Managed policies)

* 1つのポリシーを複数ユーザ・グループに適用可能
* 管理ポリシーには、更に2種類ある
 [1] AWS管理ポリシー
 [2] カスタマー管理ポリシー

[1] AWS管理ポリシー

* AWS側で用意しているポリシー(e.g. PowerUser)

[2] カスタマー管理ポリシー

* ユーザ自身が管理するポリシー
* 最大過去5世代までバージョン管理できる
 => 誤った設定をした場合に即座に前の設定に戻すことができる

【3】アクセス許可境界

 Permissions PolicyとPermissions Boundaryの両方で許可されているものが
有効なアクセス権限となるので、両方設定していないと有効にならない
 => 以下のトラブルにより知った

EMRのBootstrapでエラー「BOOTSTRAP_FAILURE_BA_DOWNLOAD_FAILED_PRIMARY」が表示
https://dk521123.hatenablog.com/entry/2023/08/17/002559

【4】IAM Policy / JSON要素

* 代表的なものは以下の通り。
~~~~~~~
1)Version
2)Statement
3)Sid
4)Effect
5)Action
6)Resource
7)Condition
8)Principal
~~~~~~~

* 詳細および上記以外の項目は、以下の公式サイトを参照

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html

1)Version

* ポリシー言語のバージョン
* 「"Version": "2012-10-17"」は現行の最新。(「2008-10-17」は旧バージョン)

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_version.html

2)Statement

* 設定項目

3)Sid

* 任意の識別子
* JSON ポリシー内で固有にする必要がある
* !メモ! あると可読性があがるから指定したほうがいい

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_sid.html

4)Effect

* 「許可(Allow)」or「拒否(Deny)」
* 明示的な拒否ステートメント(Deny)は、許可ステートメント(Allow)よりも優先される

5)Action

* 対象サービス操作
* 配列形式

6)Resource

* 対象リソース
* 配列形式。

7)Condition

* 実行する条件を指定可能

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_condition.html

* 以下の関連記事のRoleのように実行条件「タグにOwner=Admin」が
 設定されているもののみ実行を許可するような制限を書けることができる

https://dk521123.hatenablog.com/entry/2020/08/05/144724

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticmapreduce:RunJobFlow"
            ],
            "Resource": "arn:aws:ec2:elasticmapreduce:*/*",
            "Condition": {
                "StringEquals": {"elasticmapreduce:ResourceTag/Owner": "admin"}
            }
        }
    ]
}

8)Principal

* リソースへのアクセスを許可または拒否する
 ユーザー、アカウント、サービス、または他のエンティティを指定

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html

【5】サンプル

S3 に関するアクセス制御については、以下の関連記事を参照のこと。

Amazon S3 ~ アクセス制御 / IAM Policy 編 ~
https://dk521123.hatenablog.com/entry/2020/10/24/201738

例1:Hello world

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"S3Control",
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::your-s3-bucket/xxxx/*"
      },
      {
         "Sid":"CloudWatchControl",
         "Effect":"Allow",
         "Action":[
            "logs:*"
         ],
         "Resource":"*"
      },
   ]
}

例2:EC2 の開始・停止

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:Describe*",
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}

例3:EC2 の ReadOnly

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ec2:Describe*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "elasticloadbalancing:Describe*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:ListMetrics",
        "cloudwatch:GetMetricStatistics",
        "cloudwatch:Describe*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "autoscaling:Describe*",
      "Resource": "*"
    }
  ]
}

関連記事

IAM ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/02/26/231046
IAM ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2022/07/03/000000
Amazon S3 ~ アクセス制御編 ~
https://dk521123.hatenablog.com/entry/2020/09/29/165636
Amazon S3 ~ アクセス制御 / IAM Policy 編 ~
https://dk521123.hatenablog.com/entry/2020/10/24/201738
AWS Glue のトラブル ~ Job編 ~
https://dk521123.hatenablog.com/entry/2019/10/25/232155
Amazon EMR に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/08/05/144724
EMRのBootstrapでエラー「BOOTSTRAP_FAILURE_BA_DOWNLOAD_FAILED_PRIMARY」が表示
https://dk521123.hatenablog.com/entry/2023/08/17/002559