Secure60’s Vulnerability Management provides automated, SBOM-based vulnerability scanning across your Linux infrastructure. A lightweight client agent discovers installed software packages, generates a Software Bill of Materials (SBOM), and sends the inventory to Secure60. The platform then scans for known CVEs and raises threats automatically.
Key capabilities:
To use Vulnerability Management, the module must be enabled for your project:
curl installedFor Ingest mode the client authenticates with a Secure60 Ingest token. Create one in the portal before running the client:
vuln-client), and add the project the host should report into.INGEST (the available types are NONE, INGEST, and API; the inventory client only needs INGEST — do not use an API/admin token).TOKEN= for scripted installs.You also need the Project ID of that project — it is shown on the Projects tab (and in the project’s URL/context). Use it at the Project ID prompt or as PROJECT_ID=.
The token is a credential — store it securely. Keep its scope to
INGESTon just the project(s) the host reports into, following least privilege.
Download the client script directly. The current client version is 1.05, which sends the package inventory in batches — each scan now makes a handful of requests instead of one per package, so large hosts report far faster and put much less load on the ingest endpoint. (Version 1.04 added running-kernel detection so vulnerabilities on old, non-booted kernels are handled cleanly — see Non-running kernels.)
curl -O https://www.secure60.io/docs/s60-software-inv-agent-linux-1.05.sh
chmod +x s60-software-inv-agent-linux-1.05.sh
Or download it from the direct link.
Already running an earlier version (e.g. 1.04)? Upgrading is a download-and-run — the script fixes up the existing install for you, with no manual cleanup:
Download 1.05 into the same directory as your current install — the folder that holds your existing .env-s60-client-script. Your saved configuration (send mode, URL, Project ID, token) is reused automatically, so you are not asked to reconfigure.
cd /opt/secure60 # the directory holding your existing .env-s60-client-script
curl -O https://www.secure60.io/docs/s60-software-inv-agent-linux-1.05.sh
chmod +x s60-software-inv-agent-linux-1.05.sh
Re-run it — interactively, or non-interactively for fleets:
# Fleet / Ansible: converge config + cron + Trivy without running a scan now (cron runs the first scan)
S60_SCRIPTED_INSTALL=1 S60_SETUP_CRON=1 S60_INSTALL_DIR=/opt/secure60 \
./s60-software-inv-agent-linux-1.05.sh --scripted --setup-only
On an interactive run, accept the cron prompt (Y) and the upgrade completes the same way.
The cron schedule is self-healing and idempotent: re-running detects and replaces the previous Secure60 inventory cron line — at any path or version — instead of adding a second one, so you never end up with competing scans. Only the Secure60 line is touched; your other cron jobs are left alone. The old s60-software-inv-agent-linux-1.04.sh file is no longer scheduled and can be deleted. Re-running is always safe.
Run the script without any flags for a guided setup:
./s60-software-inv-agent-linux-1.05.sh
You will be prompted for:
https://ingest.secure60.io)INGEST (see Create an Ingest token above)Configuration is saved to .env-s60-client-script in the same directory as the script. Subsequent runs will use this file automatically.
Early in the first run — before the scan starts — you will be prompted to set up a cron job to run the scan every 6 hours, so the schedule is in place even if the first scan runs long.
The first scan can take several minutes. Trivy walks the filesystem (and fetches its database on first run). The script prints a heartbeat (
... still scanning — Nm elapsed) so you can see it is still working — please don’t interrupt it.
For automated deployments (e.g. Ansible, Puppet, or shell scripts), use the --scripted flag with environment variables:
export S60_SCRIPTED_INSTALL=1
export S60_SEND_MODE=ingest
export S60_INGEST_BASE=https://ingest.secure60.io
export PROJECT_ID=313
export TOKEN=eyJhbGciOiJIUzI1NiIs...
export S60_SETUP_CRON=1
export S60_INSTALL_TRIVY_IF_MISSING=1
./s60-software-inv-agent-linux-1.05.sh --scripted
| Variable | Description | Example |
|---|---|---|
S60_SEND_MODE |
Send mode: collector (on-prem) or ingest (cloud). Required. |
ingest |
S60_COLLECTOR_BASE |
Collector endpoint URL. Required for collector mode. | https://192.168.1.100 |
S60_INGEST_BASE |
Ingest base URL. Required for ingest mode. | https://ingest.secure60.io |
PROJECT_ID |
Secure60 project ID. Required for ingest mode. | 313 |
TOKEN |
Ingest token (JWT) used as the Bearer credential. Create under Organisation settings → Tokens with access type INGEST. Required for ingest mode. |
eyJhbG... |
HOST |
Hostname override. Auto-detected if not set. | web-server-01 |
IP |
Host IP address. Optional metadata. | 10.0.1.5 |
FQDN |
Fully qualified domain name. Optional metadata. | web-server-01.example.com |
environment |
Environment label. Defaults to Production. |
Production |
S60_SETUP_CRON |
Set to 1 to automatically install a cron job (every 6 hours). |
1 |
S60_INSTALL_DIR |
Install directory. Cron will reference this path. | /opt/secure60 |
S60_CRON_LOG |
Log file path for cron output. Logrotate configured automatically. | /var/log/s60-sbom.log |
S60_INSTALL_TRIVY_IF_MISSING |
Set to 1, Y, or yes to auto-install Trivy if not found. |
1 |
S60_TRIVY_VERSION |
Trivy version installed by the auto-install paths. Pinned to a known-good release for supply-chain safety rather than latest. Bump after review; set to latest to opt back into the newest (not recommended). |
0.71.2 |
S60_INSTALL_LATEST_TRIVY_REPO |
Set to 1 to allow falling back to the public Aqua repository (pinned version, then latest) when the trusted Secure60-hosted package is unavailable. Off by default for supply-chain safety. |
(unset) |
S60_INGEST_BATCH_SIZE |
Number of inventory package events sent per HTTP request (as newline-delimited JSON). Default 1000. Lower it only if a proxy or collector rejects large request bodies; raise it to send fewer, larger requests. |
1000 |
The client uses Trivy to generate software inventories. To protect against tampered upstream releases, the client installs Trivy from a trusted source by default, and only uses the public repository if you explicitly allow it.
Supply-chain safety. Trivy is installed in this order:
- A local package file you provide (
S60_TRIVY_PKG_FILE) — fleet tooling copies a verified.rpm/.debto the host.- The Secure60-hosted package downloaded from
S60_TRIVY_PKG_BASE(defaulthttps://www.secure60.io/docs), filetrivy_<version>_<arch>.rpm|deb.- The public Aqua repository (pinned
<version>, then latest) — only when you opt in withS60_INSTALL_LATEST_TRIVY_REPO=1(or--install-latest-trivy-repo); interactive runs prompt you.Steps 1–2 are SHA256-verified against a known-good checksum and installed via the package manager (so Trivy registers in the OS package database and is itself covered by vulnerability scanning). The pinned version is currently
0.71.2; override withS60_TRIVY_VERSION(and the matching checksum) after reviewing a new release.
Auto-install during scan (uses the trusted source; prompts before any public-repo fallback):
./s60-software-inv-agent-linux-1.05.sh --install-trivy-if-missing=Y
Install Trivy only (no scan):
./s60-software-inv-agent-linux-1.05.sh --install-trivy-only
Allow the public Aqua repository (only if you can’t use the trusted package):
S60_INSTALL_LATEST_TRIVY_REPO=1 ./s60-software-inv-agent-linux-1.05.sh --install-trivy-only
# or: ./s60-software-inv-agent-linux-1.05.sh --install-trivy-if-missing=Y --install-latest-trivy-repo
Supported distributions (both trusted-package and repo paths):
.rpm via dnf/yum.deb via aptTo keep your software inventory and vulnerability data up to date, set up a cron job to run the scan automatically every 6 hours.
Option 1: During interactive install
The script will prompt you to set up cron early in the first run, before the scan begins.
Option 2: During scripted install
export S60_SETUP_CRON=1
./s60-software-inv-agent-linux-1.05.sh --scripted
Option 3: Manual cron entry
0 */6 * * * /opt/secure60/s60-software-inv-agent-linux-1.05.sh --scripted >> /var/log/s60-sbom.log 2>&1
When cron is set up automatically, log rotation is also configured at /etc/logrotate.d/s60-sbom (weekly rotation, 4 weeks retained).
All settings are saved to .env-s60-client-script in the same directory as the script. This file is used automatically on subsequent runs and by the cron job.
Example configuration (Ingest mode):
S60_SEND_MODE=ingest
S60_INGEST_BASE=https://ingest.secure60.io
PROJECT_ID=313
TOKEN=eyJhbGciOiJIUzI1NiIs...
HOST=web-server-01
IP=10.0.1.5
FQDN=web-server-01.example.com
environment=Production
Example configuration (Collector mode):
S60_SEND_MODE=collector
S60_COLLECTOR_BASE=https://collector.internal:8443
HOST=web-server-01
Once the client has run and sent data to Secure60, you can view software inventory and vulnerability information across two main areas.
Navigate to Surface Area and select the Software Inventory tab.
This view shows all discovered software packages across your scanned hosts:
You can search, sort, and export the inventory to CSV.
Select the Vulnerabilities tab on the Surface Area page.
This view shows all detected CVEs across your infrastructure:
Vulnerabilities that only affect an installed-but-not-booted kernel are marked with a NON-RUNNING KERNEL badge, and a Hide non-running kernel toggle lets you focus on actionable findings. These are recorded for visibility but do not raise threats — see Non-running kernels.
Vulnerability findings are automatically raised as Threats on the Threats Overview page. These threats appear with the source label Vulnerability. For how the overview, threat groups, states, responses, and reporting work across all threat sources, see Threat Management.
From Threats Overview you can:
Vulnerability threats follow a structured lifecycle from discovery through to resolution. Understanding each stage helps you manage and prioritise your security posture effectively.
The Secure60 vulnerability client runs periodic scans on your hosts, collecting a software inventory (SBOM). The platform analyses this inventory against known CVE databases to identify vulnerabilities in installed packages.
Vulnerabilities that meet or exceed your configured minimum severity threshold (set in Modules → Vulnerability Management) are automatically raised as threats. Each threat includes the CVE identifier, affected package, installed and fixed versions, and a severity classification.
The platform uses a correlation key — a unique fingerprint based on the vulnerability source, host, CVE, and package — to prevent duplicate threats. If a vulnerability is already tracked as an open threat on the same host, a new threat is not created.
Once threats appear on the Threats Overview page, your team can:
When the Auto-close remediated threats setting is enabled (Modules → Vulnerability Management), the platform automatically reconciles open threats after each scan. If a subsequent scan no longer detects a CVE on a host — for example, because the package was upgraded — the corresponding threat is closed with a Remediated outcome and an audit note recording the scan that confirmed the fix.
This ensures your threat list stays current without manual intervention. Auto-closure only applies to threats created by the vulnerability manager and only when the vulnerability genuinely disappears from the scan results.
You can close vulnerability threats manually at any time by setting an appropriate outcome:
For known and accepted risks, create an Exception on the Threats page. Exceptions suppress future threat creation for a specific vulnerability and host combination, so accepted risks do not reappear as new threats in subsequent scans.
Linux distributions keep several kernels installed at once (the running one plus recent previous versions), so a scan legitimately reports vulnerabilities for old kernels that are installed but not currently booted. From client version 1.04 onward, Secure60 detects the running kernel (uname -r) and treats vulnerabilities that only affect a non-running kernel as informational:
Vulnerabilities affecting the running kernel are treated normally and raise threats. To clear non-running-kernel findings entirely, remove the old kernel packages on the host — for example package-cleanup --oldkernels --count=1 (RHEL/CentOS/Rocky) or apt autoremove (Debian/Ubuntu) — and the findings drop off the next scan.
For questions about Vulnerability Management setup or configuration, contact our team at support@secure60.io.