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 で設定できました。機能リクエストのコーディングが完了し、関数をデプロイする準備ができたと仮定しましょう。最初のステップは、適切な依存関係を含めてコードを圧縮し、作成した署名プロファイルを使用してアーティファクトに署名することです。そのためには、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-nameyour-signer-id
jobId
は送信先バケットで作成されるオブジェクトでプレフィックスであり、jobOwner
はジョブが実行された AWS アカウント の 12 桁 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) を使用して関数をビルドしてデプロイする場合、package コマンドは zip アーティファクトを S3 にアップロードし、署名ジョブを開始して署名されたアーティファクトを取得します。以下のコマンドとパラメータで、これを行えます。
sam package -t your-template.yaml \ --output-template-file
your-output.yaml
\ --s3-bucketyour-versioned-bucket
\ --s3-prefixyour-prefix
\ --signing-profilesyour-signer-id
AWS Signer は、アカウントにデプロイされた zip アーティファクトがデプロイ対象として信頼されていることを確認するのに役立ちます。上記のプロセスを CI/CD パイプラインに含め、前のトピックで説明した手法を使用してすべての機能にコード署名設定を添付することを要求できます。Lambda 関数のデプロイでコード署名を使用することにより、関数を作成または更新するための認証情報を取得した悪意のあるアクターが関数に悪意のあるコードを挿入するのを防ぐことができます。