

# 使用 AWS Signer 的 Lambda 代码签名
<a name="governance-code-signing"></a>

[AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 是一项完全托管的代码签名服务，让您可以根据数字签名验证代码，从而确认代码未被更改且来自可信的发布者。AWS Signer 可以与 AWS Lambda 结合使用，用于验证函数和层在部署到您的 AWS 环境之前未被更改。这可以保护您的组织免受恶意行为者的侵害，这些恶意行为者可能已获得创建新函数或更新现有函数的凭证。

要为 Lambda 函数设置代码签名，请先创建一个启用了版本控制的 S3 存储桶。之后，使用 AWS Signer 创建签名配置文件，将 Lambda 指定为平台，然后指定签名配置文件的有效期限。例如：

```
  Signer:
    Type: AWS::Signer::SigningProfile
    Properties:
      PlatformId: AWSLambda-SHA384-ECDSA
      SignatureValidityPeriod:
        Type: DAYS
        Value: !Ref pValidDays
```

然后使用签名配置文件，并通过 Lambda 创建签名配置。当签名配置看到与预期数字签名不匹配的构件时，必须指定要采取的措施：警告（但允许部署）或强制执行（并阻止部署）。以下示例配置为强制执行并阻止部署。

```
  SigningConfig:
    Type: AWS::Lambda::CodeSigningConfig
    Properties:
      AllowedPublishers:
        SigningProfileVersionArns:
          - !GetAtt Signer.ProfileVersionArn
      CodeSigningPolicies:
        UntrustedArtifactOnDeployment: Enforce
```

现在，您已将 AWS Signer 与 Lambda 一同配置，以阻止不受信任的部署。假设您已完成功能请求的编码，现在准备好部署该函数。第一步是使用相应的依赖项压缩代码，然后使用您创建的签名配置文件对构件进行签名。为此，您可以将 zip 构件上传到 S3 存储桶，然后启动签名作业。

```
aws signer start-signing-job \
--source 's3={bucketName=your-versioned-bucket,key=your-prefix/your-zip-artifact.zip,version=QyaJ3c4qa50LXV.9VaZgXHlsGbvCXxpT}' \
--destination 's3={bucketName=your-versioned-bucket,prefix=your-prefix/}' \
--profile-name your-signer-id
```

您将获得如下输出，其中 `jobId` 是在目标存储桶和前缀中创建的对象，`jobOwner` 是运行作业的 12 位 AWS 账户 ID。

```
{
    "jobId": "87a3522b-5c0b-4d7d-b4e0-4255a8e05388",
    "jobOwner": "111122223333"
  }
```

现在，您可以使用已签名的 S3 对象和创建的代码签名配置来部署您的函数。

```
  Fn:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://your-versioned-bucket/your-prefix/87a3522b-5c0b-4d7d-b4e0-4255a8e05388.zip
      Handler: fn.handler
      Role: !GetAtt FnRole.Arn
      CodeSigningConfigArn: !Ref pSigningConfigArn
```

或者，您也可以使用原始的未签名源 zip 构件来测试函数部署。部署失败时会显示如下消息：。

```
Lambda cannot deploy the function. The function or layer might be signed using a signature that the client is not configured to accept. Check the provided signature for unsigned.
```

如果您使用 AWS Serverless Application Model（AWS SAM）构建和部署函数，程序包命令会处理将 zip 构件上传到 S3 的作业，还会启动签名作业并获取已签名的构件。您可以使用参数和命令执行该操作：

```
sam package -t your-template.yaml \
--output-template-file your-output.yaml \
--s3-bucket your-versioned-bucket \
--s3-prefix your-prefix \
--signing-profiles your-signer-id
```

AWS Signer 可帮助您验证部署到账户中的 zip 构件是否值得信任，可用于部署。您可以将上述过程包含在 CI/CD 管道中，并要求所有函数都附加使用前面主题中概述的技术的代码签名配置。通过在 Lambda 函数部署中使用代码签名，可以防止恶意行为者在获得创建或更新函数的凭证后在函数中注入恶意代码。