View a markdown version of this page

Web 函數的靜態加密 - AWS Lambda

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

Web 函數的靜態加密

AWS Lambda 會在伺服器端加密 Lambda Web 函數的靜態資料。此頁面說明您可用的加密選項,以及如何設定客戶受管金鑰。

靜態加密的選項

靜態加密一律處於開啟狀態。Lambda 會在伺服器端加密 Web 函數程式碼成品和環境變數,您無法關閉此加密。根據預設,Lambda 會使用 AWS 擁有的金鑰。您可以改為設定客戶受管金鑰。

對於保護資料的 AWS KMS 金鑰,您有兩個選項:

AWS 擁有的金鑰 (預設值)

根據預設,Lambda 會使用 加密您的資料AWS 擁有的金鑰。 AWS 擁有和管理此金鑰。您無法檢視、管理或稽核其使用方式。如果此預設行為符合您的需求,則不需要額外的設定。

客戶自管金鑰

您可以選擇性地設定自己的 AWS KMS 客戶受管金鑰。當您需要控制金鑰輪換、透過 CloudTrail 使用稽核金鑰、透過金鑰政策管理金鑰存取,或符合組織合規要求時,請使用客戶受管金鑰。使用客戶受管金鑰,只有您授權的主體才能存取加密的程式碼和環境變數。客戶受管金鑰會產生 AWS KMS 費用。如需詳細資訊,請參閱 AWS Key Management Service 定價。

使用客戶受管金鑰加密靜態資料

下列各節說明 Web Functions 如何使用客戶受管金鑰、如何設定金鑰及其許可,以及如何縮小其存取範圍。

Web 函數如何使用客戶受管金鑰

當您指定客戶受管金鑰時,Lambda 會使用信封加密。這表示 Lambda 會使用資料金鑰加密修訂版本的資料,而您的 KMS 金鑰則會加密該資料金鑰。Lambda 會從 取得資料金鑰, AWS KMS 並在需要讀取資料時使用 KMS 金鑰解密它。只有有權存取 KMS 金鑰的主體才能存取修訂版的程式碼和環境變數。

Lambda 會使用客戶受管金鑰加密下列 Web 函數資源:

資源 加密的內容
修訂 從 Amazon S3 部署套件建置的程式碼成品,以及修訂版的環境變數。

Lambda 不會使用 Web Functions 的 AWS KMS 授予。透過金鑰政策和呼叫主體的 IAM 許可來授權存取。

Lambda 會在建立和啟動修訂資源 AWS KMS 時呼叫 ,並可在作用中執行環境中快取解密的資料。撤銷金鑰存取不是立即的流量控制機制,因為現有環境可以在未指定的期間內繼續使用快取的資料。

在金鑰政策變更後,測試預期的行為並監控修訂和端點運作狀態。對於緊急遏制,停止將流量路由到受影響的修訂,或停用端點,而不是僅依賴金鑰撤銷。

Lambda 會在 Web 函數的所有 AWS KMS 操作上設定下列加密內容:

  • aws:lambda:WebFunctionRevisionArn – Web 函數修訂版的 Amazon Resource Name (ARN)。

您可以在金鑰政策中使用此加密內容來限制對特定 Web 函數或修訂的存取。如需詳細資訊,請參閱縮小 KMS 金鑰的存取範圍。

設定客戶受管金鑰

AWS KMS 金鑰必須是對稱加密金鑰 (金鑰規格 SYMMETRIC_DEFAULT、金鑰用量 ENCRYPT_DECRYPT)。您無法使用非對稱金鑰。

Web 函數支援多區域金鑰。您需要的金鑰類型取決於您的端點組態:

  • HomeRegion 端點 – 您可以使用單一區域金鑰或多區域金鑰。

  • MultiRegion 或 PerRegion 端點 – 您必須在端點提供的每個 中使用具有複本 AWS 區域 的多區域金鑰。如果區域缺少金鑰的複本,複寫至該區域會失敗。

如需建立多區域金鑰的相關資訊,請參閱《 AWS Key Management Service 開發人員指南》中的建立多區域主金鑰。

由於 AWS KMS 不會在相關的多區域金鑰之間複製或同步金鑰政策,因此您必須分別設定每個金鑰政策。在主金鑰和每個複本金鑰上設定金鑰政策。每個複本金鑰的政策至少必須允許 Lambda 服務主體呼叫 kms:Decrypt。此許可允許 Lambda 解密該區域中的資料金鑰。如需詳細資訊,請參閱《 AWS Key Management Service 開發人員指南》中的授權使用多區域金鑰。

