Use this if
Choose and run the BlackShield enforcement appliance that matches your control gap: edge firewall, microsegmentation, host runtime protection, WAF, SQL firewall, or identity-aware proxy.
Choose and run the BlackShield enforcement appliance that matches your control gap: edge firewall, microsegmentation, host runtime protection, WAF, SQL firewall, or identity-aware proxy. Audience: Founders, platform engineers, and security engineers who need clear deployment choices and working appliance examples. Typical setup time: 10-20 minutes.
Choose and run the BlackShield enforcement appliance that matches your control gap: edge firewall, microsegmentation, host runtime protection, WAF, SQL firewall, or identity-aware proxy.
Use these views to match an appliance to a real traffic path before you put it in line.
Place only the appliance that matches the boundary you actually control; each appliance polls BlackShield and reports findings independently.
flowchart LR Internet["Internet and external clients"] Edge["Edge Firewall / TCP Reverse Proxy"] Internal["Internal network segments"] Hosts["Linux hosts"] App["Application and API tier"] Data["Data and SQL-like access path"] Admin["Admin and identity-sensitive paths"] Control["BlackShield control plane"] Internet --> Edge Edge --> App Internal --> App Internal --> Hosts App --> Data Admin --> App Edge -. "threat intel sync and findings" .-> Control Internal -. "segmentation policy and findings" .-> Control Hosts -. "runtime indicators and findings" .-> Control App -. "WAF signatures and findings" .-> Control Data -. "data policy and findings" .-> Control Admin -. "identity policy and findings" .-> Control
The perimeter appliance is a TCP edge proxy, while the application appliance is the HTTP/WAF control.
Use inline appliances where traffic already has a listener, proxy, or query path that can be routed through the container.
flowchart TB Client["Client"] TcpProxy["Edge firewall / TCP reverse proxy"] TcpService["Public TCP service"] Browser["Browser or API client"] Waf["Web Application Firewall reverse proxy"] Api["HTTP app or API"] Worker["Service issuing query"] SqlProxy["SQL firewall / database activity proxy"] Database["Database-facing service"] Operator["Admin user or service"] IamGate["Identity-aware proxy / admin access gateway"] AdminApi["Admin API"] Client --> TcpProxy --> TcpService Browser --> Waf --> Api Worker --> SqlProxy --> Database Operator --> IamGate --> AdminApi
Endpoint runtime monitoring is host-local rather than an inline traffic proxy; run it only where host process visibility is allowed.
The container starts with a common BlackShield connection, then specific env vars determine which enforcement behavior is active. UPSTREAM_ADDR enables TCP forwarding, UPSTREAM_URL enables WAF proxying, and METRICS_ADDR enables local Prometheus metrics.
flowchart LR Base["BLACKSHIELD_API_URL and BLACKSHIELD_API_KEY"] Metrics["METRICS_ADDR"] Listen["LISTEN_ADDR"] Tcp["UPSTREAM_ADDR"] Http["UPSTREAM_URL"] FailClosed["FAIL_CLOSED=true"] Endpoint["ENFORCEMENT_MODE=enforce"] Body["MAX_BODY_BYTES"] Base --> Sync["Sync policy or threat intelligence"] Base --> Findings["Report findings and health"] Metrics --> Prometheus["Expose local Prometheus metrics"] Listen --> Listener["Open appliance listener"] Tcp --> TcpForward["Enable perimeter TCP forwarding"] Http --> ReverseProxy["Enable application WAF reverse proxy"] FailClosed --> Blocking["Block when sync health is unavailable"] Endpoint --> ActiveResponse["Enable endpoint active response"] Body --> BodyLimit["Enforce request body inspection limit"]
Leave fail-closed and endpoint enforcement in audit-friendly settings until sync health and telemetry are proven.
Step 1
Start with the boundary where a missing active control would hurt first. The edge firewall protects TCP entry points; the WAF handles HTTP inspection.
What success looks like
The customer knows which single appliance to try first and understands that perimeter is not the WAF.
Step 2
All appliances use the same API origin and API key pattern, then sync threat intelligence or policy before reporting blocked activity as findings.
What success looks like
Every generated example uses only runtime settings supported by the matching Go entrypoint.
Step 3
Treat the first deployment as a proof point: confirm the appliance starts, exposes metrics, syncs successfully, and creates useful BlackShield findings before widening the blast radius.
What success looks like
Appliance events appear in BlackShield alongside scanner, network sensor, and security-agent evidence.
Demonstration only
This configuration is designed for ease of use. To deploy scanner clients at scale, please plan your deployment architecture accordingly or contact us for enterprise best practices.
Download the exact source files referenced on this page, or run the one-command installer to write them locally before following the deployment steps.
Creates `deploy/blackshield-perimeter/` by default. Pass `network`, `endpoint`, `application`, `data`, or `security` as the first argument to generate a different appliance runtime.
BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com \
bash <(curl -fsSL https://blackshield.chaplau.com/source-bundles/appliance-docker.sh) perimeter
cd deploy/blackshield-perimeterservices:
perimeter-appliance:
image: public.ecr.aws/blackshield-security/perimeter-appliance:1.0.8
restart: unless-stopped
ports:
- "8081:8081"
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- LISTEN_ADDR=0.0.0.0:8081
- UPSTREAM_ADDR=10.0.1.15:80
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090
- FAIL_CLOSED=falseservices:
network-appliance:
image: public.ecr.aws/blackshield-security/network-appliance:1.0.8
restart: unless-stopped
ports:
- "8082:8082"
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- LISTEN_ADDR=0.0.0.0:8082
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090services:
endpoint-appliance:
image: public.ecr.aws/blackshield-security/endpoint-appliance:1.0.8
restart: unless-stopped
pid: "host"
ports:
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090
- SCAN_INTERVAL=5s
- ENFORCEMENT_MODE=auditservices:
application-appliance:
image: public.ecr.aws/blackshield-security/application-appliance:1.0.8
restart: unless-stopped
ports:
- "8083:8083"
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- LISTEN_ADDR=0.0.0.0:8083
- UPSTREAM_URL=http://10.0.2.22:8080
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090
- MAX_BODY_BYTES=1048576
- FAIL_CLOSED=falseservices:
data-appliance:
image: public.ecr.aws/blackshield-security/data-appliance:1.0.8
restart: unless-stopped
ports:
- "8084:8084"
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- LISTEN_ADDR=0.0.0.0:8084
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090services:
security-appliance:
image: public.ecr.aws/blackshield-security/security-appliance:1.0.8
restart: unless-stopped
ports:
- "8085:8085"
- "9090:9090"
environment:
- BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com
- BLACKSHIELD_API_KEY=sp_xxxx
- LISTEN_ADDR=0.0.0.0:8085
- POLL_INTERVAL=30s
- METRICS_ADDR=0.0.0.0:9090