<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Authentication Archives - Jens Du Four</title>
	<atom:link href="https://jensdufour.be/tag/authentication/feed/" rel="self" type="application/rss+xml" />
	<link>https://jensdufour.be/tag/authentication/</link>
	<description>Connecting you to the cloud, one endpoint at a time!</description>
	<lastBuildDate>Fri, 13 Mar 2026 14:17:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</title>
		<link>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/</link>
					<comments>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Sat, 31 Jan 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AuthD]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Entra ID]]></category>
		<category><![CDATA[Intune]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://jensdufour.be/2026/02/04/entra-id-authentication-with-authd/</guid>

					<description><![CDATA[<p>Configure Entra ID authentication with AuthD on Ubuntu 24.04. Covers app registration, broker setup, MFA support, and offline caching.</p>
<p>The post <a href="https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/">Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Update (March 2026):</strong> With Ubuntu 26.04 LTS, AuthD is now included in the official Ubuntu archive (universe) and no longer requires a PPA. The instructions in this guide target Ubuntu 24.04 LTS, where the PPA is still required. If you are running Ubuntu 26.04 LTS, you can skip the PPA step and install AuthD directly with <code>sudo apt install authd</code>. Additionally, a generic OIDC broker is now available for integration with any standards-compliant identity provider. For full details, see the <a href="https://discourse.ubuntu.com/t/authd-enters-the-ubuntu-archive-in-26-04-lts/78193">official announcement</a>.</p>
</blockquote>



<h2 class="wp-block-heading">Introduction to Entra ID Authentication</h2>



<p class="wp-block-paragraph">This guide replaces the legacy PAM-based Entra ID authentication method for older Ubuntu versions.</p>



<p class="wp-block-paragraph"><strong>Entra ID authentication</strong> using AuthD represents a significant shift in how enterprises manage Linux workstation identity. As organizations adopt Ubuntu for development, data science, and productivity workloads, the need for cloud-native authentication becomes critical. AuthD provides the solution, enabling users to log in to Ubuntu with their Microsoft Entra ID credentials.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a359f9d15ae1&quot;}" data-wp-interactive="core/image" data-wp-key="6a359f9d15ae1" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><em>Figure 1: Ubuntu 24.04 LTS with GDM showing Microsoft Entra ID login option</em></p>



<p class="wp-block-paragraph">Traditional approaches like LDAP, Kerberos, or SSSD configurations require significant infrastructure and expertise. Furthermore, they complicate the user experience with separate credentials. For organizations invested in Microsoft Entra ID (formerly Azure AD), the question becomes: can we provide the same seamless, secure <strong>Entra ID authentication</strong> experience that users expect on Windows?</p>



<p class="wp-block-paragraph">The answer is <strong>yes</strong>, thanks to <strong>AuthD</strong> (Ubuntu&#8217;s authentication daemon). With AuthD, you can achieve:</p>



<ul class="wp-block-list">

<li><strong>Single Sign-On</strong> with Entra ID credentials on Ubuntu desktops</li>


<li><strong>Multi-Factor Authentication (MFA)</strong> using Microsoft Authenticator</li>


<li><strong>Device code flow</strong> authentication at the login screen</li>


<li><strong>Elimination of local accounts</strong> for enhanced security</li>


<li><strong>Offline credential caching</strong> for disconnected scenarios</li>

</ul>



<p class="wp-block-paragraph">In this guide, you’ll learn how to:</p>



<ul class="wp-block-list">

<li>Configure Azure app registration for AuthD</li>


<li>Install and configure AuthD on Ubuntu 24.04 LTS</li>


<li>Disable local account login while maintaining recovery access</li>


<li>Troubleshoot common authentication issues</li>

</ul>



<p class="wp-block-paragraph">Whether you’re securing a handful of Linux workstations or planning an enterprise-wide rollout, this guide provides everything you need for <strong>Entra ID authentication</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Note:</strong> This guide focuses on <strong>manual</strong> AuthD configuration. For device management with Microsoft Intune, see our companion article on <a href="https://jensdufour.be/2026/01/02/enrolling-ubuntu-intune-device-management/">Enrolling Ubuntu 24.04 LTS in Microsoft Intune</a>. For a fully <strong>automated zero-touch deployment</strong> using autoinstall and cloud-init, see <a href="https://jensdufour.be/2026/01/02/zero-touch-ubuntu-entra-id-autoinstall/">Automating Ubuntu Entra ID Authentication</a>.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Understanding Entra ID Authentication Components</h2>



<p class="wp-block-paragraph">Before configuring <strong>Entra ID authentication</strong>, it’s essential to understand the technologies that make this solution work.</p>



<h3 class="wp-block-heading">AuthD: The Core of Entra ID Authentication</h3>



<p class="wp-block-paragraph"><a href="https://github.com/canonical/authd">AuthD</a> is Ubuntu&#8217;s modern authentication daemon designed specifically for cloud identity providers. Unlike traditional solutions that require domain controllers or complex LDAP configurations, AuthD provides a streamlined approach to cloud authentication.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a359f9d15fa5&quot;}" data-wp-interactive="core/image" data-wp-key="6a359f9d15fa5" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" alt="AuthD architecture with MS Entra ID broker integration" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><em>Figure 2: AuthD architecture with MS Entra ID broker integration</em></p>



<p class="wp-block-paragraph"><strong>Key Features:</strong></p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Feature</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Modular Architecture</strong></td>
<td>Uses “brokers” to interface with different identity providers</td>
</tr>
<tr>
<td><strong>Cloud-Native</strong></td>
<td>Designed for MS Entra ID and Google IAM from the ground up</td>
</tr>
<tr>
<td><strong>MFA Support</strong></td>
<td>Built-in support for device authentication flow</td>
</tr>
<tr>
<td><strong>Offline Caching</strong></td>
<td>Allows cached credentials for offline login</td>
</tr>
<tr>
<td><strong>GDM Integration</strong></td>
<td>Native integration with GNOME Display Manager</td>
</tr>
<tr>
<td><strong>SSH Support</strong></td>
<td>PAM module for SSH authentication</td>
</tr>
</tbody>
</table></figure>



<p class="wp-block-paragraph">AuthD consists of two main components:</p>



<ol class="wp-block-list">

<li><strong>authd</strong>: The core authentication daemon (Debian package) that handles PAM integration</li>


<li><strong>Identity broker</strong>: A Snap package that interfaces with your identity provider (e.g., <code>authd-msentraid</code> for Microsoft Entra ID)</li>

</ol>



<p class="wp-block-paragraph">Together, these components enable secure <strong>Entra ID authentication</strong> with minimal configuration overhead.</p>



<h3 class="wp-block-heading">Microsoft Entra ID as the Identity Provider</h3>



<p class="wp-block-paragraph">Microsoft Entra ID serves as the identity provider for <strong>Entra ID authentication</strong>. Key capabilities include:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Capability</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Centralized Identity</strong></td>
<td>Single source of truth for user identities</td>
</tr>
<tr>
<td><strong>Multi-Factor Authentication</strong></td>
<td>Device code flow with Microsoft Authenticator</td>
</tr>
<tr>
<td><strong>Conditional Access</strong></td>
<td>Risk-based access decisions (when combined with Intune)</td>
</tr>
<tr>
<td><strong>Group-Based Access</strong></td>
<td>Control who can log into Linux devices</td>
</tr>
<tr>
<td><strong>Security Monitoring</strong></td>
<td>Sign-in logs and risk detection</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Architecture Overview</h3>



<p class="wp-block-paragraph">The following diagram shows how <strong>Entra ID authentication</strong> works:</p>



<pre class="wp-block-code"><code>┌─────────────────────────────────────────────────────────────────────┐
│                         Ubuntu 24.04 LTS                            │
│                                                                     │
│  ┌──────────┐    ┌──────────┐    ┌──────────────────────────────┐   │
│  │   GDM    │───&#x25b6;│  AuthD   │───&#x25b6;│  MS Entra ID Broker (Snap)  │   │
│  │ (Login)  │    │ (daemon) │    │  (authd-msentraid)           │   │
│  └──────────┘    └──────────┘    └──────────────────────────────┘   │
│       │               │                      │                      │
│       │               │                      │                      │
│  ┌────▼───────────────▼──────┐               │                      │
│  │      PAM Configuration    │               │                      │
│  │   (Pluggable Auth Module) │               │                      │
│  └───────────────────────────┘               │                      │
│                                              │                      │
└──────────────────────────────────────────────│──────────────────────┘
                                               │
                                               ▼
                         ┌────────────────────────────────────────────┐
                         │           Microsoft Entra ID               │
                         │      (Authentication &amp; Authorization)      │
                         └────────────────────────────────────────────┘
</code></pre>



<p class="wp-block-paragraph">The <strong>Entra ID authentication</strong> flow works as follows:</p>



<ol class="wp-block-list">

<li>First, the user attempts login at GDM (GNOME Display Manager)</li>


<li>Then, GDM invokes AuthD through PAM to handle authentication</li>


<li>Next, AuthD delegates to the MS Entra ID broker</li>


<li>Subsequently, the broker initiates authentication flow with Entra ID</li>


<li>Upon success, AuthD creates or updates the local user account</li>


<li>Finally, the user is logged in to the desktop</li>

</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Prerequisites for Entra ID Authentication</h2>



<p class="wp-block-paragraph">Before implementing <strong>Entra ID authentication</strong>, ensure all prerequisites are met.</p>



<h3 class="wp-block-heading">Licensing Requirements</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>License</th>
<th>Purpose</th>
<th>Required</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Microsoft Entra ID Free</strong></td>
<td>Basic authentication</td>
<td>Minimum</td>
</tr>
<tr>
<td><strong>Microsoft Entra ID P1</strong></td>
<td>Conditional Access (with Intune)</td>
<td>Recommended</td>
</tr>
<tr>
<td><strong>Microsoft 365 E3/E5</strong></td>
<td>Includes Entra ID P1</td>
<td>Alternative</td>
</tr>
</tbody>
</table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Note:</strong> AuthD itself is free. Licensing requirements depend on features you want to use in Entra ID.</p>
</blockquote>



<h3 class="wp-block-heading">Technical Prerequisites</h3>



<p class="wp-block-paragraph"><strong>Ubuntu System:</strong></p>



<ul class="wp-block-list">

<li>Ubuntu Desktop 24.04 LTS (fresh install recommended)</li>


<li>GNOME desktop environment (included by default)</li>


<li>amd64 or arm64 architecture</li>


<li>Network connectivity to Microsoft services</li>


<li>Local administrator account for initial setup</li>

</ul>



<p class="wp-block-paragraph"><strong>Azure Requirements:</strong></p>



<ul class="wp-block-list">

<li>Global Administrator or Application Administrator role</li>


<li>Permission to create app registrations in Entra ID</li>

</ul>



<h3 class="wp-block-heading">Network Requirements</h3>



<p class="wp-block-paragraph">Ensure the following endpoints are accessible:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Endpoint</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>login.microsoftonline.com</code></td>
<td>Entra ID authentication</td>
</tr>
<tr>
<td><code>graph.microsoft.com</code></td>
<td>Microsoft Graph API</td>
</tr>
<tr>
<td><code>microsoft.com/devicelogin</code></td>
<td>Device code flow</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Security Considerations</h3>



<p class="wp-block-paragraph">Before disabling local accounts, plan for:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Consideration</th>
<th>Recommendation</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Recovery Access</strong></td>
<td>Document single-user mode recovery procedure</td>
</tr>
<tr>
<td><strong>Break-Glass Account</strong></td>
<td>Create an emergency admin account in Entra ID</td>
</tr>
<tr>
<td><strong>Disk Encryption</strong></td>
<td>Use LUKS, store recovery key securely</td>
</tr>
<tr>
<td><strong>Network Dependency</strong></td>
<td>Plan for offline login scenarios (cached credentials)</td>
</tr>
<tr>
<td><strong>Rollback Plan</strong></td>
<td>Keep local admin access until fully validated</td>
</tr>
</tbody>
</table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Azure Configuration for Entra ID Authentication</h2>



<p class="wp-block-paragraph">To enable <strong>Entra ID authentication</strong>, you must first create an app registration in Azure.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a359f9d16810&quot;}" data-wp-interactive="core/image" data-wp-key="6a359f9d16810" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Azure Portal app registration for AuthD" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><em>Figure 3: Azure Portal showing app registration configuration for AuthD</em></p>



<h3 class="wp-block-heading">Step 1: Create App Registration</h3>



<ol class="wp-block-list">

<li><strong>Navigate to Azure Portal</strong>

<ul class="wp-block-list">

<li>Go to <a href="https://portal.azure.com/">portal.azure.com</a></li>


<li>Select <strong>Microsoft Entra ID</strong> &gt; <strong>App registrations</strong> &gt; <strong>New registration</strong></li>

</ul>


</li>


<li><strong>Register the Application</strong>

<ul class="wp-block-list">

<li><strong>Name:</strong> <code>Ubuntu-Device-Auth</code></li>


<li><strong>Supported account types</strong>: Accounts in this organizational directory only</li>


<li><strong>Redirect URI:</strong> Leave blank</li>

</ul>


</li>


<li><strong>Click Register</strong></li>

</ol>



<h3 class="wp-block-heading">Step 2: Configure API Permissions</h3>



<p class="wp-block-paragraph">Add the required Microsoft Graph permissions:</p>



<ol class="wp-block-list">

<li>Navigate to <strong>API permissions</strong> &gt; <strong>Add a permission</strong></li>


<li>Select <strong>Microsoft Graph</strong> &gt; <strong>Delegated permissions</strong></li>


<li>Add the following permissions:

<ul class="wp-block-list">

<li><code>User.Read</code>: Read user profile</li>


<li><code>offline_access</code>: Refresh tokens for offline access</li>


<li><code>openid</code>: OpenID Connect authentication</li>


<li><code>profile</code>: Read user profile information</li>

</ul>


</li>


<li>Click <strong>Grant admin consent</strong> for your organization</li>

</ol>



<h3 class="wp-block-heading">Step 3: Enable Public Client Flow</h3>



<p class="wp-block-paragraph">Device code flow requires public client settings:</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Authentication</strong></li>


<li>Under <strong>Settings</strong>, set <strong>Allow public client flows</strong> to <strong>Enabled</strong></li>


<li>Click <strong>Save</strong></li>

</ol>



<h3 class="wp-block-heading">Step 4: Record Application Details</h3>



<p class="wp-block-paragraph">Note down these values for later configuration:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Value</th>
<th>Location</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Application (client) ID</strong></td>
<td>Overview page</td>
</tr>
<tr>
<td><strong>Directory (tenant) ID</strong></td>
<td>Overview page</td>
</tr>
</tbody>
</table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Ubuntu Configuration: Installing AuthD</h2>



<p class="wp-block-paragraph">With Entra ID configured, you can now install and configure AuthD to enable <strong>Entra ID authentication</strong>.</p>



<h3 class="wp-block-heading">Step 1: Update System</h3>



<p class="wp-block-paragraph">Start with a fresh system update:</p>



<pre class="wp-block-code"><code># Update package lists
sudo apt update
sudo apt upgrade -y
</code></pre>



<h3 class="wp-block-heading">Step 2: Add AuthD PPA</h3>



<p class="wp-block-paragraph">AuthD is available from the Ubuntu Enterprise Desktop PPA:</p>



<pre class="wp-block-code"><code># Add the AuthD PPA
sudo add-apt-repository -y ppa:ubuntu-enterprise-desktop/authd

# Update package list
sudo apt update
</code></pre>



<h3 class="wp-block-heading">Step 3: Install AuthD</h3>



<p class="wp-block-paragraph">Install AuthD with GNOME integration:</p>



<pre class="wp-block-code"><code># Install AuthD
sudo apt install -y authd
</code></pre>



<h3 class="wp-block-heading">Step 4: Install MS Entra ID Broker</h3>



<p class="wp-block-paragraph">The broker is distributed as a Snap package:</p>



<pre class="wp-block-code"><code># Install the MS Entra ID broker
sudo snap install authd-msentraid

# Verify installation
snap list authd-msentraid
</code></pre>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a359f9d16f9b&quot;}" data-wp-interactive="core/image" data-wp-key="6a359f9d16f9b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><em>Figure 4: Installing AuthD and MS Entra broker on Ubuntu</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Configuring AuthD for Entra ID Authentication</h2>



<p class="wp-block-paragraph">After installation, configure AuthD with your Azure app registration details.</p>



<h3 class="wp-block-heading">Step 1: Create Broker Configuration Directory</h3>



<pre class="wp-block-code"><code># Create broker directory (required by AuthD)
sudo mkdir -p /etc/authd/brokers.d
sudo chmod 700 /etc/authd/brokers.d

# Copy broker declaration from the snap package
sudo cp /snap/authd-msentraid/current/conf/authd/msentraid.conf /etc/authd/brokers.d/
sudo chmod 600 /etc/authd/brokers.d/msentraid.conf
</code></pre>



<h3 class="wp-block-heading">Step 2: Configure the Broker</h3>



<p class="wp-block-paragraph">Edit the broker configuration with your Azure details:</p>



<pre class="wp-block-code"><code># Edit broker configuration
sudo nano /var/snap/authd-msentraid/current/broker.conf
</code></pre>



<p class="wp-block-paragraph">Add or modify the following configuration:</p>



<pre class="wp-block-code"><code>[oidc]
issuer = https://login.microsoftonline.com/&lt;YOUR_TENANT_ID&gt;/v2.0
client_id = &lt;YOUR_CLIENT_ID&gt;

[users]
# Allow all authenticated users
allowed_users = ALL
# Entra ID password becomes the local Linux password
password_passthrough = true


# Or restrict to specific users:
# allowed_users = user1@yourdomain.com

# Or use OWNER mode (first user becomes owner):
# allowed_users = OWNER
</code></pre>



<p class="wp-block-paragraph">Replace:</p>



<ul class="wp-block-list">

<li><code>&lt;YOUR_TENANT_ID&gt;</code> with your Microsoft Entra tenant ID</li>


<li><code>&lt;YOUR_CLIENT_ID&gt;</code> with your app registration client ID</li>

</ul>



<h3 class="wp-block-heading">User Access Options</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Setting</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ALL</code></td>
<td>Any authenticated Entra ID user can log in</td>
</tr>
<tr>
<td><code>OWNER</code></td>
<td>First user to authenticate becomes the owner</td>
</tr>
<tr>
<td><code>user@domain.com</code></td>
<td>Comma-separated list of allowed users</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Step 3: Configure Login Timeout</h3>



<p class="wp-block-paragraph">The default login timeout may be too short for MFA. Increase it:</p>



<pre class="wp-block-code"><code># Edit login.defs
sudo nano /etc/login.defs

# Find LOGIN_TIMEOUT and modify (or add if not present)
LOGIN_TIMEOUT 120
</code></pre>



<h3 class="wp-block-heading">Step 4: Restart Services</h3>



<p class="wp-block-paragraph">Apply the configuration:</p>



<pre class="wp-block-code"><code># Secure the broker configuration
sudo chmod 600 /var/snap/authd-msentraid/current/broker.conf
sudo chmod 700 /var/snap/authd-msentraid/current

# Restart AuthD service
sudo systemctl restart authd

# Restart the broker
sudo snap restart authd-msentraid

# Verify services are running
systemctl status authd
snap services authd-msentraid
</code></pre>



<h3 class="wp-block-heading">Step 5: Test Authentication</h3>



<p class="wp-block-paragraph">Before making further changes, verify <strong>Entra ID authentication</strong> works:</p>



<ol class="wp-block-list">

<li><strong>Log out</strong> of your current session</li>


<li>Click <strong>“Microsoft Entra ID”</strong> to select it as the broker (or similar option)</li>


<li>Enter your organizational email</li>


<li>Complete the device code authentication flow:

<ul class="wp-block-list">

<li>Open <a href="https://microsoft.com/devicelogin">https://microsoft.com/devicelogin</a> on another device</li>


<li>Enter the code displayed on the Ubuntu screen</li>


<li>Complete MFA authentication</li>

</ul>


</li>


<li>You should be logged in with your Entra ID account</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a359f9d175a6&quot;}" data-wp-interactive="core/image" data-wp-key="6a359f9d175a6" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"><em>Figure 5: The device code authentication flow</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Disabling Local Accounts for Secure Entra ID Authentication</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Warning:</strong> Only proceed after successfully testing <strong>Entra ID authentication</strong>. Ensure you have recovery access planned.</p>
</blockquote>



