web-dev-qa-db-ja.com

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
2
Warmar

GNOMEはログインとロック解除の両方のPAMサービス名としてgdm-passwordを使用するため、PAMでそれらを区別することはできません。これを行うには、GNOME Shellのカスタムビルドを作成する必要があります。具体的には、コンテキストに応じて異なるサービス名を使用するように js/gdm/util.js を編集します。これは、あなたがそれを行う場合、彼らにPRするための非常に便利な機能になるでしょう。

考えられる回避策は、 pam_alreadyloggedin モジュールを使用することです。これは通常、別のttyに既にログインしている場合にパスワードなしでログインするために使用されますが、一部のクリエイティブなpam構成では、最初のログイン(まだログインしていない)とロック解除または2回目のログイン(まだログインしていない)を区別するためにも使用できます。ログイン済み)。それが行う選択は完全ではありませんが、ニーズには十分かもしれません。

大きな注意点の1つは、モジュールがXセッションを認識せず、ターミナルセッションのみを認識することです(Xセッションにないttyデバイスの所有権をチェックするため、存在しない/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ファイルに含まれる内容によっては、これを調整する必要がある場合があります。

0

(上記で提案した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にセッションがロックされているかどうかを確認します。これには、デスクトップがロックされたときにlogindに通知するデスクトップ環境が必要ですが、Gnomeがこれを行っているようです(少なくともUbuntu Discoでは)。

0