Anchore
Anchore is a container security platform for scanning images, analyzing dependencies, enforcing policies, and managing vulnerabilities across your container registry.
Installation
Docker
# Run Anchore Engine
docker run -d --name anchore-engine \
-e ANCHORE_DB_PASSWORD="password" \
-p 8228:8228 \
-v /var/run/docker.sock:/var/run/docker.sock \
anchore/anchore-engine:latest
# Wait for service startup
docker logs -f anchore-engine | grep "Anchore initialized"
Kubernetes Deployment
# helm install anchore anchore/anchore
# Or raw deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: anchore-engine
spec:
replicas: 1
selector:
matchLabels:
app: anchore
template:
metadata:
labels:
app: anchore
spec:
containers:
- name: anchore
image: anchore/anchore-engine:latest
ports:
- containerPort: 8228
env:
- name: ANCHORE_DB_PASSWORD
value: "password"
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-socket
volumes:
- name: docker-socket
hostPath:
path: /var/run/docker.sock
CLI Installation
# Install anchore-cli
pip install anchorecli
# or
brew install anchore-cli
# Configure
anchore-cli --url "http://localhost:8228" --username admin --password foobar system status
# Export to .bashrc or .zshrc
export ANCHORE_CLI_URL="http://localhost:8228"
export ANCHORE_CLI_USER="admin"
export ANCHORE_CLI_PASS="foobar"
Image Analysis
Add Images
# Add image for analysis
anchore-cli image add docker.io/library/nginx:latest
# List images
anchore-cli image list
# Get image details
anchore-cli image get docker.io/library/nginx:latest | jq '.'
Syft (Bill of Materials)
# Generate SBOM in JSON format
syft docker.io/library/nginx:latest -o json > sbom.json
# CycloneDX format
syft docker.io/library/nginx:latest -o cyclonedx > sbom.xml
# Packages summary
syft docker.io/library/nginx:latest \
--scope all-layers | grep "^pkg:"
Grype (Vulnerability Detection)
# Scan image for vulnerabilities
grype docker.io/library/nginx:latest
# Detailed JSON output
grype docker.io/library/nginx:latest -o json > vuln-report.json
# Filter by severity
grype docker.io/library/nginx:latest \
--fail-on critical \
--show-suppressed
# Check specific CVE
grype docker.io/library/nginx:latest | grep "CVE-2021"
Vulnerability Scanning
Anchore Analysis
# Wait for analysis to complete
anchore-cli image wait docker.io/library/nginx:latest
# Get vulnerability results
anchore-cli image vuln docker.io/library/nginx:latest all
# High-severity CVEs only
anchore-cli image vuln docker.io/library/nginx:latest high
# Export in CSV
anchore-cli --json image vuln docker.io/library/nginx:latest all \
| jq -r '.[] | [.vuln_id, .severity, .package] | @csv' > vulns.csv
Package Analysis
# Get package listing
anchore-cli image content docker.io/library/nginx:latest pkglist
# Check specific package
anchore-cli image content docker.io/library/nginx:latest pkglist \
| grep -i openssl
# File analysis
anchore-cli image content docker.io/library/nginx:latest files | head -20
# Metadata inspection
anchore-cli image metadata docker.io/library/nginx:latest | jq '.image_metadata'
Policy Enforcement
Policy Bundles
# Get default policy
anchore-cli policy get --bundleid default
# List policies
anchore-cli policy list
# Add custom policy
anchore-cli policy add policy.json
# Evaluate image against policy
anchore-cli image policy docker.io/library/nginx:latest bundleid=default
Example Policy (policy.json)
{
"id": "production-policy",
"version": "1.0",
"whitelists": [],
"blacklists": [
{
"name": "Blacklisted packages",
"items": ["openssl=1.0.*", "curl=*"]
}
],
"rules": [
{
"gate": "vulnerabilities",
"trigger": "package",
"action": "WARN",
"params": [{"name": "severity", "value": "high"}]
},
{
"gate": "dockerfile",
"trigger": "exposed_port",
"action": "STOP",
"params": [{"name": "port", "value": "22"}]
}
]
}
Policy Evaluation
# Check if image passes policy
anchore-cli image policy docker.io/library/nginx:latest \
bundleid=production-policy
# Detailed gate results
anchore-cli --json image policy docker.io/library/nginx:latest \
bundleid=production-policy | jq '.policy_evaluation'
# Suppress false positives
anchore-cli image whitelist add docker.io/library/nginx:latest \
CVE-2021-12345 --whitelist-type "global"
Registry Integration
Add Registry
# Configure registry credentials
anchore-cli registry add docker.io username password
# List registered registries
anchore-cli registry list
# Add private registry
anchore-cli registry add registry.example.com:5000 \
--skipvalidate
Scan Registry
# Index all images in registry
anchore-cli registry analyze --full-report docker.io
# Subscribe to tag/repo for continuous scanning
anchore-cli subscription add docker.io/library/nginx:*
# List subscriptions
anchore-cli subscription list
# Trigger re-scan
anchore-cli image re-analyze docker.io/library/nginx:latest
CI/CD Integration
GitHub Actions
name: Container Security Scan
on: [push]
jobs:
anchore:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build image
run: docker build -t myapp:$GITHUB_SHA .
- name: Scan with Grype
uses: anchore/scan-action@v3
id: scan
with:
image: myapp:$GITHUB_SHA
fail-build: true
severity-cutoff: high
- name: Upload Anchore report
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: ${{ steps.scan.outputs.sarif }}
GitLab CI
container-scan:
stage: security
image: anchore/anchore-engine:latest
script:
- anchore-cli image add $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- anchore-cli image wait $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- anchore-cli image vuln $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA critical high
artifacts:
reports:
container_scanning: vulnerabilities.json
Jenkins
stage('Container Scan') {
steps {
script {
sh '''
anchore-cli image add ${DOCKER_IMAGE}:${BUILD_NUMBER}
anchore-cli image wait ${DOCKER_IMAGE}:${BUILD_NUMBER}
anchore-cli image policy ${DOCKER_IMAGE}:${BUILD_NUMBER} \
bundleid=production-policy
'''
}
}
}
Advanced Scanning
Dockerfile Analysis
# Analyze Dockerfile
anchore-cli image content docker.io/library/nginx:latest dockerfile
# Check for bad practices
anchore-cli --json image content docker.io/library/nginx:latest dockerfile \
| jq '.[] | select(.directive | contains("RUN"))'
# Detect secrets in image
grype docker.io/library/nginx:latest --vex-ignore secrets
Secrets Detection
# Scan for hardcoded secrets
syft docker.io/library/nginx:latest | grep -i "secret\|key\|password"
# Use trivy for secrets
trivy image --secret-scanners all docker.io/library/nginx:latest
# Check for credential patterns
grype docker.io/library/nginx:latest | grep -E "password|api.?key|secret"
Base Image Tracking
# Get base image info
anchore-cli image metadata docker.io/library/nginx:latest \
| jq '.image_metadata | .parent'
# Audit base image changes
anchore-cli subscription list-updates
# Alert on base image vuln
anchore-cli --json image vuln docker.io/library/nginx:latest all \
| jq '.[] | select(.package_name | contains("openssl"))'
Reporting & Compliance
Generate Reports
# HTML report
anchore-cli image report docker.io/library/nginx:latest \
--format html > report.html
# JSON detailed report
anchore-cli --json image vuln docker.io/library/nginx:latest all \
> vulnerability-report.json
# CSV for auditors
anchore-cli --json image vuln docker.io/library/nginx:latest all \
| jq -r '.[] | [.vuln_id, .severity, .package, .package_type] | @csv' \
> findings.csv
Compliance Checks
# PCI DSS compliance
anchore-cli --json image policy docker.io/library/nginx:latest \
bundleid=pci-dss | jq '.policy_evaluation'
# HIPAA compliance check
anchore-cli image vuln docker.io/library/nginx:latest critical
# License compliance
anchore-cli image content docker.io/library/nginx:latest licenses
Best Practices
- Scan all base images before use
- Enforce policies: fail on critical/high CVEs
- Add secrets scanning to scan pipeline
- Monitor and re-analyze images periodically
- Track base image updates automatically
- Maintain approved base image list
- Review and suppress confirmed false positives
- Generate compliance reports monthly
- Integrate with image signing (Cosign) for provenance
- Use private registries for approved images