<h3 class="wp-block-heading">Understanding the Security Implications</h3>



<p class="wp-block-paragraph">Disabling local account login enhances security:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Benefit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>No local password attacks</strong></td>
<td>Eliminates brute-force risks</td>
</tr>
<tr>
<td><strong>Centralized authentication</strong></td>
<td>All authentication flows through Entra ID</td>
</tr>
<tr>
<td><strong>MFA enforcement</strong></td>
<td>Every login requires multi-factor authentication</td>
</tr>
<tr>
<td><strong>Audit trail</strong></td>
<td>All logins logged in Entra ID</td>
</tr>
</tbody>
</table></figure>



<p class="wp-block-paragraph">However, you must plan for:</p>



<ul class="wp-block-list">

<li>Network connectivity requirements (first login requires network)</li>


<li>Recovery procedures (boot-level or break-glass access)</li>


<li>Cached credential limitations</li>

</ul>



<h3 class="wp-block-heading">Method 1: Lock Local User Accounts</h3>



<p class="wp-block-paragraph">The safest approach preserves accounts for emergency recovery:</p>



<pre class="wp-block-code"><code># List local users (UID &gt;= 1000, excluding nobody)
awk -F: '$3 &gt;= 1000 &amp;&amp; $1 != &quot;nobody&quot; {print $1}' /etc/passwd

