elastic / elastic/integrations
[Jamf Pro] Adding Log Stream Support
- Dominant language
- Handlebars
- Stars
- 333
- Forks
- 647
- Avg merge
- 3d 4h
- Merged PRs (30d)
- 209
Description
### Summary
The Jamf Pro integration currently collects device and object lifecycle events via Jamf's [Webhooks API](https://developer.jamf.com/jamf-pro/docs/webhooks-1) (computer enrollment, check-ins, mobile device events, policy compliance, etc.), but does not cover Jamf Log Stream - Jamf's mechanism for streaming Access and Change Management audit logs to external destinations.
These are complementary but distinct data sources:
Webhooks → device and object lifecycle events (computer/mobile device enrollment, check-ins, inventory changes, patch compliance)
Log Stream → operator/admin audit logs (who logged in, from where, and what they changed in Jamf Pro)
Log Stream fills a meaningful security gap: without it, there is no visibility into Jamf Pro administrative activity -login attempts, privilege use, or configuration changes - which are critical for insider threat detection, compliance, and incident response.
**Prerequisites**
Log Stream is available to Jamf Cloud Premium customers only. It is not available to self-hosted Jamf Pro instances.
**Log types**
**Access Log ([JSSACCESSLOG]) — tracks all login attempts to Jamf Pro:**
Timestamp
Username
Source IP address
Entry point: JSS (web UI), JSS (API) (Classic API), Universal API (Jamf Pro API)
Login status (Successful / Failed)
**Change Management Log ([CHANGEMANAGEMENT]) — tracks Create, Read, Update, and Delete operations on Jamf Pro objects:**
Timestamp, log level, thread
Actor (username + numeric ID; system operations attributed to Jamf Pro System (ID: -1))
Operation type: CREATE / READ / UPDATE / DELETE
Resource type and identifier (name/ID)
Optional structured detail block (format varies by resource type and is subject to change without notice per Jamf docs)
**Sample entries:**
```
[JSSACCESSLOG] 2021-09-09T08:44:00,679 - username=jssadmin, status=Successful Login, ipAddress=10.1.1.1, entryPoint=Universal API
[JSSACCESSLOG] 2021-09-28T13:51:35,768 - username=sampleUser, status=Failed Login, ipAddress=10.1.1.1, entryPoint=JSS
[CHANGEMANAGEMENT] 2021-09-09T08:48:43,115 [INFO ] [Tomcat-3] [file] - [jssadmin (ID: 1)] [DELETE] [Computer] [2021-09-09T08:48:43.115-0500]
ID 113
Name ......... Lauras MacBook Pro
```
**Delivery**
Logs are delivered as uncompressed GZIP files. Sync frequency:
S3: every 15 minutes, or when the log file reaches 10 MB
HTTPS endpoint: every 2 minutes, or when the log file reaches 10 MB
**Proposed implementation**
Add a new log_stream data stream to the jamf_pro package supporting two input options:
http_endpoint input — Jamf pushes directly to an Elastic Agent HTTPS listener. Lower latency (~2 min), requires network connectivity from Jamf Cloud to the agent.
aws_s3 input — Jamf delivers to an S3 bucket; Elastic Agent polls via SQS or direct listing. Higher latency (~15 min) but works where inbound connectivity isn't viable.
ECS field mapping is out of scope for this issue and will be addressed separately once we have real sample data to work from.
### Acceptance criteria
New log_stream data stream added to the jamf_pro package
http_endpoint input supported and documented
aws_s3 input supported and documented
Both [JSSACCESSLOG] and [CHANGEMANAGEMENT] log types parsed into discrete fields
Documentation covers Jamf Cloud Premium prerequisite and setup steps for both input types
References
[Jamf Log Stream developer docs](https://developer.jamf.com/jamf-pro/docs/jamf-log-stream)
[Jamf Webhooks developer docs](https://developer.jamf.com/jamf-pro/docs/webhooks-1)
Existing package: packages/jamf_pro
Contributor guide
Assessment
This issue has not been assessed yet.