Skip to content

[microsoft_intune][managed_device] Add microsoft_intune managed_device datastream#17688

Closed
janvi-elastic wants to merge 132 commits intoelastic:feature/microsoft_intune-0.1.0from
janvi-elastic:package-microsoft_intune_managed_device_datastream
Closed

[microsoft_intune][managed_device] Add microsoft_intune managed_device datastream#17688
janvi-elastic wants to merge 132 commits intoelastic:feature/microsoft_intune-0.1.0from
janvi-elastic:package-microsoft_intune_managed_device_datastream

Conversation

@janvi-elastic
Copy link
Copy Markdown
Contributor

@janvi-elastic janvi-elastic commented Mar 5, 2026

Proposed commit message

The initial release includes managed_device data stream, associated dashboards 
and visualizations.

Microsoft Intune fields are mapped to their corresponding ECS fields where possible.

Test samples were derived from documentation and live data samples, 
which were subsequently sanitized.

Checklist

  • I have reviewed tips for building integrations and this pull request is aligned with them.
  • I have verified that all data streams collect metrics or logs.
  • I have added an entry to my package's changelog.yml file.
  • I have verified that Kibana version constraints are current according to guidelines.

How to test this PR locally

  • Clone integrations repo.
  • Install elastic package locally.
  • Start elastic stack using elastic-package.
  • Move to integrations/packages/microsoft_intune directory.
  • Run the following command to run tests.

elastic-package test

Run asset tests for the package
--- Test results for package: microsoft_intune - START ---
╭──────────────────┬────────────────┬───────────┬───────────────────────────────────────────────────────────────────────────┬────────┬──────────────╮
│ PACKAGE          │ DATA STREAM    │ TEST TYPE │ TEST NAME                                                                 │ RESULT │ TIME ELAPSED │
├──────────────────┼────────────────┼───────────┼───────────────────────────────────────────────────────────────────────────┼────────┼──────────────┤
│ microsoft_intune │                │ asset     │ dashboard microsoft_intune-adaf931d-1be6-4394-a046-35e1d1010f9e is loaded │ PASS   │       2.03µs │
│ microsoft_intune │                │ asset     │ search microsoft_intune-5c69302a-2d0c-45c0-b4b5-2fe864383b99 is loaded    │ PASS   │        626ns │
│ microsoft_intune │                │ asset     │ search microsoft_intune-75100327-86d0-44e5-adfb-52ad2c59dec7 is loaded    │ PASS   │        616ns │
│ microsoft_intune │                │ asset     │ search microsoft_intune-c91d6412-560c-49a5-80c8-eca25bc242dc is loaded    │ PASS   │        640ns │
│ microsoft_intune │ managed_device │ asset     │ index_template logs-microsoft_intune.managed_device is loaded             │ PASS   │        500ns │
│ microsoft_intune │ managed_device │ asset     │ ingest_pipeline logs-microsoft_intune.managed_device-0.1.0 is loaded      │ PASS   │        564ns │
╰──────────────────┴────────────────┴───────────┴───────────────────────────────────────────────────────────────────────────┴────────┴──────────────╯
--- Test results for package: microsoft_intune - END   ---
Done
Run pipeline tests for the package
--- Test results for package: microsoft_intune - START ---
╭──────────────────┬────────────────┬───────────┬────────────────────────────────────────────────────┬────────┬──────────────╮
│ PACKAGE          │ DATA STREAM    │ TEST TYPE │ TEST NAME                                          │ RESULT │ TIME ELAPSED │
├──────────────────┼────────────────┼───────────┼────────────────────────────────────────────────────┼────────┼──────────────┤
│ microsoft_intune │ managed_device │ pipeline  │ (ingest pipeline warnings test-managed-device.log) │ PASS   │ 374.578263ms │
│ microsoft_intune │ managed_device │ pipeline  │ test-managed-device.log                            │ PASS   │ 198.349246ms │
╰──────────────────┴────────────────┴───────────┴────────────────────────────────────────────────────┴────────┴──────────────╯
--- Test results for package: microsoft_intune - END   ---
Done
Run policy tests for the package
--- Test results for package: microsoft_intune - START ---
No test results
--- Test results for package: microsoft_intune - END   ---
Done
Run script tests for the package
--- Test results for package: microsoft_intune - START ---
PKG microsoft_intune
[no test files]
--- Test results for package: microsoft_intune - END ---
Done
Run static tests for the package
--- Test results for package: microsoft_intune - START ---
No test results
--- Test results for package: microsoft_intune - END   ---
Done
Run system tests for the package
--- Test results for package: microsoft_intune - START ---
No test results
--- Test results for package: microsoft_intune - END   ---
Done

