AWS Signer 是一项完全托管的代码签名服务,旨在确保代码的可信性和完整性。它帮助你验证代码是否来自受信任的来源,并确保没有未经授权的人员访问代码。AWS Signer 管理代码签名证书及公钥和私钥,减少了公钥基础设施PKI管理的负担。此服务还提供了一系列功能,以简化密钥和证书的生命周期管理,从而使你可以专注于签名和验证代码。

在 2023 年 6 月,AWS 宣布推出与 AWS Signer 和 Amazon EKS 一起的容器镜像签名,这一新功能为在Amazon Elastic Container Registry (Amazon ECR)中存储的容器镜像提供了原生的 AWS 支持,能够对其进行签名和验证。
容器和AWS Lambda 函数是用于构建云应用的流行无服务器计算解决方案。使用 AWS Signer,你可以验证在这些工作负载中运行的软件是否源于可信来源。
接下来,你将学习代码签名在软件安全性、治理和合规需求方面的好处。灵活的持续集成和持续交付CI/CD的集成、签名身份的管理,以及与其他 AWS 服务的原生集成,都可以通过自动化简化代码安全性。
代码签名是软件供应链中重要的一环。它确保代码未被篡改并来自经过批准的来源。
为了自动化软件开发工作流,组织通常会执行 CI/CD 流水线,以高效推送、测试和部署代码。你可以将代码签名集成到工作流中,以帮助防止不受信任的代码被部署,如图 1 所示。流水线中的代码签名根据功能使用情况可以提供不同类型的信息。例如,你可以在构建阶段集成代码签名,以确认代码经过漏洞扫描、内部批准的材料清单SBOM,并完成单元和集成测试。你还可以使用代码签名验证是谁推送或发布的代码,比如开发人员、团队或组织。通过在流水线中包含多个签名阶段,可以分别验证这些步骤。有关容器镜像签名所提供的价值的更多信息,请参见容器的加密签名。
在接下来的部分中,我们将引导你完成 Amazon Elastic Kubernetes Service (Amazon EKS) 部署中图像签名及其验证的简单实现。签名证明容器镜像通过了流水线并来自受信任的来源。你可以通过添加多个AWS CodeBuild代码签名阶段来使用此过程,利用不同的 AWS Signer 签名配置文件来实现更复杂的场景。
在本节中,我们将讨论实现此解决方案所需的各种 AWS 服务和第三方工具。
在 CI/CD 流水线中,你将使用以下 AWS 服务:
AWS CodePipeline 一项完全托管的持续交付服务,可用于自动化你的发布流水线,以便快速和可靠地更新应用程序和基础设施。AWS CodeCommit 一项完全托管的源代码控制服务,提供安全的基于 Git 的代码库。AWS Signer 一项完全托管的代码签名服务,用于确保你代码的可信性和完整性。AWS CodeBuild 一项完全托管的持续集成服务,用于编译源代码、运行测试并生成可部署的软件包。在此演练中,你将为容器使用以下 AWS 服务:
Amazon EKS 一项托管的 Kubernetes 服务,用于在 AWS 云和本地数据中心运行 Kubernetes。Amazon ECR 一项完全托管的容器注册表,用于高性能托管,以可靠地在任何地方部署应用程序镜像和工件。以下是我们在流水线中集成的公开可用的签名验证工具,但你可以集成满足特定要求的其他工具。
Notation 一项公开可用的 Notary 项目,属于云原生计算基金会 (CNCF)。Notary 是一种开放标准和客户端实现,允许针对密钥管理和其他集成的特定于供应商的插件。AWS Signer 管理你的签名密钥、密钥轮换和 PKI 管理,并通过一个精心挑选的插件与 Notation 集成,提供简单的客户端工作流程。Kyverno 一项公开可用的策略引擎,专为 Kubernetes 设计。解决方案的工作原理如下,如图 2 所示:
开发人员将Dockerfile和应用程序代码推送到 CodeCommit。每次推送到 CodeCommit 都会启动 CodePipeline 上托管的流水线。CodeBuild 打包构建,容器化应用,并将镜像存储在 ECR 注册表中。CodeBuild 从之前推送到 Amazon ECR 的镜像中检索特定版本。AWS Signer 和 Notation 使用先前建立的签名配置文件对镜像进行签名,这在图 3 中进行了更详细的说明。AWS Signer 和 Notation 验证已签名的镜像版本,然后将其部署到 Amazon EKS 集群中。如果镜像以前没有被正确签名,CodeBuild 日志显示的输出类似于以下内容:
Error signature verification failed no signature is associated with ltAWSACCOUNTIDgtdkrecrltAWSREGIONgtamazonawscom/helloserver@ltDIGESTgt make sure the artifact was signed successfully
如果签名不匹配,CodeBuild 日志显示的输出类似于以下内容:
Error signature verification failed for all the signatures associated with ltAWSACCOUNTIDgtdkrecrltAWSREGIONgtamazonawscom/helloserver@ltDIGESTgt
迅猛兔加速器官网入口Kyverno 验证容器镜像签名,以便在 Amazon EKS 集群中使用。图 4 显示了步骤 4 和 5 的详细内容。
在开始之前,请确保具备以下前提条件:
已设置的Amazon EKS 集群。用于存储容器镜像的Amazon ECR 存储库。包含你应用代码的 CodeCommit 存储库。有关更多信息,请参见 创建 AWS CodeCommit 存储库。已部署的 CodePipeline,CodeCommit 存储库作为代码源,包含四个 CodeBuild 阶段:Build、ApplicationSigning、ApplicationDeployment 和 VerifyContainerSign。CI/CD 流水线应类似于图 5。你可以使用AWS 命令行界面 (AWS CLI)、AWS 管理控制台或AWS Signer API创建签名配置文件。在本节中,我们将引导你完成如何使用 AWS CLI 签署镜像的过程。
为每个身份创建一个签名配置文件。
bash
aws signer putsigningprofile profilename buildsigner platformid NotationOCISHA384ECDSA
从 CodeBuild 构建中签署镜像你的 buildspecyaml 配置文件应如下所示:
yamlversion 02
phases prebuild commands aws ecr getloginpassword region AWSREGION docker login username AWS passwordstdin AWSACCOUNTIDdkrecruseast1amazonawscom REPOSITORYURI=AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/helloserver COMMITHASH=(echo CODEBUILDRESOLVEDSOURCEVERSION cut c 17) IMAGETAG={COMMITHASH=latest} DIGEST=(docker manifest inspect AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/helloserverIMAGETAG v jq r Descriptordigest) echo DIGEST
wget https//d2hvyiie56hcatcloudfrontnet/linux/amd64/installer/rpm/latest/awssignernotationcliamd64rpm sudo rpm U awssignernotationcliamd64rpm notation version notation plugin ls
build commands notation sign REPOSITORYURI@DIGEST plugin comamazonawssignernotationplugin id arnawssignerAWSREGIONAWSACCOUNTID/signingprofiles/notationcontainersigning notation inspect AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/helloserver@DIGEST notation verify AWSACCOUNTIDdkrecrAWSREGIONamazonawscom/helloserver@DIGEST postbuild commands printf [{namehelloserverimageUris}] REPOSITORYURIIMAGETAG gt imagedefinitionsjsonartifacts files imagedefinitionsjson
buildspecyaml 配置文件中的命令执行以下操作:
1 登录到 Amazon ECR,以便处理 Docker 镜像。2 参考将要签署的特定镜像,使用提交哈希或组织使用的其他版本策略。这将获取摘要。3 使用 notation sign 命令对容器镜像进行签名。该命令使用容器镜像摘要而不是镜像标签。4 安装 Notation CLI。在此示例中,你使用的是 Linux 的安装程序。有关适用于各种操作系统的安装程序列表,请参见[AWS Signer 开发者指南](https//docsawsamazoncom/signer/latest/developerguide/Welcomehtml)。5 使用 notation sign 命令签署镜像。6 使用 notation inspect 命令检查已签名的镜像,以确保其成功签名。7 使用 notation verify 命令验证签署的镜像。输出应类似于以下内容: Successfully verified signature for ltAWSACCOUNTIDgtdkrecrltAWSREGIONgtamazonawscom/helloserver@ltDIGESTgt
可选为故障排查,在流水线中打印出政策,以检查其是否正常工作,运行 notation policy show 命令:
bashnotation policy show
对此,在 buildspecyaml 配置文件的 prebuild 阶段的 notation version 命令之后包含此命令。
执行 notation policy show 命令后,CodeBuild 日志应显示类似以下的输出:
json{ version 10 trustPolicies [ { name awssignertp registryScopes [ ltAWSACCOUNTIDgtdkrecrltAWSREGIONgtamazonawscom/helloserver ] signatureVerification { level strict } trustStores [ signingAuthorityawssignerts ] trustedIdentities [ arnawssignerltAWSREGIONgtltAWSACCOUNTIDgt/signingprofiles/notationtest ] } ]}要在 Kubernetes 中验证镜像,请在你的 EKS 集群中设置 Kyverno 和 KyvernonotationAWS Signer。有关 Kyverno 和 KyvernonotationAWS Signer 解决方案的安装说明,请参见安装指南。安装 Kyverno 和 KyvernonotationAWS Signer 后,检查控制器是否在运行状态应显示为运行中:
bash kubectl get pods n kyvernonotationaws w
配置 CodeBuild buildspecyaml 配置文件以验证在集群中部署的镜像是否已被之前签署。你可以使用以下代码配置 buildspecyaml 文件:
yamlversion 02
phases prebuild commands echo Logging in to Amazon ECR aws version REPOSITORYURI={REPOECR} COMMITHASH=(echo CODEBUILDRESOLVEDSOURCEVERSION cut c 17) IMAGETAG={COMMITHASH=latest} curl LO https//dlk8sio/release/(curl L s https//dlk8sio/release/stabletxt)/bin/linux/amd64/kubectl curl LO https//dlk8sio/release/(curl L s https//dlk8sio/release/stabletxt)/bin/linux/amd64/kubectlsha256 echo (cat kubectlsha256) kubectl sha256sum check chmod x kubectl mv /kubectl /usr/local/bin/kubectl kubectl version client build commands echo Build started on date aws eks updatekubeconfig name {EKSNAME} region {AWSDEFAULTREGION} echo Deploying Application sed i /image image/image {REPOSITORYURI}{IMAGETAG}/g deploymentyaml kubectl apply f deploymentyaml KYVERNONOTATIONPOD=(kubectl get pods noheaders o customcolumns=metadataname n kyvernonotationaws) STATUS=(kubectl logs tail=1 kyvernonotationaws75b7ddbcfckxwjh n kyvernonotationaws grep IMAGETAG grep ERROR) if [[ STATUS ]] then echo There is an error exit 1 else echo No Error fi postbuild commands printf [{namehelloserverimageUris}] REPOSITORYURIIMAGETAG gt imagedefinitionsjsonartifacts files imagedefinitionsjson
buildspecyaml 配置文件中的命令执行以下操作:
1 设置环境变量,如 ECR 存储库 URI 和提交哈希,以创建镜像标签。kubectl 工具将稍后使用此内容引用将要与 Kubernetes 对象一起部署的容器镜像。
01-27
自定义 IAM 访问分析器未使用访问分析的范围 安全博客
自定义IAM Access Analyzer未使用权限分析的范围关键要点AWS IAM Access Analyzer提供了未使用权限的分析功能,帮助组织实现最小权限原则。新增的配置能力允许用户自定义...
01-27
最佳实践:通过使用 AWS Signer 保障容器镜像构建流水线的安全 安全博客
利用 AWS Signer 加强容器镜像构建流水线的最佳实践关键要点文章介绍了 AWS Signer 在容器镜像构建流水线中的应用,增强软件安全性,确保代码来源可信。通过 AWS 服务如 CodePi...
01-27
开始您的云财务管理之旅:成本规划 云财务管理
开始云财务管理之旅:成本规划关键要点本文将指导您如何按照 AWS 的四个云财务管理原则观察、节省、规划和运行,成功构建财务管理计划。本篇为四部分系列中的第三篇,我们将重点讨论如何为未来做好规划并预测在...
01-27
使用 Amazon Managed Blockchain Query 和 Amazon QuickS
使用 Amazon Managed Blockchain Query 和 Amazon QuickSight 可视化以太坊 ERC20 代币数据作者:Everton Fraga 和 Varsha Na...