サポートされていないリソースタイプの AWS Config ルールを作成する方法を教えてください。

所要時間3分
0

AWS Config がサポートしていないリソースタイプのルールを作成したいです。

簡単な説明

AWS Config では、AWS リソースが指定された設定に準拠しているかどうかを確認するルールを作成できます。デフォルトでは、AWS Config は限られた数の AWS リソースタイプをサポートします。ただし、サポートされていないリソースタイプ用のカスタム AWS Config ルールを作成できます。

カスタムルールをデプロイすると、AWS Lambda はリソースを評価する関数を作成します。この関数を使用して、サポートされていないリソースタイプを評価し、コンプライアンス結果をカスタムルールに返します。

**注:**デフォルトでは、AWS Config はサポートされていないリソースタイプの設定やコンプライアンスの変更履歴をキャプチャしません。そのためには、「サードパーティリソースの記録設定」の手順を実行し、そのカスタムリソースタイプを評価するルールを作成します。カスタムリソースの記録と評価の詳細については、「AWS Config カスタムリソースを使用して AWS 上のあらゆるリソースを追跡する」を参照してください。

解決策

: 以下のステップとコード例では、Amazon Cognito を評価するためのカスタム AWS Config ロールを作成します。これはサポートされていないリソースです。

前提条件

Lambda 関数用の AWS Identity and Access Management (IAM) ロールを作成して、Lambda が必要な API 呼び出しを行えるようにします。

  1. IAM コンソールを開き、ナビゲーションペインから [ロール] を選択します。

  2. [ロールを作成] を選択します。

  3. [ユースケースの選択] の [一般的なユースケース] で [Lambda] を選択します。

  4. [次へ: アクセス許可] を選択します。

  5. [ポリシーを作成] を選択します。
    : 「ポリシーの作成」ページが新しいタブで開きます。このプロセスの後半で、元のタブに戻ります。

  6. [JSON] タブを選択し、次のポリシーを入力します。

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "VisualEditor0",
          "Effect": "Allow",
          "Action": [
            "config:PutEvaluations",
            "cognito-idp:ListUserPools"
            "`cognito-idp:DescribeUserPool"`
          ],
          "Resource": "*"
        }
      ]
    }
  7. [次へ: タグ] を選択し、[次へ: 確認] を選択します。

  8. [名前] に、ポリシー名を入力します。

  9. [ポリシーを作成] を選択します。

  10. ステップ 5 の [ロールを作成] タブに戻り、ポリシーリストの右側にある更新アイコンを選択します。

  11. 新しいポリシー名を見つけて選択し、[次へ: タグ] を選択します。

  12. [次へ: 確認] を選択します。

  13. [ロール名] に「lambda-role」と入力します。

  14. [ロールを作成] を選択します。

カスタム AWS 設定ルール用の Lambda 関数を作成する

  1. Lambda コンソールを開きます。
  2. [関数の作成] を選択します。
  3. [一から作成] を選択します。
    [関数名] に名前を入力します。
    [ランタイム]には、[Python 3.8] を選択します。
  4. [アクセス許可] で、[デフォルトの実行ロールの変更] を展開します。
    [実行ロール] で、[既存のロールを使用する] を選択します。
    [既存のロール] では、この記事の「前提条件」セクションで、Lambda が必要な API 呼び出しを実行できるようにするために作成したロールを選択します。
  5. [関数の作成] を選択します。
  6. [コードソース] では、Lambda コンソールで「lambda\ _function.py」ファイルを開き、デフォルトコードを次のコードに置き換えて、[デプロイ] を選択します。
    : 次のコード例では、MFA を持つすべての Amazon Cognito ユーザープールを検索します。 オフ、結果を「NON_COMPLIANT」とマークします。サポートされていない他のサービスや目的に合わせてこのガイダンスをカスタマイズするための情報とリソースについては、記事セクション「PutEvaluations API と AWS:::: Account リソースタイプ値」を参照してください。
    ## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.// SPDX-License-Identifier: MIT-0
    
    import json
    import boto3
    
    def lambda_handler(event,context):
      cognito = boto3.client('cognito-idp')
      userpools = cognito.list_user_pools(
        MaxResults=5
        )
      userpool_list = userpools['UserPools']
      userpool_ids = []
    
      for i in userpool_list:
        userpool_ids.append(i['Id'])
    
      evaluations = []
      orderingtime = json.loads(event['invokingEvent'])['notificationCreationTime']
    
      for j in userpool_ids:
         userpool_describe = cognito.describe_user_pool(
            UserPoolId = j
          )
         userpool_MFA = userpool_describe['UserPool']['MfaConfiguration']
         if userpool_MFA == 'OFF':
           evaluations.append(
              {
              'ComplianceResourceType': 'AWS::::Account',
              'ComplianceResourceId': j,
              'ComplianceType': 'NON_COMPLIANT',
              'Annotation': 'Test',
              'OrderingTimestamp': orderingtime
              }
            )
         else:
           evaluations.append(
              {
              'ComplianceResourceType': 'AWS::::Account',
              'ComplianceResourceId': j,
              'ComplianceType': 'COMPLIANT',
              'Annotation': 'Test',
              'OrderingTimestamp': orderingtime
              }
            )
    
      result_token = event['resultToken']
      config = boto3.client('config')
      response = config.put_evaluations(
                  Evaluations = evaluations,
                  ResultToken = result_token,
                  TestMode = False
                )

このコードは主に 3 つのステップを実行します。

  • インベントリを作成するためのすべてのリソースを一覧表示します
  • インベントリ内の各リソースを指定された構成と照合して評価します
  • PutEvaluations API 呼び出しを使用して AWS Config へのコンプライアンスステータスを返します

カスタムの定期的な AWS Config ルールを作成する

AWS Config でカスタム定期ルールを作成します。次に、カスタムルールを前のセクションで作成した Lambda 関数に関連付けます。手順については、「Amazon EC2 インスタンスを評価するカスタム Lambda ルールの作成」を参照してください。

重要: 後のステップで、新しいカスタムルールの Amazon リソースネーム (ARN) を書き留めておきます。

AWS Config サービスに Lambda 関数を呼び出す権限を付与します

  1. Lambda コンソールを開き、ナビゲーションペインから [関数] を選択します。
  2. Lambda 関数のハイパーリンクが付いた [関数名] を選択し、関数の詳細を開きます。
  3. [設定] タブから、[権限] を選択します。
  4. [リソースベースのポリシー] で、[権限の追加] を選択します。
    [ポリシーステートメント] で [AWS サービス] を選択します。
    [サービス] で [その他] を選択します。
    [プリンシパル] には、「config.amazonaws.com」と入力します。
    [Source ARN] には、前のセクションで作成したカスタムルールの ARN を入力します。
    : カスタムルール ARN を見つけるには、AWS Config コンソールを開き、ナビゲーションペインから [ルール] を選択します。ハイパーリンクされた[ルール名]を選択し、[設定ルール ARN] をコピーします。
    [アクション] で [lambda:InvokeFunction] を選択します。
    [ステートメント ID] には、一意の ID を入力します。
  5. [保存] を選択します。

PutEvaluations API と AWS:::: アカウントリソースタイプ値

この解決策の手順と例は、MFA を持つすべての Amazon Cognito ユーザープールを検索します。 オフ、結果を「NON_COMPLIANT」とマークします。ただし、サポートされていないリソースタイプであれば、特定の要件を満たすようにプロセスを変更できます。AWS::: Account リソースタイプを使用するその他のコード例については、「aws-config-rules GitHub」ページを参照してください。

PutEvaluations API コールには、以下のパラメータが含まれます。

{   "Evaluations": [
    {
     "Annotation": "string",
     "ComplianceResourceId": "string",
     "ComplianceResourceType": "string",
     "ComplianceType": "string",
     "OrderingTimestamp": number
    }
   ],
   "ResultToken": "string",
   "TestMode": boolean
}

サポートされていないリソースタイプについては、[ComplianceResourceType] の値として「AWS::: Account」と入力します。「AWS:::: Account」リソースタイプは、特定のリソースではなくアカウント全体についてレポートします。

{  'ComplianceResourceType': 'AWS::::Account',
  'ComplianceResourceId': 'Resource Id',
  'ComplianceType': 'COMPLIANT'|'NON_COMPLIANT',
  'Annotation': 'string',
  'OrderingTimestamp': number
}

サポートされていないリソースを ComplianceResourceType 値として「AWS::: Account」の代わりに入力すると、次のエラーが表示されます。

  • AWS 設定コンソールで: 「結果はありません」
  • Lambda CloudWatch ログ: 「"エラー: ClientError: PutEvaluations オペレーションの呼び出し時にエラー (内部失敗) が発生しました (最大リトライ回数に達しました: 4)」
  • Cloudtrail (PutEvaluations API): 「エラー: ClientError: PutEvaluations オペレーションの呼び出し時にエラー (内部失敗) が発生しました (最大リトライ回数に達しました: 4)

AWS:::: Account」リソースタイプ値を使用するときは、次の点に注意してください。

  • このリソースタイプには構成項目は記録されません。
  • AWS:: Config:: ResourceCompliance のコンプライアンス設定項目は、このリソースタイプでは記録されません。
  • このリソースタイプでは、リソースタイムラインは使用できません。
  • AWS マネジメントコンソールでは、このリソースタイプでは [リソースを管理] ボタンは使用できません。

関連情報

カスタム AWS 設定ルール用の AWS Lambda 関数の作成

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません