AWS Config 適合パックをデプロイする時にパラメータを設定する場合は キーも自力で入力しよう

どんどん楽をしたい年頃です。どうかパラメータを表示してください。

コンバンハ、千葉(幸)です。

AWS Config の適合パックは、AWS Config ルールや修復アクションの組み合わせをテンプレートで定義し、一括でデプロイ・管理できる機能です。

裏側では CloudFormation が呼び出されていることもあり、テンプレートは CloudFormation のものと同じような構文で書くことができます。

ただ、それをマネジメントコンソールからデプロイする際には CloudFormation のデプロイの場合とお作法が異なる部分があります。今回はそれについて書きます。

適合パックの詳細は以下をご参照ください。

目次

CloudFormation テンプレートにおけるパラメータ

パラメータを使用することで、テンプレート内の値にカスタム値を設定することができます。

一般的に、具体的な値をテンプレートに埋め込んでしまうと使い回すことが難しくなります。テンプレートのデプロイ時に都度、値をパラメータとして引き渡す方式にすることによって、複数の環境で同じテンプレートを使い回すといったことが可能になります。

例えばごくごくシンプルなものですが、以下のようなテンプレートがあったとします。

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  ProjectName:
    Description: Please type the ProjectName.
    Type: String
  EnvType:
    Description: Please type the EnvironmentType.
    Type: String
  SystemName:
    Description: Please type the SystemName.
    Type: String

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub ${ProjectName}-${EnvType}-${SystemName}-s3-bucket

上記ハイライト部でパラメータを定義しており、テンプレートデプロイ時に引き渡した値が 19 行目に適用されます。

このテンプレートを CloudFormation でデプロイしようとした場合、コンソールでは以下のように表示されます。

テンプレートで定義されているパラメータのキーが表示されるため、ユーザーは値を入力するだけで済みます。助かるー。

Config 適合パック テンプレートにおけるパラメータ

同じように、パラメータが定義されている Config 適合パック用のテンプレートをデプロイしてみます。

Config 適合パックのテンプレートはいくつかサンプルが用意されていますが、パラメータが定義されているものとして以下があります。

AWS Identity And Access Management 運用のベストプラクティス - AWS Config

パラメータは以下のように定義されています。それぞれデフォルト値が 90 として設定されています。

Parameters:
  AccessKeysRotatedParameterMaxAccessKeyAge:
    Description: Maximum number of days without rotation. Default 90.
    Type: String
    Default: 90
  IAMUserUnusedCredentialsCheckParameterMaxCredentialUsageAge:
    Description: Maximum number of days a credential cannot be used. The default value
      is 90 days.
    Type: String
    Default: 90

これらのパラメータは、テンプレート内で定義されている Config ルールに引き渡されます。ややこしいですが、Config ルールにおいてもパラメータ(InputParameters)があるので、そこにテンプレートのパラメータの値が設定されることになります。

  AccessKeysRotated:
    Properties:
      ConfigRuleName: AccessKeysRotated
      Description: Checks whether the active access keys are rotated within the number
        of days specified in maxAccessKeyAge. The rule is non-compliant if the access
        keys have not been rotated for more than maxAccessKeyAge number of days.
      InputParameters:
        maxAccessKeyAge:
          Ref: AccessKeysRotatedParameterMaxAccessKeyAge
      Source:
        Owner: AWS
        SourceIdentifier: ACCESS_KEYS_ROTATED
    Type: AWS::Config::ConfigRule
  IAMUserUnusedCredentialsCheck:
    Properties:
      ConfigRuleName: IAMUserUnusedCredentialsCheck
      Description: Checks whether your AWS Identity and Access Management (IAM) users
        have passwords or active access keys that have not been used within the specified
        number of days you provided.
      InputParameters:
        maxCredentialUsageAge:
          Ref: IAMUserUnusedCredentialsCheckParameterMaxCredentialUsageAge
      Source:
        Owner: AWS
        SourceIdentifier: IAM_USER_UNUSED_CREDENTIALS_CHECK
    Type: AWS::Config::ConfigRule