注意

當您建立多區域複本金鑰時,可能需要幾秒鐘到幾分鐘的時間,才能在所有區域中使用。在建立修訂或端點之前,請確認每個目標區域中都有可用的複本金鑰。

設定使用客戶受管金鑰的許可

若要使用客戶受管金鑰建立修訂,您需要 AWS KMS 金鑰的下列許可:

  • kms:DescribeKey – 當您使用 金鑰建立 Web 函數或修訂時為必要。

  • kms:GenerateDataKey – Lambda 呼叫此操作來產生資料金鑰,以加密修訂的程式碼成品和環境變數。

  • kms:Decrypt – Lambda 會呼叫此操作,以驗證在您建立修訂時金鑰是否可用。使用 讀取修訂的主體GetWebFunctionRevision也需要在 金鑰kms:Decrypt上查看其環境變數。

如果金鑰遺失、停用、不是對稱加密金鑰,或無法存取所需的許可,則建立請求會失敗。

注意

您不需要kms:Encrypt許可。Lambda 使用信封加密搭配 GenerateDataKey,這會傳回資料金鑰的純文字和加密複本,而不需要單獨的加密呼叫。

AWS KMS 金鑰政策也必須允許 Lambda 服務主體 (lambda.amazonaws.com) 呼叫 kms:Decrypt。Lambda 會使用此許可,在啟動修訂的執行環境時解密資料金鑰。服務主體不需要 kms:DescribeKey。建立 Web 函數或修訂的委託人需要該許可。

範例金鑰政策

下列金鑰政策包含 Web Functions 所需的三個陳述式,每個陳述式的範圍都縮小為 中所述的條件縮小 KMS 金鑰的存取範圍。第一個陳述式會授予 Lambda 服務主體在啟動執行環境時所需的許可。第二個和第三個會授予建立修訂的委託人,其在建立時所需的許可。

kms:DescribeKey 位於單獨的 陳述式中,因為它是沒有加密內容的中繼資料操作。加密內容條件永遠不會符合DescribeKey請求,因此該條件僅適用於授予 kms:GenerateDataKey和 的 陳述式kms:Decrypt。

此範例僅顯示 Lambda 對 Web 函數所需的陳述式。將這些陳述式新增至您現有的金鑰政策,而不是取代它,並保留授予管理員管理金鑰存取權的陳述式。

範例 Web 函數加密的金鑰政策
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow Lambda to decrypt the data key for Web Function revisions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:lambda:WebFunctionRevisionArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*", "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" } } }, { "Sid": "Allow the revision creator to generate and validate data keys", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyWebFunctionDeployRole" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:lambda:WebFunctionRevisionArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" }, "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }, { "Sid": "Allow the revision creator to describe the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyWebFunctionDeployRole" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } } ] }

如需 AWS KMS 金鑰政策的詳細資訊,請參閱《 AWS Key Management Service 開發人員指南》中的 中的金鑰政策 AWS KMS。

使用客戶受管金鑰建立 Web 函數修訂

若要使用客戶受管金鑰加密修訂,請在修訂組態的 kmsKeyArn 參數中指定金鑰 ARN。您可以在呼叫 CreateWebFunction 或 CreateWebFunctionRevision 時設定此參數。如果您省略 kmsKeyArn,Lambda 會使用 加密修訂 AWS 擁有的金鑰。

使用客戶受管金鑰建立 Web 函數 (AWS CLI)
  • 執行下列命令,使用客戶受管金鑰建立 Web 函數。

    aws lambda-web create-web-function \ --function-name my-web-app \ --revision-config '{ "kmsKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id", "buildConfig": { "codeConfig": { "s3Object": { "bucket": "amzn-s3-demo-bucket", "key": "my-app.zip" } }, "runtimeConfig": { "runtime": "nodejs24.x" } }, "serviceConfig": { "executionRoleArn": "arn:aws:iam::111122223333:role/my-web-function-role" } }' \ --endpoint-config '{ "endpointName": "my-endpoint", "endpointType": "HomeRegion", "authType": "ApplicationManaged" }'

變更現有 Web 函數的加密組態

kmsKeyArn 參數在修訂的生命週期內是固定的。由於修訂是不可變的,因此您無法變更保護現有修訂的金鑰。若要變更加密組態,請建立新的修訂,指定新的金鑰,然後將流量路由到該修訂。

