IAMユーザー ポリシー深堀

iam_policy

課題

自己学習している中でところどころIAMの用語が出てきたときに、「あれこれなんだっけ?」となることがあるため、今回はその不明点について理解を深めていきたいと思います。

IAMユーザー/ポリシーを深堀する内容

  • そもそもIAMユーザーとは
  • IAMユーザーを作成できる権限とは何か
  • AWS マネージドポリシーとは
  • IAMアイデンティティとは

そもそもIAMユーザーとは

IAMユーザーだけでは、魂の抜け殻で、ポリシーをアタッチすることで初めて効果を発揮できます。

IAMユーザーを作る意図は、[どんなユーザー]、[誰が]を使用しているかを判別するために作成するもの、と自分の中で考えています。

[どんなユーザー]
  • dev-user (開発環境)
  • stg-user (検証環境)
  • prod-user (本番環境)

などと分けておくことで、環境を分けてどんなユーザーを使用しているのかがわかります。

ただ、個人で開発する場合には上記3つでも事足りるかもしれませんが、チーム開発する場合はこの3つでは足りません。

IAMユーザーを複数人で共有していると、[操作ログ]を確認する際に困難になります。

AWSではCloudTrailでAWS上の操作ログを取得しています。

以下の図を見ていただくとわかりますが、誰が、いつ、何に対して、何をしたか?の操作ログをすべて記録しています。

先ほどの分け方をすると、この[誰が]の部分が明確化できなくなってしまいます。

チームで開発する場合には、利用者ごとにIAMユーザーを発行をする必要があります。

  • dev-user-A
  • dev-user-B

などとしておけば[誰が]の部分は明確化できるでしょう。

IAMユーザーを作成できる権限は何か

普段はAWS管理ポリシー名AdministratorAccess権限を使用しているため、意識せずともIAMユーザーを追加することができてしまいます。

AdministratorAccess は以下の許可ポリシーがアタッチされています。

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

結論: このポリシーはIAMユーザーの作成をすることは可能です。

フルアクセス権限のため、AWSサービスおよびリソースへのアクションを許可します。

PowerUserAccessはどうか

結論: IAMユーザーを作成することはできません。

その他、AWS Organizations、AWS Account Managementなどのアクションも許可されていません。

ポリシーの説明:  

このポリシーの最初のステートメントでは、NotAction  要素を使用して、すべての AWS のサービスのすべてのアクションと、すべてのリソース (AWS Identity and Access Management、AWS Organizations、AWS Account Management を除く) のすべてのアクションを許可します。

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

このNotActionとは [許可しないもの]を定義しています。

以下はAWS管理ポリシーPowerUserAccessポリシーの一部を抜粋したものです。

"NotAction"

"iam:*",

"organizations:*",

"account:*"

上記を指定しているため、結論で申し上げたようにIAMユーザーの作成をすることを許していません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*",
                "account:*"
            ],
            "Resource": "*"
        },

AWS管理ポリシー PowerUserAccess 全体は以下

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*",
                "account:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:DeleteServiceLinkedRole",
                "iam:ListRoles",
                "organizations:DescribeOrganization",
                "account:ListRegions",
                "account:GetAccountInformation"
            ],
            "Resource": "*"
        }
    ]
}

ではどうすれば、IAMユーザーを発行できるようになるのか?

同じように考えているdevelopsers ioの記事がありました。

PowerUserでIAMUserを発行できるようになりたかっただけなのに~権限の複雑さを味わってみた~ | DevelopersIO

「PowerUserだってIAMUser発行したいっ!」 そう思う事があったのでPowerUserベースにカスタムポリシーを作成したのですが、存外大変だった話をしたいと思います。

こちらの記事を参考にどんなAction の記載が必要なのかを確認してみたいと思います。

IAMの管理者権限と仮定してiam-administratorというIAMユーザーを作成しました。

このIAMユーザーに土台となるポリシーとしてPoserUserAccessを使用します。

対象のIAMユーザーを選択し、[許可タブ] を選択、[許可を追加] → [インラインポリシーを作成]を選択します。

[アクセス許可の指定画面]で[JSON]を選択します。

ポリシーエディタに対してPowerUserAccessをコピペします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*",
                "account:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:DeleteServiceLinkedRole",
                "iam:ListRoles",
                "organizations:DescribeOrganization",
                "account:ListRegions",
                "account:GetAccountInformation"
            ],
            "Resource": "*"
        }
    ]
}

CreateUserを追加してみる

"iam:CreateUser" を追加してIAMユーザーが作成できるか確認してみます。

結果はこんな感じです。

以下のアクションが足らないようです。

AWS公式のサービス許可リファレンスから内容を確認してみました。

GetAccountSummary: AWS アカウント 内での IAM エンティティの使用状況と IAM クォータに関する情報を取得するアクセス許可を付与