このテンプレートのデプロイを試みます。

Config の適合パックの画面よりデプロイを選択し……

サンプルテンプレートの中から先ほど確認した IAM 運用のベストプラクティス のテンプレートを選択し、次に進みます。

続いての画面でパラメータを設定できるのですが、 CloudFormation のようにパラメータのキーは表示してくれていません。

そのままデプロイすると……

ひとまずデプロイが完了します。

今回は特にパラメータの値の指定をしなかったので、それを参照する Config ルールのインプットパラメータにはデフォルトの 90 が設定されています。

この値を変更したい場合は、デプロイ時にパラメータのキーと値をそれぞれ手動で入力する必要があります。CloudFormation のように自動的にキーを表示してくれたりはしないので、少し頑張る必要があります。

実は書きたいことは少し違った

完全に裏話なのですが、本来はサンプルテンプレートをパラメータなしでデプロイした際に、エラーが発生する挙動を期待していました。

以前に試したことがあり、その際にはエラーが発生したからです。今回はなぜうまくいったんだ?と疑問だったのですが、どうやらサンプルテンプレートの内容が以前と異なっているからであることがわかりました。

2020/07/30時点で、以下のページに載っているサンプルテンプレートは日本語版と英語版で内容に差異があります。

AWS Identity And Access Management 運用のベストプラクティス - AWS Config

以前は(つまり現時点での日本語版ドキュメントの内容では)、以下ハイライト部のパラメータ 2 つが存在していました。こちらにはデフォルト値の定義はありません。

Parameters:
  AccessKeysRotatedParameterMaxAccessKeyAge:
    Description: Maximum number of days without rotation. Default 90.
    Type: String
    Default: 90
  IAMPolicyBlacklistedCheckParameterPolicyArns:
    Description: Comma separated list of IAM policy arns which should not be attached
      to any IAM entity.
    Type: String
  IAMRoleManagedPolicyCheckParameterManagedPolicyArns:
    Description: Comma-separated list of AWS managed policy ARNs.
    Type: String
  IAMUserUnusedCredentialsCheckParameterMaxCredentialUsageAge:
    Description: Maximum number of days a credential cannot be used. The default value
      is 90 days.
    Type: String
    Default: 90

それぞれのパラメータを参照するリソースも存在しました。

   IAMPolicyBlacklistedCheck:
    Properties:
      ConfigRuleName: IAMPolicyBlacklistedCheck
      Description: Checks that none of your IAM users, groups, or roles (excluding
        exceptionList) have the specified policies attached.
      InputParameters:
        policyArns:
          Ref: IAMPolicyBlacklistedCheckParameterPolicyArns
      Source:
        Owner: AWS
        SourceIdentifier: IAM_POLICY_BLACKLISTED_CHECK
    Type: AWS::Config::ConfigRule
  IAMRoleManagedPolicyCheck:
    Properties:
      ConfigRuleName: IAMRoleManagedPolicyCheck
      Description: Checks that the AWS Identity and Access Management (IAM) role is
        attached to all AWS managed policies specified in the list of managed policies.
        The rule is non-compliant if the IAM role is not attached to the AWS managed
        policy.
      InputParameters:
        managedPolicyArns:
          Ref: IAMRoleManagedPolicyCheckParameterManagedPolicyArns
      Source:
        Owner: AWS
        SourceIdentifier: IAM_ROLE_MANAGED_POLICY_CHECK
    Type: AWS::Config::ConfigRule

これらが存在するテンプレートの場合、パラメータにはデフォルト値が設定されていないため、デプロイ時に明示的に追加しない限り値がブランクになります。

以下は現時点の日本語版なのですが、これを手元で YAML ファイルとして保存し、アップロードしてデプロイしてみました。

