Install a managed Linux VM scanner that reuses an existing Wazuh or OSSEC alert source by default, then forwards host alerts from one native systemd service. Audience: Security operations teams, infrastructure engineers, and platform teams. Typical setup time: 10 minutes on Ubuntu/Debian systemd hosts.
quickstart
Use this if
Install a managed Linux VM scanner that reuses an existing Wazuh or OSSEC alert source by default, then forwards host alerts from one native systemd service.
Audience
Security operations teams, infrastructure engineers, and platform teams
Typical time
10 minutes on Ubuntu/Debian systemd hosts
Before You Begin
Use the managed Ubuntu/Debian bundle first when an existing Wazuh manager, OSSEC server, or OSSEC local install already writes JSON alerts.
For existing deployments, confirm a Wazuh manager, OSSEC server, or OSSEC local install is writing JSON alerts to `/var/ossec/logs/alerts/alerts.json`.
Set `BLACKSHIELD_OSSEC_MODE=managed-local` only after your organization approves the OSSEC GPLv2 local install path.
Do not point the local file collector at a Wazuh agent-only endpoint unless that endpoint is also where manager-side `alerts.json` is produced.
Use the advanced S3 or GCS path only when the alert-producing host cannot run the native managed service.
Create an ingestion API key in Settings -> API Keys with Ingestion scope before editing any generated env or secret values.
Rotate any `sp_...` key that was pasted into terminal transcripts, support tickets, or chat before retesting.
Fast path
Copy a working starter, run it in your environment, then come back here for the deeper rollout details.
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.
Get the source bundle
Download the exact source files referenced on this page, or run the one-command installer to write them locally before following the deployment steps.
Managed Linux VM scanner
Creates `deploy/vm-scanner/managed/` with an Ubuntu/Debian installer that defaults to existing Wazuh/OSSEC alerts and supports explicit managed-local OSSEC installs.
deploy/vm-scanner/managed/
bash
BLACKSHIELD_SITE_URL=https://blackshield.chaplau.com \
BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com \
bash <(curl -fsSL https://blackshield.chaplau.com/source-bundles/vm-scanner-managed-linux.sh)
cd deploy/vm-scanner/managed
Creates `deploy/vm-scanner/` with a Compose file, a ready-to-edit `.env.vm-scanner`, and a README so local host ingestion is runnable without rewriting the guide commands.
deploy/vm-scanner/
bash
BLACKSHIELD_VMS_IMAGE=public.ecr.aws/blackshield-security/vms-scanner:1.0.6 \
BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com \
bash <(curl -fsSL https://blackshield.chaplau.com/source-bundles/vm-scanner-compose.sh)
cd deploy/vm-scanner
Creates `deploy/aws-vm-scanner/` with an ECS Fargate service, S3-backed source settings, and a host upload helper so AWS rollout can start without writing infrastructure boilerplate first.
deploy/aws-vm-scanner/
bash
BLACKSHIELD_VMS_IMAGE=public.ecr.aws/blackshield-security/vms-scanner:1.0.6 \
BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com \
bash <(curl -fsSL https://blackshield.chaplau.com/source-bundles/aws-vm-scanner.sh)
cd deploy/aws-vm-scanner
Creates `deploy/gcp-vm-scanner/` with a Cloud Run service, GCS-backed source settings, and a host upload helper so GCP rollout can start without rewriting the guide commands.
deploy/gcp-vm-scanner/
bash
BLACKSHIELD_VMS_IMAGE=public.ecr.aws/blackshield-security/vms-scanner:1.0.6 \
BLACKSHIELD_API_URL=https://api.blackshield.chaplau.com \
bash <(curl -fsSL https://blackshield.chaplau.com/source-bundles/gcp-vm-scanner.sh)
cd deploy/gcp-vm-scanner
Use the guided steps below when you want to tailor the rollout, validate ownership, or expand the deployment safely.
Step 1
Use the managed Linux path first
The managed installer makes VM scanner mean a working host scanner: it defaults to existing Wazuh or OSSEC alerts, while OSSEC local installation is an explicit customer-approved option.
Existing Wazuh manager, OSSEC server, or OSSEC local install: generate `deploy/vm-scanner/managed/`, set the ingestion key, and run the installer.
Fresh Ubuntu/Debian VM: set `BLACKSHIELD_OSSEC_MODE=managed-local` only after approving the OSSEC GPLv2 install path.
AWS CDK path: create a Python 3.11 venv, export BLACKSHIELD_API_URL and SCANNER_IMAGE_URI, then run `cdk bootstrap && cdk deploy`.
The existing-source path reuses `/var/ossec/logs/alerts/alerts.json` and makes sure JSON output is enabled.
Wazuh agent-only endpoints normally do not own the manager-side `alerts.json`; install BlackShield on the manager/server/local host, or use the S3/GCS sync path.
Fleet-noisy package and update activity is grouped with host/IP evidence; intrusion-like alerts stay per-host with actor and provenance fields.
Rotate any `sp_...` key pasted into terminals, tickets, or chat before retesting.
What success looks like
Rotate any `sp_...` key pasted into terminals, tickets, or chat before retesting.
Download the recommended managed bundle first. It installs `/usr/local/bin/blackshield-vms-scanner-run`, the native package under `/opt/blackshield/vm-scanner/venv`, and a restartable systemd unit.
Managed Linux: generate `deploy/vm-scanner/managed/` for the default Ubuntu/Debian native service.
The generated env defaults to `BLACKSHIELD_OSSEC_MODE=existing`; compatibility `auto` and explicit `managed-local` remain supported.
`managed-local` downloads and installs OSSEC GPLv2 local mode, so use it only after customer approval.
Scanner state persists in `/var/lib/blackshield/vm-scanner/ossec-state.json` so restarts do not duplicate ingestion.
Advanced existing-source modes remain available below for Docker Compose, Docker-backed systemd, cron, AWS Fargate, and GCP Cloud Run.
What success looks like
Advanced existing-source modes remain available below for Docker Compose, Docker-backed systemd, cron, AWS Fargate, and GCP Cloud Run.
Run the generated installer with sudo, then confirm OSSEC/Wazuh alerts are readable and the native BlackShield service is healthy.
Run `sudo ./install-managed-vm-scanner.sh` from `deploy/vm-scanner/managed/`.
Check `sudo systemctl status blackshield-vms-scanner --no-pager` and `curl http://localhost:8080/health`; healthy responses report `status: ok` and `total_findings_ingested`.
Check `curl http://localhost:8080/metrics` when you want the raw counters without the health wrapper.
For failures, run `sudo journalctl -u blackshield-vms-scanner -n 100 --no-pager`, `sudo -u blackshield-vms-scanner test -r /etc/blackshield/vm-scanner.env`, `sudo -u blackshield-vms-scanner test -r /var/ossec/logs/alerts/alerts.json`, and confirm OSSEC/Wazuh service status.
Trigger a test OSSEC or Wazuh alert and confirm a new finding appears in the platform Findings view within the next scan interval.
Open the finding detail and confirm Host Identity, Network / Actor, Detection Provenance, and Raw Evidence are populated from the alert where available.
What success looks like
Open the finding detail and confirm Host Identity, Network / Actor, Detection Provenance, and Raw Evidence are populated from the alert where available.
Keep the original sidecar and cloud patterns for environments where OSSEC/Wazuh is already managed elsewhere or alerts are synced through object storage.
Docker Compose: generate `deploy/vm-scanner/` for an existing local alert file with a containerized scanner.
Docker-backed systemd: generate `deploy/vm-scanner/systemd/` when Docker is already your host runtime standard.
cron / one-shot: generate `deploy/vm-scanner/cron/` for periodic forwarding without a continuously running scanner.
AWS and GCP: generate the S3/GCS bundles when the manager/server host syncs `alerts.json` into object storage.
What success looks like
Existing OSSEC/Wazuh deployments can still use Docker, cron, and object-storage collectors without changing the managed Linux default.