[PR #5977] feat: Entra/Intune device authentication as a new peer-registration method #27240

Open
opened 2026-08-05 07:08:25 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/5977
Author: @thvevirtue
Created: 4/24/2026
Status: 🔄 Open

Base: mainHead: feature/entra-device-auth


📝 Commits (10+)

  • bd3a7e4 entra_device: Phase 1 server skeleton
  • 09c4bc2 entra_device: wire into AccountManager + HTTP router
  • 8c921a7 entra_device: unit tests for enrolment flow + peer-registration integration
  • e7667d5 entra_device: test harness (Dockerfile + compose + synthetic client) + dex CGO shim
  • 783117e enroll-tester: add --demo mode for in-process end-to-end verification
  • b47a05a docs: user-facing documentation for Entra device auth
  • 17e718d entra-test: fix docker-compose flags + config for real bring-up
  • 9b27c0f entra-test: seed-account helper + expose Postgres port
  • 50c249d docs: record live-tenant verification matrix
  • d38984e client/entradevice: PFX CertProvider + Enroller + tests (Phase 2 core)

📊 Changes

53 files changed (+7647 additions, -95 deletions)

View changed files

client/cmd/entra_enroll.go (+330 -0)
📝 client/cmd/root.go (+1 -0)
client/internal/enroll/entradevice/enroller.go (+256 -0)
client/internal/enroll/entradevice/enroller_test.go (+250 -0)
client/internal/enroll/entradevice/provider.go (+145 -0)
client/internal/enroll/entradevice/state.go (+41 -0)
📝 client/internal/profilemanager/config.go (+7 -0)
client/internal/profilemanager/config_entra.go (+19 -0)
docs/ENTRA_DEVICE_AUTH.md (+523 -0)
📝 go.mod (+1 -0)
📝 go.sum (+2 -0)
📝 idp/dex/config.go (+1 -1)
📝 idp/dex/provider.go (+2 -4)
idp/dex/sqlite_cgo.go (+18 -0)
idp/dex/sqlite_nocgo.go (+20 -0)
management/Dockerfile.entra-test (+89 -0)
📝 management/internals/server/boot.go (+24 -1)
management/server/entra_device_enroll.go (+329 -0)
📝 management/server/http/handler.go (+181 -87)
management/server/http/handlers/entra_device_auth/e2e_test.go (+395 -0)

...and 33 more files

📄 Description

Entra / Intune Device Authentication — a third peer-registration method

What this PR adds

A new way for devices to join a NetBird network, alongside setup keys and SSO: the device itself authenticates using an Entra-issued certificate, with zero user interaction. Admins map Entra security groups to NetBird auto-groups; the device ends up in the right NetBird groups based on its Entra membership.

The feature is served on a dedicated endpoint path (/join/entra) so it never mixes with the existing gRPC Login/Sync surface or the admin /api surface.

Deployment story

Intune PKCS Certificate profile → PFX on device
                ↓
netbird entra-enroll --management-url https://<mgmt>/join/entra \
                     --entra-tenant YOUR_TENANT \
                     --entra-pfx    device.pfx \
                     --entra-pfx-password-env NB_ENTRA_PFX_PASSWORD
                ↓
netbird up                  ← normal gRPC login, peer already registered

Design in one page

  1. Admin configures an EntraDeviceAuth integration (tenant id, app credentials, compliance requirements) and EntraDeviceAuthMapping rows that pair Entra security group IDs with NetBird auto-groups.
  2. Device calls GET /join/entra/challenge → server issues a single-use 32-byte nonce (60s TTL).
  3. Device signs the nonce with its device cert private key (RSA-PSS / PKCS1v15 / ECDSA all accepted).
  4. Device POSTs /join/entra/enroll with cert chain + signed nonce + WG pubkey.
  5. Server validates:
    • Cert chain + nonce signature (cryptographic proof of private-key possession).
    • Microsoft Graph lookup: device exists + accountEnabled == true; optionally complianceState == compliant via Intune.
    • Transitive group membership enumeration via Graph.
    • Mapping resolution (strict_priority or union mode, with wildcard + tenant-only fallback options).
  6. Peer is created in NetBird's DB, assigned to the resolved auto-groups + the All group, with proper IP allocation + DNS label + integrated peer validator hooks (approval workflow still applies).
  7. Server emits a PeerAddedWithEntraDevice activity event with full audit meta (device id, matched mapping ids, resolution mode, applied auto-groups).
  8. Server returns a LoginResponse-shaped JSON + a one-shot bootstrap token. The client persists state and proceeds with normal gRPC Login using the WG pubkey the server already knows about.

What's landed

Server

  • management/server/types/entra_device_auth.go — domain model (EntraDeviceAuth, EntraDeviceAuthMapping, MappingResolution).
  • management/server/integrations/entra_device/ — cert validator (RSA/ECDSA), Graph client (OAuth2 client-credentials, device lookup, transitiveMemberOf, compliance), single-use nonce store, strict_priority + union mapping resolver, gorm-backed Store, manager orchestrator, activity codes.
  • management/server/http/handlers/entra_join/ — public /join/entra/{challenge,enroll} routes.
  • management/server/http/handlers/entra_device_auth/ — admin CRUD on /api/integrations/entra-device-auth{,/mappings}.
  • management/server/entra_device_enroll.goDefaultAccountManager.EnrollEntraDevicePeer (reuses IP allocation, retries, group assignment, integrated peer validator, activity events).
  • management/server/permissions/modules/module.go — new EntraDeviceAuth permission module.
  • idp/dex/{config,provider}.go + sqlite_{cgo,nocgo}.gobonus fix: split Dex SQLite3 construction behind a CGO build tag so builds work under CGO_ENABLED=0 (was a pre-existing upstream break).

Client

  • client/internal/enroll/entradevice/ — pluggable CertProvider interface + PFX-backed implementation + challenge/enroll orchestrator + structured server-error decoding.
  • client/cmd/entra_enroll.gonetbird entra-enroll subcommand with full CLI.
  • client/internal/profilemanager/config.goEntraEnroll *EntraEnrollState field persisted per profile so re-enrolment is skipped on subsequent runs.

Test harness

  • tools/entra-test/docker-compose.yml + Dockerfile.entra-test — full local deployment (Postgres + management, auto-migrated tables).
  • tools/entra-test/enroll-tester/ — synthetic client with --demo mode (in-process handler + fake Graph) for zero-dependency E2E verification.
  • tools/entra-test/seed-account/ — creates a minimal NetBird account row for testing without an IdP.
  • tools/entra-test/make-pfx/ — generates test PFX files.
  • tools/entra-test/TESTING.md — step-by-step walkthrough.

Docs

  • docs/ENTRA_DEVICE_AUTH.md — user/admin-facing documentation: concepts, resolution semantics, error codes, REST API reference, enrolment protocol reference, security notes, live-tenant verification matrix, future work.

Testing

Unit tests (all green)

  • management/server/integrations/entra_device/20+ tests covering mapping resolution (priority, union, tie-break, revoked/expired filtering, wildcard, fallback), nonce store (single-use, TTL, concurrent), cert validator (RSA-PSS, PKCS1v15, ECDSA, tampered sig, expired, garbage), manager (happy path, union merge, unknown tenant, disabled integration, bad nonce, disabled device, missing device, fail-closed Graph errors, compliance pass/fail/API-failure, no mapping matched, device-id mismatch, nonce single-use), store (CRUD + bootstrap token lifecycle).
  • management/server/http/handlers/entra_join/4 tests with full HTTP round-trip (real cert + signed nonce, error code mapping, malformed JSON).
  • client/internal/enroll/entradevice/7 tests covering PFX load (happy, wrong password, missing file), enroller round-trip, structured server error decode, input validation, trailing /join/entra tolerance.

Live-tenant verification

Run end-to-end against a real Entra tenant using the Docker harness:

Scenario Input Expected Actual
Happy path, wildcard mapping real device, compliance off success, peer created
Happy path, specific-group mapping same real device success, peer created
Device not in mapped Entra group real device, non-matching mapping 403 no_mapping_matched
Device absent from Entra bogus device GUID 403 device_disabled
Compliance on, compliant device compliant device id success, peer created
Compliance on, non-compliant device non-compliant device id 403 device_not_compliant

Every reject path is atomic — zero rows written on any 4xx/5xx outcome. See docs/ENTRA_DEVICE_AUTH.md#live-tenant-verification-results for the full matrix.

End-to-end Phase 2 client run

Built netbird.exe from this branch; ran:

netbird entra-enroll --management-url http://localhost:33073/join/entra \
  --entra-tenant 5a7a81b2-99cc-45fc-b6d1-cd01ba176c26 \
  --entra-pfx device.pfx \
  --entra-pfx-password-env NB_ENTRA_PFX_PASSWORD

ENROLMENT SUCCESS. Peer appeared in Postgres (peers + group_peers rows), /join/entra stripped from the saved ManagementURL, EntraEnroll state persisted to the profile config file.

Explicit non-goals / follow-ups

  1. Windows cert store + TPM-backed CNG signing. Scoped, researched, deliberately deferred. CertProvider interface is shaped so it drops in next to PFXProvider without enroller changes. Two routes documented: CGO+smimesign vs pure-Go ncrypt.dll syscalls. See docs/ENTRA_DEVICE_AUTH.md#future-work.
  2. enrollmentBootstrapToken proto field on LoginRequest. Manager.ValidateBootstrapToken is implemented + tested but not yet invoked from the gRPC Login path (requires a proto regen). Post-enrolment Login currently works because the WG pubkey already identifies the peer; the bootstrap token just adds belt-and-braces for a narrow race window.
  3. Continuous revalidation (Phase 5). Reserved field revalidation_interval exists on the integration; no background scheduler yet.
  4. Auto-routing in netbird up. Today entra-enroll is a separate subcommand. A follow-up can detect /join/entra in the URL passed to up and run the enrolment automatically.
  5. Dashboard UI (Phase 4). Admin configuration happens via the REST API today. UI work in netbirdio/dashboard is a separate PR.

Compatibility + safety

  • Zero breaking changes. All new types live in new packages; the only existing file modifications are:
    • management/server/http/handler.go — adds two bypass paths (/join/entra/*) + one installEntraDeviceAuth call (best-effort — logs a warning and skips if interfaces don't match).
    • management/server/permissions/modules/module.go — adds one Module constant.
    • client/internal/profilemanager/config.go — adds one nullable EntraEnroll field.
    • idp/dex/{config,provider}.go — route SQLite3 construction through a build-tagged shim.
  • Feature-flagged by data. If no EntraDeviceAuth row exists for an account, the /join/entra endpoints simply return 404 integration_not_found. No observable behaviour change for existing deployments.
  • Server accepts CGO_ENABLED=0 builds. Everything new compiles on the standard pipeline without a C toolchain.

Branch commits

9f04a0c entra_device: address SonarCloud feedback (complexity + creds)
688239f docs: bump Entra device auth status header (Phase 2 shipped)
cb3c676 entra_device: defer Windows cert-store provider to a follow-up
d4228d8 client: netbird entra-enroll subcommand (Phase 2 complete)
d38984e client/entradevice: PFX CertProvider + Enroller + tests (Phase 2 core)
50c249d docs: record live-tenant verification matrix
9b27c0f entra-test: seed-account helper + expose Postgres port
17e718d entra-test: fix docker-compose flags + config for real bring-up
b47a05a docs: user-facing documentation for Entra device auth
783117e enroll-tester: add --demo mode for in-process end-to-end verification
e7667d5 entra_device: test harness (Dockerfile + compose + synthetic client) + dex CGO shim
8c921a7 entra_device: unit tests for enrolment flow + peer-registration integration
09c4bc2 entra_device: wire into AccountManager + HTTP router
bd3a7e4 entra_device: Phase 1 server skeleton

~6,300 insertions, 43 files. Every line committed has been either unit-tested or live-tested.

Summary by CodeRabbit

  • New Features

    • Entra/Intune device authentication: challenge/enroll flow, tenant/device enrollment, mapping resolution (strict/union), one-shot bootstrap tokens, and admin APIs for integrations and mappings.
    • CLI enrollment: new command to perform device enrollment, persist enrollment state locally, and display enrollment result (peer ID, URL, resolved groups).
  • Documentation

    • Full Entra device auth guide and end-to-end testing docs.
  • Tests & Tools

    • Extensive tests and local tooling (enroll-tester, demo server, make-pfx, seed-account, Docker Compose).

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/netbirdio/netbird/pull/5977 **Author:** [@thvevirtue](https://github.com/thvevirtue) **Created:** 4/24/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `feature/entra-device-auth` --- ### 📝 Commits (10+) - [`bd3a7e4`](https://github.com/netbirdio/netbird/commit/bd3a7e4b303d96dc17276846f2b22f9fee3fbf83) entra_device: Phase 1 server skeleton - [`09c4bc2`](https://github.com/netbirdio/netbird/commit/09c4bc2b15f709fa232fc79f8ceaf1181ce25e80) entra_device: wire into AccountManager + HTTP router - [`8c921a7`](https://github.com/netbirdio/netbird/commit/8c921a7fb73d0b04c67ea2a0ccaba298b03abd6d) entra_device: unit tests for enrolment flow + peer-registration integration - [`e7667d5`](https://github.com/netbirdio/netbird/commit/e7667d5c9654808568e91e3ad15e586c75eb6308) entra_device: test harness (Dockerfile + compose + synthetic client) + dex CGO shim - [`783117e`](https://github.com/netbirdio/netbird/commit/783117e437fb59b2b56164a8b402aee3a7e217e8) enroll-tester: add --demo mode for in-process end-to-end verification - [`b47a05a`](https://github.com/netbirdio/netbird/commit/b47a05adf24a79d7eb7e93ed4a07da0b6da7ce60) docs: user-facing documentation for Entra device auth - [`17e718d`](https://github.com/netbirdio/netbird/commit/17e718d9d4a8e4d28934cddabd0778592d3a3e8c) entra-test: fix docker-compose flags + config for real bring-up - [`9b27c0f`](https://github.com/netbirdio/netbird/commit/9b27c0f37580c7453778c3337caed193de5449bb) entra-test: seed-account helper + expose Postgres port - [`50c249d`](https://github.com/netbirdio/netbird/commit/50c249d77da6e2f2e082788a007e66559b9e39b8) docs: record live-tenant verification matrix - [`d38984e`](https://github.com/netbirdio/netbird/commit/d38984e580d916521da7252b6f7b979eae75a62d) client/entradevice: PFX CertProvider + Enroller + tests (Phase 2 core) ### 📊 Changes **53 files changed** (+7647 additions, -95 deletions) <details> <summary>View changed files</summary> ➕ `client/cmd/entra_enroll.go` (+330 -0) 📝 `client/cmd/root.go` (+1 -0) ➕ `client/internal/enroll/entradevice/enroller.go` (+256 -0) ➕ `client/internal/enroll/entradevice/enroller_test.go` (+250 -0) ➕ `client/internal/enroll/entradevice/provider.go` (+145 -0) ➕ `client/internal/enroll/entradevice/state.go` (+41 -0) 📝 `client/internal/profilemanager/config.go` (+7 -0) ➕ `client/internal/profilemanager/config_entra.go` (+19 -0) ➕ `docs/ENTRA_DEVICE_AUTH.md` (+523 -0) 📝 `go.mod` (+1 -0) 📝 `go.sum` (+2 -0) 📝 `idp/dex/config.go` (+1 -1) 📝 `idp/dex/provider.go` (+2 -4) ➕ `idp/dex/sqlite_cgo.go` (+18 -0) ➕ `idp/dex/sqlite_nocgo.go` (+20 -0) ➕ `management/Dockerfile.entra-test` (+89 -0) 📝 `management/internals/server/boot.go` (+24 -1) ➕ `management/server/entra_device_enroll.go` (+329 -0) 📝 `management/server/http/handler.go` (+181 -87) ➕ `management/server/http/handlers/entra_device_auth/e2e_test.go` (+395 -0) _...and 33 more files_ </details> ### 📄 Description # Entra / Intune Device Authentication — a third peer-registration method ## What this PR adds A new way for devices to join a NetBird network, alongside setup keys and SSO: **the device itself authenticates using an Entra-issued certificate, with zero user interaction**. Admins map Entra security groups to NetBird auto-groups; the device ends up in the right NetBird groups based on its Entra membership. The feature is served on a **dedicated endpoint path** (`/join/entra`) so it never mixes with the existing gRPC `Login`/`Sync` surface or the admin `/api` surface. ## Deployment story ``` Intune PKCS Certificate profile → PFX on device ↓ netbird entra-enroll --management-url https://<mgmt>/join/entra \ --entra-tenant YOUR_TENANT \ --entra-pfx device.pfx \ --entra-pfx-password-env NB_ENTRA_PFX_PASSWORD ↓ netbird up ← normal gRPC login, peer already registered ``` ## Design in one page 1. **Admin configures** an `EntraDeviceAuth` integration (tenant id, app credentials, compliance requirements) and `EntraDeviceAuthMapping` rows that pair Entra security group IDs with NetBird auto-groups. 2. **Device calls** `GET /join/entra/challenge` → server issues a single-use 32-byte nonce (60s TTL). 3. **Device signs** the nonce with its device cert private key (RSA-PSS / PKCS1v15 / ECDSA all accepted). 4. **Device POSTs** `/join/entra/enroll` with cert chain + signed nonce + WG pubkey. 5. **Server validates**: - Cert chain + nonce signature (cryptographic proof of private-key possession). - Microsoft Graph lookup: device exists + `accountEnabled == true`; optionally `complianceState == compliant` via Intune. - Transitive group membership enumeration via Graph. - Mapping resolution (`strict_priority` or `union` mode, with wildcard + tenant-only fallback options). 6. **Peer is created** in NetBird's DB, assigned to the resolved auto-groups + the All group, with proper IP allocation + DNS label + integrated peer validator hooks (approval workflow still applies). 7. **Server emits** a `PeerAddedWithEntraDevice` activity event with full audit meta (device id, matched mapping ids, resolution mode, applied auto-groups). 8. **Server returns** a `LoginResponse`-shaped JSON + a one-shot bootstrap token. The client persists state and proceeds with normal gRPC Login using the WG pubkey the server already knows about. ## What's landed ### Server - `management/server/types/entra_device_auth.go` — domain model (`EntraDeviceAuth`, `EntraDeviceAuthMapping`, `MappingResolution`). - `management/server/integrations/entra_device/` — cert validator (RSA/ECDSA), Graph client (OAuth2 client-credentials, device lookup, transitiveMemberOf, compliance), single-use nonce store, `strict_priority` + `union` mapping resolver, gorm-backed Store, manager orchestrator, activity codes. - `management/server/http/handlers/entra_join/` — public `/join/entra/{challenge,enroll}` routes. - `management/server/http/handlers/entra_device_auth/` — admin CRUD on `/api/integrations/entra-device-auth{,/mappings}`. - `management/server/entra_device_enroll.go` — `DefaultAccountManager.EnrollEntraDevicePeer` (reuses IP allocation, retries, group assignment, integrated peer validator, activity events). - `management/server/permissions/modules/module.go` — new `EntraDeviceAuth` permission module. - `idp/dex/{config,provider}.go` + `sqlite_{cgo,nocgo}.go` — **bonus fix**: split Dex SQLite3 construction behind a CGO build tag so builds work under `CGO_ENABLED=0` (was a pre-existing upstream break). ### Client - `client/internal/enroll/entradevice/` — pluggable `CertProvider` interface + PFX-backed implementation + challenge/enroll orchestrator + structured server-error decoding. - `client/cmd/entra_enroll.go` — `netbird entra-enroll` subcommand with full CLI. - `client/internal/profilemanager/config.go` — `EntraEnroll *EntraEnrollState` field persisted per profile so re-enrolment is skipped on subsequent runs. ### Test harness - `tools/entra-test/docker-compose.yml` + `Dockerfile.entra-test` — full local deployment (Postgres + management, auto-migrated tables). - `tools/entra-test/enroll-tester/` — synthetic client with `--demo` mode (in-process handler + fake Graph) for zero-dependency E2E verification. - `tools/entra-test/seed-account/` — creates a minimal NetBird account row for testing without an IdP. - `tools/entra-test/make-pfx/` — generates test PFX files. - `tools/entra-test/TESTING.md` — step-by-step walkthrough. ### Docs - `docs/ENTRA_DEVICE_AUTH.md` — user/admin-facing documentation: concepts, resolution semantics, error codes, REST API reference, enrolment protocol reference, security notes, live-tenant verification matrix, future work. ## Testing ### Unit tests (all green) - `management/server/integrations/entra_device/` — **20+ tests** covering mapping resolution (priority, union, tie-break, revoked/expired filtering, wildcard, fallback), nonce store (single-use, TTL, concurrent), cert validator (RSA-PSS, PKCS1v15, ECDSA, tampered sig, expired, garbage), manager (happy path, union merge, unknown tenant, disabled integration, bad nonce, disabled device, missing device, fail-closed Graph errors, compliance pass/fail/API-failure, no mapping matched, device-id mismatch, nonce single-use), store (CRUD + bootstrap token lifecycle). - `management/server/http/handlers/entra_join/` — **4 tests** with full HTTP round-trip (real cert + signed nonce, error code mapping, malformed JSON). - `client/internal/enroll/entradevice/` — **7 tests** covering PFX load (happy, wrong password, missing file), enroller round-trip, structured server error decode, input validation, trailing `/join/entra` tolerance. ### Live-tenant verification Run end-to-end against a real Entra tenant using the Docker harness: | Scenario | Input | Expected | Actual | |---|---|---|---| | Happy path, wildcard mapping | real device, compliance off | success, peer created | ✅ | | Happy path, specific-group mapping | same real device | success, peer created | ✅ | | Device not in mapped Entra group | real device, non-matching mapping | `403 no_mapping_matched` | ✅ | | Device absent from Entra | bogus device GUID | `403 device_disabled` | ✅ | | Compliance on, compliant device | compliant device id | success, peer created | ✅ | | Compliance on, non-compliant device | non-compliant device id | `403 device_not_compliant` | ✅ | Every reject path is atomic — zero rows written on any 4xx/5xx outcome. See `docs/ENTRA_DEVICE_AUTH.md#live-tenant-verification-results` for the full matrix. ### End-to-end Phase 2 client run Built `netbird.exe` from this branch; ran: ``` netbird entra-enroll --management-url http://localhost:33073/join/entra \ --entra-tenant 5a7a81b2-99cc-45fc-b6d1-cd01ba176c26 \ --entra-pfx device.pfx \ --entra-pfx-password-env NB_ENTRA_PFX_PASSWORD ``` → `ENROLMENT SUCCESS`. Peer appeared in Postgres (`peers` + `group_peers` rows), `/join/entra` stripped from the saved `ManagementURL`, `EntraEnroll` state persisted to the profile config file. ## Explicit non-goals / follow-ups 1. **Windows cert store + TPM-backed CNG signing.** Scoped, researched, deliberately deferred. `CertProvider` interface is shaped so it drops in next to `PFXProvider` without enroller changes. Two routes documented: CGO+smimesign vs pure-Go `ncrypt.dll` syscalls. See `docs/ENTRA_DEVICE_AUTH.md#future-work`. 2. **`enrollmentBootstrapToken` proto field on `LoginRequest`.** `Manager.ValidateBootstrapToken` is implemented + tested but not yet invoked from the gRPC Login path (requires a proto regen). Post-enrolment Login currently works because the WG pubkey already identifies the peer; the bootstrap token just adds belt-and-braces for a narrow race window. 3. **Continuous revalidation (Phase 5).** Reserved field `revalidation_interval` exists on the integration; no background scheduler yet. 4. **Auto-routing in `netbird up`.** Today `entra-enroll` is a separate subcommand. A follow-up can detect `/join/entra` in the URL passed to `up` and run the enrolment automatically. 5. **Dashboard UI (Phase 4).** Admin configuration happens via the REST API today. UI work in `netbirdio/dashboard` is a separate PR. ## Compatibility + safety - **Zero breaking changes.** All new types live in new packages; the only existing file modifications are: - `management/server/http/handler.go` — adds two bypass paths (`/join/entra/*`) + one `installEntraDeviceAuth` call (best-effort — logs a warning and skips if interfaces don't match). - `management/server/permissions/modules/module.go` — adds one `Module` constant. - `client/internal/profilemanager/config.go` — adds one nullable `EntraEnroll` field. - `idp/dex/{config,provider}.go` — route SQLite3 construction through a build-tagged shim. - **Feature-flagged by data.** If no `EntraDeviceAuth` row exists for an account, the `/join/entra` endpoints simply return `404 integration_not_found`. No observable behaviour change for existing deployments. - **Server accepts CGO_ENABLED=0 builds.** Everything new compiles on the standard pipeline without a C toolchain. ## Branch commits ``` 9f04a0c entra_device: address SonarCloud feedback (complexity + creds) 688239f docs: bump Entra device auth status header (Phase 2 shipped) cb3c676 entra_device: defer Windows cert-store provider to a follow-up d4228d8 client: netbird entra-enroll subcommand (Phase 2 complete) d38984e client/entradevice: PFX CertProvider + Enroller + tests (Phase 2 core) 50c249d docs: record live-tenant verification matrix 9b27c0f entra-test: seed-account helper + expose Postgres port 17e718d entra-test: fix docker-compose flags + config for real bring-up b47a05a docs: user-facing documentation for Entra device auth 783117e enroll-tester: add --demo mode for in-process end-to-end verification e7667d5 entra_device: test harness (Dockerfile + compose + synthetic client) + dex CGO shim 8c921a7 entra_device: unit tests for enrolment flow + peer-registration integration 09c4bc2 entra_device: wire into AccountManager + HTTP router bd3a7e4 entra_device: Phase 1 server skeleton ``` ~6,300 insertions, 43 files. Every line committed has been either unit-tested or live-tested. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Entra/Intune device authentication: challenge/enroll flow, tenant/device enrollment, mapping resolution (strict/union), one-shot bootstrap tokens, and admin APIs for integrations and mappings. * CLI enrollment: new command to perform device enrollment, persist enrollment state locally, and display enrollment result (peer ID, URL, resolved groups). * **Documentation** * Full Entra device auth guide and end-to-end testing docs. * **Tests & Tools** * Extensive tests and local tooling (enroll-tester, demo server, make-pfx, seed-account, Docker Compose). <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
saavagebueno added the pull-request label 2026-08-05 07:08:25 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#27240