クラウドセキュリティエンジニアブログ

ニューリジェンセキュリティのクラウドセキュリティエンジニアチームが AWSなどのクラウドセキュリティについて気になることや調べたことを書くブログ

Change Managerによる変更管理と本番アクセス統制 ⑤テンプレート作成編

こんにちは、クラウドセキュリティアーキテクトの大島悠司です。

7編にわたって、「Change Managerによる変更管理と本番アクセス統制」について紹介しています。

前回の「④Change Managerセットアップ編」では、Change Managerのセットアップ方法と、本番アクセス統制のために追加で必要な設定やハマりやすいポイントを紹介しました。
今回の「⑤テンプレート作成編」では、本番アクセス統制を実現するために、Change Managerに必要なテンプレートの作成と登録方法を紹介します。

Change Manager /Automation /Documentの関係

Change Manager(変更マネージャー)は内部的にAutomation(自動化)を使っており、AutomationはDocument(ドキュメント)で定義されたタスクを実行しています。
つまり、まずDocumentでタスクを定義し、次にChange ManagerでDocumentを指定し、起票と承認がされるとAutomationを通してタスクを実行するという流れです。

Documentを作成する

ドキュメントから、「Create document」→「Automation」を選択します。

グループ参加用のDocument作成(ビルダーで作成)

任意の名前を付けて、分かりやすい説明を記載します。「ロールを想定」に「AWS-QuickSetup-SSMChangeMgr-<ジョブ機能名>AdminRole」を指定します。

 入力パラメータを入力します。ここでは、ユーザ名/グループ名/TTLをタスクに渡したいので、それが分かるような名前を付けます。

 実行するタスクを設定していきます。

ステップ1でユーザをグループに追加します。任意のステップ名を付け、アクションタイプを「AWS APIのアクションを呼び出して実行する」を選択します。

Serviceはiam、APIはAddUserToGroupを入力し、APIに渡すパラメータとして前述の入力パラメータからGroupNameとUserNameを入力します。

 ステップ2でユーザにタグを付与します。

任意のステップ名を付け、アクションタイプを「AWS APIのアクションを呼び出して実行する」を選択します。
Serviceはiam、APIはTagUserを入力し、APIに渡すパラメータとして前述の入力パラメータからUserNameとGroupNameを入力します。

 ドキュメントが作成されました。

ドキュメントはyaml形式で管理されます。先ほどビルダーで作成したものは、以下のようになります。

description: Add User To Group and Tag User
schemaVersion: '0.3'
assumeRole: 'arn:aws:iam::<accountID>:role/AWS-QuickSetup-SSMChangeMgr-MyAWSAdminAdminRole'
parameters:
  UserName:
    type: String
  GroupName:
    type: String
  TTL:
    type: String
mainSteps:
  - name: AddUserToGroup
    action: aws:executeAwsApi
    inputs:
      Service: iam
      Api:  AddUserToGroup
      GroupName: ""
      UserName: ""
  - name: AddTag
    action: 'aws:executeAwsApi'
    inputs:
      Service: iam
      Api: TagUser
      UserName: ''
      Tags:
        - Key: ''
          Value: ''

グループ離脱用のDocument作成(エディタで作成)

今度はエディタで作成してみます。ドキュメント作成画面からエディタを選択し、「編集」を押下します。

グループ参加用に作成したドキュメントのyamlを流用し、以下のようにします。 

description: Remove User From Group and Untag User
schemaVersion: '0.3'
assumeRole: 'arn:aws:iam::<accountID>:role/AWS-QuickSetup-SSMChangeMgr-MyAWSAdminAdminRole'
parameters:
  UserName:
    type: String
  GroupName:
    type: String
mainSteps:
  - name: RemoveUserFromGroup
    action: aws:executeAwsApi
    inputs:
      Service: iam
      Api:  RemoveUserFromGroup
      GroupName: ""
      UserName: ""
  - name: RemoveTag
    action: 'aws:executeAwsApi'
    inputs:
      Service: iam
      Api: UntagUser
      UserName: ''
      TagKeys:
        - ''

これをエディタに張り付けて作成します。

 

 ドキュメントが作成されました。

注意 今回は、想定ロールに「AWS-QuickSetup-SSMChangeMgr-<ジョブ機能名>AdminRole」を入力しました。
これにより、Change Managerでドキュメント実行時のデフォルトのロールを設定することができます。

また、デフォルトのロールを設定しない場合は、{{AutomationAssumeRole}}と指定し、入力パラメータに「AutomationAssumeRole」を指定することも可能です。

ドキュメントの想定ロールが決まっている場合は、ユーザがドキュメント作成時に明示的に選択する手間を省くために、デフォルトのロールを設定するとよいでしょう。