Screenshot

image image

Implementation Details

Docs Referred

https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/review-logs-using-azure-monitor

@janvi-elastic janvi-elastic requested a review from a team as a code owner March 5, 2026 17:01
@andrewkroh andrewkroh added Crest Contributions from Crest developement team. New Integration Issue or pull request for creating a new integration package. dashboard Relates to a Kibana dashboard bug, enhancement, or modification. documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. labels Mar 5, 2026
@IOITI
Copy link
Copy Markdown

IOITI commented Mar 13, 2026

Hi @janvi-elastic, Any reason why not putting Microsoft Intune in Azure integration package and configure router to capture Intune data ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks pretty useful overall, a couple thoughts @janvi-elastic:

  • Default timeframe is "Last 15 years" - set to 90 days and update screenshot
  • Managed Devices stat tile: Without a comparison a single number doesn't tell a security team much. I think we could replace the "Devices by Compliance State" chart with two metric tiles up top (Compliant vs. Non-Compliant) since this is the core question the dashboard is trying to answer and it's scannable at a glance.

There are also some interesting fields from the sample events that we should consider surfacing more prominently:

  • EncryptionStatusString - One of the 3 devices has encryption set to False - this feels like it should be prominently visualized, either as a metric tile or alongside the compliance state breakdown, as it's a core device posture signal
  • JailBroken - in a production environment with mobile devices this would matter, it's worth surfacing
  • LastContact - the Inventory Details table shows this but it's only visible at the bottom. It would be nice to have some callout for devices that haven't contacted Intune in X days, as stale devices are a common blind spot

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cpascale43 Regarding Devices by Compliance State, In live logs we are getting Compliant, Noncompliant and Not Evaluated. And in documentation we don't have list of Possible values. So should we remove pie chart and replace it with metrics(Compliant vs Noncompliant) ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @janvi-elastic, given that there are at least three possible values in live data and the docs don't list all of them, we can keep it as is. Thanks for flagging!

@janvi-elastic janvi-elastic changed the base branch from main to feature/microsoft_intune-0.1.0 March 24, 2026 11:32
tradebot-elastic and others added 19 commits March 24, 2026 17:31
* Fix broken link

* Update manifest and changelog

* Run elastic package build

* Remove html at the end of URL

* Remove one more html
Fix the m365_defender system benchmark setup and update the HTTP mock to 
align with the current agent OAuth behavior. Extend the alert benchmark HTTP mock
by adding a POST endpoint for the refresh_token grant that returns a new access_token,
ensuring long-running and token renewal flows are exercised without relying on real AD.
…integrations (elastic#17045)

In these integrations' documentation and manifest titles and descriptions, rename "Trend Micro" to "TrendAI",
as this is the new product name for the services these connect with.

Also, update the integration logo to the new product logo.
…lastic#17413)

Box Events sends either null or an email to box.source.login when using
the admin_logs_streaming setting. Setting this field to a boolean
causes data set quality issues and fields to become ignored.

Changing this to a keyword should resolve issues with data set quality.
…ic#18022)

Made with ❤️️ by updatecli

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@v7...v8)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ic#17879)

* [ci] Add blocking PR check for package docs using docs-builder

