使用 AWS Config 部署公有子網路的偵測屬性型存取控制 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Config 部署公有子網路的偵測屬性型存取控制

由 Alberto Menendez 建立 (AWS)

環境:PoC 或試行

技術:安全、身分、合規;聯網

AWS 服務:AWSConfig;Amazon SNS

Summary

分散式邊緣網路架構依賴於與虛擬私有雲端 () 中的工作負載一起執行的網路邊緣安全性VPCs。相較於更常見、集中的方法,這提供了前所未有的可擴展性。雖然在工作負載帳戶中部署公有子網路可以帶來好處,但它也會帶來新的安全風險,因為它會增加攻擊面。建議您僅部署 Elastic Load Balancing (ELB) 資源,例如 Application Load Balancer 或這些 公有子網路中的NAT閘道VPCs。在專用公有子網路中使用負載平衡器和NAT閘道,可協助您針對傳入和傳出流量實作精細的控制。

建議您同時實作預防性和偵測性控制項,以限制可部署在公有子網路中的資源類型。如需使用屬性型存取控制 (ABAC) 部署公有子網路的預防性控制項的詳細資訊,請參閱部署公有子網路的預防性屬性型存取控制 。雖然對大多數情況有效,但這些預防性控制可能無法解決所有可能的使用案例。因此,此模式以 ABAC方法為基礎,可協助您設定有關部署在公有子網路中不合規資源的提醒。解決方案會檢查彈性網路介面是否屬於公有子網路中不允許的資源。

為了達成此目標,此模式使用 AWSConfig 自訂規則ABAC。自訂規則會在建立或修改彈性網路介面時處理其組態。在高層級上,此規則會執行兩個動作,以判斷網路介面是否合規:

  1. 若要判斷網路介面是否在規則範圍內,規則會檢查子網路是否具有表示其為公有子網路的特定AWS標籤。例如,此標籤可能是 IsPublicFacing=True

  2. 如果網路介面部署在公有子網路中,規則會檢查建立此資源AWS的服務。如果資源不是ELB資源或NAT閘道,則會將該資源標記為不合規。

先決條件和限制

先決條件

  • 作用中AWS帳戶

  • AWS 設定,在工作負載帳戶中設定

  • 在工作負載帳戶中部署所需資源的許可

  • VPC 具有公有子網路的

  • 正確套用標籤以識別目標公有子網路

  • (選用) Organizations 中的AWS組織

  • (選用) 作為 Config 和 AWS Security Hub AWS 委派管理員的中央安全帳戶

架構

目標架構

使用 AWS Config 自訂規則來偵測公有子網路中的不合規資源

此圖展示了以下要點:

  1. 部署或修改彈性網路介面資源 (AWS::EC2::NetworkInterface) 時,Config AWS 會擷取事件和組態。

  2. AWS 組態會將此事件與用於評估組態的自訂規則相符。

  3. 與此自訂規則相關聯的 AWS Lambda 函數會叫用。函數會評估資源,並套用指定的邏輯,以判斷資源組態是 COMPLIANTNON_COMPLIANT還是 NOT_APPLICABLE

  4. 如果資源確定為 NON_COMPLIANT,Config AWS 會透過 Amazon Simple Notification Service (Amazon ) 傳送警示SNS。

    注意:如果此帳戶是 AWS Organizations 中的成員帳戶,您可以透過 Config 或 AWS Security Hub AWS 將合規資料傳送至中央安全帳戶。

Lambda 函數評估邏輯

下圖顯示 Lambda 函數套用的邏輯,以評估彈性網路介面的合規性。

Lambda 函數邏輯的圖表

自動化和擴展

此模式是一種偵測性解決方案。您也可以使用修復規則來補充它,以自動解決任何不合規的資源。如需詳細資訊,請參閱使用 Config Rules AWS 修復不合規資源

您可以透過以下方式擴展此解決方案:

  • 強制執行您建立的對應AWS標籤,以識別面向公有的子網路。如需詳細資訊,請參閱 AWS Organizations 文件中的標籤政策

  • 設定中央安全帳戶,將 Config AWS 自訂規則套用至組織中的每個工作負載帳戶。如需詳細資訊,請參閱 (AWS 部落格文章) 中的大規模自動化組態合規AWS

  • 將 AWS Config 與 AWS Security Hub 整合,以大規模擷取、集中和通知。如需詳細資訊,請參閱 AWS Security Hub 文件中的設定AWS組態

