翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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
ネットワークインターフェイスがルールの範囲内にあるかどうかを判断するために、ルールは、サブネットにパブリックサブネットであることを示す特定のAWSタグがあるかどうかをチェックします。例えば、このタグは です
IsPublicFacing=True
。ネットワークインターフェイスがパブリックサブネットにデプロイされている場合、ルールはこのリソースを作成したAWSサービスをチェックします。リソースがELBリソースまたはNATゲートウェイでない場合、リソースは非準拠としてマークされます。
前提条件と制限
前提条件
アクティブなAWSアカウント
AWS 設定、ワークロードアカウントにセットアップする
ワークロードアカウントに必要なリソースをデプロイするアクセス許可
パブリックサブネットVPCを持つ
ターゲットパブリックサブネットを識別するために適切に適用されるタグ
(オプション) Organizations 内のAWS組織
(オプション) Config AWS と Security Hub の委任管理者である中央AWSセキュリティアカウント
アーキテクチャ
ターゲット アーキテクチャ
この図表は、以下を示すものです:
Elastic Network Interface リソース (
AWS::EC2::NetworkInterface
) がデプロイまたは変更されると、Config AWS はイベントと設定をキャプチャします。AWS Config は、このイベントを、設定の評価に使用されるカスタムルールと照合します。
このカスタムルールに関連付けられた AWS Lambda 関数が呼び出されます。関数はリソースを評価し、指定されたロジックを適用して、リソース設定が
COMPLIANT
、、NON_COMPLIANT
または であるかどうかを判断しますNOT_APPLICABLE
。リソースが と決定された場合
NON_COMPLIANT
、Config AWS は Amazon Simple Notification Service (Amazon ) を介してアラートを送信しますSNS。注: このアカウントが AWS Organizations のメンバーアカウントである場合は、Config または AWS Security Hub AWS を介して中央のセキュリティアカウントにコンプライアンスデータを送信できます。
Lambda 関数評価ロジック
次の図は、Elastic Network Interface のコンプライアンスを評価するために 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 ルールリポジトリ
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
Lambda 関数を作成します。 |
| 全般 AWS |
Lambda 関数の実行ロールにアクセス許可を追加します。 |
| 全般 AWS |
Lambda 関数の Amazon リソースネーム () を取得しますARN。 |
| 全般 AWS |
Config AWS カスタムルールを作成します。 |
| 全般 AWS |
通知を設定します。 |
| 全般 AWS |
タスク | 説明 | 必要なスキル |
---|---|---|
準拠したリソースを作成します。 |
| 全般 AWS |
非準拠のリソースを作成します。 |
| 全般 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