Announcing RUNWAY: The conference for teams securing what's nextRegister Now
RunReveal
SourcesSource Types

Sandfly Security

Sandfly Security is an agentless intrusion detection and threat hunting platform for Linux. RunReveal polls the Sandfly results API and ingests each scan result, giving you a searchable, long-term record of every detection across your fleet: suspicious processes, tampered files, rogue users, hidden kernel modules, and more.

Sandfly Security is a Pro plan source. RunReveal polls your Sandfly server every 5 minutes.

How It Works

RunReveal authenticates to your Sandfly server with a dedicated API user, then reads results from the results API (POST /v4/results).

To avoid gaps or duplicates, RunReveal synchronizes on Sandfly's monotonic sequence_id rather than on timestamps. Sandfly explicitly recommends this: result timestamps are not guaranteed to be ordered, but sequence_id never decreases. When you first connect the source, RunReveal calls GET /v4/results/getMaxID to record the current high-water mark and then collects every result created after that point. Historical results from before the source was connected are not backfilled.

Setup

To connect Sandfly you need three things: your Sandfly server URL, and the username and password of a dedicated API user.

Step 1: Create a Sandfly API user

Create a dedicated API user for RunReveal rather than reusing a person's login. Assign it the api_result_read role — an API-only, read-only role scoped to results and host data. This follows least-privilege and keeps the account out of the web interface.

You must be a Sandfly admin to create users.

In the Sandfly web interface, go to Settings → Account Settings → User Accounts.

Click Add User and fill in the form:

  • User Type: Local (Sandfly manages the login and password)
  • Username: a name you'll recognize, for example runreveal
  • Password: a strong password — you'll paste this into RunReveal
  • Full Name: e.g. RunReveal Integration
  • Roles: select api_result_read

Click Finish to create the user, then record the username and password for the next step.

The api_result_read role grants read access to results and host data without web-interface access, which is exactly what RunReveal needs. See Sandfly's Adding Users guide and the API Endpoint Role Security Matrix for the full permission breakdown.

Step 2: Add the source in RunReveal

  1. Go to Sources in RunReveal
  2. Click the Sandfly Security source tile
  3. Give it a Source Name
  4. Enter your Sandfly Server URL — the base URL of your Sandfly server, e.g. https://sandfly.example.com. RunReveal appends the API path automatically.
  5. Enter the Username and Password for the API user from Step 1
  6. (Optional) Enable Skip TLS certificate verification if your Sandfly server uses a self-signed or otherwise untrusted certificate
  7. Click Connect Source

Your Sandfly server must be reachable from RunReveal over HTTPS on a public address. Self-hosted servers behind a private network or firewall need to allow inbound access from RunReveal.

Only enable Skip TLS certificate verification when your Sandfly server presents a self-signed or internal certificate. It disables certificate and hostname validation for requests to that server, so prefer installing a trusted certificate where possible.

Verify It's Working

New results should begin flowing within a few minutes of the next Sandfly scan. Because RunReveal starts from the current sequence_id, you'll see data once Sandfly produces new results after the source is connected.

You can validate we are receiving your logs by running the following SQL query.

SELECT * FROM runreveal.logs WHERE sourceType = 'sandfly' LIMIT 1

Schema

The following columns are exposed for this source. RunReveal applies schema normalization across all sources, ensuring uniform field names and data types for cross-source queries and reusable detection logic.

Table: sandfly_logs (51 columns)

ColumnType
workspaceIDString
sourceIDString
sourceTypeString
sourceTTLUInt32
receivedAtDateTime
idString
eventTimeDateTime
eventNameString
eventIDString
srcIPString
srcASCountryCodeString
srcASNumberUInt32
srcASOrganizationString
srcCityString
srcConnectionTypeString
srcISPString
srcLatitudeFloat64
srcLongitudeFloat64
srcUserTypeString
dstIPString
dstASCountryCodeString
dstASNumberUInt32
dstASOrganizationString
dstCityString
dstConnectionTypeString
dstISPString
ColumnType
dstLatitudeFloat64
dstLongitudeFloat64
dstUserTypeString
actorMap(String, String)
tagsMap(String, String)
resourcesArray(String)
serviceNameString
enrichmentsArray(Tuple(data Map(String, String), name String, provider String, type String, value String))
readOnlyBool
rawLogString
resultIdString
sequenceIdInt64
externalIdString
hostnameString
hostIdString
ipAddrString
nodeNameString
queueNameString
sandflyNameString
statusString
severityUInt8
resultTypeString
engineString
keyDataString
endTimeString

On this page