この想定ロールを設定していない場合、Change Managerでリクエストを作成する際に、使用するロールを選択することができずエラーになるので注意が必要です。

テンプレートを作成する

ここでは、先ほど作成したドキュメントを使って、Change Managerのテンプレートを作成していきます。

グループ参加用のテンプレート作成(ビルダーで作成)

Change Managerの画面から、「テンプレートを作成」を押下します。

任意の名前を付け、分かりやすい説明を入力します。
ランブックは作成済のグループ参加用ドキュメントを選択します。

承認者はIAMユーザ/グループ/ロールから選択できますが、ここではグループを選択します。
このグループは、変更を承認するユーザ(例えばチームリーダ)から構成されるグループを選択するとよいでしょう。

承認通知用のSNSトピックは、リクエストが起票されたときの通知先です。
先ほどのグループに含まれるユーザ全員を宛先としたSNSトピックもよいですが、起票時に個人宛に承認をもらいたいことを考えると、リクエスタに指定を許可するほうが良いでしょう。

注意
ちなみに、承認者を変更リクエストで指定することもできます。
しかし、起票者が承認者を自由に選択できてしまうと、メンバー同士の結託によりリーダーの承認を介さない変更ができてしまいますので、要件に応じてよく考える必要があります。

テンプレートが作成されたので、「レビューのために送信」を押下します。

Change Managerのテンプレートレビュアーで設定した通知先に以下のようなメールが届きます。

自己承認はできませんので、テンプレート作成者以外でレビュアーに該当するユーザがテンプレートを確認します。承認/拒否ボタンがありますので、「承認」を押下します。

コメントを入力して承認します。

テンプレートが承認され、ステータスが「承認済み」になり、通知メールも届きました。

注意
もし、承認されていないテンプレートを使ってリクエストを作成しようとすると、以下のようなエラーが出て作成できません。

ドキュメントと同様に、Change Managerのテンプレートもyaml形式で管理されています。
今回だとこのようになると思います。

schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
  - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 604800
    inputs:
      Message: Please approve this change request
      EnhancedApprovals:
        Approvers:
          - approver: ChangeApprovalGroup
            type: IamGroup
            minRequiredApprovals: 1
        NotificationArn: ""
description: Add User To Group and Tag User
executableRunBooks:
  - name: AddUserToGroup-document
    version: $DEFAULT
templateInformation: >
  #### What is the purpose of this change?


  #### What will be required to make this change?


  #### Are there any manual steps that need to be run as part of this change?


  #### What is the expected end state of the system after this change?


  #### What assumptions, if any, are being made about the state of the system at the time of this change?


  #### What could happen if everything goes wrong this change and how is the risk mitigated?


  #### What is your rollback plan?
parameters:
  Level1ApproverSnsTopicArn:
    type: String
    description: Level 1 Approver SNS Topic Arn

グループ参加用のテンプレート作成(エディタで作成)

今度はエディタで作成してみます。テンプレート作成画面からエディタを選択し、「編集」を押下します。

グループ参加用に作成したテンプレートのyamlを流用し、以下のようにします。

schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
  - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 604800
    inputs:
      Message: Please approve this change request
      EnhancedApprovals:
        Approvers:
          - approver: ChangeApprovalGroup
            type: IamGroup
            minRequiredApprovals: 1
        NotificationArn: ""
description: Remove User From Group and Untag User
executableRunBooks:
  - name: RemoveUserFromGroup-document
    version: $DEFAULT
templateInformation: >
  #### What is the purpose of this change?


  #### What will be required to make this change?


  #### Are there any manual steps that need to be run as part of this change?


  #### What is the expected end state of the system after this change?


  #### What assumptions, if any, are being made about the state of the system at the time of this change?


  #### What could happen if everything goes wrong this change and how is the risk mitigated?


  #### What is your rollback plan?
parameters:
  Level1ApproverSnsTopicArn:
    type: String
    description: Level 1 Approver SNS Topic Arn

これをエディタに張り付けて作成します。
先ほどと同様に、承認されるとテンプレートを利用することができます。

まとめ

今回の「⑤テンプレート作成編」では、本番アクセス統制を実現するために、Change Managerに必要なテンプレートの作成と登録方法を紹介しました。

バックアップの観点で、yamlファイルはソースコード管理ツールなどで管理しておくとよいでしょう。

次回の「⑥動作確認編」では、Change Mangerのリクエスト作成を行ってみて、変更管理と本番アクセス統制が可能になっているかを紹介します。

「Change Managerによる変更管理と本番アクセス統制」シリーズ全編はこちら

  1. 動機づけ編
  2. マルチアカウント&IAM設計編
  3. Session Managerログイン&ロギング編
  4. Change Managerセットアップ編
  5. テンプレート作成編
  6. 動作確認編
  7. まとめ