誰もが自由にコンピューターやサービスを勝手に利用できてしまっては、セキュリティ上問題があります。そこで現代的なOSやWebサービスは、使用開始前にユーザー名とパスワード
家庭内の個人利用であれば、こうしたOS単位のユーザー認証でも問題ありません。しかし企業などでは、社員ごとにIDを発行し、そのIDを使って様々なITリソースへの認証を一元管理できると便利です。こうした要望を実現するため、従来ではActive DirectoryやOpenLDAPなどが利用されてきました。
Active Directoryはオンプレミスに設置し、組織内に閉じた使い方をするのが前提のディレクトリサービスです。しかし近年では、クラウドサービスの利用の拡大や、テレワークの普及によって、オンプレミスのディレクトリサービスではカバーし切れないケースが出てきました。
そこで、ID管理自体もクラウド化する流れが加速しています。この分野でよく利用されているのが、Microsoft Azure
なおAzure ADは、今後
Azure ADのセットアップ
Azureにサインアップ済みであること、またAzure ADを設定できるだけの組織の権限を持っていることを前提に解説します。
Azure Portalにログインしたら、左側サイドペインの

アプリケーションの名前を入力します。ここでは

アプリの登録ができたら、左側サイドペインの

「概要」

続いて

最後にAzureのサービスの


これでAzure AD側のセットアップは完了です。
aad-authのセットアップ
続いてログインするUbuntu側を設定しましょう。これはsudoできるローカルユーザーでログインして作業します。
以下のコマンドを実行して、libpam-aad
」libnss-aad
」/etc/
に、aad
を利用する設定が追記されます。
$ sudo apt install -y libpam-aad libnss-aad
続いて、以下のコマンドを実行します。これはネットワークユーザーがUbuntuにはじめてログインした際に、自動的にホームディレクトリを作成する設定です。
$ sudo pam-auth-update --enable mkhomedir
最後にAzure ADアプリケーションの設定を行います。/etc/
をテキストエディタで開いてください。
以下のように、ファイル冒頭にtenant_
」app_
」#
」
### required values
## See https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal
## for more information on how to set up an Azure AD app.
# tenant_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# app_id = yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
以上で設定は終了です。OSの再起動などは必要ありません。
Azure ADを使ったUbuntuへのログイン
一度Ubuntuからログアウトし、ログイン画面を表示してください。Azure ADのユーザーはローカルに存在しないため、ユーザー一覧に表示されません。そこでここで

続いてAzure ADのパスワードを入力すれば、Ubuntuにログインすることが可能です。

なおAzure ADによる認証は、GUIでのログインだけでなく、SSH経由のログインでも利用できます。そのためサーバーのユーザーをAzure ADで管理するといった用途にも使えます。
オフライン認証
先ほど編集した/etc/
には、以下のような設定がありました。
# offline_credentials_expiration = 90 ; duration in days a user can log in without online verification
コメントに書かれている通り、これはユーザーがオンライン認証なしでログインできる期間です。一度オンライン認証をパスしてログインに成功すると、aad-auth
はその情報を/var/
以下に、ここで設定された日数が経過するまでキャッシュします。そしてキャッシュが有効な間は、改めてオンライン認証をせずとも、ログインできるのです。これによって強制的にオフラインになってしまう場所、例えば飛行機での移動中や、知床の山中でも、オンラインIDでUbuntuを使えるというわけです。
キャッシュの有効期限は、デフォルトで90日となっています。変更したい場合は、この行のコメントを解除した上で、数値を書き換えてください。またここに負数を設定すると、オフライン認証自体を無効にすることができます。
なおキャッシュが切れた状態でオフライン認証を行おうとすると、当然アクセスは拒否されます。例えばキャッシュの保持期限を1日に設定した状態で、2023-08-03 09:45:19
に一度オンラインで認証を行った後、2023-08-04 11:35:20
にオフライン認証を試みた際のログが以下のものです。
8月 04 11:35:20 lunar gdm-password][6169]: pam_aad(gdm-password:auth): try to authenticate "mizuno@hoge.onmicrosoft.com" from cache
8月 04 11:35:20 lunar gdm-password][6169]: pam_aad(gdm-password:auth): getting user information from cache for "mizuno@hoge.onmicrosoft.com"
8月 04 11:35:20 lunar gdm-password][6169]: pam_aad(gdm-password:auth): Last online login was: 2023-08-03 09:45:19 +0900 JST. Current time: 2023-08-04 11:35:20.316946207 +0900 JST m=+14.465847911.
8月 04 11:35:20 lunar gdm-password][6169]: pam_aad(gdm-password:auth): Online revalidation needed every 1 days
8月 04 11:35:20 lunar gdm-password][6169]: pam_aad(gdm-password:auth): authenticating user "mizuno@hoge.onmicrosoft.com" from cache failed: offline credentials expired. Denying access.
「offline credentials expired. Denying access
」
aad-cli
でAzure ADの構成を確認する
Azure ADの現在の構成は、aad-cli
コマンドで確認することができます。
「aad-cli config
」
$ aad-cli config [default] tenant_id = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx app_id = yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy offline_credentials_expiration = 90 homedir = /home/%f shell = /bin/bash
「aad-cli user
」
$ aad-cli user login = mizuno@hoge.onmicrosoft.com password = x uid = 2976482976 gid = 2976482976 gecos = home = /home/mizuno@hoge.onmicrosoft.com shell = /bin/bash last_online_auth = 2023-08-04T11:40:09+09:00 shadow_password =
--all
オプションをつけると、全ユーザーをリスト表示します。
$ aad-cli user --all mizuno@hoge.onmicrosoft.com (...略...)
その他、より詳しくはaad-cli
のヘルプを参照してください。
トラブルシューティング
この手の設定作業を行っていると、慣れないうちはAzure側の設定不備などで、うまくログインができないといったトラブルに遭遇しがちです。筆者も遭遇しました。このような時のトラブルシューティング方法を紹介します。
まずpam_
のデバッグログを有効化しましょう。/etc/
を以下のように書き換えてください。
auth [success=1 default=ignore] pam_aad.so
↓
auth [success=1 default=ignore] pam_aad.so debug
その状態でログインを試行してみましょう。出力されたエラーログは、journalctl
コマンドで参照できます。
$ journalctl -b0 | grep pam_aad
Azure側からエラーコードが返ってきていたら、そのエラーコードの意味を調べましょう。これはMicrosoftのエラーコードの確認ページにエラーコードを入力することで、調べることが可能です。
例えば筆者の場合、以下のようなエラーがログに出力されていました。
8月 02 10:52:02 lunar gdm-password][1863]: pam_aad(gdm-password:auth): Connecting to "https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", with clientID "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" for user "mizuno@hoge.onmicrosoft.com"
8月 02 10:52:02 lunar gdm-password][1863]: pam_aad(gdm-password:auth): Unknown error code(s) from server: [65001]
調べてみたところ、エラーコード65001は