[新機能]IAMの委譲権限を制限可能なPermissions Boundaryが登場したので試してみた

119件のシェア(ちょっぴり話題の記事)

にしざわです。ブログというか新機能について触るのも久々な感じですが、大好きなサービスの1つであるIAMサービスに、"Permissions Boundary"という新たな機能が登場したので、試してみたいと思います。ほぼ下記のドキュメントのシナリオ通りなのですが、よりシンプルに説明できるように少し設定を変えながら試した結果をご紹介します。

Permissions Boundaryとはどんな機能なのか?

このPermissions Boundaryは、IAMユーザまたはIAMロールに対するアクセス権限として動作します。これまで設定していたPermissions Policyに加えて、追加オプションとして設定することが可能です。Permission Boundaryは、定義済のManaged Policyから選択する形で設定を行います。

このオプションを設定した場合、権限がどのように評価されるのかについては、下記の図を見れば一目瞭然なのですが、Permissions PolicyとPermissions Boundaryの両方で許可されているものが有効なアクセス権限ということになります。

Evaluating Effective Permissions with Boundaries

想定されるのは、Permissions Boundaryでは、制限したいアクセス権を広く定義しつつ、Permissions Policyの方でユーザやロールごとに、付与したいアクセス権限を細かく管理するイメージになると思います。Permissions Boundaryについては、制限したい権限は細かく規定しなければいけない一方で、将来的に付与したいアクセス権限は許可しておかなければ、万一の権限追加の際にPermissions PolicyとPermissions Boundaryの両方をメンテナンスしなければいけないということにもなりかねませんので、十分に注意しましょう。

どんなユースケースで利用できるのか?

先日、Classmethodがリリースした無料のセキュリティ診断サービスであるinsightwatchでも利用しているCISベンチマークにおいても、IAM権限は適切に分離して運用することが推奨されています。今回の新機能を利用すれば、これまではできなかったような、より厳密な管理が行えるようになっています。

[AWS]CISで語られているIAMマスターロールとIAMマネージャーロールについて整理

具体的には、以下のようにIAM管理者にユーザへのIAM払い出しを任せつつ、以下のような制限をかけることができます。

Permissions Boundaryを試してみた

それでは、上記のようなシナリオに基づいて設定をしていきたいと思います。以下の記載については、公式ドキュメントを参考にしつつ、今回用意したシナリオを想定通りに動かす為に微修正したものですが、網羅的なテストを行っているわけではありませんので、ご了承ください。

Manged Policyを用意する

今回は、以下のようなManaged Policyを用意しました。今回の肝は最初に記載したBoundary用のポリシーです。

  • DelegatedUserBoundary
    • IAM管理者のPermissions Boundaryに設定する為のポリシー
    • 委譲するIAM権限の制限を行う
      • XCompanyBoundariesをBoundaryに設定したIAMユーザしか作れない
      • XCompanyBoundariesおよびDelegatedUserBoundaryの2つのポリシーを操作することはできない
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateUser",
                "iam:DeleteUserPolicy",
                "iam:UpdateUser",
                "iam:AttachUserPolicy",
                "iam:DetachUserPolicy",
                "iam:PutUserPolicy",
                "iam:PutUserPermissionsBoundary"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam:: 123456789012:policy/XCompanyBoundaries"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:List*",
                "iam:DeleteUser",
                "iam:*Group*",
                "iam:CreatePolicy",
                "iam:CreateLoginProfile",
                "iam:CreateAccessKey",
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:DeleteLoginProfile",
                "iam:DeleteAccessKey",
                "iam:SetDefaultPolicyVersion",
                "iam:SimulatePrincipalPolicy",
                "iam:SimulateCustomPolicy"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "iam:CreatePolicyVersion",
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:DeleteUserPermissionsBoundary",
                "iam:SetDefaultPolicyVersion"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:policy/XCompanyBoundaries",
                "arn:aws:iam:: 123456789012:policy/DelegatedUserBoundary"
            ]
        }
    ]
}
  • DelegatedUserPermissions
    • IAM管理者のPermissions Policyに設定する為のポリシー
    • IAM管理者に委譲したいポリシーを緩やかに記載(Permissions Boundaryで細かい制限を行う為、こちらでは細かい権限指定は行わない)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:*",
            "Resource": "*"
        }
    ]
}
  • XCompanyBoundaries
    • IAM管理者が払い出すIAMユーザ用のPermissions Boundary用のポリシー。この設定を必須とする。
    • 今回のテスト上では何を記載しても構わなかったが、IAMおよびOrganizationsへのアクセスとログ格納用バケットへのアクセスを制限するポリシーをサンプルとして記載
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:DeleteServiceLinkedRole",
                "iam:ListRoles",
                "organizations:DescribeOrganization"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DenyS3Logs",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::logs",
                "arn:aws:s3:::logs/*"
            ]
        }
    ]
}

IAM管理者用のIAMユーザを用意する

今回はその名の通り、iam-adminというIAMユーザを用意しました。

  • iam-admin
    • Permissions Policy
      • DelegatedUserPermissionsポリシー
    • Permissions Boundary
      • DelegatedUserBoundaryポリシー

Permissions Policyには複数のポリシーを登録することができますが、Permissions Boundaryには設定できるのは1つの管理ポリシーのみとなります。

Permissions Boundaryで動作が制限されることを確認する

iam-adminで想定通りの動作となるか、確認してみましょう。まずは、Permissions Boundaryが無いIAMユーザを作成してみると、想定通り作成に失敗しました。

想定したポリシーではないものをPermissions Boundaryに設定した場合でも試してみましが、やはり作成はできませんでした。

そこで想定している"XCompanyBoundaries"ポリシーをPermissions Boundaryに指定したIAMユーザを作成してみると、きちんと作成することができました。

そこで、IAM管理者が不正に自身の操作ができないことも確認してみましょう。

想定通り、iam-admin自身のPermissions Boundaryを削除することはできませんでした。

まとめ

今回は、新機能であるIAMのPermissions Boundaryを試してみました。今回の設定の課題として、払い出すユーザの削除をしようとすると、IAM管理者に" iam:DeleteUserPermissionsBoundary"が無い為、エラーになることがわかっていますので、運用においては少し工夫が必要なようです。ただ、今回の新機能により、より厳格なセキュリティポリシーに則った運用が可能となっているのは素晴らしいですね。他にも良いユースケースがあればご紹介していこうと思います。

どこかの誰かのお役に立てば嬉しいです。