折り畳み
################################################################################
#
#   Conformance Pack:
#     Operational Best Practices for AWS Identity and Access Management
#
#   See Parameters section for names and descriptions of required parameters.
#
################################################################################

Parameters:
  AccessKeysRotatedParameterMaxAccessKeyAge:
    Description: Maximum number of days without rotation. Default 90.
    Type: String
    Default: 90
  IAMPolicyBlacklistedCheckParameterPolicyArns:
    Description: Comma separated list of IAM policy arns which should not be attached
      to any IAM entity.
    Type: String
  IAMRoleManagedPolicyCheckParameterManagedPolicyArns:
    Description: Comma-separated list of AWS managed policy ARNs.
    Type: String
  IAMUserUnusedCredentialsCheckParameterMaxCredentialUsageAge:
    Description: Maximum number of days a credential cannot be used. The default value
      is 90 days.
    Type: String
    Default: 90
Resources:
  AccessKeysRotated:
    Properties:
      ConfigRuleName: AccessKeysRotated
      Description: Checks whether the active access keys are rotated within the number
        of days specified in maxAccessKeyAge. The rule is non-compliant if the access
        keys have not been rotated for more than maxAccessKeyAge number of days.
      InputParameters:
        maxAccessKeyAge:
          Ref: AccessKeysRotatedParameterMaxAccessKeyAge
      Source:
        Owner: AWS
        SourceIdentifier: ACCESS_KEYS_ROTATED
    Type: AWS::Config::ConfigRule
  IAMGroupHasUsersCheck:
    Properties:
      ConfigRuleName: IAMGroupHasUsersCheck
      Description: Checks whether IAM groups have at least one IAM user.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_GROUP_HAS_USERS_CHECK
    Type: AWS::Config::ConfigRule
  IAMPasswordPolicy:
    Properties:
      ConfigRuleName: IAMPasswordPolicy
      Description: Checks whether the account password policy for IAM users meets
        the specified requirements.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_PASSWORD_POLICY
    Type: AWS::Config::ConfigRule
  IAMPolicyBlacklistedCheck:
    Properties:
      ConfigRuleName: IAMPolicyBlacklistedCheck
      Description: Checks that none of your IAM users, groups, or roles (excluding
        exceptionList) have the specified policies attached.
      InputParameters:
        policyArns:
          Ref: IAMPolicyBlacklistedCheckParameterPolicyArns
      Source:
        Owner: AWS
        SourceIdentifier: IAM_POLICY_BLACKLISTED_CHECK
    Type: AWS::Config::ConfigRule
  IAMPolicyNoStatementsWithAdminAccess:
    Properties:
      ConfigRuleName: IAMPolicyNoStatementsWithAdminAccess
      Description: 'Checks whether the default version of AWS Identity and Access
        Management (IAM) policies do not have administrator access. If any statement
        has "Effect": "Allow" with "Action": "*" over "Resource": "*", the rule is
        non-compliant.'
      Source:
        Owner: AWS
        SourceIdentifier: IAM_POLICY_NO_STATEMENTS_WITH_ADMIN_ACCESS
    Type: AWS::Config::ConfigRule
  IAMRoleManagedPolicyCheck:
    Properties:
      ConfigRuleName: IAMRoleManagedPolicyCheck
      Description: Checks that the AWS Identity and Access Management (IAM) role is
        attached to all AWS managed policies specified in the list of managed policies.
        The rule is non-compliant if the IAM role is not attached to the AWS managed
        policy.
      InputParameters:
        managedPolicyArns:
          Ref: IAMRoleManagedPolicyCheckParameterManagedPolicyArns
      Source:
        Owner: AWS
        SourceIdentifier: IAM_ROLE_MANAGED_POLICY_CHECK
    Type: AWS::Config::ConfigRule
  IAMRootAccessKeyCheck:
    Properties:
      ConfigRuleName: IAMRootAccessKeyCheck
      Description: Checks whether the root user access key is available. The rule
        is compliant if the user access key does not exist.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_ROOT_ACCESS_KEY_CHECK
    Type: AWS::Config::ConfigRule
  IAMUserGroupMembershipCheck:
    Properties:
      ConfigRuleName: IAMUserGroupMembershipCheck
      Description: Checks whether IAM users are members of at least one IAM group.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_USER_GROUP_MEMBERSHIP_CHECK
    Type: AWS::Config::ConfigRule
  IAMUserMFAEnabled:
    Properties:
      ConfigRuleName: IAMUserMFAEnabled
      Description: Checks whether the AWS Identity and Access Management users have
        multi-factor authentication (MFA) enabled.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_USER_MFA_ENABLED
    Type: AWS::Config::ConfigRule
  IAMUserNoPoliciesCheck:
    Properties:
      ConfigRuleName: IAMUserNoPoliciesCheck
      Description: Checks that none of your IAM users have policies attached. IAM
        users must inherit permissions from IAM groups or roles.
      Source:
        Owner: AWS
        SourceIdentifier: IAM_USER_NO_POLICIES_CHECK
    Type: AWS::Config::ConfigRule
  IAMUserUnusedCredentialsCheck:
    Properties:
      ConfigRuleName: IAMUserUnusedCredentialsCheck
      Description: Checks whether your AWS Identity and Access Management (IAM) users
        have passwords or active access keys that have not been used within the specified
        number of days you provided.
      InputParameters:
        maxCredentialUsageAge:
          Ref: IAMUserUnusedCredentialsCheckParameterMaxCredentialUsageAge
      Source:
        Owner: AWS
        SourceIdentifier: IAM_USER_UNUSED_CREDENTIALS_CHECK
    Type: AWS::Config::ConfigRule
  MFAEnabledForIAMConsoleAccess:
    Properties:
      ConfigRuleName: MFAEnabledForIAMConsoleAccess
      Description: Checks whether AWS Multi-Factor Authentication (MFA) is enabled
        for all AWS Identity and Access Management (IAM) users that use a console
        password. The rule is compliant if MFA is enabled.
      Source:
        Owner: AWS
        SourceIdentifier: MFA_ENABLED_FOR_IAM_CONSOLE_ACCESS
    Type: AWS::Config::ConfigRule
  RootAccountHardwareMFAEnabled:
    Properties:
      ConfigRuleName: RootAccountHardwareMFAEnabled
      Description: Checks whether your AWS account is enabled to use multi-factor
        authentication (MFA) hardware device to sign in with root credentials.
      Source:
        Owner: AWS
        SourceIdentifier: ROOT_ACCOUNT_HARDWARE_MFA_ENABLED
    Type: AWS::Config::ConfigRule
  RootAccountMFAEnabled:
    Properties:
      ConfigRuleName: RootAccountMFAEnabled
      Description: Checks whether the root user of your AWS account requires multi-factor
        authentication for console sign-in.
      Source:
        Owner: AWS
        SourceIdentifier: ROOT_ACCOUNT_MFA_ENABLED
    Type: AWS::Config::ConfigRule

実行してみると、想定どおりデプロイに失敗します。

Parameters: IAMPolicyBlacklistedCheckParameterPolicyArns, IAMRoleManagedPolicyCheckParameterManagedPolicyArns must have values (Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: fxxxxxb-e419-4c11-b20d-09xxxxxxxx33; Proxy: null)

パラメータには値を持たせる必要がある、というエラーです。そのため、明示的にキーと値(ここでは IAM ポリシーの ARN )を入力してデプロイする必要があります。

(この辺り、何かしらパラメータを入力する必要があるという部分のハードルが高く、サンプルテンプレートから除外されたのではと想像しています。)

終わりに

適合パックデプロイ時のパラメータの引き渡しについて確認しました。どのようなパラメータが定義されているかを、デプロイ時にマネジメントコンソールから確認できないのはちょっとつらみがありますね。

ぜひ、表示してくれるようなアップデートを期待しています!

以上、千葉(幸)がお送りしました。