LoginSignup
4
3

cdk-serverless-clamscanを使って既存S3バケットへウイルススキャンを設定してみた

Last updated at Posted at 2023-12-15

この記事は デジタルキューブ & ヘプタゴン Advent Calendar 2023 の 12月15日分の記事です。

S3バケットへアップロードしたファイルへのウイルススキャンの方法として、AWS Developer Tools Blogcdk-serverless-clamscanが紹介されています。

ブログではCDKで新規にS3バケットを作り、作成S3バケットへのウイルススキャン設定方法が紹介されていますが、本記事では既存バケットに対してcdk-serverless-clamscanを動かすまでについてを紹介します。

はじめに

S3バケットのウイルススキャン方法について有償サービス以外で何か方法はないかと探していたところ、AWSのブログ記事を見つけ試してみました。

しかしAWS CDK/TypeScriptの初心者のため、AWS CDK WorkshopでAWS CDKに触れてみてデプロイするまでの流れを把握してからcdk-serverless-clamscanの設定を行なっています。

cdk-serverless-clamscan

cdk-serverless-clamscanは、S3バケットにアップロードされたファイルに対しLambdaを使ってClamAVでのウイルスチェックを実行するコンストラクト(コンストラクト:私は構築されるAWSリソース群のライブラリだと理解)です。コンストラクトでは、S3バケットへアップロードされたファイルをLambdaからマウントされたEFSへ一時的にダウンロードし、ファイルスキャンを実行、実行結果はS3のファイルにタグとして付与されます。実行結果はLambdaやEventBrideなどに渡すことも可能です。

serverless-clamscan.png

CDKの作成

CDKプロジェクト作成の手順はAWSのブログ記事中Create and deploy our cdk applicationにある手順と内容が重複しますが、実際に実行した情報を記載します。

  • CDKアプリケーションの作成
mkdir CdkTest
cd CdkTest
cdk init app --language typescript
  • package.jsonを以下内容へ修正します。
{
  "name": "cdk_test",
  "version": "0.1.0",
  "bin": {
    "cdk_test": "bin/cdk_test.js"
  },
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "test": "jest",
    "cdk": "cdk"
  },
  "devDependencies": {
    "@types/jest": "^26.0.10",
    "@types/node": "10.17.27",
    "aws-cdk": "^2.11.0",
    "jest": "^26.4.2",
    "ts-jest": "^26.2.0",
    "ts-node": "^9.0.0",
    "typescript": "~3.9.7"
  },
  "dependencies": {
    "aws-cdk-lib": "^2.11.0",
    "cdk-serverless-clamscan": "^2.1.29",
    "constructs": "^10.0.0",
    "source-map-support": "^0.5.16"
  }
}
  • lib/cdk_test-stack.tsの内容は以下内容にします。既存バケット名を入力へはウイルススキャンを設定したいバケット名を入力します。
import { Stack, StackProps, RemovalPolicy, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { ServerlessClamscan } from 'cdk-serverless-clamscan';
import * as s3 from 'aws-cdk-lib/aws-s3';


export class CdkTestStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    // 既存バケット用のServerlessClamscan
    const sc = new ServerlessClamscan(this, 'rClamscan', {
      acceptResponsibilityForUsingImportedBucket: true,
    });
    // 既存バケット読み込み
    const importedBucket = s3.Bucket.fromBucketName(
      this, 
      'imported-bucket-from-name',
      '既存バケット名を入力'
    );
    // 既存バケットへのclamscan設定
    sc.addSourceBucket(importedBucket);

    //バケットポリシーを出力
    const bucketbolicy = sc.getPolicyStatementForBucket(importedBucket);
    new CfnOutput(this, 'bucketbolicy', {
      description: 'bucketbolicy',
      value: JSON.stringify(bucketbolicy)
    });

  }
}
  • 依存関係のあるパッケージのインストールとCDKデプロイ。CDKアプリケーションを初めてアカウントにデプロイしたので手順中にcdk bootstrapが含まれています。
npm install
cdk bootstrap
cdk deploy

バケットポリシー

デプロイ後にS3バケット用のバケットポリシーが出力されます。内容はDenyルールになっていため、既存のS3バケットに設定する際は注意が必要です。

動作確認

デプロイが終了後の動作確認。

  • アップロード用のファイルを用意
  • 検知されるかの確認のため、テストウイルスもダウンロードし用意
  • S3バケットへファイルをアップロード
  • ファイルのタグを確認。アップロード直後のタグは以下状態となっています。
    avscan-tag-progress.png
  • スキャンが終了後、ウイルスファイルの場合はタグは以下に更新されることが確認できます。
    avscan-tag-infected.png
  • 正常ファイルの場合はscan-statusCLEANに更新されます。

課題

  • ClamAVのスキャナーアップデート時の更新

コンストラクトの説明に、使用するウイルス検索エンジンのClamAVでスキャナーの更新があった際はcdk deployを実行する説明が記載されています。スキャナーに更新があった際の自動更新は設定されていないため、別途仕組みを作る必要があります。

参考URL

https://aws.amazon.com/jp/blogs/developer/virus-scan-s3-buckets-with-a-serverless-clamav-based-cdk-construct/
https://construct-hub-testing.dev-tools.aws.dev/packages/cdk-serverless-clamscan/v/2.6.31?lang=typescript
https://github.com/awslabs/cdk-serverless-clamscan

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3