Microsoft Entra ID 認証 (Azure AD 認証) で Ubuntu Desktop 23.04 にログイン
Ubuntu Desktop 23.04 で Microsoft Entra ID (旧称 Azure AD) によるユーザー認証がネイティブに利用できるようになったそうなので (現時点ではパブリック プレビュー)、どのように使えるのか試してみました。
ubuntu/aad-auth プロジェクト
Microsoft Entra ID 認証を実現しているコンポーネントは ubuntu/aad-auth プロジェクトで開発されています。
現時点では Ubuntu 23.04 で利用できますが、将来的には Ubuntu 22.04 LTS へのバックポートも予定されているようです。
このプロジェクトで配布されているコンポーネントは以下の 3 つです。
- PAM モジュール (libpam-aad)
- NSS モジュール (libnss-aad)
- 管理用のコマンドライン ツール (aad-cli)
Ubuntu Desktop で Microsoft Entra ID 認証を利用するための手順
Microsoft Entra ID 認証で Ubuntu Desktop にログインできるようにするためには、大きく 2 つの手順が必要です。
Microsoft Entra テナントにアプリケーションを登録
Ubuntu Desktop に Microsoft Entra ID 認証でログインできるようにするためには、Microsoft Entra テナントに Ubuntu へのログオンに使用するためのアプリケーションを登録し、加えて、そのアプリケーションのためのサービス プリンシパルを作成する必要があります。
アプリケーションの登録とサービス プリンシパルの作成は色々な方法でできますが、今回は 2 つの方法を試しました。
Azure portal を使用してアプリケーションを登録する方法
この方法では以下のことを行います。
- アプリケーションの登録
- Azure portal ではアプリケーションの登録時にサービス プリンシパルが自動的に作成されます。
- 管理者による同意の付与
- アプリケーションのアプリロールにユーザーを割り当て
-
Azure Active Directory のアプリの登録からアプリを新規登録します。
-
アプリケーションの登録は表示名のみを入力して、他は既定値を使用します。
Azure portal を使用したアプリケーションの登録では、この操作によって Microsoft Entra テナントにアプリケーションが登録され、加えて、登録したアプリケーションに対応するサービス プリンシパルも自動的に作成されます。
-
アプリケーションが登録できたら、認証からパブリック クライアント フローを有効にします。
-
次に API のアクセス許可で管理者による同意を与えます。
-
最後にエンタープライズ アプリケーションから、作成されたサービス プリンシパルに Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを割り当てます。
アプリケーションの登録によって作成されたサービス プリンシパルを選択します。
ユーザーとグループからユーザーを追加します。
Microsoft Graph PowerShell を使用してアプリケーションの登録とサービス プリンシパルを作成する方法
この方法では以下のことを行います。
- アプリケーションの登録
- サービス プリンシパルの作成
- アプリケーションのアプリロールにユーザーを割り当て
- 同意の付与
- 管理者として同意を付与、または、特定のユーザーに代わって同意を付与します。
-
Microsoft Graph にアクセスするためにサインインします。
$params = @{ TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Scopes = @( 'Application.ReadWrite.All', # サービス プリンシパルの作成に必要 'User.ReadBasic.All', # ユーザーの取得に必要 'AppRoleAssignment.ReadWrite.All' # アプリケーションのアプリ ロールにユーザーを割り当てに必要 ) } Connect-MgGraph @params
-
アプリケーションを作成します。アプリケーションの表示名は任意に設定できます。
$aadAppName = 'Ubuntu Login' $permissionId = (Find-MgGraphPermission -PermissionType 'Delegated' -SearchString 'User.Read' -ExactMatch).Id $params = @{ DisplayName = $aadAppName SignInAudience = 'AzureADMyOrg' IsFallbackPublicClient = $true RequiredResourceAccess = @{ ResourceAppId = '00000003-0000-0000-c000-000000000000' # Microsoft Graph (GraphAggregatorService) のアプリケーション ID ResourceAccess = @( @{ Type = 'Scope' Id = $permissionId } ) } } $aadApp = New-MgApplication @params
-
作成したアプリケーションのためのサービス プリンシパルを作成します。
$servicePrincipal = New-MgServicePrincipal -AppId $aadApp.AppId
-
Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを取得します。
$userPrincipalName = 'user1@xxxxxxxx.onmicrosoft.com' $user = Get-MgUser -UserId $userPrincipalName
-
作成したサービス プリンシパルに Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを割り当てます。
$params = @{ ServicePrincipalId = $servicePrincipal.Id ResourceId = $servicePrincipal.Id PrincipalId = $user.Id AppRoleId = '00000000-0000-0000-0000-000000000000' # Default Access } New-MgServicePrincipalAppRoleAssignedTo @params
-
この後の手順で必要になる情報を確認しておきます。
'tenant_id = {0}' -f (Get-MgContext).TenantId 'app_id = {0}' -f $aadApp.AppId 'app_object_id = {0}' -f $aadApp.Id
-
tenant_id
とapp_id
は Ubuntu Desktop 上で Microsoft Entra ID 認証を構成する際に必要になります。 -
app_object_id
は同意の付与を行う際に、作成したアプリケーションに対応するサービス プリンシパルを取得するために必要になります。
-
-
Microsoft Graph からサインアウトします。
Disconnect-MgGraph
同意の付与
Microsoft Graph PowerShell を使用する場合、Ubuntu Desktop へのログインに使用するアプリケーションに対して、管理者として同意を付与すること (Azure portal と同等)、特定のユーザーに代わって同意を付与すること、どちらもできます。
通常は、どちらかの方法で同意を付与すれば十分です。
管理者として同意を付与する
-
Microsoft Graph にアクセスするためにサインインします。
$params = @{ TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Scopes = @( 'Application.Read.All', # サービス プリンシパルのリストに必要 'DelegatedPermissionGrant.ReadWrite.All' # 同意の付与に必要 ) } Connect-MgGraph @params
-
アプリケーションのために作成したサービス プリンシパルを取得します。
$aadAppObjectId
には、Microsoft Entra アプリケーション登録時に確認しておいた Microsoft Entra アプリケーションのオブジェクト ID を指定します。$aadAppObjectId = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' # アプリケーションのオブジェクト ID $aadApp = Get-MgApplication -ApplicationId $aadAppObjectId $servicePrincipal = Get-MgServicePrincipal -Filter ('AppId eq ''{0}''' -f $aadApp.AppId)
-
サービス プリンシパルの Microsoft Graph へのアクセス許可に対して管理者の同意を付与します。
$msGraphServicePrincipal = Get-MgServicePrincipal -Filter ('AppId eq ''{0}''' -f '00000003-0000-0000-c000-000000000000') $params = @{ ResourceId = $msGraphServicePrincipal.Id Scope = 'User.Read' ClientId = $servicePrincipal.Id ConsentType = 'AllPrincipals' } New-MgOauth2PermissionGrant @params
-
Microsoft Graph からサインアウトします。
Disconnect-MgGraph
特定のユーザーに代わって同意を付与する
-
Microsoft Graph にアクセスするためにサインインします。
$params = @{ TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Scopes = @( 'Application.Read.All', # サービス プリンシパルのリストに必要 'User.ReadBasic.All', # ユーザーの取得に必要 'DelegatedPermissionGrant.ReadWrite.All' # 同意の付与に必要 ) } Connect-MgGraph @params
-
アプリケーションのために作成したサービス プリンシパルを取得します。
$aadAppObjectId
には、Microsoft Entra アプリケーション登録時に確認しておいた Microsoft Entra アプリケーションのオブジェクト ID を指定します。$aadAppObjectId = 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy' # アプリケーションのオブジェクト ID $aadApp = Get-MgApplication -ApplicationId $aadAppObjectId $servicePrincipal = Get-MgServicePrincipal -Filter ('AppId eq ''{0}''' -f $aadApp.AppId)
-
同意を付与するユーザーとして、Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを取得します。
$userPrincipalName = 'user1@xxxxxxxx.onmicrosoft.com' $user = Get-MgUser -UserId $userPrincipalName
-
サービス プリンシパルの Microsoft Graph へのアクセス許可に対してユーザーに代わって同意を付与します。
$msGraphServicePrincipal = Get-MgServicePrincipal -Filter ('AppId eq ''{0}''' -f '00000003-0000-0000-c000-000000000000') $params = @{ ResourceId = $msGraphServicePrincipal.Id Scope = 'User.Read' ClientId = $servicePrincipal.Id ConsentType = 'Principal' PrincipalId = $user.Id } New-MgOauth2PermissionGrant @params
-
Microsoft Graph からサインアウトします。
Disconnect-MgGraph
Ubuntu Desktop 上での Microsoft Entra ID 認証の構成
ubuntu/aad-auth で説明されている手順と Ubuntu Blog の動画を参考に Microsoft Entra ID 認証を構成します。
主な手順は 3 つです。
- PAM と NSS のパッケージをインストール
- ホーム ディレクトリの作成を有効化
- Microsoft Entra ID 認証の構成ファイルを更新
PAM と NSS のパッケージをインストール
libpam-aad と libnss-aad をインストールします。
sudo apt install libpam-aad libnss-aad
パッケージのインストールによって、/etc/nsswitch.conf
の password
、group
、shadow
には aad
が追記されます。
加えて、/etc/pam.d/common-auth
には auth [success=1 default=ignore] pam_aad.so
が追記されます。
ホーム ディレクトリの作成を有効化
Microsoft Entra ユーザーによる初回ログイン時にユーザーのホーム ディレクトリが自動的に作成されるように PAM の構成で mkhomedir
を有効にします。
sudo pam-auth-update --enable mkhomedir
Microsoft Entra ID 認証の構成ファイルを更新
Microsoft Entra ID 認証の構成ファイルは /etc/aad.conf
にあるので、このファイルを更新します。
最低限更新が必要なのは、ファイルの先頭付近にある tenant_id
と app_id
です。コメントアウトを解除して、Microsoft Entra アプリケーション登録時に確認しておいた Microsoft Entra テナントのテナント ID と作成した Microsoft Entra アプリケーションのアプリケーション ID で書き換えます。
その他にもいくつか構成できる項目があります。
-
offline_credentials_expiration
: オンラインでの認証無しでログインできる日数を設定できます。オンラインで 1 度認証していれば、ここで設定した期間は Microsoft Entra と通信できない状態でも Ubuntu Desktop にログインできます。- 既定の設定では、90 日間まではオフライン状態でもログインできるようです。
- 0 を設定した場合は、オフライン状態でのログインが無期限で許可されます。
- マイナスの値を設定した場合は、オフライン状態でのログインは許可されません。
-
homedir
: 初回ログイン時に作成されるユーザーのホーム ディレクトリ名の命名パターンを設定できます。 -
shell
: 初回ログイン時に設定されるユーザーの既定の shell を指定できます。
今回は試していませんが、既定の構成 [default]
(セクション分けされていない部分) の他に、[domain.com]
のようにセクションを設けて構成値を記述することで、ユーザー プリンシパル名のドメインごとに異なる構成にもできるようです。異なる Microsoft Entra テナントに属する複数のユーザーが Ubuntu Desktop にログインできるように構成できるのだと思います。
Microsoft Entra ユーザー アカウントで Ubuntu Desktop にログインできることを確認
サインイン画面で "アカウントが見つかりませんか?" をクリックするとユーザー名を入力できるので、Microsoft Entra ユーザーのユーザー プリンシパル名とパスワードを入力してログインします。
ログイン後、ユーザー プリンシパル名を使用したホーム ディレクトリが作成されていることも確認できます。
Microsoft Entra ID 認証の構成管理ツール
Microsoft Entra ID 認証構成管理用のコマンドライン ツールとして aad-cli
が用意されています。
別パッケージのため、このツールを使用する場合にはインストールします。
sudo apt install aad-cli
aad-cli
を使用すると、現在の構成の確認やログインしたことがある Microsoft Entra ユーザーの情報、各 shell 用のオートコンプリーション スクリプトの生成などができます。
$ aad-cli
Manage Azure AD accounts configuration
Usage:
aad-cli [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
config Manage aad-auth configuration
help Help about any command
user Manage local Azure AD user information
version Returns the version of aad-cli and the PAM/NSS libraries if available
Flags:
-h, --help help for aad-cli
-v, --verbose count issue INFO (-v), DEBUG (-vv) or DEBUG with caller (-vvv) output
Use "aad-cli [command] --help" for more information about a command.
サブコマンド config
を使用すると、現在の構成を確認できます。
$ aad-cli config
[default]
tenant_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
app_id = yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
offline_credentials_expiration =
homedir = /home/%f
shell = /bin/bash
サブコマンド user
に --all
フラグを追加すると、ログインしたことがある Microsoft Entra ユーザーの一覧を確認できます。
$ aad-cli user --all
user1@xxxxxxxx.onmicrosoft.com
user2@xxxxxxxx.onmicrosoft.com
サブコマンド user
に --name
フラグを追加して、ログインしたことがある Microsoft Entra ユーザーのユーザー プリンシパル名を指定すると、そのユーザーの情報を確認できます。
$ aad-cli user --name user1@xxxxxxxx.onmicrosoft.com
login = user1@xxxxxxxx.onmicrosoft.com
password = x
uid = 937526944
gid = 937526944
gecos =
home = /home/user1@xxxxxxxx.onmicrosoft.com
shell = /bin/bash
last_online_auth = 2023-06-18T01:55:16+09:00
shadow_password =
まとめ
Windows 11 などのクライアント Windows で一般化している Microsoft Entra アカウントを使用したログインを Ubuntu Desktop でも利用できることが確認できました。
パブリック プレビュー中ということもあり奇妙な挙動を見せることもありましたが、1 つの Microsoft Entra アカウントで OS の違いを区別せずにログインできるのは便利そうです。
Discussion