Skip to main content

Nessus agents

Pulls the agents linked to a Nessus manager, with their platform, link state and scan history.

Type namenessus_agents
CreatesEndpoints
Runs onA sensor with network reach to the Nessus manager
Presence flagnessus_exits
Field prefixnessus_

What it contributes

  • Identity — agent ID, UUID, name
  • Network — IP, MAC addresses
  • Platform — platform, distro, upgrade distro
  • Agent build — core version, core build, plugin feed ID
  • Link state — link status, linked on, unlinked on, auto-unlinked, last connect, status
  • Scan state — last scanned
  • Grouping — groups, link groups, cluster group ID
  • Cluster topology — node ID, node host, node name
  • Settings — remote logs, remote settings, settings pending, settings staged, log directory

Alongside its own nessus_* fields it writes the shared asset fields, so its agents correlate against every other source. os, type and mac are written in do-not-override mode, so Nessus fills them when they are empty but will not overwrite what an EDR agent already asserted. See Exported fields for the complete list.

nessus_last_scanned is a coverage metric, not an inventory one

An agent that is linked but has not been scanned in months is a vulnerability blind spot even though the asset looks covered. Filter on the gap between nessus_last_connect and nessus_last_scanned.

Requirements

The integration is outbound-only: it reads the Nessus API on a schedule, so nothing is installed on the manager, nothing changes on the agents, and nothing has to reach into the deployment.

Network access

FromToProtocolPort
The sensor running the integrationThe Nessus manager named in URLHTTPS over TCPWhatever the URL names — 8834 on a default Nessus Manager install

Nessus managers commonly present a self-signed certificate. Install its CA on the sensor host in preference to enabling Ignore SSL — the API keys are sent on every request, as the note under Generating the API keys explains.

Access in Nessus

NeedWhy
An account that can generate API keysThe credential is an access key and secret key pair, generated under My Account → API Keys. See Generating the API keys in Nessus
That account able to list agentsNessus keys inherit their creator's permissions, so the account, not the key, decides what the run can read
A product variant that exposes the agents APIThe run reads /agents and /agents/{id}; not every Nessus product exposes them

In this deployment

NeedWhy
A registered, healthy sensor with reach to the managerThe integration runs on a sensor, on the platform's schedule — see Sensors
The agent group names to collectNessus groups is mandatory and scopes the run — see the warning under Configuration

Configuration

FieldRequiredNotes
NameYesLabel for this instance
URLYesNessus manager base URL, e.g. https://nessus.example.com:8834
Access IDYesThe Access Key shown when the API keys were generated
Secret keyYesThe Secret Key shown alongside it, once
Nessus groupsYesComma-separated list of agent groups to pull
CookiesNoExtra cookies added to requests
SensorYesSensor that will run the integration
Ignore SSLNoSkips certificate validation — leave off against a manager with a trusted CA
Groups are a filter, not a hint

Nessus groups is mandatory and scopes what the run collects. Agents outside the listed groups are not pulled, and no warning is raised — so an agent group created after this instance was configured stays invisible until you add it here.

Generating the API keys in Nessus

In the Nessus console, open My Account from the top-right corner, go to the API Keys tab and choose Generate. Nessus issues a fresh key pair and shows both values on that screen — they are what you enter when creating the integration instance:

Nessus showsEnter it asExample
Access KeyAccess IDa1b2c3d4e5f6...
Secret KeySecret keyshown once, at generation
Generating replaces the existing pair

The keys belong to the user account, not to a client, so Generate invalidates whatever pair that account was already using. If another integration or script authenticates as the same user it will start failing the moment you press it — give this integration its own account rather than sharing one.

Nessus keys inherit the permissions of the user who created them, so generate them under a dedicated read-only account that can list agents rather than under an administrator.

TODO

Confirm the minimum Nessus user role that can read /agents and /agents/{id} on current Nessus Manager and Tenable.sc versions, and note which product variants expose the agents API at all.

Self-signed certificates are the norm here

Nessus managers are commonly deployed with a self-signed certificate. Install its CA on the sensor host in preference to enabling Ignore SSL — the API keys are sent on every request.

