GNOME: 잠금 화면 및 로그인에 대한 다양한 PAM 구성

GNOME: 잠금 화면 및 로그인에 대한 다양한 PAM 구성

최근에 U2F 보안 키를 구입했으며 로그인하려면 키와 일반 비밀번호를 사용한 인증을 요구하도록 Ubuntu 18.04 시스템을 성공적으로 구성했습니다. 다음과 같이 인증 구성을 변경하고 싶습니다.

  1. 처음으로 내 컴퓨터에 로그인할 때 비밀번호를 입력하고 U2F 키를 삽입해야 합니다.
  2. 로그인된 기계를 잠글 때 U2F 키를 삽입하면 잠금이 해제됩니다.

일반 그놈 잠금화면에서도 가능합니까? 그렇다면 어떤 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 구성을 사용하면 첫 번째 로그인(아직 로그인하지 않음)과 잠금 해제 또는 두 번째 로그인을 구별하는 데에도 사용할 수 있습니다( 이미 로그인했습니다.) 그것이 내리는 선택은 완벽하지는 않지만 귀하의 요구에 충분할 수 있습니다.

한 가지 중요한 주의 사항은 이 모듈이 X 세션을 인식하지 못하고 터미널 세션만 인식한다는 것입니다(tty 장치의 소유권을 확인하고 X 세션에는 소유권이 없으므로 결국 /dev/:0존재하지 않는 장치를 찾게 됩니다). 실제로 이는 X 세션에서 터미널이 열려 있으면(그리고 screen이나 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

이제 두 줄을 추가할 수 있습니다/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

첫 번째 줄은 활성 및 잠긴 세션이 있는 경우에만 지문 인증을 허용합니다(따라서 로그인 화면에는 적용되지 않음). 두 번째 줄은 pam 모듈이 실패 시 영원히 기다리게 하므로 gdm이 루프에 들어가거나 오류를 표시하지 않습니다.

관련 정보