Adds a new workflow that validates changed packages/**/docs/*.md files
on every PR using the elastic/docs-builder action (metadata-only + strict
mode), catching Elastic-specific syntax issues before they reach EPR/downstream.

_dev/build/ template files are excluded since they contain {{ fields }}
syntax that is not valid docs-builder input.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* [ci] Exclude knowledge_base and subdirs from package docs check

Narrows the path trigger from packages/**/docs/** to packages/**/docs/*.md
and tightens the grep filter to [^/]*.md$ so only top-level docs files
are validated, excluding knowledge_base/ and other subdirectories.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* [ci] Support nested package paths in docs validation trigger

Replace packages/**/docs/*.md with explicit single- and two-level
patterns so the workflow also triggers for nested packages like
packages/nginx/nginx/docs/README.md (see elastic#17403).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* [test] Validate package docs with isolated docs-builder run

- Run docs-builder in an isolated .validate/ directory (with git init)
  so it never discovers docs/docset.yml or scans repo-wide .md files
- Lowercase filenames before validation (docs-builder requirement)
- Include cross_links (beats, docs-content, ecs, elasticsearch,
  integrations) in generated docset to resolve cross-repo references
- Add test edits to 1password, nginx, aws package docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [ci] Drop --strict, add test doc edits

Package docs have content-level warnings (missing titles, code block
annotations) that are not actual errors but would fail with --strict.
Use non-strict mode to catch real errors only.

Also adds test edits to 1password, nginx, aws docs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [ci] Remove test doc edits, exclude deleted files from diff

- Revert test edits to 1password, nginx, aws docs
- Add --diff-filter=d to git diff to skip deleted files, which would
  break the cp step in CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [ci] Copy img/ dirs and allow errors until baseline is clean

- Copy each package's img/ directory into .validate/ so image
  references resolve (drops 84 → ~10 remaining image errors)
- Mount at /workspace instead of /app to avoid overwriting the
  docs-builder binary in the container
- Add continue-on-error: true so existing doc issues don't block
  PRs until a follow-up PR fixes the ~44 pre-existing errors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [ci] Fix script injection: use env var for github.base_ref

Avoid interpolating github.base_ref directly into the shell command,
which is attacker-controlled (PR target branch name). Pass it as an
env var instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Lowercase Vidyard thumbnail URLs in package docs

docs-builder rejects image filenames with uppercase characters.
Lowercase the play.vidyard.com thumbnail URLs so the filenames
integration-docs downloads are valid.

Affects: crowdstrike, m365_defender, microsoft_defender_endpoint,
sentinel_one

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Bump versions and add changelog entries

Run elastic-package changelog add + build for each affected package:
- crowdstrike 3.12.0 → 3.12.1
- m365_defender 5.12.0 → 5.12.1
- microsoft_defender_endpoint 4.5.0 → 4.5.1
- sentinel_one 2.5.0 → 2.5.1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix changelog type: enhancement → bugfix

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
)

* [ci] Remove continue-on-error, add failure notification workflow

- Remove continue-on-error from validate-package-docs so it properly
  blocks PRs with doc issues
- Add a separate workflow_run-triggered workflow that posts a comment
  mentioning @elastic/ingest-docs when validation fails
- The notification workflow uses workflow_run (runs in base branch
  context) so it can safely have pull-requests: write without exposing
  secrets to fork PRs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* [ci] Keep continue-on-error, notify via artifact signal

The validation step stays non-blocking (continue-on-error: true) but
uploads a "docs-validation-failed" artifact when docs-builder exits
non-zero. The notification workflow downloads this artifact — if it
exists, it posts a PR comment mentioning @elastic/ingest-docs.

This avoids false blocking on unknown edge cases while still surfacing
doc issues to the right team.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Address review: env vars for injection safety, --body-file for comment

- Use env var for github.event.pull_request.number instead of inline
  interpolation in shell (validate-package-docs.yml)
- Use env var for github.repository instead of inline interpolation
  in shell (notify-package-docs-failure.yml)
- Use --body-file instead of --body for multi-line comment to avoid
  shell quoting issues

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Replace ingest-docs with integration-docs, add #docs channel reference

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
integration-docs uses docs-builder with --strict (the default in
preview-build.yml), so warnings like unknown code block languages
become errors there. Match that behavior here so issues are caught
before they reach integration-docs.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…s and increase min Kibana version (elastic#18046)

* v1: Add back esql based dashboards and increase min Kibana version

* Update changelog.yml
…cts (elastic#18052)

The artifact-based approach doesn't work because upload-artifact@v4
scopes artifacts to the workflow run, making them inaccessible from
a workflow_run-triggered workflow via download-artifact.

Instead, query the Jobs API to check if the "Validate with docs-builder"
step concluded as failure (despite the job succeeding via continue-on-error),
and find the PR number from the head SHA.

Also removes the now-unnecessary signal/upload steps from the validation
workflow. Handles jq returning literal "null" for commits without a PR.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…18055)

In PanOS wildfire CEF events, the request extension key contains a
filename rather than a URL. The decode_cef processor maps the raw
CEF request key to cef.extensions.requestUrl per the CEF spec, and
the pipeline unconditionally mapped that to url.full. This caused
filenames like "somefile.txt" to appear in url.full/url.original
while file.name was never populated.

Add a conditional so that for THREAT events with Name "wildfire" or
"wildfire-virus", requestUrl is routed to file.name and
threat.indicator.file.name instead of the url fields. Add a wildfire
CEF system test event to verify the end-to-end decode_cef behavior
through the Elastic Agent.
mrodm and others added 25 commits April 8, 2026 10:26
Fix error checks in ReportFailedTests comparing err to nil instead of itself.
Fix minor wording in error messages for gomod and codeowners.
Add a new dev/packagenames Go package that validates no two packages
share the same name field across the packages/ directory.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…lastic#18245)

PR elastic#15432 (v1.17.0) added source_lag_time with a guard condition to
clamp start_time when the cursor is ahead of now - source_lag_time.
Two bugs in the implementation cause 400 Bad Request errors from the
JumpCloud API:

1. parseDate uses the default RFC3339 layout, which cannot parse
   JumpCloud's fractional-second timestamps (e.g.
   2023-01-14T08:16:06.495Z). When parsing fails, parseDate silently
   returns zero time, disabling the guard condition entirely.

2. The YAML >- block scalar introduces a trailing newline in the
   if-true branch output. When the guard fires, start_time is sent
   as "2026-03-09T10:46:26Z\n", which JumpCloud rejects as invalid.

Fix (1) by passing "RFC3339Nano" layout to parseDate so it handles
fractional seconds. Fix (2) by adding the -]] trim marker to strip
the trailing newline.

Exercise the source_lag_time code path in the existing system test.
* Add OTel Assets for MSSQL Server

Co-authored-by: mykola-elastic <mykola.kmet@elastic.co>
Co-authored-by: muthu-mps <101238137+muthu-mps@users.noreply.github.com>
* Add OTel Asset for ZooKeeper

Co-authored-by: muthu-mps <101238137+muthu-mps@users.noreply.github.com>
…tic#18254)

* [Security Rules] Update security rules package to v9.3.8-beta.1

* Add changelog entry for 9.3.8-beta.1
* add auto-expand-replicas setting

* update pr link

* update format_version

* Update manifest.yml

* fix validation errors

* Update changelog.yml

* Update manifest.yml
…tic#18287)

* [Security Rules] Update security rules package to v9.3.8-beta.2

* Add changelog entry for 9.3.8-beta.2
* [airflow_otel] add new content pack

* update readme

* add CODEOWNERS

* upgrade compiler version

* add slo note

* update dataset name

* update screenshots

* recompile dashboards
* improve Node Detail dashboard

* fix PR id

* address reviews
…#18196)

The FDR ingest pipeline renamed crowdstrike.event_simpleName into
event.action, destroying the source field. For registry, driver,
and *Written events, event.action is then overwritten with a
generic operation name (per TRaDe requirements), leaving the
original CrowdStrike event name inaccessible as a keyword field.

Change the rename to a copy so crowdstrike.event_simpleName
survives in the indexed document alongside event.action.
…r events (elastic#17980)

Copy binding deltas from the protoPayload.serviceData object. This
object describes which operations were made on accounts' roles and can
be used to detect whether a role has been added to or removed from an
account.

Description of the binding deltas structure can be found in the GCP IAM
documentation[1].

[1] https://docs.cloud.google.com/iam/docs/reference/rpc/google.iam.v1#google.iam.v1.BindingDelta
cloudflare_logpush: add region variable to aws-s3 input

Elastic Agent 8.19.12 added validation in the Filebeat aws-s3 input
that requires the "region" config field when "non_aws_bucket_name"
is set (elastic/beats#48534). The cloudflare_logpush integration
only rendered "default_region", which is a different field used for
AWS SDK initialization, so configurations using Cloudflare R2 or
other S3-compatible storage fail at startup.

Add a "region" variable to the aws-s3 policy template and render it
in all 21 data stream templates, matching the approach already used
by the tanium and netskope integrations.

Fixes elastic#17790
* Initial draft of the package

* add pr number

* add CODEOWNERS entry

* README.md: > **Note**: SLO templates require Elastic Stack version 9.4.0 or later.

* add screenshots

* fix rate panels

* fix percentage calculation

* add link to traefik doc

* add comments about processors: cumulativetodelta, resource/dataset

* add categories

* change kibana.version to ^9.2.1

* recompile dashboards with kb-dashboard-cli==0.4.1
…#18002)

* initial changes

* kb-dashboard 0.4.0 changes

* update dashboards

* update kibana version
…ic#18297)

Made with ❤️️ by updatecli

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…iew dashboards (elastic#18063)

ti_misp: Add filters for Indicators ingested visualization for Overview dashboards

Add filters in Indicators ingested visualization to make sure they only show data 
relevant to MISP data stream. Add missing screenshots for both overview dashboards.
…ats tag/branch (elastic#18305)

- Regenerate schemas and fields for osquery 5.22.1; bump package and Kibana constraint.
- Add optional beats.tag and beats.branch in osquery-gen (tag > branch > version).
@cla-checker-service
Copy link
Copy Markdown

❌ Author of the following commits did not sign a Contributor Agreement:
, , , 775aafd, , , , , , 699aa72, , , , , , , ,

Please, read and sign the above mentioned agreement if you want to contribute to this project

@elasticmachine
Copy link
Copy Markdown

💔 Build Failed

Failed CI Steps

History

Comment on lines +25 to +26
conditions:
kibana
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High extend/agent-version-conditions.md:25

The YAML example at line 26 is missing a colon after kibana, so kibana becomes a key with no value and version: becomes a sibling of kibana instead of a child. Users who copy this example will get a YAML parsing error.

Suggested change
conditions:
kibana
conditions:
- kibana
+ kibana:
version: '^9.4.0'
🤖 Copy this AI Prompt to have your agent fix this:
In file docs/extend/agent-version-conditions.md around lines 25-26:

The YAML example at line 26 is missing a colon after `kibana`, so `kibana` becomes a key with no value and `version:` becomes a sibling of `kibana` instead of a child. Users who copy this example will get a YAML parsing error.

@janvi-elastic
Copy link
Copy Markdown
Contributor Author

Sorry for the noise, raised new PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Crest Contributions from Crest developement team. dashboard Relates to a Kibana dashboard bug, enhancement, or modification. documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. New Integration Issue or pull request for creating a new integration package.

Projects

None yet

Development

Successfully merging this pull request may close these issues.