AWS IAM Identity Centerの許可セットをCloudFormationで作成する

2023.03.13

AWS IAM Identity Center の許可セット(Permission Set)を CloudFormationで作成してみます。

早くテンプレートが欲しい人向け

以下パラメータ全部入りの許可セットサンプルです。

AWSTemplateFormatVersion: 2010-09-09
Description: "Permission set example"
Parameters:
  # IAM Identity Center(SSO) インスタンスのARN
  InstanceArn:
    Description: "IAM Identity Center(SSO) Instance ARN"
    Type: String
    Default: "arn:aws:sso:::instance/ssoins-xxx"
  # リレーステートURL
  RelayStateType:
    Description: "Used to redirect users within the application during the federation authentication process."
    Type: String
    Default: "https://ap-northeast-1.console.aws.amazon.com/console/home"
  # セッション期間
  SessionDuration:
    Description: "The length of time that the application user sessions are valid for in the ISO-8601 standard."
    Type: String
    Default: "PT8H"
Resources:
  Example:
    Type: AWS::SSO::PermissionSet
    Properties:
      InstanceArn: !Ref InstanceArn
      # 基本設定
      Name: "example-ps"
      Description: "example permission set"
      Tags:
        - Key: "example-key"
          Value: "example-value"
      # 操作周り
      RelayStateType: !Ref RelayStateType
      SessionDuration: !Ref SessionDuration
      # 権限
      ManagedPolicies:
        - "arn:aws:iam::aws:policy/ReadOnlyAccess"
        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
      InlinePolicy:
        Version: "2012-10-17"
        Statement:
          - Sid: "example"
            Effect: "Allow"
            Action:
              - "ec2:DescribeRegions"
            Resource: "*"
      CustomerManagedPolicyReferences:
        - Path: "/"
          Name: "ExamplePolicy1"
        - Path: "/"
          Name: "ExamplePolicy2"
      PermissionsBoundary:
        # カスタマー管理ポリシーを指定する場合
        CustomerManagedPolicyReference:
          Name: "ExamplePermissionsBoundaryPolicy"
          Path: "/"
        # # AWS 管理ポリシーを指定する場合
        # ManagedPolicyArn: "arn:aws:iam::aws:policy/PowerUserAccess"

許可セットとは

AWS IAM Identity Center の 許可セット(Permission Set)AWSアカウントへのアクセス権(など)を定義するリソース です。 もともとは "アクセス権限セット" と呼ばれていました。

IAM Identity Center の割り当て(Assignment)に必要な1パラメータとなります。

img

許可セットのパラメータ

固定値

  • InstanceArn : インスタンスARN

インスタンスARNは [IAM Identity Center > 設定] から確認できます。

img

基本設定

  • Name : 許可セット
  • Description [optional] : 説明
  • Tags [optional] : タグ

名前と説明については、以下制約が注意点です。 (説明のところに記載している正規表現はパッと見て分かりにくいですが、 少なくとも日本語はダメでした)

許可セット名

許可セット名は 32 文字以下に制限されています。名前には、英数字と + = , . @ - _ といった特殊文字のみを使用できます。

説明

許可セットの説明は 700 文字以下に制限されています。説明は正規表現 [\u0009\u000A\u000D\u0020-\u007E\u00A1-\u00FF]* と一致する必要があります。

操作周り

  • SessionDuration [optional] : セッション期間(ユーザーがログオン状態を維持できる時間)
  • RelayStateType [optional] : リレーステート(マネジメントコンソール選択時にユーザーをリダイレクトさせるURL)

セッション期間は 1時間〜12時間の間で秒単位で選択できます。 ISO 8601 形式で記載します。 例えば 8時間を指定したい場合、テンプレートには PT8H と書きます。

リレーステートはサインインする際に、常に同じ画面を表示させたい時に役立ちます。 例えば東京リージョンのホーム画面を表示させたい場合は `https://ap-northeast-1.console.aws.amazon.com/console/home` を指定します。

権限周り(全体像)

  • ManagedPolicies [optional] : AWS管理ポリシーARNのリスト
  • InlinePolicy [optional] : インラインポリシーJSON
  • CustomerManagedPolicyReferences [optional] : カスタマー管理ポリシー指定
  • PermissionsBoundary [optional] : Permissions Boundary(許可の境界)指定

以下にて、それぞれの書き方を説明します。

> AWS管理ポリシー

