使用 AWS Signer 的 Lambda 程式碼簽署 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Signer 的 Lambda 程式碼簽署

AWS Signer 是一項全受管程式碼簽署服務,可讓您對照數位簽章驗證您的程式碼,以確認該程式碼未經變更且來自受信任的發布者。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 封鎖不受信任的部署。假設您已經完成功能請求的編碼,現在已準備好部署函數。第一個步驟是壓縮程式碼及適當相依性,然後使用您建立的簽署設定檔簽署成品。為此,您可以上傳壓縮成品到 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

或者,您還可以使用原始未簽署的來源壓縮成品測試函數部署。部署會失敗並顯示以下訊息:

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) 建置與部署您的函數,套件命令將處理壓縮成品上傳到 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 會協助您確認部署到帳戶中的壓縮成品是否受信任用於部署。您可以在 CI/CD 管道中包含上述程序,並要求所有函數都使用先前主題中所述的技術附加程式碼簽署組態。透過搭配 Lambda 函數部署使用程式碼簽署,您可以防止可能已取得憑證的惡意行為者建立或更新函數,將惡意程式碼注入函數中。