ListMFADevices: IAM ユーザーの MFA デバイスを一覧表示する許可を付与

ListAccessKeys: 指定の IAM ユーザーに関連付けられたアクセスキー ID に関する情報を一覧表示する許可を付与

ListUsers: 指定されたパスのプレフィックスを持つ IAM ユーザーを一覧表示する許可を付与

本来適切なポリシーがアタッチされていれば、以下のような画面が表示される想定ですが、それらを許可していないがために、上記のよう[アクセス拒否]メッセージを表示しているようです。

ダッシュボード画面

IAMユーザー画面

では、これらのポリシーを追加していきましょう。

これで[変更を保存]します。

以下のアカウントでログインし、ダッシュボードを確認すると、エラーは消えました。

ただ、この状態でもまだポリシーは足りません。

  • ポリシーの一覧が見れない
  • ポリシーのアタッチができない
  • アクセスキーの作成ができない

これらを解消するため以下のポリシーを追加します。

  • iam:ListPolicies
  • iam:AttachUserPolicy
  • iam:CreateAccessKey

また、ListUsersのポリシーのみではIAMユーザーの一覧のみしか表示できないため、アタッチしたポリシーやアクセスキーなどが確認できないため以下のポリシーを追加します。

  • iam:ListAccessKeys
  • iam:ListAttachedUserPolicies
  • iam:GetUser
  • iam:GetPolicyVersion
  • iam:ListUserPolicies
  • iam:ListGroupsForUser
  • iam:ListGroups
  • iam:GetLoginProfile
  • iam:GetUserPolicy
  • iam:GetRole
  • iam:ListAttachedRolePolicies
  • iam:ListRolePolicies

結果的に追加ポリシーは以下となりました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*",
                "account:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateUser",
                "iam:CreateAccessKey",
                "iam:GetAccountSummary",
                "iam:ListMFADevices",
                "iam:ListAccessKeys",
                "iam:ListUsers",
                "iam:ListPolicies",
                "iam:AttachUserPolicy",
                "iam:ListAccessKeys",
                "iam:ListAttachedUserPolicies",
                "iam:GetUser",
                "iam:GetPolicyVersion",
                "iam:ListUserPolicies",
                "iam:ListGroupsForUser",
                "iam:GetLoginProfile",
                "iam:GetUserPolicy",
                "iam:ListGroups",
                "iam:CreateServiceLinkedRole",
                "iam:DeleteServiceLinkedRole",
                "iam:ListRoles",
                "iam:GetRole",
                "iam:ListAttachedRolePolicies",
                "iam:ListRolePolicies",
                "organizations:DescribeOrganization",
                "account:ListRegions",
                "account:GetAccountInformation"
            ],
            "Resource": "*"
        }
    ]
}

上記までの設定でIAMユーザー (ポリシー、ロール参照)を作成するインラインポリシーの作成はできました。

ただ、このポリシーでは以下ができません。

  • インラインポリシーの作成変更ができない (PubUserPolicyの付与が必要)
  • ロールの作成ができない (PutRolePolicyの付与が必要)

上記操作を行う場合には( )内に記載したポリシーを付与する必要があります。

AWSマネージドポリシーとは

AWSマネージドポリシー = AWS管理ポリシー であることがAWS公式ドキュメントを読むことでわかりました。

管理ポリシーとインラインポリシー

AWS 管理ポリシー、カスタマー管理ポリシー、およびインラインポリシーの違いについて説明します。

マネージド ポリシー (Managed Policy) = 管理ポリシー

AWSマネージドポリシーはAWS管理ポリシーのことであり、なおかつAWS管理ポリシーとはその名の通りAWSが管理するポリシーのため、意図してユーザーがこのポリシーの内容を変更することはできません。

IAMアイデンティティとは

IAMアイデンティティを理解するには以下をセットで理解しておくと良いです。

  • IAMリソース
  • IAMアイデンティティ
  • IAMエンティティ
  • プリンシパル
IAMリソースIAMで管理するもの全て
AMユーザー、グループ、ロール、ポリシーなどを指す
IAMアイデンティティ権限付与の対象となるリソース
IAMユーザー、グループ、ロールなどを指す
IAMエンティティAWSの認証の実体
IAMユーザー、ロールなどを指す
プリンシパルAWSリソース操作を委任されたユーザーまたはロール

まとめ

IAM、IAMポリシーについて疑問に思っていた点、特にIAMユーザーを作成できる権限を重点的に深ぼってみました。

IAMユーザーを作成できる権限という名目で記事を書いてみましたが、IAMユーザーのみならず、ポリシー、ロール、グループなどIAMを管理する上で必要なこと、として検証した記事となりました。

結論、IAMを管理する上で必要なポリシーを追加していくのは一筋縄ではいかないことがわかりました。

AWS管理ポリシーで、IAM管理者ポリシーがあればそれに越したことはないですが、現状はそういったポリシー自体はないようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です