

# 使用代码签名通过 Lambda 验证代码完整性
<a name="configuration-codesigning"></a>

代码签名有助于确保只有可信代码部署到您的 Lambda 函数。使用 AWS Signer，您可以为您的函数创建数字签名的代码包。当您[向函数添加代码签名配置](configuration-codesigning-create.md)时，Lambda 会验证所有新代码部署是否由可信来源签名。由于代码签名验证检查在部署时运行，因此对函数执行没有影响。

**重要**  
代码签名配置仅阻止未签名代码的新部署。如果将代码签名配置添加到具有未签名代码的现有函数，则该代码将一直运行，直到您部署新的代码包。

当您为某个函数启用代码签名时，您添加到该函数的任何[层](chapter-layers.md)也必须由允许的签名配置文件进行签名。

使用 AWS Signer 或 AWS Lambda 代码签名不收取任何额外费用。

## 签名验证
<a name="config-codesigning-valid"></a>

将签名代码包部署到函数时，Lambda 会执行以下验证检查：

1. **完整性**：验证代码包自签名以来是否尚未修改。Lambda 将包的哈希值与签名的哈希值进行比较。

1. **过期**：验证代码包的签名是否尚未过期。

1. **不匹配**：验证代码包是否使用允许的签名配置文件进行签名

1. **撤销**：验证代码包的签名是否尚未撤销。

