🦞

Microsoft Entra ID 認証 (Azure AD 認証) で Ubuntu Desktop 23.04 にログイン

2023/07/11に公開

Ubuntu Desktop 23.04 で Microsoft Entra ID (旧称 Azure AD) によるユーザー認証がネイティブに利用できるようになったそうなので (現時点ではパブリック プレビュー)、どのように使えるのか試してみました。

https://ubuntu.com/blog/azure-ad-authentication-comes-to-ubuntu-desktop-23-04

ubuntu/aad-auth プロジェクト

Microsoft Entra ID 認証を実現しているコンポーネントは ubuntu/aad-auth プロジェクトで開発されています。

https://github.com/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 つの手順が必要です。

  1. Microsoft Entra テナントにアプリケーションを登録
  2. Ubuntu Desktop 上で Microsoft Entra ID 認証を構成

Microsoft Entra テナントにアプリケーションを登録

Ubuntu Desktop に Microsoft Entra ID 認証でログインできるようにするためには、Microsoft Entra テナントに Ubuntu へのログオンに使用するためのアプリケーションを登録し、加えて、そのアプリケーションのためのサービス プリンシパルを作成する必要があります。

アプリケーションの登録とサービス プリンシパルの作成は色々な方法でできますが、今回は 2 つの方法を試しました。

Azure portal を使用してアプリケーションを登録する方法

この方法では以下のことを行います。

  1. アプリケーションの登録
    • Azure portal ではアプリケーションの登録時にサービス プリンシパルが自動的に作成されます。
  2. 管理者による同意の付与
  3. アプリケーションのアプリロールにユーザーを割り当て

https://learn.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal


  1. Azure Active Directory のアプリの登録からアプリを新規登録します。

  2. アプリケーションの登録は表示名のみを入力して、他は既定値を使用します。

    Azure portal を使用したアプリケーションの登録では、この操作によって Microsoft Entra テナントにアプリケーションが登録され、加えて、登録したアプリケーションに対応するサービス プリンシパルも自動的に作成されます。

  3. アプリケーションが登録できたら、認証からパブリック クライアント フローを有効にします。

  4. 次に API のアクセス許可で管理者による同意を与えます。

  5. 最後にエンタープライズ アプリケーションから、作成されたサービス プリンシパルに Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを割り当てます。

    アプリケーションの登録によって作成されたサービス プリンシパルを選択します。

    ユーザーとグループからユーザーを追加します。

Microsoft Graph PowerShell を使用してアプリケーションの登録とサービス プリンシパルを作成する方法

この方法では以下のことを行います。

  1. アプリケーションの登録
  2. サービス プリンシパルの作成
  3. アプリケーションのアプリロールにユーザーを割り当て
  4. 同意の付与
    • 管理者として同意を付与、または、特定のユーザーに代わって同意を付与します。

  1. Microsoft Graph にアクセスするためにサインインします。

    $params = @{
        TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        Scopes   = @(
            'Application.ReadWrite.All',       # サービス プリンシパルの作成に必要
            'User.ReadBasic.All',              # ユーザーの取得に必要
            'AppRoleAssignment.ReadWrite.All'  # アプリケーションのアプリ ロールにユーザーを割り当てに必要
        )
    }
    Connect-MgGraph @params
    
  2. アプリケーションを作成します。アプリケーションの表示名は任意に設定できます。

    $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
    
  3. 作成したアプリケーションのためのサービス プリンシパルを作成します。

    $servicePrincipal = New-MgServicePrincipal -AppId $aadApp.AppId
    
  4. Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを取得します。

    $userPrincipalName = 'user1@xxxxxxxx.onmicrosoft.com'
    $user = Get-MgUser -UserId $userPrincipalName
    
  5. 作成したサービス プリンシパルに 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
    
  6. この後の手順で必要になる情報を確認しておきます。

    'tenant_id = {0}' -f (Get-MgContext).TenantId
    'app_id = {0}' -f $aadApp.AppId
    'app_object_id = {0}' -f $aadApp.Id
    
    • tenant_idapp_id は Ubuntu Desktop 上で Microsoft Entra ID 認証を構成する際に必要になります。
    • app_object_id は同意の付与を行う際に、作成したアプリケーションに対応するサービス プリンシパルを取得するために必要になります。
  7. Microsoft Graph からサインアウトします。

    Disconnect-MgGraph
    

同意の付与

Microsoft Graph PowerShell を使用する場合、Ubuntu Desktop へのログインに使用するアプリケーションに対して、管理者として同意を付与すること (Azure portal と同等)、特定のユーザーに代わって同意を付与すること、どちらもできます。

通常は、どちらかの方法で同意を付与すれば十分です。

管理者として同意を付与する

https://learn.microsoft.com/ja-jp/azure/active-directory/manage-apps/grant-admin-consent

  1. Microsoft Graph にアクセスするためにサインインします。

    $params = @{
        TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        Scopes   = @(
            'Application.Read.All',                   # サービス プリンシパルのリストに必要
            'DelegatedPermissionGrant.ReadWrite.All'  # 同意の付与に必要
        )
    }
    Connect-MgGraph @params
    
  2. アプリケーションのために作成したサービス プリンシパルを取得します。

    $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)
    
  3. サービス プリンシパルの 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
    
  4. Microsoft Graph からサインアウトします。

    Disconnect-MgGraph
    
特定のユーザーに代わって同意を付与する

https://learn.microsoft.com/ja-jp/azure/active-directory/manage-apps/grant-consent-single-user

  1. Microsoft Graph にアクセスするためにサインインします。

    $params = @{
        TenantId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        Scopes   = @(
            'Application.Read.All',                   # サービス プリンシパルのリストに必要
            'User.ReadBasic.All',                     # ユーザーの取得に必要
            'DelegatedPermissionGrant.ReadWrite.All'  # 同意の付与に必要
        )
    }
    Connect-MgGraph @params
    
  2. アプリケーションのために作成したサービス プリンシパルを取得します。

    $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)
    
  3. 同意を付与するユーザーとして、Ubuntu Desktop へのログインに使用する Microsoft Entra ユーザーを取得します。

    $userPrincipalName = 'user1@xxxxxxxx.onmicrosoft.com'
    $user = Get-MgUser -UserId $userPrincipalName
    
  4. サービス プリンシパルの 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
    
  5. Microsoft Graph からサインアウトします。

    Disconnect-MgGraph
    

Ubuntu Desktop 上での Microsoft Entra ID 認証の構成

ubuntu/aad-auth で説明されている手順と Ubuntu Blog の動画を参考に Microsoft Entra ID 認証を構成します。

主な手順は 3 つです。

  1. PAM と NSS のパッケージをインストール
  2. ホーム ディレクトリの作成を有効化
  3. Microsoft Entra ID 認証の構成ファイルを更新

PAM と NSS のパッケージをインストール

libpam-aad と libnss-aad をインストールします。

sudo apt install libpam-aad libnss-aad

パッケージのインストールによって、/etc/nsswitch.confpasswordgroupshadow には 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_idapp_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