使用 Amazon Signer 的 Lambda 代码签名 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon Signer 的 Lambda 代码签名

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

要为 Lambda 函数设置代码签名,请先创建一个启用了版本控制的 S3 存储桶。之后,使用 Amazon 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

现在,您已将 Amazon 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 位 Amazon Web Services 账户 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.

如果您使用 Amazon Serverless Application Model(Amazon 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

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