Web 函數支援下列金鑰轉換:

  • AWS 擁有的金鑰 至客戶受管金鑰 – 建立指定 的新修訂kmsKeyArn。

  • 不同客戶受管金鑰的一個客戶受管金鑰 – 建立新的修訂,以指定新的金鑰 ARN。

  • 的客戶受管金鑰 AWS 擁有的金鑰 – 建立不含 的新修訂kmsKeyArn。然後,Lambda 會使用 保護該修訂 AWS 擁有的金鑰,這是預設值。

當您使用不同的金鑰建立新的修訂時,Lambda 不會重新加密現有的修訂。每個修訂都會使用您在建立時指定的金鑰進行加密。這表示只要較早的修訂版仍然可以接收流量,其原始金鑰必須保持啟用狀態,並可供 Lambda 服務主體存取。在您停用或刪除金鑰之前,請確認端點的修訂權重仍然不會參考使用該金鑰加密的修訂。

使用不同的客戶受管金鑰建立新的修訂 (AWS CLI)
  1. 執行下列命令來建立使用不同金鑰的修訂。

    aws lambda-web create-web-function-revision \ --function-name my-web-app \ --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/new-key-id \ --build-config '{ "codeConfig": { "s3Object": { "bucket": "my-bucket", "key": "my-app-v2.zip" } }, "runtimeConfig": { "runtime": "nodejs24.x" } }' \ --service-config '{ "executionRoleArn": "arn:aws:iam::111122223333:role/my-web-function-role" }'
  2. 更新端點的修訂權重,將流量路由到新的修訂。如需詳細資訊,請參閱部署模式。

縮小 KMS 金鑰的存取範圍

中的金鑰政策會使用下列條件金鑰範例金鑰政策限制存取。每個金鑰都會限制如何使用金鑰,因此對金鑰的存取不會超過 Web 函數的需求。

加密內容

Lambda 會aws:lambda:WebFunctionRevisionArn為每個修訂 AWS KMS 請求設定加密內容。在 上使用StringLike條件kms:EncryptionContext:aws:lambda:WebFunctionRevisionArn,將金鑰限制為特定 Web 函數的修訂。將此條件同時套用至建立者陳述式和 Lambda 服務主體陳述式。

請勿將此條件套用至授予 的陳述式kms:DescribeKey。該操作沒有加密內容,因此 條件會拒絕它。

下列範例顯示具有加密內容條件的建立者陳述式。

{ "Sid": "Allow the revision creator to generate and validate data keys", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyWebFunctionDeployRole" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:lambda:WebFunctionRevisionArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" } } }

kms:ViaService 條件

kms:ViaService 條件會限制金鑰,以便只有 Lambda 代表您提出的請求才能使用它。值為區域特定:lambda.us-east-1.amazonaws.com。

在此條件下, 會 AWS KMS 拒絕使用相同登入資料 (例如aws kms generate-data-key,自行執行) 進行的直接呼叫,但建立 Web 函數會成功,因為 Lambda 會為您進行 AWS KMS 呼叫。

AWS KMS 不會在相關的多區域金鑰之間共用金鑰政策。每個複本金鑰都有自己的政策。當您搭配多區域金鑰使用 kms:ViaService條件時,請使用符合每個金鑰區域的區域服務名稱 (例如,lambda.us-east-1.amazonaws.com在 us-east-1 金鑰政策和 us-west-2 複本金鑰政策lambda.us-west-2.amazonaws.com中)。您也可以在一個條件中列出多個區域值,因為 StringEquals接受值陣列。

下列範例顯示同時具有 kms:ViaService條件和加密內容條件的建立者陳述式。

{ "Sid": "Allow the revision creator to generate and validate data keys", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyWebFunctionDeployRole" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:lambda:WebFunctionRevisionArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" }, "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }

混淆代理人保護

當沒有執行動作許可的實體強制更特權的實體執行時,就會發生混淆代理人問題。由於 Lambda 服務主體可以使用您的客戶受管金鑰,因此請限制存取您擁有的 Web 函數修訂。如需詳細資訊,請參閱《IAM 使用者指南》中的混淆代理問題。

當 Lambda AWS KMS 使用自己的服務憑證呼叫 以啟動執行環境時,它會將修訂 ARN 作為來源 ARN 傳送,並將您的 AWS 帳戶 ID 作為來源帳戶傳送。使用 Lambda 服務主體陳述式上的 aws:SourceArn 條件金鑰,將金鑰限制為特定 Web 函數的修訂。

{ "Sid": "Allow Lambda to decrypt the data key for Web Function revisions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:web-function/my-function/revision/*" } } }

若要將金鑰限制在您的帳戶,而非特定 Web 函數,請使用 aws:SourceAccount 條件金鑰搭配您的 AWS 帳戶 ID。

