使用 AWS Config 偵測不合規的 Lambda 部署和組態 - AWS Lambda

使用 AWS Config 偵測不合規的 Lambda 部署和組態

主動評估以外,AWS Config 還可以回應式偵測與您的控管政策不相符的資源部署和組態。這一點很重要,因為控管政策會隨著您的組織學習和實作新的最佳實務而演進。

請考慮在部署或更新 Lambda 函數時設定全新政策的情形:所有 Lambda 函數都必須始終使用特定且經過核准的 Lambda 層版本。您可以將 AWS Config 設為監控新的或更新函數的層組態。如果 AWS Config 偵測到未使用核准層版本的函數,則會將該函數標記為不合規資源。您可以選擇使用 AWS Systems Manager 自動化文件來指定修補動作,從而將 AWS Config 設為自動修復不合規資源。例如,您可以使用 適用於 Python (Boto3) 的 AWS SDK 以 Python 語言編寫自動化文件,用以更新不合規函數,使其指向核准的層版本。因此,AWS Config 同時充當偵測性和糾正性控制,自動執行合規性管理。

我們將此過程分解為三個重要的實作階段:

The three implementation phases are identify, notify, and deploy remediation.

階段 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 規則設定的一組特殊參數。在這種情況下,OldLayerArnCONFIG_RULE_PARAMETERS 內的一項參數。它允許使用者提供其認為舊的或已棄用的特定 ARN 值,然後,規則會檢查任何 Lambda 函數是否使用這個舊的 ARN 值。

階段 2:視覺化與設計

AWS Config 會收集組態資料,並將這些資料存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。您可以使用 Amazon Athena 直接從 S3 儲存貯體查詢這些資料。藉助 Athena,您可以在組織層級彙整此類資料,為所有帳戶產生資源組態的整體全貌。若要設定資源組態資料彙總,請參閱 AWS Cloud Operations and Management 部落格上的 Visualizing AWS Config data using Athena and Amazon Quick Suite

以下是使用特定層 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%'

以下是查詢的結果:

Query results in Athena console.

在彙總組織的 AWS Config 資料以後,您可以使用 Amazon Quick Suite 建立儀表板。透過將 Athena 結果匯入 Amazon Quick Suite,您可以視覺化展示 Lambda 函式對層版本規則的遵循程度。此儀表板可以突出顯示合規和不合規的資源,依下一個區段中所述協助您確定強制政策。下圖是一個範例儀表板,它會報告在組織內部套用至函數的層版本的分佈情況。

Example Quick Suite dashboard shows distribution of layer versions in Lambda functions.

階段 3:實作與強制執行

您現在可以選擇性地將您在階段 1 中建立的層版本規則與透過 Systems Manager 自動化文件執行的修補動作配對,該自動化文件是您使用 適用於 Python (Boto3) 的 AWS SDK 編寫的 Python 指令碼。此指令碼會為每個 Lambda 函數呼叫 UpdateFunctionConfiguration API 動作,使用新的層 ARN 更新函數組態。或者,您可以讓指令碼提交提取請求至程式碼儲存庫,以更新層 ARN。這樣,未來的程式碼部署也會使用正確的層 ARN 進行更新。