を使用してパブリックサブネットの検出属性ベースのアクセスコントロールをデプロイする AWS Config - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

を使用してパブリックサブネットの検出属性ベースのアクセスコントロールをデプロイする AWS Config

Amazon Web Services、Alberto Menendez

概要

分散型エッジネットワークアーキテクチャは、仮想プライベートクラウド (VPC) 内のワークロードとともに実行されるネットワークエッジセキュリティに依存しています。これにより、より一般的で一元化されたアプローチと比較して、かつてないスケーラビリティが得られます。パブリックサブネットをワークロードアカウントにデプロイすることには利点がありますが、アタックサーフェスが増えるため、新たなセキュリティリスクも生じます。これらの VPC のパブリックサブネットでは、Application Load Balancer や NAT ゲートウェイなどの Elastic Load Balancing (ELB) リソースのみをデプロイすることを推奨します。専用のパブリックサブネットでロードバランサーと NAT ゲートウェイの使用は、インバウンドトラフィックとアウトバウンドトラフィックのきめ細かな制御に役立ちます。

パブリックサブネットにデプロイできるリソースのタイプを制限するために、予防的コントロールと検出的コントロールの両方を実装することを推奨します。属性ベースのアクセス制御 (ABAC) を使用してパブリックサブネットの予防的コントロールをデプロイする方法の詳細については、「Deploy preventative attribute-based access controls for public subnets」を参照してください。ほとんどの状況で有効ですが、これらの予防的コントロールは、考え得るすべてのユースケースに対処できるとは限りません。したがって、このパターンは ABAC アプローチに基づいて構築され、パブリックサブネットにデプロイされている非準拠リソースに関する警告を設定するのに役立ちます。このソリューションは、Elastic Network Interface がパブリックサブネットで許可されていないリソースに属しているかどうかをチェックします。

これを実現するために、このパターンでは AWS Config カスタムルールABAC を使用します。カスタムルールは、Elastic Network Interface が作成または変更されるたびに、その設定を処理します。大まかに言うと、このルールは 2 つのアクションを実行して、ネットワークインターフェイスが適合しているかどうかを判断します。

  1. ネットワークインターフェイスがこのルールの範囲内にあるかどうかを判断するために、ルールは、サブネットにパブリックサブネットであることを示す特定の AWS タグがあるかどうかをチェックします。例えば、タグには IsPublicFacing=True などがあります。

  2. ネットワークインターフェイスがパブリックサブネットにデプロイされている場合、ルールはこのリソースを AWS のサービス 作成した をチェックします。リソースが Elastic Load Balancing リソースまたは NAT ゲートウェイでない場合、リソースは非準拠としてマークされます。

前提条件と制限

前提条件

  • アクティブな AWS アカウント

  • AWS Configが、ワークロードアカウントで設定済み

  • ワークロードアカウントに必要なリソースをデプロイするためのアクセス許可

  • パブリックサブネットのある VPC

  • ターゲットのパブリックサブネットを識別するために適切に適用されるタグ

  • (オプション) の組織 AWS Organizations

  • (オプション) AWS Config と の委任管理者である中央セキュリティアカウント AWS Security Hub CSPM

アーキテクチャ

ターゲットアーキテクチャ

AWS Config カスタムルールを使用してパブリックサブネット内の非準拠リソースを検出する

この図表は、以下を示すものです:

  1. Elastic Network Interface リソース (AWS::EC2::NetworkInterface) がデプロイまたは変更されると、 はイベントと設定を AWS Config キャプチャします。

  2. AWS Config は、このイベントを、設定の評価に使用されるカスタムルールと照合します。

  3. このカスタムルールに関連付けられた AWS Lambda 関数が呼び出されます。関数はリソースを評価し、指定されたロジックを適用して、リソース設定が COMPLIANTNON_COMPLIANT または NOT_APPLICABLE かを判断します。

  4. リソースが であると判断された場合NON_COMPLIANT、 は Amazon Simple Notification Service (Amazon SNS) を介してアラート AWS Config を送信します。

    注: このアカウントが のメンバーアカウントである場合は AWS Organizations、 AWS Config または を使用してコンプライアンスデータを中央セキュリティアカウントに送信できます AWS Security Hub CSPM。

Lambda 関数の評価ロジック

次の図は、Elastic Network Interface のコンプライアンスを評価するために Lambda 関数によって適用されるロジックを示しています。

Lambda 関数ロジックの図

自動化とスケール

このパターンは検出的ソリューションです。また、修復ルールで補完して、非準拠のリソースを自動的に解消することもできます。詳細については、AWS Config 「ルールを使用した非準拠リソースの修復」を参照してください。