# Lock each local user account (example for user 'localadmin')
sudo passwd -l localadmin

# Remove from sudo group if not needed
sudo deluser localadmin sudo
</code></pre>



<p class="wp-block-paragraph">To unlock in emergency:</p>



<pre class="wp-block-code"><code>sudo passwd -u localadmin
</code></pre>



<h3 class="wp-block-heading">Method 2: PAM Configuration for AuthD Priority</h3>



<p class="wp-block-paragraph">Configure PAM to prioritize AuthD:</p>



<pre class="wp-block-code"><code># Backup existing PAM configuration
sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup

# Edit PAM configuration
sudo nano /etc/pam.d/common-auth
</code></pre>



<p class="wp-block-paragraph">Modify to prioritize AuthD:</p>



<pre class="wp-block-code"><code># AuthD authentication (primary)
auth    [success=2 default=ignore]    pam_authd.so

# Local authentication (fallback - comment out to disable)
# auth   [success=1 default=ignore]    pam_unix.so nullok_secure

# Deny if all methods fail
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
</code></pre>



<h3 class="wp-block-heading">Method 3: Hide Local Users from GDM</h3>



<p class="wp-block-paragraph">Hide local users from the login screen:</p>



<pre class="wp-block-code"><code># Create/edit GDM configuration
sudo nano /etc/gdm3/greeter.dconf-defaults