创建代码签名配置时，您可以使用 [UntrustedArtifactOnDeployment](https://docs.aws.amazon.com/lambda/latest/api/API_CodeSigningPolicies.html#lambda-Type-CodeSigningPolicies-UntrustedArtifactOnDeployment) 参数来指定在过期、不匹配或撤销检查失败时 Lambda 应如何响应。您可以选择以下操作之一：
+ `Warn`：这是默认设置。Lambda 允许部署代码包，但会发出警告。Lambda 发布新的 Amazon CloudWatch 指标 (`SignatureValidationErrors`)，并将警告存储在 CloudTrail 日志中。
+ `Enforce` Lambda 发出警告（与 `Warn` 操作相同）并阻止代码包的部署。

**Topics**
+ [

## 签名验证
](#config-codesigning-valid)
+ [

# 为 Lambda 创建代码签名配置
](configuration-codesigning-create.md)
+ [

# 为 Lambda 代码签名配置 IAM 策略
](config-codesigning-policies.md)
+ [

# 在代码签名配置上使用标签
](tags-csc.md)

# 为 Lambda 创建代码签名配置
<a name="configuration-codesigning-create"></a>

要为函数启用代码签名，您需要创建*代码签名配置*并将其附加到函数。代码签名配置定义了允许的签名配置文件列表以及在任意一项验证检查失败时要采取的策略操作。

**注意**  
定义为容器映像的函数不支持代码签名。

**Topics**
+ [

## 配置先决条件
](#config-codesigning-prereqs)
+ [

## 创建代码签名配置
](#config-codesigning-config-console)
+ [

## 为函数启用代码签名
](#config-codesigning-function-console)

## 配置先决条件
<a name="config-codesigning-prereqs"></a>

为 Lambda 函数配置代码签名之前，请使用 AWS Signer 执行以下操作：
+ 创建一个或多个[签名配置文件](https://docs.aws.amazon.com/signer/latest/developerguide/signing-profiles.html)。
+ 使用签名配置文件[为函数创建签名代码包](https://docs.aws.amazon.com/signer/latest/developerguide/lambda-workflow.html)。

## 创建代码签名配置
<a name="config-codesigning-config-console"></a>

代码签名配置定义允许的签名配置文件列表和签名验证策略。

**创建代码签名配置（控制台）**

1. 打开 Lambda 控制台的 [Code signing configurations（代码签名配置）页面](https://console.aws.amazon.com/lambda/home#/code-signing-configurations)。

1. 选择 **Create configuration**（创建配置）。

1. 对于 **Description（描述）**，输入一个描述性的配置名称。

1. 在 **Signing profiles**（签名配置文件）下，最多可以在配置中添加 20 个签名配置文件。

   1. 对于 **Signing profile version ARN（签名配置文件版本 ARN）**，选择配置文件版本的 Amazon 资源名称 (ARN) 或输入 ARN。

   1. 要添加其他签名配置文件，请选择 **Add signing profiles（添加签名配置文件）**。

1. 在 **Signature validation policy**（签名验证策略）下，选择 **Warn**（警告）或 **Enforce**（强制执行）。

1. 选择 **Create configuration**（创建配置）。

## 为函数启用代码签名
<a name="config-codesigning-function-console"></a>

要为函数启用代码签名，请向该函数添加代码签名配置。

**重要**  
代码签名配置仅阻止未签名代码的新部署。如果将代码签名配置添加到具有未签名代码的现有函数，则该代码将一直运行，直到您部署新的代码包。

**将代码签名配置与函数关联（控制台）**

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

1. 选择要启用代码签名的函数。

1. 打开 **Configuration**（配置）选项卡。

1. 向下滚动并选择**代码签名**。

1. 选择**编辑**。

1. 在 **Edit code signing（编辑代码签名）**中，为此函数选择代码签名配置。

1. 选择**保存**。

# 为 Lambda 代码签名配置 IAM 策略
<a name="config-codesigning-policies"></a>

要授予用户访问 Lambda 代码签名 API 操作的权限，请将一个或多个策略声明附加到用户策略。有关用户策略的详细信息，请参阅[Lambda 的基于身份的 IAM policy](access-control-identity-based.md)。

以下示例策略声明将授予创建、更新和检索代码签名配置的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
          "lambda:CreateCodeSigningConfig",
          "lambda:UpdateCodeSigningConfig",
          "lambda:GetCodeSigningConfig"
        ],
      "Resource": "*" 
    }
  ]
}
```

------

管理员可以使用 `CodeSigningConfigArn` 条件键指定开发人员创建或更新函数时必须使用的代码签名配置。

以下示例策略声明将授予创建函数的权限。策略声明包括指定允许的代码签名配置的 `lambda:CodeSigningConfigArn` 条件。如果 [CodeSigningConfigArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-CodeSigningConfigArn) 参数缺失或与条件中的值不匹配，则 Lambda 会阻止 `CreateFunction` API 请求。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowReferencingCodeSigningConfig",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "lambda:CodeSigningConfigArn": "arn:aws:lambda:us-east-1:111122223333:code-signing-config:csc-0d4518bd353a0a7c6"
        }
      }
    }
  ]
}
```

------

# 在代码签名配置上使用标签
<a name="tags-csc"></a>

对代码签名配置进行标签可以组织和管理资源。标签是与资源关联的自由格式键值对，在 AWS 服务 中受支持。有关标签用例的更多信息，请参阅《Tagging AWS Resources and Tag Editor Guide》**中的 [Common tagging strategies](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)。

 可以使用 AWS Lambda API 来查看和更新标签。在 Lambda 控制台中管理特定的代码签名配置时，还可以查看和更新标签。

**Topics**
+ [

## 使用标签所需的权限
](#csc-tags-required-permissions)
+ [

## 通过 Lambda 控制台使用标签
](#tags-csc-console)
+ [

## 通过 AWS CLI 使用标签
](#tags-csc-cli)

## 使用标签所需的权限
<a name="csc-tags-required-permissions"></a>

要允许 AWS Identity and Access Management（IAM）身份（用户、组或角色）读取资源或为其设置标签，请授予该身份相应的权限：
+ **lambda:ListTags** – 当资源有标签时，将此权限授予需要在其上调用 `ListTags` 的任何人。对于带标签的函数，`GetFunction` 也需要此权限。
+ **lambda:TagResource** – 将此权限授予需要调用 `TagResource` 或执行在创建时授予标记的操作的任何人。

或者，也可以考虑授予 **lambda:UntagResource** 权限以允许 `UntagResource` 调用该资源。

有关更多信息，请参阅 [Lambda 的基于身份的 IAM policy](access-control-identity-based.md)。

## 通过 Lambda 控制台使用标签
<a name="tags-csc-console"></a>

可以使用 Lambda 控制台创建带标签的代码签名配置、向现有代码签名配置添加标签、按标签筛选代码签名配置。

**在创建代码签名配置时添加标签**

1. 在 Lambda 控制台中打开[代码签名配置](https://console.aws.amazon.com/lambda/home#/code-signing-configurations)。

1. 从内容窗格的标题中选择**创建配置**。

1. 在内容窗格的顶部区域中设置代码签名配置。有关设定代码签名配置的更多信息，请参阅[使用代码签名通过 Lambda 验证代码完整性](configuration-codesigning.md)。

1. 在**标签**部分，选择**添加新标签**。

1. 在**键**字段中输入标签键。有关标记限制的信息，请参阅《Tagging AWS Resources and Tag Editor Guide》中的 [Tag naming limits and requirements](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)。**

1. 选择**创建配置**。

**向现有代码签名配置添加标签**

1. 在 Lambda 控制台中打开[代码签名配置](https://console.aws.amazon.com/lambda/home#/code-signing-configurations)。

1. 选择代码签名配置的名称。

1. 在**详细信息**窗格下方的选项卡中选择**标签**。

1. 选择**管理标签**。

1. 选择 **Add new tag（添加新标签）**。

1. 在**键**字段中输入标签键。有关标记限制的信息，请参阅《Tagging AWS Resources and Tag Editor Guide》中的 [Tag naming limits and requirements](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices)。**

1. 选择**保存**。

**按标签筛选代码签名配置**

1. 在 Lambda 控制台中打开[代码签名配置](https://console.aws.amazon.com/lambda/home#/code-signing-configurations)。

1. 选择搜索框。

1. 在下拉列表中，从**标签**副标题下方选择标签。

1. 选择**使用：“tag-name”**查看所有使用此键标记的代码签名配置，或者选择一个**运算符**进一步按值筛选。

1. 选择标签值以按标签键和值的组合进行筛选。

搜索框还支持搜索标签键。输入键名称，即可在列表中查找该键。

## 通过 AWS CLI 使用标签
<a name="tags-csc-cli"></a>

可以使用 Lambda API 在现有 Lambda 资源（包括代码签名配置）上添加和删除标签。还可以在创建代码签名配置时添加标签，这样就可以在资源的整个生命周期中对其进行标记。

### 使用 Lambda 标签 API 更新标签
<a name="tags-csc-api-config"></a>

可以通过 [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) 和 [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API 操作，添加和删除受支持 Lambda 资源的标签。

可以使用 AWS CLI 调用这些操作。要向现有资源添加标签，请使用 `tag-resource` 命令。此示例添加了两个标签，一个带有键 *Department*，另一个带有键 *CostCenter*。

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

要删除标签，请使用 `untag-resource` 命令。此示例删除了键为 *Department* 的标签。

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### 在创建代码签名配置时添加标签
<a name="tags-csc-on-create"></a>

若要使用标签创建新的 Lambda 代码签名配置，请使用 [CreateCodeSigningConfig](https://docs.aws.amazon.com//lambda/latest/api/API_CreateCodeSigningConfig.html) API 操作。指定 `Tags` 参数。可以使用 `create-code-signing-config` AWS CLI 命令和 `--tags` 选项调用此操作。有关 CLI 命令的更多信息，请参阅《AWS CLI Command Reference》中的 [create-code-signing-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-code-signing-config.html)。**

在将 `Tags` 参数与 `CreateCodeSigningConfig` 一起使用之前，请确保角色拥有标记资源的权限以及此操作所需的常规权限。有关标记权限的更多信息，请参阅 [使用标签所需的权限](#csc-tags-required-permissions)。

### 使用 Lambda 标签 API 查看标签
<a name="tags-csc-api-view"></a>

要查看应用于特定 Lambda 资源的标签，请使用 `ListTags` API 操作。有关更多信息，请参阅 [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)。

可以提供 ARN（Amazon 资源名称），以使用 `list-tags` AWS CLI 命令调用此操作。

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### 按标签筛选资源
<a name="tags-csc-filtering"></a>

您可以使用 AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API 操作按标签筛选资源。`GetResources` 操作最多可接收 10 个筛选条件，每个筛选条件包含一个标签键和最多 10 个标签值。提供具有 `ResourceType` 的 `GetResources`，可按特定资源类型进行筛选。

可以使用 `get-resources` AWS CLI 命令调用此操作。有关使用 `get-resources` 的示例，请参阅《AWS CLI Command Reference》**中的 [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)。