AWS CDK の BucketDeployment が作成するカスタムリソース Lambda の Amazon Inspector 検出を抑制する
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CDK の BucketDeployment コンストラクトは、S3 バケットへのファイルデプロイを実現するために内部で Lambda カスタムリソースを自動的に作成します。Amazon Inspector はこの Lambda 関数もスキャン対象にするため、依存ライブラリの脆弱性(Package Vulnerability)やコードの脆弱性(Code Vulnerability)が検出されることがあります。
しかし、この Lambda 関数は CDK によって管理される内部リソースのため、開発者が自由にパッチを当てることは難しく、基本的には CDK パッケージ側の対応を待つ必要があります。本記事では、CDK を使って Amazon Inspector の抑制ルール(AWS::InspectorV2::Filter)をコードで定義し、このカスタムリソース Lambda の検出結果を自動的に抑制する実装を紹介します。
BucketDeployment の内部 Lambda とは
BucketDeployment は、ローカルファイルや S3 オブジェクトを S3 バケットにデプロイするための CDK コンストラクトです。デプロイ処理は Custom::CDKBucketDeployment という Lambda カスタムリソースによって実行されます。
CDK スタックをデプロイすると、CloudFormation 上に AWS::Lambda::Function リソースが作成されていることが確認できます。

CloudFormation の Sample スタックリソースを「CDKBucketDeployment」で絞り込むと、BucketDeployment が内部で作成する Lambda 関数(AWS::Lambda::Function)が確認できる
この Lambda 関数のランタイム(Python)や依存ライブラリのバージョンは CDK のリリースに紐づいており、開発者が直接変更することはできません。
Amazon Inspector による検出結果
BucketDeployment を含む CDK スタックをデプロイすると、Amazon Inspector が Lambda 関数をスキャンします。今回の検証環境では、以下のような High 重大度の検出結果が確認されました。
| タイトル | タイプ | 重大度 |
|---|---|---|
| CWE-117,93 - Log injection | Code Vulnerability | High |
| GHSA-mf9v-mfxr-j63j - urllib3 | Package Vulnerability | High |
| GHSA-qccp-gfcp-xxvc - urllib3 | Package Vulnerability | High |
重大度は High ですが、この Lambda はデプロイ時にのみ実行されるカスタムリソースであるため、外部からの攻撃に晒されるリスクは低いと言えます。とはいえ検出結果としてノイズになるため、Inspector の抑制ルールで管理します。もちろん、扱うデータのセンシティブさやシステムのクリティカルさに応じて、抑制の要否は適切に判断してください。
実装
CfnFilter(AWS::InspectorV2::Filter)リソースを CDK で定義します。filterAction: "SUPPRESS" を指定し、filterCriteria.lambdaFunctionName に対象 Lambda 関数名を EQUALS 条件で指定します。
import * as cdk from "aws-cdk-lib";
import * as inspectorv2 from "aws-cdk-lib/aws-inspectorv2";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as s3 from "aws-cdk-lib/aws-s3";
import * as s3deploy from "aws-cdk-lib/aws-s3-deployment";
import { Construct } from "constructs";
export class SampleStack extends cdk.Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
/** BucketDeployment の対象バケット */
const sampleBucket = new s3.Bucket(this, "SampleBucket", {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
/** BucketDeployment */
const deployment = new s3deploy.BucketDeployment(this, "SampleDeployment", {
sources: [s3deploy.Source.data("sample.txt", "Hello, World!")],
destinationBucket: sampleBucket,
});
/** BucketDeployment の内部 Lambda */
const deploymentHandler = deployment.node.findChild(
"CustomResourceHandler"
) as lambda.IFunction;
/** Inspector 抑制フィルター */
new inspectorv2.CfnFilter(this, "SuppressInspectorForDeploymentLambda", {
name: "suppress-bucket-deployment-lambda",
filterAction: "SUPPRESS",
filterCriteria: {
lambdaFunctionName: [
{
comparison: "EQUALS",
value: deploymentHandler.functionName,
},
],
},
});
}
}
deployment.node.findChild("CustomResourceHandler") のポイントを補足します。BucketDeployment コンストラクトはコンストラクトツリー上で CustomResourceHandler という論理 ID で Lambda 関数を作成します。node.findChild() でその参照を取得し、functionName プロパティを Inspector のフィルター条件に渡すことで、CDK デプロイ時に解決される実際の Lambda 関数名を抑制ルールに設定できます。
動作確認
抑制ルールなしの場合
CfnFilter を含まない状態でデプロイすると、Amazon Inspector が Lambda 関数の脆弱性を検出し、3 件が ACTIVE(抑制されていない)状態になります。
$ aws inspector2 list-findings \
--filter-criteria '{"lambdaFunctionName":[{"comparison":"EQUALS","value":"Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"}]}' \
--query 'findings[].{Title:title,Status:status}'
[
{ "Title": "CWE-117,93 - Log injection", "Status": "ACTIVE" },
{ "Title": "GHSA-mf9v-mfxr-j63j - urllib3", "Status": "ACTIVE" },
{ "Title": "GHSA-qccp-gfcp-xxvc - urllib3", "Status": "ACTIVE" }
]
マネジメントコンソールからも確認できます。

抑制ルール適用前:3 件の High 検出結果が Active 状態で表示される
抑制ルールありの場合
CfnFilter を追加してデプロイすると、CloudFormation が AWS::InspectorV2::Filter を作成します。
Sample | CREATE_IN_PROGRESS | AWS::InspectorV2::Filter | SuppressInspectorForDeploymentLambda
Sample | CREATE_COMPLETE | AWS::InspectorV2::Filter | SuppressInspectorForDeploymentLambda
同じコマンドで確認すると、3 件すべてが SUPPRESSED に変わっています。
$ aws inspector2 list-findings \
--filter-criteria '{"lambdaFunctionName":[{"comparison":"EQUALS","value":"Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"}]}' \
--query 'findings[].{Title:title,Status:status}'
[
{ "Title": "CWE-117,93 - Log injection", "Status": "SUPPRESSED" },
{ "Title": "GHSA-mf9v-mfxr-j63j - urllib3", "Status": "SUPPRESSED" },
{ "Title": "GHSA-qccp-gfcp-xxvc - urllib3", "Status": "SUPPRESSED" }
]
マネジメントコンソールからも確認できます。

抑制ルール適用後:Active な検出結果が 0 件になる
作成された抑制ルールは aws inspector2 list-filters でも確認できます。
$ aws inspector2 list-filters
{
"filters": [
{
"name": "suppress-bucket-deployment-lambda",
"action": "SUPPRESS",
"criteria": {
"lambdaFunctionName": [
{
"comparison": "EQUALS",
"value": "Sample-CustomCDKBucketDeployment8693BB64968944B69A-9eRaNHrRpB5F"
}
]
}
}
]
}
おわりに
AWS CDK の BucketDeployment が作成するカスタムリソース Lambda の Amazon Inspector 検出を、CDK で抑制してみました。
BucketDeployment の Lambda は使用しているライブラリの関係からか、頻繁に脆弱性が検出されます。放置するとアラート疲れの原因になりますが、今回の実装を使えばそれを回避できます。
以上