このソリューションは、次の方法でスケールできます。

  • パブリックサブネットを識別するために確立した対応する AWS タグの適用を強制します。詳細については、 AWS Organizations ドキュメントの「タグポリシー」を参照してください。

  • 組織内のすべてのワークロードアカウントに AWS Config カスタムルールを適用する中央セキュリティアカウントを設定します。詳細については、「Automate configuration compliance at scale in AWS」(AWS ブログ記事) を参照してください。

  • AWS Config と統合 AWS Security Hub CSPM して、大規模なキャプチャ、一元化、通知を行います。詳細については、 AWS Security Hub CSPM ドキュメントの「 の設定 AWS Config」を参照してください。

ツール

  • AWS Config は、 内のリソースの詳細ビュー AWS アカウント と、その設定方法を提供します。リソースがどのように相互に関連しているか、またそれらの構成が時間の経過とともにどのように変化したかを特定するのに役立ちます。

  • 受信したアプリケーションまたはネットワークトラフィックを複数のターゲットに分散するには、Elastic Load Balancing を使用します。例えば、1 つまたは複数のアベイラビリティーゾーンの Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • Amazon Simple Notification Service (Amazon SNS)」は、ウェブサーバーやメールアドレスなど、パブリッシャーとクライアント間のメッセージの交換を調整および管理するのに役立ちます。 

  • Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。

ベストプラクティス

カスタム AWS Config ルールを開発するためのその他の例とベストプラクティスについては、GitHub の公式AWS Config ルールリポジトリを参照してください。

エピック

タスク説明必要なスキル

Lambda 関数を作成します。

  1. にサインインし AWS マネジメントコンソール、AWS Lambda コンソールを開きます。

  2. [ 関数] ページで、[関数の作成] を選択します。

  3. [一から作成] を選択します。

  4. [基本的な情報] ペインで、[関数名] に名前を入力します。

  5. [ランタイム] には、[Python 3.12] を選択します。

  6. [アーキテクチャ][x86_64] に設定したままにします。

  7. [関数の作成] を選択してください。

  8. [コード] タブを選択します。

  9. ファイルエクスプローラーで、lambda_function.py を選択します。

  10. [lambda_function.py] タブに、このパターンの「追加情報」セクションで提供されているサンプルコードを貼り付けます。サンプルコードをカスタマイズして、evaluate_change_notification_compliance 関数内のカスタム評価ロジックを識別するようにします。

  11. [デプロイ] をクリックします。

AWS 全般

アクセス許可を Lambda 関数の実行ロールに追加する。

  1. ナビゲーションペインで、[関数] を選択します。

  2. 先ほど作成した関数を選択します。

  3. [設定][アクセス権限] の順に選択します。

  4. ロール名を選択して、 AWS Identity and Access Management (IAM) コンソールでロールを開きます。

  5. [アクセス許可ポリシー] で、[許可を追加] を選択後、[インラインポリシーを作成] を選択します。

  6. JSON を選択します。

  7. 次のポリシーをポリシーエディタに貼り付けます。これにより、Lambda 関数は次の項目を実行できるようになります。

    • サブネットタグの詳細を取得する。

    • コンプライアンスの結果を に送信します AWS Config。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "config:PutEvaluations", "ec2:DescribeSubnets" ], "Resource": "*", "Effect": "Allow" } ] }
  8. [次へ] を選択します。

  9. ポリシーの名前を入力し、[Create policy] (ポリシーの作成) を選択します。

AWS 全般

Lambda 関数の Amazon リソースネーム (ARN) を取得する。

  1. Lambda のコンソールを開きます。

  2. ナビゲーションペインで、[関数] を選択します。

  3. 先ほど作成した関数を選択します。

  4. [関数の概要] セクションの [関数 ARN] で値をコピーします。

AWS 全般

AWS Config カスタムルールを作成します。

  1. AWS Config コンソール を開きます。

  2. [ルール] ページで、[ルールの追加] を選択します。

  3. [ルールタイプの指定] ページで [カスタム Lambda ルールを作成] を選択後、[次へ] をクリックします。

  4. [ルールの設定] ページで、次の手順を実行します。

    1. 名前と説明を入力します。

    2. [AWS Lambda 関数の ARN] には、先ほどコピーした ARN を貼り付けます。

    3. [Trigger type] (トリガータイプ)で、[When configuration changes] (設定変更時)を選択します。

    4. [変更範囲] では、[リソース] を選択します。

    5. [リソースタイプ] では、[AWS EC2 ネットワークインターフェイス] を選択します。

    6. [次へ] を選択します。

  5. [確認と作成] ページで、ルールを確認し、[保存] を選択します。

AWS 全般