# 例
ManagedPolicies:
  - "arn:aws:iam::aws:policy/AdministratorAccess"
  - "arn:aws:iam::aws:policy/AmazonS3FullAccess"

AWS管理ポリシーのARNをリストで記載できます。

ちなみにAWS管理ポリシーの一覧は以下ページから確認できます。

> インラインポリシー

# 例(JSONで書く版)
InlinePolicy:
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "example",
        "Effect": "Allow",
        "Action": [
          "ec2:DescribeRegions"
        ],
        "Resource": "*"
      }
    ]
  }

# 例(YAMLで書く版)
InlinePolicy:
  Version: "2012-10-17"
  Statement:
    - Sid: "example"
      Effect: "Allow"
      Action:
        - "ec2:DescribeRegions"
      Resource: "*"

インラインポリシーを1つ記載できます。 書けるポリシーの最大サイズは 10,240 bytes です。

> カスタマー管理ポリシー指定

# 例
CustomerManagedPolicyReferences:
  - Path: "/"
    Name: "ExamplePolicy1"
  - Path: "/"
    Name: "ExamplePolicy2"

カスタマー管理ポリシーのリストを指定します。

注意: このカスタマー管理ポリシーはアクセス先AWSアカウント上に 事前に展開されている必要があります。事前に展開していないと、割当作成時に失敗します。

注意: アタッチできるマネージドポリシー(AWS管理ポリシー or カスタマー管理)は 10個までです。

> Permissions Boundary指定

# 例 (AWS管理ポリシーを指定する版)
PermissionsBoundary:
  CustomerManagedPolicyReference:
    Name: "ExamplePermissionsBoundaryPolicy"
    Path: "/"

# 例 (カスタマー管理ポリシーを指定する版)
PermissionsBoundary:
  ManagedPolicyArn: "arn:aws:iam::aws:policy/PowerUserAccess"

Permissions Boundary(許可の境界)として、1つポリシーを指定できます。

注意: カスタマー管理ポリシーの場合は、先程と同じく アクセス先AWSアカウント上に事前に展開されている必要があります。

CFnテンプレートを作ってみる

以下サンプルテンプレートです。

AWSTemplateFormatVersion: 2010-09-09
Description: "Permission set example"
Parameters:
  # IAM Identity Center(SSO) インスタンスのARN
  InstanceArn:
    Description: "IAM Identity Center(SSO) Instance ARN"
    Type: String
    Default: "arn:aws:sso:::instance/ssoins-xxx"
  # リレーステートURL
  RelayStateType:
    Description: "Used to redirect users within the application during the federation authentication process."
    Type: String
    Default: "https://ap-northeast-1.console.aws.amazon.com/console/home"
  # セッション期間
  SessionDuration:
    Description: "The length of time that the application user sessions are valid for in the ISO-8601 standard."
    Type: String
    Default: "PT8H"
Resources:
  Example:
    Type: AWS::SSO::PermissionSet
    Properties:
      InstanceArn: !Ref InstanceArn
      # 基本設定
      Name: "example-ps"
      Description: "example permission set"
      Tags:
        - Key: "example-key"
          Value: "example-value"
      # 操作周り
      RelayStateType: !Ref RelayStateType
      SessionDuration: !Ref SessionDuration
      # 権限
      ManagedPolicies:
        - "arn:aws:iam::aws:policy/ReadOnlyAccess"
        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
      InlinePolicy:
        Version: "2012-10-17"
        Statement:
          - Sid: "example"
            Effect: "Allow"
            Action:
              - "ec2:DescribeRegions"
            Resource: "*"
      CustomerManagedPolicyReferences:
        - Path: "/"
          Name: "ExamplePolicy1"
        - Path: "/"
          Name: "ExamplePolicy2"
      PermissionsBoundary:
        # カスタマー管理ポリシーを指定する場合
        CustomerManagedPolicyReference:
          Name: "ExamplePermissionsBoundaryPolicy"
          Path: "/"
        # # AWS 管理ポリシーを指定する場合
        # ManagedPolicyArn: "arn:aws:iam::aws:policy/PowerUserAccess"

パラメータのInstanceArn部分を自身の環境のものに変更して、 展開したものがこちら(以下キャプチャ)です。

img

img

おわりに

IAM Identity Center 許可セットを作成しました。 インラインポリシーでJSONを作り込むケースなどもあると思うので、 IaC管理のメリットは享受できそうです。

以上、参考になれば幸いです。

参考