工具

  • AWS Config 提供AWS帳戶中資源的詳細檢視,以及其設定方式。它可協助您識別資源彼此之間的關係,以及其組態如何隨著時間而改變。

  • Elastic Load Balancing (ELB) 會將傳入的應用程式或網路流量分散到多個目標。例如,您可以在一或多個可用區域中跨 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址分配流量。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。

  • Amazon Simple Notification Service (Amazon SNS) 可協助您協調和管理發佈者和用戶端之間的訊息交換,包括 Web 伺服器和電子郵件地址。 

  • Amazon Virtual Private Cloud (Amazon VPC) 可協助您將AWS資源啟動至您定義的虛擬網路。此虛擬網路類似於傳統網路,您會在自己的資料中心中運作,並享有使用 可擴展基礎設施的好處AWS。

最佳實務

如需開發自訂 Config AWS 規則的更多範例和最佳實務,請參閱 上的官方 AWS Config 規則儲存庫 GitHub。

史詩

任務描述所需的技能

建立 Lambda 函數。

  1. 登入 AWS 管理主控台,然後開啟 AWS Lambda 主控台。

  2. Functions (函數) 頁面上,選擇 Create function (建立函數)

  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. 選擇 Next (下一步)

  9. 輸入政策名稱,然後選擇 Create policy (建立政策)

一般 AWS

擷取 Lambda 函數 Amazon Resource Name (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. 針對 觸發類型,選擇 組態有所變更時

    4. 針對變更範圍 ,選取 資源

    5. 針對資源類型 ,選擇 AWS EC2 NetworkInterface

    6. 選擇 Next (下一步)

  5. 檢閱和建立頁面上,驗證您的規則,然後選擇儲存

一般 AWS

設定通知。

  1. 請遵循建立 Amazon SNS主題中的指示,以建立 Amazon SNS主題。

  2. 請遵循訂閱 Amazon SNS主題中的指示,設定接收 Amazon SNS主題通知的端點。

  3. 遵循如何使用 Config AWS 來設定不合規AWS資源的自訂 Amazon 規則,在資源不合規時收到通知。 EventBridge

一般 AWS
任務描述所需的技能

建立合規資源。

  1. 使用下列指示在公有子網路中建立其中一個支援的 資源:

  2. 建立資源後,Config AWS 自訂規則會評估與資源相關聯的彈性網路介面。它將這些網路介面標記為 COMPLIANT。您可以按照下列步驟在 AWS Config 中檢視資源:

    1. 在 AWS 開啟 Config 主控台https://console.aws.amazon.com/config/

    2. 規則頁面上,選擇您的規則。

    3. 規則詳細資訊頁面上,前往頁面底部。

    4. 資源範圍 下,選取合規 。確認您看到已建立之網路介面IDs的 。

    5. 如需網路介面組態的詳細資訊,請選擇資源 ID。

一般 AWS

建立不合規的資源。

  1. 使用下列指示在公有子網路中建立不合規的資源:

  2. 建立資源後,Config AWS 自訂規則會評估與資源相關聯的彈性網路介面。它將這些網路介面標記為 NON_COMPLIANT。您可以按照下列步驟在 AWS Config 中檢視資源:

    1. 在 AWS 開啟 Config 主控台https://console.aws.amazon.com/config/

    2. 規則頁面上,選擇您的規則。

    3. 規則詳細資訊頁面上,前往頁面底部。

    4. 資源範圍 下,選取 NonCompliant。確認您看到已建立之網路介面IDs的 。

    5. 如需網路介面組態的詳細資訊,請選擇資源 ID。

  3. 確認您在 Amazon 中設定的端點收到通知SNS。

一般 AWS

建立不適用的資源。

  1. 在私有子網路中,建立任何需要彈性網路介面的資源。

  2. 建立資源後,Config AWS 自訂規則會評估與資源相關聯的彈性網路介面。它將這些網路介面標記為 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