通知を設定する。

  1. Amazon SNS トピックを作成するには、「Creating an Amazon SNS topic」の手順に従います。

  2. Subscribing to an Amazon SNS topic」の手順に従って、Amazon SNS トピックの通知を受信するエンドポイントを設定します。

  3. を使用して非準拠 AWS リソースのカスタム Amazon EventBridge ルールを設定して、 リソースが非準拠である場合に通知を受け取る AWS Config方法」の手順に従います。 EventBridge

AWS 全般
タスク説明必要なスキル

適合リソースを作成する。

  1. パブリックサブネットに対応しているリソースの 1 つを作成するには、次の手順を使用します。

  2. リソースが作成されると、 AWS Config カスタムルールはリソースに関連付けられた Elastic Network Interface を評価します。これらのネットワークインターフェイスは COMPLIANT としてマークされます。以下の AWS Config 手順に従って、 でリソースを表示できます。

    1. AWS Config コンソール を開きます。

    2. [ルール] ページで、ルールを選択します。

    3. [ルールの詳細]ページで、ページの下部に移動します。

    4. [対象範囲内のリソース] で、[準拠] を選択します。作成されたネットワークインターフェイスの ID が表示されていることを確認します。

    5. ネットワークインターフェイス設定の詳細については、そのリソース ID を選択します。

AWS 全般

非準拠リソースを作成する。

  1. 次の手順を使用して、パブリックサブネットに非準拠のリソースを作成します。

  2. リソースが作成されると、 AWS Config カスタムルールはリソースに関連付けられた Elastic Network Interface を評価します。これらのネットワークインターフェイスは NON_COMPLIANT としてマークされます。以下の AWS Config 手順に従って、 でリソースを表示できます。

    1. AWS Config コンソール を開きます。

    2. [ルール] ページで、ルールを選択します。

    3. [ルールの詳細]ページで、ページの下部に移動します。

    4. [対象範囲内のリソース] で、[非準拠] を選択します。作成されたネットワークインターフェイスの ID が表示されていることを確認します。

    5. ネットワークインターフェイス設定の詳細については、そのリソース ID を選択します。

  3. Amazon SNS で設定したエンドポイントで通知を受信していることを確認します。

AWS 全般

適用外リソースを作成する。

  1. プライベートサブネットで、Elastic Network Interface を必要とするリソースを作成します。

  2. リソースが作成されると、 AWS Config カスタムルールはリソースに関連付けられた Elastic Network Interface を評価します。これらのネットワークインターフェイスは NOT_APPLICABLE としてマークされます。これらのリソースは AWS Config コンソールには表示されません。

AWS 全般

関連リソース

AWS ドキュメント

その他の AWS リソース

追加情報

以下は、デモンストレーション目的で提供される Lambda 関数の例です。

import boto3 import json import os # Init clients config_client = boto3.client('config') ec2_client = boto3.client('ec2') def lambda_handler(event, context): # Init values compliance_value = 'NOT_APPLICABLE' invoking_event = json.loads(event['invokingEvent']) configuration_item = invoking_event['configurationItem'] status = configuration_item['configurationItemStatus'] eventLeftScope = event['eventLeftScope'] # First check if the event configuration applies. Ex. resource event is not delete if (status == 'OK' or status == 'ResourceDiscovered') and not eventLeftScope: compliance_value = evaluate_change_notification_compliance(configuration_item) config_client.put_evaluations( Evaluations=[ { 'ComplianceResourceType': invoking_event['configurationItem']['resourceType'], 'ComplianceResourceId': invoking_event['configurationItem']['resourceId'], 'ComplianceType': compliance_value, 'OrderingTimestamp': invoking_event['configurationItem']['configurationItemCaptureTime'] }, ], ResultToken=event['resultToken']) # Function with the logs to evaluate the resource def evaluate_change_notification_compliance(configuration_item): is_in_scope = is_in_scope_subnet(configuration_item['configuration']['subnetId']) if (configuration_item['resourceType'] != 'AWS::EC2::NetworkInterface') or not is_in_scope: return 'NOT_APPLICABLE' else: alb_condition = configuration_item['configuration']['requesterId'] in ['amazon-elb'] nlb_condition = configuration_item['configuration']['interfaceType'] in ['network_load_balancer'] nat_gateway_condition = configuration_item['configuration']['interfaceType'] in ['nat_gateway'] if alb_condition or nlb_condition or nat_gateway_condition: return 'COMPLIANT' return 'NON_COMPLIANT' # Function to check if elastic network interface is in public subnet def is_in_scope_subnet(eni_subnet): subnet_description = ec2_client.describe_subnets( SubnetIds=[eni_subnet] ) for subnet in subnet_description['Subnets']: for tag in subnet['Tags']: if tag['Key'] == os.environ.get('TAG_KEY') and tag['Value'] == os.environ.get('TAG_VALUE'): return True return False