# Add the following
[org/gnome/login-screen]
disable-user-list=true
</code></pre>



<p class="wp-block-paragraph">Apply changes:</p>



<pre class="wp-block-code"><code>sudo dpkg-reconfigure gdm3
</code></pre>



<h3 class="wp-block-heading">Recovery Access Setup</h3>



<p class="wp-block-paragraph">Always maintain emergency access:</p>



<ol class="wp-block-list">

<li><strong>Recovery Mode Access</strong>

<ul class="wp-block-list">

<li>To access single-user mode:

<ul class="wp-block-list">

<li>Reboot and hold SHIFT to access GRUB</li>


<li>Edit boot entry, add ‘single’ to kernel parameters</li>


<li>Boot into single-user mode (requires disk encryption password)</li>

</ul>


</li>

</ul>


</li>


<li><strong>Break-Glass Admin Account</strong>

<ul class="wp-block-list">

<li>Create a dedicated admin account in Entra ID</li>


<li>Add to <code>allowed_users</code> in broker configuration</li>


<li>Store credentials securely (password manager)</li>


<li>Document when and how to use</li>

</ul>


</li>


<li><strong>Create Recovery Script</strong></li>

</ol>



<pre class="wp-block-code"><code>sudo tee /root/emergency-recovery.sh &gt; /dev/null &lt;&lt; 'EOF'
#!/bin/bash
# Emergency recovery script - Run from recovery mode
mount -o remount,rw /
passwd -u localadmin
cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth
echo &quot;Recovery complete. Reboot normally.&quot;
EOF
sudo chmod 700 /root/emergency-recovery.sh
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Automation Script for Entra ID Authentication</h2>



