GNOME:ロック画面とログイン用のさまざまなPAMの設定

GNOME:ロック画面とログイン用のさまざまなPAMの設定

最近U2Fセキュリティキーを購入し、ログインするには、キーと通常のパスワードを使用して認証を要求するようにUbuntu 18.04システムを正常に設定しました。次のように認証設定を変更したいと思います。

  1. 初めて自分のコンピュータにログインするときは、パスワードを入力してU2Fキーを挿入する必要があります。
  2. ログインしたマシンをロックするときにU2Fキーを挿入すると、ロックが解除されます。

一般的なGNOMEロック画面でも可能ですか?では、どのpam構成を編集する必要がありますか?

これまで私が変更した唯一のことは追加することです。

auth    required  pam_u2f.so

/etc/pam.d/gdm-passwordにアクセスしてダウンロードします。

@include common-auth

答え1

gdm-passwordGNOMEはログインおよびロック解除のPAMサービス名として使用されるため、PAMでは区別できません。これを行うには、GNOME Shellのカスタムビルドを作成する必要があります。js/gdm/util.js状況に応じて異なるサービス名を使用してください。これを行うと、彼らに宣伝するのに非常に便利な機能になります。

答え2

上記の pam_alreadyloggedin よりも優れた解決策として、カスタムスクリプトを使用して現在のセッションがロックされていることを確認し、それに応じて動作を変更することもできます。これには、次のものを使用できます。pam_script基準寸法。たとえば、pam構成に次のように入力します。

# Skip regular password checks when there is a current session and it is
# locked. This skips a number of modules from common-auth when
# succesful, so this breaks when extra primary modules are added there,
# but this seems to be the only way (using success=done prevents
# optional post-auth modules from running).
auth [success=2 default=ok] pam_script.so dir=/etc/pam.d/is-current-session-locked     

@include common-auth

auth    required  pam_u2f.so

次に、次の名前のスクリプトを生成し/etc/pam.d/is-current-session-locked/pam_script_authて実行可能にします。

#!/bin/sh                                                                                               

if [ -z "$XDG_SESSION_ID" ]; then
        return 1                                                                                        
fi
if ! loginctl show-session "$XDG_SESSION_ID" | grep '^LockedHint=yes$' > /dev/null; then                
        return 1
fi

# Current session is locked, return success
return 0

スクリプトはログインセッションIDがあることを確認し、セッションがロックされているかどうかloginctlに尋ねます。デスクトップがロックされているときにログインを通知するためにデスクトップ環境が必要ですが、Gnomeがこれを行うようです(少なくともUbuntu Discoでは)。

答え3

考えられる解決策は、次を使用することです。pam_すでにログインしています基準寸法。これは通常、他のttyにすでにログインしている場合はパスワードのないログインに使用されますが、いくつかのクリエイティブなpam設定では、最初のログイン(まだログインしていない)とロック解除または2番目のログインを区別するためにも使用できます(すでにログインしました。)それがする選択は完璧ではありませんが、あなたのニーズには十分かもしれません。

1つの重要な注意点は、このモジュールがXセッションを認識せず、端末セッションのみを認識することです(ttyデバイスの所有権を確認し、Xセッションに所有権がないため、最終的に存在しない/dev/:0デバイスを見つけることができます)。実際には、Xセッションで端末が開いていると(そしてスクリーンまたはtmuxがバックグラウンドで実行されている場合)、ログインしていることを認識します。

次のようなものがあなたのユースケースに適していると思います。

# Skip regular password checks when already logged in (i.e. also when
# unlocking). This skips a number of modules from common-auth when
# succesful, so this breaks when extra primary modules are added there,
# but this seems to be the only way (using success=done prevents
# optional post-auth modules from running).
auth [success=2 default=ok] pam_alreadyloggedin.so debug

@include common-auth

auth    required  pam_u2f.so

common-authファイルに含まれる内容によっては調整が必要になる場合があります。

答え4

XDG_SESSION_ID変数がUbuntu 22.04 LTSに設定されていないため、Matthijs Kooijmanの回答を調整する必要がありました。

/etc/pam.d/is-logged-inスクリプトを作成しました。

#!/bin/sh

TTY=$(basename "$PAM_TTY")
SESSION_ID=$(loginctl list-sessions --no-legend | grep -Ei "$TTY$" | head -n1 | cut -d' ' -f1)

if loginctl show-session "$SESSION_ID" | grep '^LockedHint=yes$' >/dev/null; then
    echo "Session $SESSION_ID is locked."
    return 0
else
    echo "Session $SESSION_ID is unlocked."
    return 1
fi

次に実行可能としてマークします。sudo chmod +x /etc/pam.d/is-logged-in

これで2行を追加できます/etc/pam.d/gdm-fingerprint

 auth   required        pam_succeed_if.so user != root quiet_success
+auth [success=1 default=ignore] pam_exec.so quiet seteuid /etc/pam.d/is-logged-in
+auth required pam_exec.so /bin/sleep infinity 
 auth   required        pam_fprintd.so

最初の行は、アクティブなセッションとロックされたセッションがある場合にのみ指紋認証を許可します(したがってログイン画面には適用されません)。 2行目はpamモジュールが失敗したときに永遠に待機するため、gdmがループに入ったりエラーを表示したりしません。

関連情報