Files
fleet/docs/Get started/FAQ.md
T
Sharon KatzandClaude Opus 4.6 b36be84e85 Add native Splunk HEC log destination (#48455)
**Related issue:** Resolves #25574

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`
- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually

---

## Summary

- Adds a new `splunk` log plugin that sends osquery logs directly to
Splunk's HTTP Event Collector (HEC) endpoint
- Eliminates the need for middleware like AWS Firehose when using Splunk
as a log destination
- Follows the same pattern as existing log destinations (Firehose, Kafka
REST, NATS, etc.)
- Includes `insecure_skip_verify` option for environments with
self-signed TLS certs

## UI changes

Follows the same pattern as the NATS log destination PR (#36527) --
adding "Splunk" to the display name, tooltip, and TypeScript type union.
No new components, pages, or styles.

### Manage automations modal -- "Log destination: Splunk"
<img width="822" height="527" alt="image"
src="https://github.com/user-attachments/assets/2533207f-fa95-4364-8ee0-3c39cd3e8e4d"
/>


### Query details page -- "Log destination: Splunk"
<img width="1905" height="662" alt="image"
src="https://github.com/user-attachments/assets/069a5005-f95c-4562-a819-fd8bdcc349f7"
/>



### Tooltip on hover
<img width="639" height="348" alt="image"
src="https://github.com/user-attachments/assets/809a47a6-b82a-4f45-b731-77b2d2c87947"
/>



### Edit query form -- "sent to your log destination: Splunk"
<img width="451" height="814" alt="image"
src="https://github.com/user-attachments/assets/b78b9a57-1f0c-4413-8b7c-654de1fd40a2"
/>



### Save new query modal -- "sent to your log destination: Splunk"
<img width="536" height="698" alt="image"
src="https://github.com/user-attachments/assets/d0a0ab01-66fe-4d63-9190-9c5e840e456d"
/>

---

### How it works

The Splunk writer (`server/logging/splunk.go`) implements the
`fleet.JSONLogger` interface. On startup it performs a health check
against the HEC `/services/collector/health` endpoint. On each `Write()`
call, it wraps each log entry in Splunk's HEC event format (adding
`time`, `index`, `source`, `sourcetype`), batches them up to 1 MB, and
POSTs to `/services/collector/event` with the `Authorization: Splunk
<token>` header. If a batch exceeds 1 MB it flushes and starts a new
one. Events over 1 MB are dropped with a log warning. Transient errors
(HTTP 503) are retried with exponential backoff (up to 8 retries).

### Configuration

```yaml
osquery:
  status_log_plugin: splunk
  result_log_plugin: splunk

splunk:
  url: https://splunk.example.com:8088
  token: <HEC token>
  index: main
  source: fleet
  source_type: fleet:json
  insecure_skip_verify: false  # set true for self-signed certs
```

Or via environment variables:
```
FLEET_OSQUERY_STATUS_LOG_PLUGIN=splunk
FLEET_OSQUERY_RESULT_LOG_PLUGIN=splunk
FLEET_SPLUNK_URL=https://splunk.example.com:8088
FLEET_SPLUNK_TOKEN=<HEC token>
FLEET_SPLUNK_INDEX=main
FLEET_SPLUNK_SOURCE=fleet
FLEET_SPLUNK_SOURCE_TYPE=fleet:json
```

### Files changed
- `server/logging/splunk.go` -- Splunk HEC log writer with batching,
retry, and health check
- `server/logging/splunk_test.go` -- 9 unit tests
- `server/logging/splunk_integration_test.go` -- 3 integration tests
against real Splunk (gated by env var)
- `server/logging/logging.go` -- Added `SplunkConfig` and `case
"splunk"` to factory
- `server/config/config.go` -- Added `SplunkConfig` struct and config
flags
- `cmd/fleet/logging.go` -- Wired Splunk config into logging builder
- `server/fleet/app.go` -- Added `SplunkConfig` type for API responses
(excludes token)
- `server/service/service_appconfig.go` -- Added `case "splunk"` to
logging plugin validation
- `frontend/interfaces/config.ts` -- Added `"splunk"` to LogDestination
type
-
`frontend/components/LogDestinationIndicator/LogDestinationIndicator.tsx`
-- Added Splunk display name and tooltip
- `docs/Configuration/fleet-server-configuration.md` -- Splunk config
documentation
- `docs/Get started/FAQ.md` -- Updated plugin list
- `articles/log-destinations.md` -- Updated Splunk section with native
HEC docs
- `changes/25574-splunk-log-destination` -- Change file

## Test plan

### Unit tests (9 tests)
- [x] `TestSplunkWrite` -- sends 3 events, verifies HEC format, auth
header, index/source/sourcetype
- [x] `TestSplunkWriteEmpty` -- empty logs don't trigger HTTP request
- [x] `TestSplunkServerError` -- HEC 403 propagates as error
- [x] `TestSplunkHealthCheckFailure` -- constructor fails on bad health
- [x] `TestSplunkRecordTooBig` -- oversized events (>1MB) are dropped,
normal events still sent
- [x] `TestSplunkSplitBatchBySize` -- logs exceeding 1MB batch limit are
split into multiple requests
- [x] `TestSplunkRetryOnServiceUnavailable` -- 503 retried with backoff,
succeeds on 3rd attempt
- [x] `TestSplunkRetryExhausted` -- after 9 attempts (1 + 8 retries)
returns error
- [x] `TestSplunkMissingConfig` -- empty URL/token returns descriptive
error

### Integration tests (3 tests, gated by `SPLUNK_INTEGRATION_TEST=1`)
- [x] `TestSplunkIntegration` -- 3 events sent via writer, queried back
from Splunk REST API
- [x] `TestSplunkIntegrationBatch` -- 100 events in one Write(), all
confirmed indexed
- [x] `TestSplunkIntegrationBadToken` -- bad token Write() returns 403

### End-to-end test (macOS ARM64, real osquery agent)

1. Started Splunk Enterprise, MySQL, Redis via Docker
2. Built Fleet server from this branch with
`--osquery_status_log_plugin=splunk`
3. Set up Fleet, enrolled a real osquery 5.23.0 agent on this MacBook
4. **83 real osquery status log events indexed in Splunk** with correct
source/sourcetype/index
5. Each event contained full osquery data (`hostIdentifier`,
`host_uuid`, `calendarTime`, `severity`, `message`, `decorations`)

### Splunk showing real osquery events from Fleet
<img width="1910" height="861" alt="image"
src="https://github.com/user-attachments/assets/192490bf-d594-4424-a3e3-a18306892873"
/>


Generated with [Claude Code](https://claude.ai/code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added native Splunk HEC logging destination for status, result, and
audit logs.
* Updated the log destination UI to display **Splunk** with a dedicated
tooltip.
* Added Splunk HEC configuration (URL/token/index/source/source type)
including TLS verification control.
* **Bug Fixes**
* Improved log delivery with batching, retries for temporary HTTP
failures, and safeguards for oversized events.
* **Tests**
* Added unit tests and optional integration tests covering routing,
batching, retries, and error scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-07-03 12:14:24 -04:00

58 KiB
Raw Blame History

FAQ

Can you host Fleet for me?

Fleet offers managed cloud hosting for Fleet Premium customers with large deployments.

While organizations of all kinds use Fleet, from Fortune 500 companies to school districts to hobbyists, today we are only currently able to provide fully-managed hosting for deployments larger than 700 hosts. (Instead, you can buy a license and self-host Fleet Premium with support.)

Fleet is simple enough to spin up for yourself (our operations guy did it). Premium features are available either way.

What is the easiest way to deploy Fleet?

Take a look at Deploying Fleet for guides on Render or deploy for scale with AWS Terraform. You can also deploy Fleet anywhere you want.

You can enroll servers and laptops using a simple installer or automatically deliver Fleet's agent (fleetd) using your existing tools, such as Chef, Terraform, Munki/autopkg, Ansible, Puppet, Jamf, Intune, etc. As of Fleet v4.53.0, when Fleet's MDM is enabled for MacOS, fleetd is installed as part of the bootstrap.

By default, Fleet keeps fleetd up to date automatically. For self-managed instances, Fleet provides a Simple upgrade process.

What options do I have for access control? What about auditing admin activity?

Fleet lets you define role-based access controls, the ability to assign different admins for different groups of hosts, and rolling deployments. Fleet has built-in audit logging (accessed through API or streamed to a data lake.)

In addition, you can do GitOps because you can control your Fleet instance through a git repo, allowing you to use your standard CI/CD and approval process. This also tracks the history of changes as commits.

Does Fleet include pre-built queries?

Fleet comes with a built-in library for reporting device health and also includes over 400 optional built-in CIS policies for Mac and Windows.

You can easily write reports yourself with auto-complete, as well as import queries for HID to detect IOCs using Yara or other intrusion detection mechanisms from the community or other vendors. Or, you can import policies to monitor for high-impact vulnerabilities such as a particular TPM chip; for example, a large vehicle manufacturer uses Fleet to do this.

Customers can build on these built-in policies to monitor ongoing compliance with regulatory standards like NIST, PCI, ISO, SOC, and HIPAA.

Has anyone stress-tested Fleet? How many hosts can the Fleet server handle?

Fleet is used in production deployments with hundreds of thousands of hosts and has been stress-tested to 150,000 online and 400,000 total enrolled hosts.

Its standard deployment practice to have multiple Fleet servers behind a load balancer. However, the MySQL database is typically the performance bottleneck and a single Fleet server can handle tens of thousands of hosts.

Will Fleet slow down my servers? What about my employee laptops?

Unlike legacy systems, Fleet gives you complete control over how frequent and labor-intensive the scanning is.

When you collect data with Fleet, the performance impact is automatically reported. You can analyze CPU, memory, and network usage or just compare whether a report's performance impact is “minimal,” “considerable,” or “excessive.” You can easily compare the average performance of a scan across all systems or troubleshoot performance on an individual host. If one of your queries gets too rowdy on a particular host, Fleet will temporarily disable it.

You can test changes on a small subset of hosts first, then roll them out to the rest of your organization.

What browsers does Fleet support?

Fleet supports the latest, stable releases of all major browsers and platforms.

We test each browser on Windows whenever possible, because our engineering team primarily uses macOS.

Note: This information also applies to fleetdm.com.

Desktop

  • Chrome
  • Firefox
  • Edge
  • Safari (macOS only)

Mobile

  • Mobile Safari on iOS
  • Mobile Chrome on Android

Note

  • Not every feature in the Fleet admin UI is easy to use from mobile browsers, though you can now access many features of Fleet via mobile browser.
  • The Fleet admin user interface may not be fully supported in Google Chrome when the browser is running on ChromeOS.

What host operating systems does Fleet support?

Fleet supports the following operating system versions on hosts.

OS Supported version(s)
macOS 14+ (Sonoma)
iOS/iPadOS 17+
Windows Pro and Enterprise 10 21H2 (E) (LTS)+, Server 2012+
Linux CentOS 7.1+, Ubuntu 20.04+, Fedora 38+, Amazon Linux 2+, Debian 11+, Red Hat Enterprise Linux (RHEL) 7+, openSUSE 15.6+, Arch Linux, Omarchy
ChromeOS 112.0.5615.134+
Android 14+

While Fleet may still function partially or fully with OS versions older than those above, Fleet does not actively test against unsupported versions and does not pursue bugs on them.

Linux support

Fleet Desktop is supported on the GNOME and KDE Plasma desktop environments. Fedora requires a GNOME extension to enable system tray support. Other distributions like Ubuntu include this by default.

Enforcing disk encryption is only supported on Ubuntu Linux, Kubuntu Linux, and Fedora Linux hosts.

Fleet's default install/uninstall scripts use apt-get for Debian-based distributions, and dnf for Red Hat-based distributions. To install packages on CentOS versions prior to 8, either add dnf or edit install and uninstall scripts to use the yum or rpm command.

The fleetctl package command is not supported on DISA-STIG distribution.

Is Fleet MIT licensed?

Different portions of the Fleet software are licensed differently, as noted in the LICENSE file. The majority of Fleet is MIT licensed. Paid features require a license key.

How do I contact Fleet for support?

A lot of questions can be answered in the documentation or guides.

To get help from the community, visit https://fleetdm.com/support.

If your organization has Fleet Premium, you can access professional support with a guaranteed response time.

Do you offer pricing for unmanaged hosts? What about ephemeral hosts which may scale up or down?

For now, the number of hosts is the maximum cap of hosts enrolled at any given time. Unmanaged hosts ("Pending" MDM status in Fleet) are not included in the enrolled hosts count.

Where's the data stored?

Since Fleet is self-managed, some metadata is stored wherever it is deployed (e.g. Amazon, Azure, Google, your own data center, hybrid cloud, anywhere). That's done using a MySQL database, but the bulk of the data flows directly into a tool like Splunk or ElasticSearch. You can send that information to any of Fleet's supported log destinations.

Can I fork Fleet's source code and build upon it myself to create my own features?

Potentially! Fleet is open core with a source code license similar to GitLab's.

Anyone is free to contribute to the free or paid features of the project. We are always interested to hear feedback, and we are happy to take pull requests and ideas upstream any time we can.

Can I buy support or services separate from Fleet Premium?

The only way we are able to partner as a business to provide support and build new open source and paid features is through customers purchasing Fleet Premium.

Why is my EDR flagging the fleetd agent (orbit)?

EDR products such as SentinelOne and CrowdStrike may occasionally flag the fleetd agent (orbit) after an update. This is a known false-positive scenario that can occur when changes to the agent's behavior trigger heuristic-based detections.

It's common for security products to be falsely flagged as malicious because they need to access security-sensitive data (keychains, certificates, system configurations) to do their intended work. This is a known pattern across the industry and is not unique to Fleet; endpoint agents from many vendors encounter the same heuristic-based false positives.

Fleet is in active communication with EDR vendors to resolve false-positive flagging of the fleetd agent. If you notice a new flag against the orbit binary, please contact your EDR vendor support team to report the false positive. They will let you know the best path forward to address any exceptions you may want to make.

If your vendor supports excluding by "Publisher", add Fleet Device Management Inc as an exclusion rule that will prevent Fleet software from being mistakenly flagged. Additionally, us a recursive path exclusion with /opt/orbit/ for macOS/Linux and C:\Program Files\Orbit\ for Windows.

SLSA provenance attestation 🌶️

Fleet's orbit binaries are built via GitHub Actions and include SLSA (Supply-chain Levels for Software Artifacts) provenance attestations. These attestations allow customers to cryptographically verify that a given binary was produced from a specific GitHub build job and source commit—providing confidence that the binary has not been tampered with.

You can verify the attestation using the gh CLI:

gh attestation verify <path-to-orbit-binary> --repo fleetdm/fleet

This gives your security team an additional signal when triaging EDR alerts: if the attestation verifies successfully, the binary is the authentic artifact produced by Fleet's CI pipeline.

How can I uninstall fleetd?

See the "How to uninstall fleetd" guide.

How do I properly handle all these deprecation warnings in GitOps?

If you set up GitOps before Fleet version 4.82.0, you may see deprecation warnings like so in your GitOps runs:

[!] 'queries' is deprecated; use 'reports' instead

To migrate from queries to reports, teams to fleets, etc. and take care of any of these deprecation warnings, you can use grep -ri "team" . --exclude-dir=.git to search your GitOps folder for a term (in this case team), then edit the files and update the references to fleet. Be cautious about using a general find-and-replace command to do this for all files at once, as you may end up unintentionally replacing something incorrectly. Note that in some cases the word is plural (team vs. teams) or may be in all caps (teams vs. TEAMS).

If you used the teams/ directory to organize your teams fleets, use git mv teams fleets to rename the folder. This is critical, as renaming with the file manager, the standard mv command, or GitHub Desktop will not cause git to initiate a rename command, and will instead delete and then create files/folders, which will cause Fleet to delete the teams fleets and move all your devices into Unassigned.

What is your commitment to open source stewardship?

  • When a feature is free and open source we won't move that feature to a paid tier. Features might be removed from the open source codebase in other cases, for example when combining features from multiple tiers into one new feature.

  • The majority of new capabilities added to Fleet will benefit all users, not just customers.

  • We won't introduce features into the open source codebase with a fixed delay; if a feature is planned to land in both it will be released simultaneously in both.

  • We will always release and open source all tests that we have for any open source feature.

  • The free version of Fleet is enterprise ready.

  • The open source codebase will not contain any artificial limits on the number of hosts, users, size, or performance.

  • The majority of new features contributed by Fleet Device Management Inc will be open source.

  • The product will be available for download without leaving an email address or logging in.

  • We will always allow you to benchmark the performance of Fleet. (Fleet also load tests the platform before every release, with increasingly ambitious targets. The scale of real time reporting supported by Fleet has increased 5,000% since 2019. Today, Fleet deployments support 500,000 devices, and counting. The company is committed to driving this number to 1M+, and beyond.)

What MySQL versions are supported?

Fleet is tested with MySQL 8.0.44, 8.4.8, and 9.5.0 (9.6.0 is currently incompatible). Newer versions of MySQL 8 typically work well. AWS Aurora requires at least version 3.10.3. Please avoid using MariaDB or other MySQL variants that are not officially supported. Compatibility issues have been identified with MySQL variants, and these may not be addressed in future Fleet releases.

What Redis versions are supported?

Fleet is actively tested with Redis 6.2 and 7 (specifically engine_version 7.1 on AWS ElastiCache). Redis 8 and Valkey are also known to work, though we don't currently actively test with those versions.

What version of the Mac Admins osquery extension is supported?

Fleet deploys v1.4.1 of the Mac Admins osquery extension, with full support for the tables currently available in Fleet. For a list of supported tables, see the Fleet tables reference.