SCPを使って特定のアクセス許可セットのみIAMユーザー作成を許可してみる

2022.03.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今まで「アクセス権限セット」だったのが、いつの間にかドキュメントやコンソール上は「アクセス許可セット」になっていました。本ブログでは「アクセス許可セット」で統一しています。

アクセス許可セット - AWS Single Sign-On

実現したいこと

SCPで以下を実現したい場合、どんなSCPを作成する必要があるかを考えてみました。

  • 特定のアクセス許可セットを割り当てているSSOユーザー(グループ)以外は、IAMユーザーに関わる操作をさせないようにしたい
  • IAMロールは作成できるようにしたい

マルチアカウント環境であれば、各アカウントへのログインはSSO経由に集約することが多いです。その場合に、利用者にはIAMユーザーを作成させずに、IAMロールのみを使用させたいというケースをSCPで実現できないかを試してみました。

具体的なAWS SSOの仕組みについては以下のブログがわかりやすいので、ぜひご一読ください。

別の解決方法としてPermissions boundaryを用いた方法もあります。

作成したSCPのポリシー

タイトルにはIAMユーザー作成を許可と書きましたが、指定したアクセス許可セット以外からのIAM ユーザーと IAM グループの作成、更新、削除を禁止しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyEditIAMUserAndGroup",
      "Effect": "Deny",
      "Action": [
        "iam:CreateUser",
        "iam:CreateLoginProfile",
        "iam:CreateAccessKey",
        "iam:UpdateUser",
        "iam:DeleteUser",
        "iam:CreateGroup",
        "iam:UpdateGroup",
        "iam:DeleteGroup",
        "iam:AddUserToGroup",
        "iam:RemoveUserFromGroup",
        "iam:AttachUserPolicy",
        "iam:DetachUserPolicy",
        "iam:PutUserPolicy",
        "iam:DeleteUserPolicy",
        "iam:AttachGroupPolicy",
        "iam:DetachGroupPolicy",
        "iam:PutGroupPolicy",
        "iam:DeleteGroupPolicy"
      ],
      "Resource": "*",
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_{アクセス許可セット名}_*"
          ]
        }
      }
    }
  ]
}

ここのConditionで制限している内容は、リクエストをおこなったプリンシパルのARNが指定したSSOのIAMロールのARNじゃなかったら拒否するという条件です。{アクセス許可セット名}は適宜作成しているアクセス許可セットに合わせて変更してください。

SSOからメンバーアカウントへログインする際に利用するIAMロールは、アクセス許可セットが元になっています。そのためメンバーアカウントに作成されるIAMロール名はAWSReservedSSO_(アクセス許可セット名)_(英字小文字と数字の組み合わせのランダムな文字列)となります。ランダムな文字列の部分をワイルドカードを使うことで除外対象としています。

参考:IAM JSON ポリシー要素: 条件演算子 - AWS Identity and Access Management

やってみる

SCPで除外したアクセス許可セット と 除外していないアクセス許可セットそれぞれから、メンバーアカウントにログインしてIAMユーザーを作成してみます。どちらもAdministratorAccessの権限を付与して、SCPの制限から除外できているかを確認します。

SCPの設定

ログインするアカウントが所属しているOUに、先ほど紹介したSCPポリシーを新しく作成してアタッチします。今回はdeny-create-iam-userというポリシーを作成しました。

除外指定していないアクセス許可セット

SSO作成時にデフォルトで作成されるAWSAdministratorAccessでログインして、IAMユーザーが作成できるか試してみます。このアクセス許可セットにはAdministratorAccessのマネージドポリシーがアタッチされていますが、SCPの除外対象とはしていません。

上記のアクセス許可セットを割り当てたユーザーでメンバーアカウントへログインします。IAMユーザーの作成を試してみたところ、SCPで拒否されているActionのためエラーとなりました。

念のためIAMロールも作成してみましたが、こちらは問題なく作成できました。

除外指定したアクセス許可セット

次にSCPのポリシーで拒否対象から除外しているアクセス許可セットでログインしてみます。新規でIamAdministratorAccessのアクセス許可セットを作成してAdministratorAccessのマネージドポリシーをアタッチしているため、権限としての違いはありません。

同じように上記のアクセス許可セットを割り当てたユーザーでメンバーアカウントへログイン。IAMユーザーを作成したところ、こちらは問題なく作成できました。

このアクセス許可セットでログインしている場合、SCPの制限からは除外されているためAdministratorAccessの権限通りに操作が可能です。

注意点

SCPで一部の権限を制限しているため、SSOのコンソールからは一見同じ権限が与えられているように見えてしまいます。(今回ではどちらもAdministratorAccessの権限)

そのため、SCPで除外対象としているアクセス許可セットを誤ったグループ、ユーザーに付与しないように注意しましょう。除外対象とするアクセス許可セットは特定の管理者グループにのみアタッチする運用が望ましいと思います。

上記のような設定ミスを防ぐためにも、定期的にアクセス権限セット割り当ての棚卸をするようにしましょう。

おわりに

アクセス許可セットのロールをSCPから除外してみました。今回はIAMユーザー作成の制限でしたが、特定のアクセス許可セットをSCPの対象外としたい場合にも活用できるので、ぜひご利用の環境に合わせてガードレール設定してみてください。

参考