Docs/Agent/S3 Evidence Vault

S3 Evidence Vault

Configure S3 storage for scheduled artifact uploads. All evidence is organized by date, type, and source for easy retrieval and compliance auditing.


Authentication Methods

Three options for S3 authentication, in order of preference:

IAM Role (recommended)

Attach an IAM role to the node instance profile. No credentials to manage.

IRSA (EKS)

Use IAM Roles for Service Accounts on EKS for pod-level credentials.

Kubernetes Secret

Create a secret with AWS credentials:

kubectl create secret generic aws-credentials \
--from-literal=aws-access-key-id=AKIA... \
--from-literal=aws-secret-access-key=... \
-n production

Secret namespace

The agent always reads the credentials secret from the workload's own namespace — i.e. the namespace of the pod being scanned. This is a deliberate security boundary: an agent running on a node must not be able to read secrets in arbitrary namespaces on behalf of a workload, since that would let any pod that opts into S3 export effectively read any secret in the cluster.

There is no override (no --s3-secret-namespace flag, no fall back to the agent's namespace). Practically, this means every namespace that uses S3 export needs its own copy of the credentials secret. The annotations only choose the secret's name; the namespace is fixed.

Annotation Configuration

Configure S3 settings via pod or namespace annotations:

AnnotationDescription
reel.io/s3-bucketS3 bucket name
reel.io/s3-regionAWS region
reel.io/s3-secretName of Kubernetes secret with AWS credentials (always read from the workload's own namespace — see below)

Pod annotations take priority over namespace annotations.

Complete Example

# Namespace-level S3 config (applies to all pods)
apiVersion: v1
kind: Namespace
metadata:
name: production
annotations:
reel.io/s3-bucket: "compliance-evidence"
reel.io/s3-region: "us-east-1"
reel.io/s3-secret: "aws-credentials"
reel.io/schedule: |
0 6 * * * | upload sbom --scanners vuln
next | upload cbom

S3 Key Pattern

Artifacts are organized in S3 with the following key structure:

{date}/{type}/{cluster}_{node}_{namespace}_{pod}_{container}_{timestamp}.{ext}
TypeExtension
sbom, cbom, volatile, metadata, malware.json
checkpoint, layer, frame, memory.tar.zst or .core.zst

Configuration Priority

S3 settings resolve in this order: CLI flags > pod annotations > namespace annotations.