<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Device Trust on Matt Goodrich</title><link>https://mattgoodrich.com/tags/device-trust/</link><description>Recent content in Device Trust on Matt Goodrich</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 23 Jun 2026 00:01:00 -0700</lastBuildDate><atom:link href="https://mattgoodrich.com/tags/device-trust/index.xml" rel="self" type="application/rss+xml"/><item><title>Trust the User, Then Trust the Machine</title><link>https://mattgoodrich.com/posts/trust-the-user-then-the-machine/</link><pubDate>Tue, 23 Jun 2026 00:01:00 -0700</pubDate><guid>https://mattgoodrich.com/posts/trust-the-user-then-the-machine/</guid><description>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/header.png" alt="Featured image of post Trust the User, Then Trust the Machine" />&lt;p>You can prove exactly who is making a request and still have no idea what they are making it from. A user signs in with a phishing-resistant passkey, the strongest factor you can give them, and the login is genuinely theirs. It tells you nothing about whether the laptop behind that login is a managed, encrypted, patched company machine or a personal one riddled with malware, or a contractor&amp;rsquo;s box you have never seen. The user factor answers one question. The machine asking the question is a second one, and most access decisions never ask it.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-two-part-decision.png"
width="1568"
height="412"
srcset="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-two-part-decision_hu15305861362717841582.png 480w, https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-two-part-decision_hu6106679044027997071.png 1024w"
loading="lazy"
alt="A Serious Access Decision Needs Both Answers: the User Factor Proves Who Is Making the Request and the Device Check Proves the Machines Identity and Live Posture; Access Is Granted Only When Both Pass, and Denied or Stepped Up Otherwise"
class="gallery-image"
data-flex-grow="380"
data-flex-basis="913px"
>&lt;/p>
&lt;p>Device-based authentication is how you ask it. The request carries proof of the machine as well as the person: a certificate that says this is a device you issued, and a set of signals that say the device is healthy right now. Used as an enterprise control, it is the second half of &amp;ldquo;verify the request,&amp;rdquo; and the half most programs skip because the user half is the one with all the marketing behind it.&lt;/p>
&lt;h2 id="what-the-user-factor-cant-see">What the User Factor Can&amp;rsquo;t See
&lt;/h2>&lt;p>Even a perfect user factor has a blind spot the size of the endpoint. &lt;a class="link" href="https://mattgoodrich.com/posts/mfa-that-survives-phishing/" >Phishing-resistant authentication&lt;/a> stops an attacker from logging in as your user from the attacker&amp;rsquo;s own machine. It does nothing about an attacker operating &lt;em>on&lt;/em> your user&amp;rsquo;s machine. Malware on a legitimate, signed-in laptop rides the user&amp;rsquo;s valid session. Stolen session cookies replay from anywhere with no second login at all. A developer&amp;rsquo;s personal laptop with no disk encryption and a three-year-old OS authenticates exactly as cleanly as the hardened fleet machine next to it, because the user behind both is the same trusted person.&lt;/p>
&lt;p>The pattern underneath all three is the same. User identity tells you whose request it is. It is silent on the trustworthiness of the thing the request came from. The device factor exists to make that thing speak for itself.&lt;/p>
&lt;h2 id="device-identity-vs-device-posture">Device Identity vs Device Posture
&lt;/h2>&lt;p>This is the distinction the whole topic turns on, and the one most &amp;ldquo;device trust&amp;rdquo; pitches blur. A device makes two separate claims, and you need both.&lt;/p>
&lt;p>&lt;strong>Device identity&lt;/strong> is the claim &amp;ldquo;I am a machine you know.&amp;rdquo; It is answered by a certificate the device holds, issued by you, proving this specific endpoint is one you enrolled. It is binary and durable: the machine either presents a valid, non-revoked certificate or it does not.&lt;/p>
&lt;p>&lt;strong>Device posture&lt;/strong> is the claim &amp;ldquo;I am a machine in good shape right now.&amp;rdquo; It is answered by live signals: disk encryption on, OS patched to a current level, screen lock enforced, EDR agent running, firewall up. It is graded and perishable. A device that was compliant this morning can fail posture this afternoon when someone disables FileVault.&lt;/p>
&lt;p>A certificate proves identity and says nothing about health. Posture proves health and says nothing about identity, because an attacker&amp;rsquo;s fully-patched, encrypted laptop has excellent posture and no business on your network. The control you actually want is both at once: this is one of our machines, &lt;em>and&lt;/em> it is healthy at the moment it is asking. Conflating the two is how you end up trusting a well-maintained device you do not own, or a genuinely-yours device that has quietly rotted.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>Device identity&lt;/th>
&lt;th>Device posture&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>The claim&lt;/td>
&lt;td>&amp;ldquo;I am a machine you enrolled&amp;rdquo;&lt;/td>
&lt;td>&amp;ldquo;I am a healthy machine right now&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Proven by&lt;/td>
&lt;td>A hardware-bound X.509 certificate&lt;/td>
&lt;td>Live signals from MDM and EDR&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Nature&lt;/td>
&lt;td>Binary and durable&lt;/td>
&lt;td>Graded and perishable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Fails when&lt;/td>
&lt;td>The cert is revoked, expired, or absent&lt;/td>
&lt;td>Encryption off, OS stale, EDR killed&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>The claim alone gives you&lt;/td>
&lt;td>A known machine that may be unhealthy&lt;/td>
&lt;td>A healthy machine that may be a stranger&amp;rsquo;s&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="a-certificate-is-only-as-good-as-where-its-key-lives">A Certificate Is Only as Good as Where Its Key Lives
&lt;/h2>&lt;p>Device identity rests entirely on the certificate being hard to copy, and that is where most implementations are weaker than they look.&lt;/p>
&lt;p>A device certificate is an X.509 cert with a private key, usually pushed to managed devices through your MDM with &lt;a class="link" href="https://learn.microsoft.com/en-us/mem/intune/protect/certificates-scep-configure" target="_blank" rel="noopener"
>SCEP or a similar enrollment protocol&lt;/a>. The question that decides whether it is a real control is where that private key sits. A &lt;strong>soft certificate&lt;/strong> lives in the OS user or machine keystore as exportable key material. It is convenient, and it is copyable: malware running on the device, or a user who wants to, can export the key and present your &amp;ldquo;device identity&amp;rdquo; from a completely different machine. You have authenticated a file, not a device.&lt;/p>
&lt;p>A &lt;strong>hardware-bound certificate&lt;/strong> generates and stores its private key in the device&amp;rsquo;s secure hardware, the TPM on a Windows or Linux machine, the Secure Enclave on a Mac, and marks it non-exportable. The key never leaves the chip; signing happens inside it. Now the certificate is bound to one physical machine, and presenting that device identity requires possession of that machine rather than a copied file. This is the same principle that separates a &lt;a class="link" href="https://mattgoodrich.com/posts/mfa-that-survives-phishing/" >synced passkey from a device-bound hardware key&lt;/a>: the security is in where the private key physically lives. Apple&amp;rsquo;s Secure Enclave and managed device attestation, and the equivalent TPM attestation on Windows, let you go one step further and verify at enrollment that the key really is hardware-protected before you trust the cert at all.&lt;/p>
&lt;p>For the highest-assurance paths, the device certificate does real work in &lt;a class="link" href="https://cloud.google.com/beyondcorp" target="_blank" rel="noopener"
>mutual TLS&lt;/a>: the client and the server both present certs, and the connection only completes if the device&amp;rsquo;s hardware-bound cert checks out. That is how you gate an admin plane or a service-to-service call on the machine itself, so a valid user on an unrecognized box cannot complete the connection at all.&lt;/p>
&lt;p>Whatever you issue, plan for its lifecycle on day one: device certs should be short-lived and auto-renewed, with a working revocation path through CRL or OCSP, so a lost or decommissioned machine loses its identity fast instead of holding a valid cert for a year. &lt;a class="link" href="https://smallstep.com/" target="_blank" rel="noopener"
>step-ca&lt;/a>, Smallstep&amp;rsquo;s open-source certificate authority, is a practical way to issue and rotate these device certs without standing up a commercial PKI.&lt;/p>
&lt;h2 id="posture-is-a-live-signal-not-a-stamp">Posture Is a Live Signal, Not a Stamp
&lt;/h2>&lt;p>The most common posture mistake is checking it once. A device passes an enrollment check, gets marked compliant, and that verdict sticks while the machine drifts: encryption gets turned off, the OS falls behind, the EDR agent is killed. A posture stamp from three weeks ago only tells you the machine was healthy three weeks ago. It says nothing about now.&lt;/p>
&lt;p>Real device posture is evaluated at access time and re-evaluated continuously. The signal usually comes from your MDM and EDR, which report a compliance state per device, and your IdP consumes it. If you are not buying that signal, open-source &lt;a class="link" href="https://www.osquery.io/" target="_blank" rel="noopener"
>osquery&lt;/a> with &lt;a class="link" href="https://fleetdm.com/" target="_blank" rel="noopener"
>Fleet&lt;/a> can collect posture across the fleet, and &lt;a class="link" href="https://wazuh.com/" target="_blank" rel="noopener"
>Wazuh&lt;/a> covers the EDR-style telemetry. In practice that is a &lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-conditional-access-grant#require-device-to-be-marked-as-compliant" target="_blank" rel="noopener"
>conditional access policy that requires a compliant or managed device&lt;/a>: the user authenticates, the policy checks the device&amp;rsquo;s current compliance signal, and access is granted, stepped up, or blocked based on the machine&amp;rsquo;s state at that moment. Google&amp;rsquo;s &lt;a class="link" href="https://cloud.google.com/beyondcorp" target="_blank" rel="noopener"
>BeyondCorp&lt;/a> model is the same idea taken to its conclusion: every request is evaluated against device and user context, and there is no trusted network to hide a bad device inside.&lt;/p>
&lt;p>Concretely, a policy for a managed laptop reaching a sensitive app might require, all evaluated live at sign-in: a valid hardware-bound device certificate, disk encryption on through FileVault or BitLocker, the OS within one major version and 30 days of patches, a screen lock at five minutes or less, and an EDR agent that has checked in within the last 24 hours. The certificate is the hard gate, miss it and you are blocked. The patch window is soft, miss it and you are allowed through but pushed straight into remediation. Wiring those signals up is the actual work, and it is why device posture is a program rather than a setting.&lt;/p>
&lt;p>The grading matters as much as the gate. Posture does not have to be pass or fail. A fully compliant managed laptop reaches everything its user is entitled to; a managed laptop that is healthy except for a pending OS update reaches most things but gets pushed to remediate; an unknown device is held at the door or routed to a constrained path. The point is that the device&amp;rsquo;s &lt;em>current&lt;/em> state, not its enrollment history, decides what it reaches.&lt;/p>
&lt;h2 id="the-login-page-cant-read-the-machine">The Login Page Can&amp;rsquo;t Read the Machine
&lt;/h2>&lt;p>The identity half of this works the way you would expect: the browser presents a client certificate during the TLS handshake, or the platform presents a device-bound key like a &lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/devices/concept-primary-refresh-token" target="_blank" rel="noopener"
>Primary Refresh Token&lt;/a> held in the TPM, and the IdP verifies it live at the instant of sign-in. The proof is produced on the spot, so it is genuinely real-time.&lt;/p>
&lt;p>Posture cannot work that way, and it is worth being precise about why. A login page is sandboxed. JavaScript in a browser tab has no way to ask the operating system whether FileVault is on, what build the kernel is, or whether the EDR agent is still alive. Anything that reads those facts has to run outside the browser, with real access to the machine. So the posture signal never comes from the page inspecting the device at login. It is gathered ahead of time, or by a separate local process, and then joined to the device identity the certificate just proved. Two patterns do that joining, and they trade freshness against effort.&lt;/p>
&lt;p>&lt;strong>The directory lookup, which most enterprises run.&lt;/strong> The device is enrolled in MDM, and an agent already on it, Intune or Jamf or Kandji alongside your EDR, evaluates posture on its own schedule and reports a verdict to the MDM service. The MDM writes a &lt;code>compliant: true / false&lt;/code> flag onto the device object in the directory. At login, the &lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-conditional-access-grant#require-device-to-be-marked-as-compliant" target="_blank" rel="noopener"
>conditional access policy&lt;/a> does not interrogate the device about its health at all. It reads that stored flag on the device object, keyed to the identity the certificate proved. The cost is freshness: the flag is only as current as the last MDM check-in, which is measured in hours, so &amp;ldquo;this device is compliant&amp;rdquo; really means &amp;ldquo;it was compliant the last time it phoned home.&amp;rdquo; That is fine for most access, and it is the reason the second pattern exists for the access where hours of staleness is too much.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-directory.png"
width="1002"
height="2056"
srcset="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-directory_hu14903496761150495247.png 480w, https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-directory_hu6525814957587200737.png 1024w"
loading="lazy"
alt="The directory-lookup path: an MDM and EDR agent on the device evaluates posture on its own schedule and writes a compliant true-or-false verdict onto the device object in the directory. At login the browser presents the device certificate or bound key, which the IdP verifies live to prove identity, while the IdP separately looks up that previously stored compliance verdict, only as fresh as the last check-in, and decides allow or block"
class="gallery-image"
data-flex-grow="48"
data-flex-basis="116px"
>&lt;/p>
&lt;p>&lt;strong>The local agent, when you want the read at login time.&lt;/strong> Here you install a small native agent that the sign-in flow can reach, precisely because the browser cannot reach the OS itself. The browser talks to the agent instead, through one of three handoffs: a browser extension wired to a &lt;a class="link" href="https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging" target="_blank" rel="noopener"
>native messaging host&lt;/a> that launches a local binary, a loopback call to an agent listening on &lt;code>127.0.0.1&lt;/code>, or a custom URL scheme (&lt;code>okta-verify://&lt;/code>, the company-portal app) that wakes a native helper. The agent reads posture right then, signs the result with the device key so it cannot be forged or replayed from another machine, and returns it to the IdP as part of the login. This is the live read, and it is how tools like &lt;a class="link" href="https://www.1password.com/product/device-trust" target="_blank" rel="noopener"
>1Password&amp;rsquo;s Device Trust&lt;/a> (formerly Kolide), Okta Verify, and Google&amp;rsquo;s Endpoint Verification check a machine the browser is locked out of.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-agent.png"
width="1568"
height="1476"
srcset="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-agent_hu13793755647789725322.png 480w, https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-posture-agent_hu15170203365077177305.png 1024w"
loading="lazy"
alt="The local-agent path: at login the browser presents the device certificate or bound key, which the IdP verifies live to prove identity. Because the browser cannot read the operating system, the IdP hands off to a local native agent through native messaging, a 127.0.0.1 loopback, or a URL scheme; the agent reads posture at that moment, signs it with the device key, and returns the signed result as part of the login, and the IdP allows or blocks based on whether the device is healthy and the signature is valid"
class="gallery-image"
data-flex-grow="106"
data-flex-basis="254px"
>&lt;/p>
&lt;p>The hardware platforms add a third source for a narrow set of facts: &lt;a class="link" href="https://support.apple.com/guide/deployment/managed-device-attestation-dep28afbde6a/web" target="_blank" rel="noopener"
>Apple&amp;rsquo;s Managed Device Attestation&lt;/a> and Android &lt;a class="link" href="https://developer.android.com/google/play/integrity" target="_blank" rel="noopener"
>Play Integrity&lt;/a> can fold a signed claim into the login that the device is genuine, managed, and not jailbroken. Those are strong and hard to spoof, but they cover the durable facts, not the perishable ones. A patch three weeks behind or an EDR agent killed at lunch still rides in from MDM and EDR. The signed attestation tells you the machine is real; the compliance verdict tells you it is healthy. The certificate proves who the machine is, live, and a courier, either the directory or a local agent, carries the posture the browser was never allowed to read.&lt;/p>
&lt;h2 id="build-it-at-the-choke-point">Build It at the Choke Point
&lt;/h2>&lt;p>As an enterprise control, device authentication goes in at the same choke points as the rest of your access, in the same blast-radius order the zero-trust sequence uses for everything else.&lt;/p>
&lt;p>Start by giving managed devices a real identity: enroll them in MDM, issue hardware-bound certificates, and register them in the IdP so &amp;ldquo;managed device&amp;rdquo; is a fact the access layer can check. Then put a device condition in front of the systems whose compromise would hurt most, the production consoles, the financial systems, the IdP admin itself, requiring a managed, compliant device to reach them while you leave lower-risk apps alone. Use &lt;a class="link" href="https://learn.microsoft.com/en-us/entra/identity/authentication/concept-certificate-based-authentication" target="_blank" rel="noopener"
>certificate-based authentication&lt;/a> or mTLS where you want the machine proven cryptographically, and the MDM compliance signal where you want the machine&amp;rsquo;s health checked. For SaaS that sits outside your network entirely, browser-level device trust tools like &lt;a class="link" href="https://www.1password.com/product/device-trust" target="_blank" rel="noopener"
>1Password&amp;rsquo;s Device Trust&lt;/a> (formerly Kolide) can block authentication from a device that fails posture, which is often the most practical way to extend the control to apps you do not host.&lt;/p>
&lt;p>The shape is the same every time: the user proves who they are, the device proves what it is and how healthy it is, and the policy at the choke point reads both before it decides.&lt;/p>
&lt;p>The reason this is additive rather than a rebuild is that all three of those attach to a login flow you already run, without touching the applications themselves. A conditional access policy is a rule on the IdP, so once a device is registered through MDM enrollment, every app already behind your single sign-on inherits the device check with no code change. Certificate-based authentication and mTLS add a client-certificate requirement to the existing TLS handshake, so the connection simply fails when the hardware-bound cert is absent. And a browser device-trust agent sits inside the OIDC or SAML redirect the app already uses, blocking the round trip when posture fails, which is how you cover SaaS that has never heard of your devices. You are not rewriting how anyone logs in. You are adding a second question to the moment they already do.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-login-flow.png"
width="1568"
height="512"
srcset="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-login-flow_hu6921746269626023282.png 480w, https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-login-flow_hu6694746992147319131.png 1024w"
loading="lazy"
alt="Device Trust in the Login Flow: After the User Signs In, Conditional Access at the IdP Checks the Device, and Either Allows a Managed and Compliant Machine, Allows but Pushes a Healthy-but-Slightly-Behind Machine to Remediate, or Blocks an Unmanaged or Non-Compliant One or Routes It to a Constrained Path Like VDI or a Managed Browser"
class="gallery-image"
data-flex-grow="306"
data-flex-basis="735px"
>&lt;/p>
&lt;h2 id="the-unmanaged-device-is-the-whole-problem">The Unmanaged Device Is the Whole Problem
&lt;/h2>&lt;p>Here is where device authentication argues with itself, and the part worth being honest about. The clean version, every device is enrolled, every cert is hardware-bound, every endpoint reports posture, describes a fleet that does not fully exist in any real company. The contractor on their own laptop, the developer who needs to check something from a personal machine, the vendor&amp;rsquo;s engineer, the phone that is genuinely personal: these are not edge cases you can wave off. They are a standing share of who needs access, and a hard &amp;ldquo;managed devices only&amp;rdquo; rule does not make them go away. It makes them find a path you cannot see, which is worse than the problem you were solving.&lt;/p>
&lt;p>So the realistic control is scoped, not absolute. Require managed, healthy devices for the high-value systems where the assurance is worth the friction, and offer the unmanaged population a path that does not require enrolling their personal hardware: a virtual desktop or a managed browser that keeps company data off the endpoint, mobile application management that containers the corporate apps without claiming the whole phone, or a constrained, read-mostly tier of access at a lower assurance level. The goal is to match the device requirement to the sensitivity of what is being reached, and to give the people you cannot hand a managed laptop a real way in, rather than pretending they will not need one.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-access-gates.png"
width="1568"
height="1212"
srcset="https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-access-gates_hu16293672844773561439.png 480w, https://mattgoodrich.com/posts/trust-the-user-then-the-machine/diagram-access-gates_hu8450597830411907614.png 1024w"
loading="lazy"
alt="The access gates for a device, read top to bottom: identity is proven first, then the targets sensitivity decides the path. Crown-jewel, admin, and production targets require a managed, compliant device or are blocked and routed to a managed endpoint or VDI. Everyday apps branch on whether the device is managed: a managed, compliant device gets full access, a managed device a patch behind is allowed but pushed to remediate, and an unmanaged device must clear a minimum posture bar of encryption, a current OS, and a screen lock to reach a constrained path through a managed browser, MAM, or VDI that keeps data off the device, or it is blocked"
class="gallery-image"
data-flex-grow="129"
data-flex-basis="310px"
>&lt;/p>
&lt;p>There is a cost ceiling here too. MDM and EDR coverage is never total, certificate lifecycle is real operational work, and some machines, old Linux boxes, lab equipment, appliances, will never carry a hardware-bound cert or report posture cleanly. Those get the same treatment as every other long tail in this series: an inventory, a compensating control, and a place on the list to retire, named out loud instead of quietly assumed into your coverage.&lt;/p>
&lt;h2 id="verify-the-person-then-the-machine">Verify the Person, Then the Machine
&lt;/h2>&lt;p>User authentication and device authentication answer different questions, and a serious access decision needs both answered. Who is this, proven with a phishing-resistant factor. And what are they on, proven with a hardware-bound certificate for identity and a live posture signal for health. Skip the second question and a trusted user on a compromised machine looks identical to a trusted user on a clean one, right up until it does not.&lt;/p>
&lt;p>Verify the person, then verify the machine they brought. The access decision needs both answers, and only one of them is about the user.&lt;/p></description></item></channel></rss>