<p class="wp-block-paragraph">For consistent deployments, use this automation script for <strong>Entra ID authentication</strong>:</p>



<pre class="wp-block-code"><code>#!/bin/bash
#===============================================================================
# Script Name: setup-authd.sh
# Description: Automated setup of AuthD on Ubuntu 24.04 LTS
# Author: Enterprise IT
# Version: 1.0
#===============================================================================

set -e  # Exit on error

# Configuration Variables - MODIFY THESE
TENANT_ID=&quot;YOUR_TENANT_ID_HERE&quot;
CLIENT_ID=&quot;YOUR_CLIENT_ID_HERE&quot;
ALLOWED_USERS=&quot;ALL&quot;  # Options: ALL, OWNER, or comma-separated emails
DISABLE_LOCAL_LOGIN=&quot;false&quot;  # Set to &quot;true&quot; to disable local login

# Logging
LOG_FILE=&quot;/var/log/authd-setup.log&quot;
exec 1&gt; &gt;(tee -a &quot;$LOG_FILE&quot;) 2&gt;&amp;1

log() {
    echo &quot;[$(date '+%Y-%m-%d %H:%M:%S')] $1&quot;
}

error() {
    echo &quot;[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1&quot; &gt;&amp;2
    exit 1
}

# Check if running as root
if [[ $EUID -ne 0 ]]; then
    error &quot;This script must be run as root (use sudo)&quot;
fi

# Validate configuration
if [[ &quot;$TENANT_ID&quot; == &quot;YOUR_TENANT_ID_HERE&quot; ]]; then
    error &quot;Please set TENANT_ID before running this script&quot;
fi

if [[ &quot;$CLIENT_ID&quot; == &quot;YOUR_CLIENT_ID_HERE&quot; ]]; then
    error &quot;Please set CLIENT_ID before running this script&quot;
fi

# Check Ubuntu version
if ! grep -q &quot;24.04&quot; /etc/lsb-release; then
    error &quot;This script is designed for Ubuntu 24.04 LTS&quot;
fi

log &quot;Starting AuthD setup...&quot;

#===============================================================================
# PHASE 1: Install AuthD
#===============================================================================

log &quot;Phase 1: Installing AuthD...&quot;

apt update

# Add AuthD PPA
if ! grep -q &quot;ubuntu-enterprise-desktop/authd&quot; /etc/apt/sources.list.d/*.list 2&gt;/dev/null; then
    add-apt-repository -y ppa:ubuntu-enterprise-desktop/authd
    log &quot;AuthD PPA added&quot;
fi

apt update
apt install -y authd

log &quot;AuthD installed&quot;

#===============================================================================
# PHASE 2: Install MS Entra ID Broker
#===============================================================================

log &quot;Phase 2: Installing MS Entra ID broker...&quot;

snap install authd-msentraid

log &quot;MS Entra ID broker installed&quot;

#===============================================================================
# PHASE 3: Configure Broker
#===============================================================================

log &quot;Phase 3: Configuring broker...&quot;

# Create broker configuration directory
mkdir -p /etc/authd/brokers.d/

# Copy broker declaration
cp /snap/authd-msentraid/current/conf/authd/msentraid.conf /etc/authd/brokers.d/

# Configure broker
cat &gt; /var/snap/authd-msentraid/current/broker.conf &lt;&lt; EOF
[oidc]
issuer = https://login.microsoftonline.com/${TENANT_ID}/v2.0
client_id = ${CLIENT_ID}

[users]
allowed_users = ${ALLOWED_USERS}
password_passthrough = true
EOF

log &quot;Broker configured&quot;

#===============================================================================
# PHASE 4: Configure Login Timeout
#===============================================================================

log &quot;Phase 4: Configuring login timeout...&quot;

if grep -q &quot;^LOGIN_TIMEOUT&quot; /etc/login.defs; then
    sed -i 's/^LOGIN_TIMEOUT.*/LOGIN_TIMEOUT 120/' /etc/login.defs
else
    echo &quot;LOGIN_TIMEOUT 120&quot; &gt;&gt; /etc/login.defs
fi

log &quot;Login timeout configured&quot;

#===============================================================================
# PHASE 5: Disable Local Login (Optional)
#===============================================================================

if [ &quot;$DISABLE_LOCAL_LOGIN&quot; = &quot;true&quot; ]; then
    log &quot;Phase 5: Disabling local login...&quot;

    # Backup PAM configuration
    cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup.$(date +%Y%m%d)

    # Hide user list in GDM
    mkdir -p /etc/gdm3
    cat &gt;&gt; /etc/gdm3/greeter.dconf-defaults &lt;&lt; 'EOF'

[org/gnome/login-screen]
disable-user-list=true
EOF

    # Lock local accounts
    for user in $(awk -F: '$3 &gt;= 1000 &amp;&amp; $1 != &quot;nobody&quot; {print $1}' /etc/passwd); do
        passwd -l &quot;$user&quot; 2&gt;/dev/null || true
        log &quot;Locked local user: $user&quot;
    done

    log &quot;Local login disabled&quot;
else
    log &quot;Phase 5: Skipping local login disable (set DISABLE_LOCAL_LOGIN=true to enable)&quot;
fi

#===============================================================================
# PHASE 6: Restart Services
#===============================================================================

log &quot;Phase 6: Restarting services...&quot;

systemctl restart authd
snap restart authd-msentraid

log &quot;Services restarted&quot;

#===============================================================================
# COMPLETION
#===============================================================================

log &quot;==============================================&quot;
log &quot;Setup completed successfully!&quot;
log &quot;==============================================&quot;
log &quot;&quot;
log &quot;Next steps:&quot;
log &quot;1. Reboot the system&quot;
log &quot;2. Log out and test Entra ID authentication at GDM&quot;
log &quot;&quot;
log &quot;Configuration details:&quot;
log &quot;  - Tenant ID: ${TENANT_ID}&quot;
log &quot;  - Client ID: ${CLIENT_ID}&quot;
log &quot;  - Allowed Users: ${ALLOWED_USERS}&quot;
log &quot;  - Local Login Disabled: ${DISABLE_LOCAL_LOGIN}&quot;
log &quot;&quot;
log &quot;Log file: ${LOG_FILE}&quot;

echo &quot;&quot;
echo &quot;Reboot now? (y/n)&quot;
read -r response
if [[ &quot;$response&quot; =~ ^[Yy]$ ]]; then
    reboot
fi
</code></pre>



<h3 class="wp-block-heading">Using the Automation Script</h3>



<ol class="wp-block-list">

<li><strong>Save the script</strong> as <code>setup-authd.sh</code></li>


<li><strong>Edit configuration variables</strong>:

<ul class="wp-block-list">

<li>TENANT_ID=”your-tenant-id”</li>


<li>CLIENT_ID=”your-client-id”</li>


<li>ALLOWED_USERS=”ALL”</li>


<li>DISABLE_LOCAL_LOGIN=”false”</li>

</ul>


</li>


<li><strong>Run the script</strong>:

<ul class="wp-block-list">

<li><code>chmod +x setup-authd.sh &amp;&amp; sudo ./setup-authd.sh</code></li>

</ul>


</li>


<li><strong>Complete post-script steps</strong>:

<ul class="wp-block-list">

<li>Reboot the system</li>


<li>Test Entra ID authentication</li>


<li>If successful, re-run with:

<ul class="wp-block-list">

<li><code>DISABLE_LOCAL_LOGIN="true"</code></li>

</ul>


</li>

</ul>


</li>

</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Troubleshooting Entra ID Authentication Issues</h2>



<p class="wp-block-paragraph">When implementing <strong>Entra ID authentication</strong>, you may encounter various issues.</p>



<h3 class="wp-block-heading">AuthD Authentication Failures</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Issue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>No Entra ID option at GDM</td>
<td>Broker not configured</td>
<td>Check <code>/etc/authd/brokers.d/msentraid.conf</code> exists</td>
</tr>
<tr>
<td>“Authentication failed”</td>
<td>Wrong client ID</td>
<td>Verify client ID in broker.conf</td>
</tr>
<tr>
<td>Device code timeout</td>
<td>LOGIN_TIMEOUT too short</td>
<td>Increase in <code>/etc/login.defs</code></td>
</tr>
<tr>
<td>User not allowed</td>
<td>allowed_users restriction</td>
<td>Update broker.conf allowed_users</td>
</tr>
<tr>
<td>“Invalid issuer”</td>
<td>Wrong tenant ID</td>
<td>Verify tenant ID in broker.conf</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Login Issues After Configuration</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Issue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>Can’t log in at all</td>
<td>PAM misconfigured</td>
<td>Boot to recovery mode, restore PAM backup</td>
</tr>
<tr>
<td>Slow login</td>
<td>Network latency</td>
<td>Check DNS, consider cached credentials</td>
</tr>
<tr>
<td>MFA not working</td>
<td>Device code flow issue</td>
<td>Verify app registration settings</td>
</tr>
<tr>
<td>Home directory not created</td>
<td>NSS issue</td>
<td>Check <code>/etc/nsswitch.conf</code> includes authd</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Useful Troubleshooting Commands</h3>



<pre class="wp-block-code"><code># Check AuthD service status
systemctl status authd

# View AuthD logs
journalctl -u authd -f

# Check broker logs
snap logs authd-msentraid

# View broker configuration
cat /var/snap/authd-msentraid/current/broker.conf

# Test authentication manually
authd-cli authenticate
</code></pre>



<h3 class="wp-block-heading">Recovery Commands</h3>



<p class="wp-block-paragraph">If locked out, boot to recovery mode:</p>



<pre class="wp-block-code"><code># Mount filesystem read-write
mount -o remount,rw /

# Restore PAM configuration
cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth

# Unlock local user
passwd -u localadmin

# Restart services
systemctl restart authd
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Best Practices for Entra ID Authentication</h2>



<p class="wp-block-paragraph">To ensure your <strong>Entra ID authentication</strong> deployment is secure and reliable, follow these best practices.</p>



<h3 class="wp-block-heading">Security Hardening</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Practice</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enable disk encryption</strong></td>
<td>Use LUKS during Ubuntu installation</td>
</tr>
<tr>
<td><strong>Configure automatic updates</strong></td>
<td>Enable unattended-upgrades for security patches</td>
</tr>
<tr>
<td><strong>Monitor login attempts</strong></td>
<td>Review Entra ID sign-in logs regularly</td>
</tr>
<tr>
<td><strong>Restrict allowed users</strong></td>
<td>Only allow users who need Linux access</td>
</tr>
<tr>
<td><strong>Document recovery procedures</strong></td>
<td>Test recovery quarterly</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Operational Best Practices</h3>



<ol class="wp-block-list">

<li><strong>Document Recovery Procedures</strong>

<ul class="wp-block-list">

<li>Create step-by-step recovery documentation</li>


<li>Store recovery keys securely (not on the device)</li>


<li>Test recovery procedures quarterly</li>

</ul>


</li>


<li><strong>Plan for Offline Scenarios</strong>

<ul class="wp-block-list">

<li>AuthD caches credentials for offline login</li>


<li>First login always requires network</li>


<li>Document offline limitations for users</li>

</ul>


</li>


<li><strong>User Communication</strong>

<ul class="wp-block-list">

<li>Provide training on device code authentication</li>


<li>Create FAQ for common issues</li>


<li>Establish support channels</li>

</ul>


</li>


<li><strong>Staged Rollout</strong>

<ul class="wp-block-list">

<li>Pilot with IT team first</li>


<li>Expand to early adopters</li>


<li>Full deployment after validation</li>

</ul>


</li>

</ol>



<h3 class="wp-block-heading">Monitoring Commands</h3>



<pre class="wp-block-code"><code># Check AuthD service status
systemctl status authd

# View AuthD logs
journalctl -u authd -f

# Check broker logs
snap logs authd-msentraid

# List logged-in users
who
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusion: Embracing Entra ID Authentication</h2>



<p class="wp-block-paragraph">Implementing <strong>Entra ID authentication</strong> with AuthD transforms Ubuntu workstations into cloud-native enterprise systems. As a result, organizations achieve:</p>



<ul class="wp-block-list">

<li><strong>Eliminate password sprawl</strong> with single sign-on</li>


<li><strong>Enhance security</strong> through MFA enforcement</li>


<li><strong>Simplify management</strong> with centralized identity</li>


<li><strong>Reduce attack surface</strong> by eliminating local accounts</li>


<li><strong>Enable unified identity</strong> across all platforms</li>

</ul>



<p class="wp-block-paragraph">This <strong>Entra ID authentication</strong> solution represents the future of enterprise Linux management. With AuthD now <a href="https://discourse.ubuntu.com/t/authd-enters-the-ubuntu-archive-in-26-04-lts/78193">included in the Ubuntu 26.04 LTS archive</a>, expect even deeper integration and additional identity provider support, including a generic OIDC broker for standards-compliant providers.</p>



<p class="wp-block-paragraph"><strong>Ready to implement Entra ID authentication?</strong> Begin with a single test workstation, validate the authentication flow, then scale your deployment with confidence.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Additional Resources</h2>



<h3 class="wp-block-heading">External Documentation</h3>



<ul class="wp-block-list">

<li><a href="https://documentation.ubuntu.com/authd/stable-docs/">AuthD Official Documentation</a></li>


<li><a href="https://github.com/canonical/authd">AuthD GitHub Repository</a></li>


<li><a href="https://learn.microsoft.com/en-us/entra/">Microsoft Entra ID Documentation</a></li>

</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Have questions about implementing </em><em>Entra ID authentication</em><em>? Share your experience in the comments below or reach out for assistance!</em></p>
<p>The post <a href="https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/">Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: jensdufour.be @ 2026-06-19 20:59:25 by W3 Total Cache
-->