

# 保护 Lambda 环境变量
<a name="configuration-envvars-encryption"></a>

为了保护环境变量，您可以使用服务器端加密来保护静态数据，使用客户端加密来保护传输中数据。

**注意**  
为了提高数据库的安全性，建议您使用 AWS Secrets Manager 而不是环境变量来存储数据库凭证。有关更多信息，请参阅 [在 Lambda 函数中使用 Secrets Manager 密钥](with-secrets-manager.md)。

**静态安全**  
Lambda 始终使用 AWS KMS key 提供服务器端静态加密。默认情况下，Lambda 使用 AWS 托管式密钥。如果此默认行为适合您的工作流，您无需设置任何其他内容。Lambda 将在账户中创建 AWS 托管式密钥，并为您管理权限。AWS 不会向您收取使用此密钥的费用。

如果您愿意，可以提供 AWS KMS 客户托管式密钥。这样做可能是为了控制 KMS 密钥的轮换，或者是为了满足组织管理 KMS 密钥的要求。当您使用客户托管式密钥时，只有您账户中有权访问 KMS 密钥的用户才能查看或管理函数上的环境变量。

客户托管式密钥产生标准 AWS KMS 费用。有关更多信息，请参阅 [AWS Key Management Service 定价](https://aws.amazon.com/kms/pricing/)。

**传输过程中的安全**  
为了提高安全性，您可以为传输中加密启用帮助程序，这样可以确保环境变量在客户端加密，以便在传输过程中提供保护。

**为环境变量配置加密**

1. 使用 AWS Key Management Service（AWS KMS）创建任意客户托管式密钥，供 Lambda 用于服务器端和客户端加密。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

1. 使用 Lambda 控制台，导航到 **Edit environment variables (编辑环境变量)** 页面。

   1. 打开 Lamba 控制台的 [Functions](https://console.aws.amazon.com/lambda/home#/functions)（函数）页面。

   1. 选择函数。

   1. 选择 **Configuration (配置)**，然后从左侧导航栏选择 **Environment variables (环境变量)**。

   1. 在 **Environment variables (环境变量)** 部分中，选择 **Edit (编辑)**。

   1. 展开 **Encryption configuration (加密配置)**。

1. （可选）启用控制台加密帮助程序，以使用客户端加密来保护传输中数据。

   1. 在 **Encryption in transit (传输中加密)** 下，选择 **Enable helpers for encryption in transit (为传输中加密启用帮助程序)**。

   1. 对于要为其启用控制台加密帮助程序的每个环境变量，选择环境变量旁的 **Encrypt**（加密）。

   1.  在要传输中加密的 AWS KMS key 下，选择在此过程开始时创建的客户托管式密钥。

   1. 选择 **Execution role policy (执行角色策略)**并复制策略。此策略授予函数执行角色解密环境变量的权限。

      保存此策略以便在此过程的最后一步中使用。

   1. 将代码添加到解密环境变量的函数中。选择**解密密钥代码段**来查看示例。

1. （可选）为静态加密指定您的客户托管密钥。

   1. 选择 **Use a customer master key (使用客户主密钥)**。

   1. 选择在此过程开始时创建的客户托管式密钥。

1. 选择 **Save**（保存）。

1. 设置权限。

   如果您使用带有服务器端加密的客户托管密钥，请将权限授予您希望能查看或管理函数上的环境变量的任何用户或角色。有关更多信息，请参阅 [管理服务器端加密 KMS 密钥的权限](#managing-permissions-to-your-server-side-encryption-key)。

   如果您为传输中的安全性启用客户端加密，您的函数需要调用 `kms:Decrypt` API 操作的权限。将之前在此过程中保存的策略添加到函数的[执行角色](lambda-intro-execution-role.md)。

## 管理服务器端加密 KMS 密钥的权限
<a name="managing-permissions-to-your-server-side-encryption-key"></a>

您的用户或函数的执行角色不需要 AWS KMS 权限，即可使用默认加密密钥。要使用客户托管式密钥，您需要具有使用密钥的权限。Lambda 使用您的权限在密钥上创建授权。Lambda 可将其用于加密。
+ `kms:ListAliases` – 在 Lambda 控制台中查看密钥。
+ `kms:CreateGrant`、`kms:Encrypt` – 在函数上配置客户托管式密钥。
+ `kms:Decrypt` – 查看和管理使用客户托管式密钥加密的环境变量。

您可以从您的 AWS 账户 或从密钥的基于资源的权限策略获取这些权限。`ListAliases` 由 [Lambda 的托管策略](access-control-identity-based.md)提供。密钥策略将剩余权限授予**密钥用户**组中的用户。

没有 `Decrypt` 权限的用户仍然可以管理函数，但无法在 Lambda 控制台中查看或管理环境变量。要防止用户查看环境变量，请向用户的权限添加一条语句，该语句拒绝访问默认密钥、客户托管式密钥或所有密钥。

**Example IAM policy – 按密钥 ARN 拒绝访问**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc"
        }
    ]
}
```

有关托管密钥权限的详细信息，请参阅《AWS Key Management Service 开发人员指南》**中的[使用 AWS KMS 的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。