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

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

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

作成者: Alberto Menendez (AWS)

環境:PoC またはパイロット

テクノロジー: セキュリティ、アイデンティティ、コンプライアンス、ネットワーク

AWS サービス: AWS Config、Amazon SNS

[概要]

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

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

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

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

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

前提条件と制限

前提条件

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

  • AWS 設定、ワークロードアカウントにセットアップする

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

  • パブリックサブネットVPCを持つ

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

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

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

アーキテクチャ

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

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

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

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

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

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

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

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

Lambda 関数評価ロジック

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

Lambda 関数ロジックの図

自動化とスケール

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

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

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

  • Config AWS カスタムルールを組織内のすべてのワークロードアカウントに適用する中央セキュリティアカウントを設定します。詳細については、 (AWS ブログ記事) の「大規模な設定コンプライアンスの自動化AWS」を参照してください。

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

ツール

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

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

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

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

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

ベストプラクティス

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

エピック

タスク説明必要なスキル

Lambda 関数を作成します。

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

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

  3. [ゼロから作る] を選択します。

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

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

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

  7. [Create function (関数の作成)] を選択します。

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

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

  10. このパターンの追加情報セクションにあるサンプルコードを lambda_function.py タブに貼り付けます。サンプルコードをカスタマイズして、evaluate_change_notification_compliance関数内のカスタム評価ロジックを特定します。

  11. [デプロイ] を選択します。

全般 AWS

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

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

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

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

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

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

  6. を選択しますJSON

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

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

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

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

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

全般 AWS

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

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

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

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

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

全般 AWS

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

  1. で AWS Config コンソールを開きますhttps://console.aws.amazon.com/config/

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

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

  4. ルールの設定ページで、以下を実行します。

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

    2. AWS Lambda 関数 ARNでは、以前にコピーARNした を貼り付けます。

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

    4. 変更の範囲 については、リソース を選択します。

    5. リソースタイプ では、 AWS EC2 NetworkInterfaceを選択します。

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

  5. 確認と作成ページでルールを確認してから、 の保存 を選択します。

全般 AWS

通知を設定します。

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

準拠したリソースを作成します。

  1. パブリックサブネットでサポートされているリソースの 1 つを作成するには、次の手順に従います。

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

    1. で AWS Config コンソールを開きますhttps://console.aws.amazon.com/config/

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

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

    4. スコープ のリソースで、コンプライアンス を選択します。作成されたネットワークインターフェイスIDsの が表示されていることを確認します。

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

全般 AWS

非準拠のリソースを作成します。

  1. パブリックサブネットに非準拠のリソースを作成するには、次の手順に従います。

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

    1. で AWS Config コンソールを開きますhttps://console.aws.amazon.com/config/

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

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

    4. スコープ のリソースで、 を選択しますNonCompliant。作成されたネットワークインターフェイスIDsの が表示されていることを確認します。

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

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

全般 AWS

適用されないリソースを作成します。

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

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

全般 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