

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

# Web 函數的靜態加密
<a name="web-functions-encryption"></a>

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

## 靜態加密的選項
<a name="web-functions-encryption-options"></a>

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

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

**AWS 擁有的金鑰 (預設值)**  
根據預設，Lambda 會使用 加密您的資料[AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)。 AWS 擁有和管理此金鑰。您無法檢視、管理或稽核其使用方式。如果此預設行為符合您的需求，則不需要額外的設定。

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

## 使用客戶受管金鑰加密靜態資料
<a name="web-functions-encryption-cmk"></a>

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

### Web 函數如何使用客戶受管金鑰
<a name="web-functions-encryption-how-it-works"></a>

當您指定客戶受管金鑰時，Lambda 會使用[信封加密](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)。這表示 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 金鑰的存取範圍](#web-functions-encryption-scope-down)。

### 設定客戶受管金鑰
<a name="web-functions-encryption-key-requirements"></a>

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

Web 函數支援多區域金鑰。您需要的金鑰類型取決於您的端點組態：
+ **HomeRegion 端點** – 您可以使用單一區域金鑰或多區域金鑰。
+ **MultiRegion 或 PerRegion 端點** – 您必須在端點提供的每個 中使用具有複本 AWS 區域 的多區域金鑰。如果區域缺少金鑰的複本，複寫至該區域會失敗。

如需建立多區域金鑰的相關資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[建立多區域主金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-primary-keys.html)。

由於 AWS KMS 不會在相關的多區域金鑰之間複製或同步金鑰政策，因此您必須分別設定每個金鑰政策。在主金鑰和每個複本金鑰上設定金鑰政策。每個複本金鑰的政策至少必須允許 Lambda 服務主體呼叫 `kms:Decrypt`。此許可允許 Lambda 解密該區域中的資料金鑰。如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[授權使用多區域金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-auth.html)。

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

### 設定使用客戶受管金鑰的許可
<a name="web-functions-encryption-permissions"></a>

若要使用客戶受管金鑰建立修訂，您需要 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 函數或修訂的委託人需要該許可。

#### 範例金鑰政策
<a name="web-functions-encryption-key-policy"></a>

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

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

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

**Example 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](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

### 使用客戶受管金鑰建立 Web 函數修訂
<a name="web-functions-encryption-specifying-key"></a>

若要使用客戶受管金鑰加密修訂，請在修訂組態的 `kmsKeyArn` 參數中指定金鑰 ARN。您可以在呼叫 [CreateWebFunction](https://docs.aws.amazon.com/lambda/latest/lambda-web/API_CreateWebFunction.html) 或 [CreateWebFunctionRevision](https://docs.aws.amazon.com/lambda/latest/lambda-web/API_CreateWebFunctionRevision.html) 時設定此參數。如果您省略 `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 函數的加密組態
<a name="web-functions-encryption-changing-key"></a>

`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}}"
       }'
   ```

1. 更新端點的修訂權重，將流量路由到新的修訂。如需詳細資訊，請參閱[部署模式](web-functions-deployment.md)。

### 縮小 KMS 金鑰的存取範圍
<a name="web-functions-encryption-scope-down"></a>

中的金鑰政策會使用下列條件金鑰[範例金鑰政策](#web-functions-encryption-key-policy)限制存取。每個金鑰都會限制如何使用金鑰，因此對金鑰的存取不會超過 Web 函數的需求。

#### 加密內容
<a name="web-functions-encryption-scope-down-context"></a>

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 條件
<a name="web-functions-encryption-scope-down-viaservice"></a>

`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"
        }
    }
}
```

#### 混淆代理人保護
<a name="web-functions-encryption-scope-down-confused-deputy"></a>

當沒有執行動作許可的實體強制更特權的實體執行時，就會發生混淆代理人問題。由於 Lambda 服務主體可以使用您的客戶受管金鑰，因此請限制存取您擁有的 Web 函數修訂。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[混淆代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。

當 Lambda AWS KMS 使用自己的服務憑證呼叫 以啟動執行環境時，它會將修訂 ARN 作為來源 ARN 傳送，並將您的 AWS 帳戶 ID 作為來源帳戶傳送。使用 Lambda 服務主體陳述式上的 [aws：SourceArn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-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](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 條件金鑰搭配您的 AWS 帳戶 ID。

將此條件套用至 Lambda 服務主體陳述式。中所述`kms:ViaService`的條件會[kms:ViaService 條件](#web-functions-encryption-scope-down-viaservice)限制哪些服務可以使用 金鑰，但不會提供混淆代理人保護。

### 錯誤行為
<a name="web-functions-encryption-errors"></a>

當您建立修訂時，Lambda 會驗證 AWS KMS 金鑰。建立時可能發生下列錯誤：
+ **驗證錯誤** – 金鑰 ARN 無效、金鑰不存在、金鑰已停用，或金鑰不是對稱加密金鑰。
+ **存取遭拒錯誤** – 呼叫委託人或 Lambda 服務委託人沒有金鑰所需的 AWS KMS 許可。

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

### 使用 MultiRegion 和 PerRegion 端點加密
<a name="web-functions-encryption-multi-region"></a>

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

您可以呼叫 來檢視每個區域的狀態和更新狀態`GetWebFunctionEndpoint`。中的每個區域項目都`regionalEndpoints`包含 `state`和 `stateReason`（區域的部署狀態） 和 `updateStatus` 和 `updateStatusReason`（最近更新的結果）。行為會因是否建立或更新端點而有所不同：
+ 在**端點建立期間** – 中的區域項目`regionalEndpoints`會顯示 `state`的 `stateReason` ，`Failed`其中包含描述金鑰問題的 。整體端點`state`也會顯示 `Failed`，其會將您`stateReason`導向區域項目。
+ **在端點更新期間** – 區域的 `updateStatus``Failed`會顯示`updateStatusReason`描述金鑰問題的 。整體端點`updateStatus`也會顯示 `Failed`，其會將您`updateStatusReason`導向區域項目。

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

## 監控 Web 函數與 的互動 AWS KMS
<a name="web-functions-encryption-monitoring"></a>

當您使用客戶受管金鑰搭配 Web 函數時，您可以使用 CloudTrail 來追蹤 Lambda 代表您提出的 AWS KMS 請求。如需有關在 CloudTrail 日誌中尋找 AWS KMS 事件的資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[搜尋 CloudTrail 日誌以進行 AWS KMS API 呼叫](https://docs.aws.amazon.com/kms/latest/developerguide/logging-using-cloudtrail.html#searching-kms-ct)。

下表列出 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 請求。