將此條件套用至 Lambda 服務主體陳述式。中所述kms:ViaService的條件會kms:ViaService 條件限制哪些服務可以使用 金鑰,但不會提供混淆代理人保護。

錯誤行為

當您建立修訂時,Lambda 會驗證 AWS KMS 金鑰。建立時可能發生下列錯誤:

  • 驗證錯誤 – 金鑰 ARN 無效、金鑰不存在、金鑰已停用,或金鑰不是對稱加密金鑰。

  • 存取遭拒錯誤 – 呼叫委託人或 Lambda 服務委託人沒有金鑰所需的 AWS KMS 許可。

請勿停用或撤銷對作用中修訂版金鑰的存取權

如果您在修訂版為 之後停用 AWS KMS 金鑰或撤銷 Lambda 服務主體的存取權Active,Lambda 就無法再解密資料金鑰。這可防止 Lambda 啟動該修訂的新執行環境,這會中斷調用。此外,請勿在仍部署修訂的區域中刪除複本金鑰。這具有相同的效果 (Lambda 無法在該區域中啟動新的執行環境)。若要還原服務,請使用可存取的金鑰建立新的修訂,或重新啟用原始金鑰並還原金鑰政策。

使用 MultiRegion 和 PerRegion 端點加密

對於具有 MultiRegion 或 PerRegion 端點的 Web 函數,Lambda 會在複寫期間檢查每個區域中的金鑰可用性。如果多區域金鑰複本在目標區域中遺失或無法存取,則僅該區域的複寫會失敗。其他區域會繼續正常運作。

您可以呼叫 來檢視每個區域的狀態和更新狀態GetWebFunctionEndpoint。中的每個區域項目都regionalEndpoints包含 state和 stateReason(區域的部署狀態) 和 updateStatus 和 updateStatusReason(最近更新的結果)。行為會因是否建立或更新端點而有所不同:

  • 在端點建立期間 – 中的區域項目regionalEndpoints會顯示 state的 stateReason ,Failed其中包含描述金鑰問題的 。整體端點state也會顯示 Failed,其會將您stateReason導向區域項目。

  • 在端點更新期間 – 區域的 updateStatusFailed會顯示updateStatusReason描述金鑰問題的 。整體端點updateStatus也會顯示 Failed,其會將您updateStatusReason導向區域項目。

若要解決失敗的區域,請在該區域中建立金鑰複本,或還原對現有複本的存取權,然後更新端點以重試複寫。

監控 Web 函數與 的互動 AWS KMS

當您使用客戶受管金鑰搭配 Web 函數時,您可以使用 CloudTrail 來追蹤 Lambda 代表您提出的 AWS KMS 請求。如需有關在 CloudTrail 日誌中尋找 AWS KMS 事件的資訊,請參閱《 AWS Key Management Service 開發人員指南》中的搜尋 CloudTrail 日誌以進行 AWS KMS API 呼叫。

下表列出 Web Functions 產生的 AWS KMS 事件,以及您可以在每個事件中稽核的值。

eventName 發生時 要稽核的值
DescribeKey 當您使用客戶受管金鑰建立 Web 函數或修訂時。 userIdentity 是建立修訂的 IAM 主體。此事件沒有加密內容,因為 DescribeKey 是中繼資料操作。
GenerateDataKey 當您建立 Web 函數或修訂版時。Lambda 會產生資料金鑰,以加密修訂的程式碼成品和環境變數。 userIdentity 是建立修訂的 IAM 主體。 encryptionContext包含 aws:lambda:WebFunctionRevisionArn。
Decrypt 當您建立 Web 函數或修訂時,Lambda 會驗證金鑰存取。當 Lambda 將修訂版部署到複本區域、啟動新的執行環境,以及呼叫者使用 讀取修訂版的環境變數時,Lambda 也會呼叫此操作GetWebFunctionRevision。 對於建立時間呼叫, userIdentity是建立修訂的 IAM 主體。Lambda 也會進行試轉Decrypt呼叫lambda.amazonaws.com,以確認服務主體可以使用 金鑰。對於執行期呼叫, userIdentity是 Lambda 服務主體 (lambda.amazonaws.com)。對於 GetWebFunctionRevision,Lambda Decrypt會使用發起人的登入資料呼叫 。 encryptionContext包含 aws:lambda:WebFunctionRevisionArn。

GenerateDataKey 和 Decrypt事件包含修訂版 ARN aws:lambda:WebFunctionRevisionArn的加密內容。使用此值來識別特定 Web 函數修訂的 AWS KMS 請求。