cdk-serverless-clamscan
An aws-cdk construct that uses ClamAV® to scan newly uploaded objects to Amazon S3 for viruses. The construct provides a flexible interface for a system to act based on the results of a ClamAV virus scan. Check out this blogpost for a guided walkthrough.
Pre-Requisites
Docker: The ClamAV Lambda functions utilizes a container image that is built locally using docker bundling
Examples
This project uses projen and thus all the constructs follow language specific standards and naming patterns. For more information on how to translate the following examples into your desired language read the CDK guide on Translating TypeScript AWS CDK code to other languages
Example 1. (Default destinations with rule target)
typescript
import { RuleTargetInput } from 'aws-cdk-lib/aws-events';
import { SnsTopic } from 'aws-cdk-lib/aws-events-targets';
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { Topic } from 'aws-cdk-lib/aws-sns';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { ServerlessClamscan } from 'cdk-serverless-clamscan';
export class CdkTestStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const bucket_1 = new Bucket(this, 'rBucket1');
const bucket_2 = new Bucket(this, 'rBucket2');
const bucketList = [bucket_1, bucket_2];
const sc = new ServerlessClamscan(this, 'rClamscan', {
buckets: bucketList,
});
const bucket_3 = new Bucket(this, 'rBucket3');
sc.addSourceBucket(bucket_3);
const infectedTopic = new Topic(this, 'rInfectedTopic');
sc.infectedRule?.addTarget(
new SnsTopic(infectedTopic, {
message: RuleTargetInput.fromEventPath(
'$.detail.responsePayload.message',
),
}),
);
}
}
python
from aws_cdk import (
Stack,
aws_events as events,
aws_events_targets as events_targets,
aws_s3 as s3,
aws_sns as sns
)
from cdk_serverless_clamscan import ServerlessClamscan
from constructs import Construct
class CdkTestStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
bucket_1 = s3.Bucket(self, "rBucket1")
bucket_2 = s3.Bucket(self, "rBucket2")
bucketList = [ bucket_1, bucket_2 ]
sc = ServerlessClamscan(self, "rClamScan",
buckets=bucketList,
)
bucket_3 = s3.Bucket(self, "rBucket3")
sc.add_source_bucket(bucket_3)
infected_topic = sns.Topic(self, "rInfectedTopic")
if sc.infected_rule != None:
sc.infected_rule.add_target(
events_targets.SnsTopic(
infected_topic,
message=events.RuleTargetInput.from_event_path('$.detail.responsePayload.message'),
)
)
Example 2. (Bring your own destinations)
typescript
import {
SqsDestination,
EventBridgeDestination,
} from 'aws-cdk-lib/aws-lambda-destinations';
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { Queue } from 'aws-cdk-lib/aws-sqs';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { ServerlessClamscan } from 'cdk-serverless-clamscan';
export class CdkTestStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const bucket_1 = new Bucket(this, 'rBucket1');
const bucket_2 = new Bucket(this, 'rBucket2');
const bucketList = [bucket_1, bucket_2];
const queue = new Queue(this, 'rQueue');
const sc = new ServerlessClamscan(this, 'default', {
buckets: bucketList,
onResult: new EventBridgeDestination(),
onError: new SqsDestination(queue),
});
const bucket_3 = new Bucket(this, 'rBucket3');
sc.addSourceBucket(bucket_3);
}
}
python
from aws_cdk import (
Stack,
aws_lambda_destinations as lambda_destinations,
aws_s3 as s3,
aws_sqs as sqs
)
from cdk_serverless_clamscan import ServerlessClamscan
from constructs import Construct
class CdkTestStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
bucket_1 = s3.Bucket(self, "rBucket1")
bucket_2 = s3.Bucket(self, "rBucket2")
bucketList = [ bucket_1, bucket_2 ]
queue = sqs.Queue(self, "rQueue")
sc = ServerlessClamscan(self, "rClamScan",
buckets=bucketList,
on_result=lambda_destinations.EventBridgeDestination(),
on_error=lambda_destinations.SqsDestination(queue),
)
bucket_3 = s3.Bucket(self, "rBucket3")
sc.add_source_bucket(bucket_3)
Operation and Maintenance
When ClamAV publishes updates to the scanner you will see “Your ClamAV installation is OUTDATED” in your scan results. While the construct creates a system to keep the database definitions up to date, you must update the scanner to detect all the latest Viruses.
Update the docker images of the Lambda functions with the latest version of ClamAV by re-running cdk deploy.
API Reference
See API.md.
Contributing
See CONTRIBUTING for more information.
License
This project is licensed under the Apache-2.0 License.
Metadata
Release files for aws-clamav-malware-scanner-vpc 2.14.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| aws_clamav_malware_scanner_vpc-2.14.0.tar.gz | 184.9 kB | Without provenance | Details for aws_clamav_malware_scanner_vpc-2.14.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| aws_clamav_malware_scanner_vpc-2.14.0-py3-none-any.whl | Python 3 | none | any | Details for aws_clamav_malware_scanner_vpc-2.14.0-py3-none-any.whl |
Total release size: 367.9 kB
Release files / aws_clamav_malware_scanner_vpc-2.14.0.tar.gz
| Download URL | aws_clamav_malware_scanner_vpc-2.14.0.tar.gz |
|---|---|
| Size | 184.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f04a9d0efbd3ca4b92032aca1befbaef7c7999a765b4cea14c5ef02b34bace14
|
|
BLAKE2b-256 checksum How to use checksums |
d12716f30f29832e2c9e71fe8e3a7bb08e1f0518835d2ed1178c328a93212d8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.1
|
Release files / aws_clamav_malware_scanner_vpc-2.14.0-py3-none-any.whl
| Download URL | aws_clamav_malware_scanner_vpc-2.14.0-py3-none-any.whl |
|---|---|
| Size | 183.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62c07baa1224706e4641d397ee8668cda62f6e8105a9bd1c62a5f7cdaeb5295d
|
|
BLAKE2b-256 checksum How to use checksums |
b4d3427e2930de78c9b182580aee2a34fd8b114d864ac1ba6c6d59567f6eb321
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.1
|
Security for aws-clamav-malware-scanner-vpc 2.14.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.