The integration then authenticates with the X-ApiKeys header, pages /agents, and fetches /agents/{id} for per-agent detail.

Exported fields

Each agent returned by /agents/{id} becomes one asset record. The integration copies the Nessus agent attributes into fields prefixed nessus_, keeping the Nessus name so a value in the platform can always be traced back to the agent record it came from, and additionally writes the shared fields that make the agent correlate with other sources.

One rule drops records before anything is written: an agent whose groups do not intersect the Nessus groups list configured on the instance. Every agent that survives that filter is written — see the note on offline agents below.

Identity

FieldTypeHolds
nessus_exitsBooleanAlways true — the presence flag marking this asset as Nessus-covered
nessus_idTextNessus agent ID. This is the value the run feeds back into /agents/{id} to fetch per-agent detail
nessus_uuidTextAgent UUID. The strongest match key — an existing asset carrying the same nessus_uuid is what the run correlates against first
nessus_nameTextAgent name as Nessus reports it

Network

FieldTypeHolds
nessus_ipIPAddress the agent reports
nessus_mac_addrsTextMAC addresses of the agent's adapters — an array in the source record

Platform

FieldTypeHolds
nessus_platformTextPlatform as Nessus reports it. This single value is the input to all three of the normalised os, os_vendor and type
nessus_distroTextDistribution
nessus_upgrade_distroTextFull distribution string

Agent build

FieldTypeHolds
nessus_core_versionTextAgent core version
nessus_core_buildTextAgent core build
nessus_plugin_feed_idTextPlugin feed the agent last received. Compare it across the estate to find agents scanning on a stale plugin set
FieldTypeHolds
nessus_link_statusTextLink status of the agent
nessus_statusTextAgent status
nessus_linked_onDate/timeWhen the agent was linked to the manager
nessus_unlinked_onDate/timeWhen the agent was unlinked, if it has been
nessus_auto_unlinkedTextWhether the manager unlinked the agent automatically — a number in the source record
nessus_last_connectDate/timeWhen the agent last connected to the manager. Also the value behind the shared first_seen and last_seen

Scan state

FieldTypeHolds
nessus_last_scannedDate/timeWhen the agent was last scanned

Grouping

FieldTypeHolds
nessus_groupsTextAgent groups the agent belongs to — an array in the source record. This is also the field the Nessus groups filter is matched against
nessus_link_groupsTextLink group
nessus_cluster_group_idTextCluster group ID

Cluster topology

FieldTypeHolds
nessus_node_idTextID of the cluster node the agent is assigned to
nessus_node_hostTextHost of that node
nessus_node_nameTextName of that node

Settings

FieldTypeHolds
nessus_remote_logsTextRemote logging state — a number in the source record
nessus_remote_settingsTextRemote settings state — a number in the source record
nessus_settingsPendingTextWhether settings changes are pending on the agent — a number in the source record
nessus_settingsStagedTextWhether settings changes are staged on the agent — a number in the source record
nessus_log_directoryTextLog directory on the agent host

Shared fields it writes

These are the normalised, source-independent fields. They are what other integrations correlate against, so their values are cleaned up rather than copied verbatim:

Shared fieldDerived from
namesnessus_name
private_ipnessus_ip
macnessus_mac_addrs — do-not-override
osnessus_platform, normalised to a canonical name such as Windows 11 or Ubuntu 20.04 — do-not-override
os_vendornessus_platform, normalised to Windows, Linux, MacOS, OpenBSD or VMware
typeInferred from the normalised osEndpoint, Server, Hypervisor and similar — do-not-override
first_seennessus_last_connect, on the run that creates the asset
last_seennessus_last_connect
updated_atTime of the run that produced the record
os is protected from overwrite but os_vendor is not

os, type and mac are do-not-override, so a richer source keeps them. names, private_ip and os_vendor are not — a Nessus run will overwrite what another integration asserted. Where a host looks inconsistent, os coming from an EDR while os_vendor came from Nessus is the usual explanation.

Nessus ignores the offline window

Ignore if host is offline appears in this instance's advanced settings, but this integration never applies it — an agent that has not connected in a year is still written. Filter on nessus_last_connect in a view or report instead of relying on that setting.

See also