LevelBlue USM Anywhere¶
Pulls alarms and events from the LevelBlue USM Anywhere platform (formerly AT&T Cybersecurity / AlienVault) through its API 2.0, using OAuth2 client-credentials authentication. This lets an MSSP or SOC ingest a USM Anywhere tenant's detections into WitFoo by provisioning a single API client credential — the managed LevelBlue collection agents keep shipping to USM Anywhere unchanged.
| Category | SIEM |
| Connector Name | signal-client.usm-anywhere-events |
| Auth Method | OAuth2 Client Credentials |
| Polling Interval | About every 60 seconds (built in, not configurable) |
| Multi-Instance | One instance per Conductor (see One instance per Conductor) |
| API Base | https://<subdomain>.alienvault.cloud/api/2.0 |
| Vendor Docs | LevelBlue: API Clients |
Availability
This connector was introduced in WitFoo 1.1.0. Alarm and event field extraction is built against the LevelBlue USM Anywhere API 2.0 reference. If records from your tenant classify unexpectedly, contact WitFoo support with a sample so the mapping can be confirmed.
Prerequisites¶
Vendor Requirements
An active USM Anywhere subscription whose edition includes the API (LevelBlue documents the API as available in the Standard and Premium editions) and permission to create an API client in your tenant.
- Active LevelBlue USM Anywhere subscription with API access
- A USM Anywhere API client (Client ID + Secret)
- Your tenant subdomain — the bare DNS label from your USM Anywhere URL
https://<subdomain>.alienvault.cloud - Network: Conductor can reach
<subdomain>.alienvault.cloudon port 443
Step 1: Create API Credentials in USM Anywhere¶
- Log in to your USM Anywhere tenant
- In the USM Anywhere web UI secondary menu, select Profile Settings, open the API Clients tab and click New Client (menu names follow the LevelBlue documentation and can change between USM Anywhere versions)
-
Copy the generated Client ID and Client Secret
Protect the secret
Treat the client secret like a password. Store it in your secrets manager and do not paste it into tickets or chat.
-
Make sure the API client is enabled — the API Clients tab shows an enable toggle for each client
- Note your subdomain — the label before
.alienvault.cloudin your tenant URL. Forhttps://acme-soc.alienvault.cloud/, the subdomain isacme-soc
Step 2: Configure in Conductor¶
- Open the Conductor UI at
https://<conductor-ip>/admin/settings/integrations - From the Add Integration dropdown, select LevelBlue USM Anywhere
- Enter a unique name for this instance
-
Fill in the settings form:
Field JSON key Required Default Notes Subdomain subdomainYes — Bare DNS label only — do not include https://or.alienvault.cloud. Must match^[a-z0-9-]{1,63}$; the request host is always composed as<subdomain>.alienvault.cloud.Client ID client_idYes — OAuth2 client id (sent as the HTTP Basic username during the token grant). Secret secretYes — OAuth2 client secret. Masked in the form. Collect Alarms collect_alarmsNo truePoll /api/2.0/alarms.Collect Events collect_eventsNo falsePoll /api/2.0/events.Event Filter event_filterNo — Optional events-only filter written as a URL query string, e.g. event_category=Application. Ignored when only alarms are collected. The connector setspage,size,sortandtimestamp_occured_gteitself and removes them from the filter if present.Enable at least one source
At least one of Collect Alarms or Collect Events must be enabled — the connector rejects a configuration where both are off.
-
Toggle Enabled to on
- Click Save
Why a subdomain, not a full URL
The connector accepts only a DNS label and always composes the request host as <subdomain>.alienvault.cloud. This prevents a mistyped or hostile value from redirecting traffic to another host (SSRF protection), so a full URL, scheme, port, or path is rejected by design.
What Gets Collected¶
| Source | Toggle | WitFoo Classification |
|---|---|---|
| Alarms | collect_alarms | Correlated SIEM detections (see below) |
| Events | collect_events | Asset inventory for the observing host |
Alarms are USM Anywhere's own correlated detections. WitFoo classifies each alarm by its rule_intent (kill-chain stage):
USM rule_intent | WitFoo message type |
|---|---|
| Reconnaissance & Probing | network_scan |
| Exploitation & Installation | exploit_attempt |
| System Compromise / Delivery & Attack | malicious_behavior |
| Any other / unset intent (e.g. Environmental Awareness) | siem_event |
Events classify as asset_inventory — the source host the event was observed on becomes the inventoried asset. Both sources are tagged with the usm_anywhere stream; a recognized USM record is never dropped as unknown.
Alarms feed work units
Because USM Anywhere alarms are the SIEM's own detections, WitFoo's default lead rules treat every collected alarm as a lead — including alarms that fall to the siem_event floor — and leads feed the incident correlation engine that builds work units. Events (asset inventory) match no default lead rule. If alarm volume is high, tune the alarm scope in USM Anywhere or collect events only.
Step 3: Validate Data Flow¶
After saving, verify the integration is working:
- Check connection status — The integration tile should show a green status indicator within a couple of minutes of saving
-
Check Signal Client logs:
-
Check artifacts in Analytics — Navigate to WitFoo Analytics Signals → Search and filter for the
usm_anywherestream
Behavior¶
- Polling — Each poll reads every enabled source (alarms, events). The next poll starts about 60 seconds after the previous one finishes. The interval is built in; there is no polling-interval setting for this connector
- Checkpoint resume — At the end of a poll the connector saves its position for each source: an inclusive
timestamp_occuredwatermark plus the UUIDs of the records already delivered at that timestamp. The next poll re-fetches from the watermark and skips those UUIDs, so a record that was already delivered is not delivered again. The position is saved when a poll ends, so a restart in the middle of a poll can deliver that poll's records again - Rate limiting and errors — On HTTP 429 the connector waits for the server's
Retry-Aftertime (kept between 1 second and 15 minutes) before its next poll. With no usableRetry-After, and after other temporary errors, it waits a random time that grows with each consecutive failure, up to 10 minutes - Per-poll page cap — A poll reads at most 500 pages (100 records each) for each enabled source. If a source is further behind than that, the connector logs a warning and the next poll resumes from the checkpoint; the cap delays records, it does not drop them
- Redirect safety — All HTTP redirects are refused; the request host is always
<subdomain>.alienvault.cloud
One instance per Conductor¶
The Conductor UI lets you add more than one instance of this connector, but every instance saves its position (its checkpoint) in the same file on the Conductor and loads that file when it starts. With two or more instances, an instance can start from another tenant's position, so records can be skipped or fetched again. Add one USM Anywhere instance per Conductor; an MSSP with several tenants should use a separate Conductor for each tenant.
Coexistence With LevelBlue Agents and Beats¶
This connector pulls from the USM Anywhere API. It does not change how any data reaches USM Anywhere:
- LevelBlue managed agents keep shipping to USM Anywhere unchanged. The connector reads the resulting alarms and events from the API — there is no need to re-point the managed collection agents
- Beats / Windows Event Forwarding are unaffected. If you already forward logs to Conductor with OSS Filebeat / Winlogbeat or Windows Event Forwarding, that continues to work alongside this connector
Distinct from the USM Anywhere exporter
This ingest connector (usm-anywhere-events) is separate from the WitFoo outbound exporter integrations (usm-anywhere / alien-vault), which send WitFoo artifacts to an external system. Enabling this connector does not enable any exporter.
Troubleshooting¶
Authentication Failed (401 or 403)¶
- Verify the Client ID and Secret were copied completely
- Confirm the API client is still enabled in USM Anywhere (Profile Settings → API Clients) and has not been deleted
- If in doubt, create a new API client in USM Anywhere and update the Conductor settings with its credentials
Subdomain Rejected¶
- The Subdomain must be a bare DNS label (lowercase letters, digits, hyphens) — do not include
https://, a port, a path, or.alienvault.cloud - Example: for
https://acme-soc.alienvault.cloud/, enteracme-soc
Checkpoint Not Advancing¶
- Confirm records exist in USM Anywhere for the polled source in the current window
- Check Signal Client logs for a page-cap warning — a large backlog drains over several polls by design
- Verify the tenant clock and record timestamps are sane (a zero or missing
timestamp_occuredrecord is skipped)
Rate Limited (429)¶
- The connector already waits for the server's
Retry-Aftervalue before its next poll - Reduce the load: turn off Collect Events if you only need alarms, or narrow events with the Event Filter
- If 429 responses continue, ask LevelBlue about the API rate limits for your tenant
No Data Appearing¶
- Confirm the integration shows Enabled in the Conductor UI
- Confirm at least one of Collect Alarms / Collect Events is on
- Verify the tenant subdomain is correct and reachable on port 443
- Check Signal Client logs:
docker logs signal-client-svc --tail=100
Credentials in logs
The connector's logger never writes the Client ID, Secret, or bearer token. If you enable the shared low-level request-tracing mode (DEBUG=1) for deep diagnostics, request headers may be written to disk — use it only in a controlled environment and clear the output afterward.
See also: Integration Catalog · Integration Management · Signal Client · Common Troubleshooting