本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 偵測不合規的 Lambda 部署和組態 AWS Config
除了主動評估之外, AWS Config 還可以反應式偵測不符合控管政策的資源部署和組態。這一點很重要,因為控管政策會隨著您的組織學習和實作新的最佳實務而演進。
請考慮在部署或更新 Lambda 函數時設定全新政策的情形:所有 Lambda 函數都必須始終使用特定且經過核准的 Lambda 層版本。您可以將 AWS Config 設為監控新的或更新函數的層組態。如果 AWS Config 偵測到未使用已核准 layer 版本的函數,則會將該函數標記為不合規資源。您可以選擇性地設定 AWS Config ,使用 AWS Systems Manager 自動化文件指定修復動作,以自動修復資源。例如,您可以使用 在 Python 中撰寫自動化文件 適用於 Python (Boto3) 的 AWS SDK,這會更新不合規函數以指向核准的 layer 版本。因此, 同時 AWS Config 做為偵測和修正控制,自動化合規管理。
我們將此過程分解為三個重要的實作階段:
階段 1:確定存取資源
首先在您的帳戶 AWS Config 中啟用 ,並將其設定為記錄 AWS Lambda 函數。這可讓 AWS Config 觀察何時建立或更新 Lambda 函數。然後,您可以設定自訂政策規則,以檢查使用 AWS CloudFormation Guard 語法的特定策略違規情況。Guard 規則採用下列一般形式:
rule name when condition { assertion }
以下是一條範例規則,用於檢查確保層未被設為舊的層版本:
rule desiredlayer when configuration.layers !empty { some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn }
我們來了解一下規則語法和結構:
-
規則名稱:在提供的範例中,規則的名稱為
desiredlayer
。 -
條件:此子句指定應該檢查規則的條件。在提供的範例中,條件為
configuration.layers !empty
。這意味著只有當組態中的layers
屬性不為空時,才應評估資源。 -
聲明:在
when
子句後,聲明將決定檢查什麼規則。聲明some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn
會檢查任何 Lambda 層 ARN 是否與OldLayerArn
值不相符。如果不相符,聲明為 true 且規則通過;否則,它將會失敗。
CONFIG_RULE_PARAMETERS
是一組使用 AWS Config 規則設定的特殊參數。在這種情況下,OldLayerArn
是 CONFIG_RULE_PARAMETERS
內的一項參數。它允許使用者提供其認為舊的或已棄用的特定 ARN 值,然後,規則會檢查任何 Lambda 函數是否使用這個舊的 ARN 值。
階段 2:視覺化與設計
AWS Config 會收集組態資料,並將該資料存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。您可以使用 Amazon Athena
以下是使用特定層 ARN 識別所有 Lambda 函數的範例 Athena 查詢:
WITH unnested AS ( SELECT item.awsaccountid AS account_id, item.awsregion AS region, item.configuration AS lambda_configuration, item.resourceid AS resourceid, item.resourcename AS resourcename, item.configuration AS configuration, json_parse(item.configuration) AS lambda_json FROM default.aws_config_configuration_snapshot, UNNEST(configurationitems) as t(item) WHERE "dt" = 'latest' AND item.resourcetype = 'AWS::Lambda::Function' ) SELECT DISTINCT region as Region, resourcename as FunctionName, json_extract_scalar(lambda_json, '$.memorySize') AS memory_size, json_extract_scalar(lambda_json, '$.timeout') AS timeout, json_extract_scalar(lambda_json, '$.version') AS version FROM unnested WHERE lambda_configuration LIKE '%arn:aws:lambda:us-east-1:111122223333:layer:AnyGovernanceLayer:24%'
以下是查詢的結果:
透過彙總整個組織 AWS Config 的資料,您可以使用 Amazon QuickSight
階段 3:實作與強制執行
您現在可以選擇性地將您在階段 1 中建立的層版本規則與透過 Systems Manager 自動化文件執行的修補動作配對,該自動化文件是您使用 適用於 Python (Boto3) 的 AWS SDK編寫的 Python 指令碼。此指令碼會為每個 Lambda 函數呼叫 UpdateFunctionConfiguration API 動作,使用新的層 ARN 更新函數組態。或者,您可以讓指令碼提交提取請求至程式碼儲存庫,以更新層 ARN。這樣,未來的程式碼部署也會使用正確的層 ARN 進行更新。