使用 google 身份驗證器進行 SSH 公鑰驗證仍然要求輸入密碼

使用 google 身份驗證器進行 SSH 公鑰驗證仍然要求輸入密碼

我正在嘗試使用 libpam-google-authenticator 透過 ssh 啟用 2FA。並非所有使用者都需要啟用身份驗證器。每個人都使用 ssh 公鑰,但沒有人有密碼。我正在運行 Debian buster,並且還嘗試了 bullseye 的 libpam-google-authenticator。

我的問題是,無論我在 PAM 配置中添加什麼,未啟用身份驗證器的用戶永遠不會直接登錄,但總是要求輸入密碼

我已經安裝了 libpam-google-authenticator 並配置了 /etc/ssh/sshd_config:

PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no
PermitEmptyPasswords no

我無法計算出正確的 PAM 配置,以便沒有 .google_authenticator 檔案的使用者仍然可以登入。

在 /etc/pam.d/sshd 中我嘗試過(像這樣嘗試在 Ubuntu 14.04.1 上使用公鑰(無密碼)+ google 身份驗證器取得 SSH):

#@include common-auth
auth       required     pam_google_authenticator.so debug nullok

在這種情況下,沒有身份驗證器設定的使用者將透過以下偵錯被拒絕;

Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: start of google_authenticator for "<user>"
Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: end of google_authenticator for "<user>" Result: The return value should be ignored by PAM dispatch
Aug 05 15:11:18 <host> sshd[746620]: error: PAM: Permission denied for <user> from <IP>

是否pam_permit需要設定後備案例?

我還嘗試了auth requiredauth sufficient之前和之後的各種組合@include common-auth,但它們都會導致沒有身份驗證器的用戶被要求輸入密碼,有時帶有身份驗證器的用戶也會被要求輸入密碼。

有人有一個食譜可以讓這個工作嗎?

答案1

這是我的工作配置。有些使用者啟用了身份驗證器,有些則沒有,只允許使用公鑰進行 SSH 登錄,而不允許使用密碼。

在 /etc/ssh/sshd_config 中,

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PermitEmptyPasswords no

在/etc/pam.d/sshd中,

# Standard Un*x authentication.
#@include common-auth

# Require authenticator, if not configured then allow
auth    required    pam_google_authenticator.so debug nullok
auth    required    pam_permit.so

@include comon-auth必須停用,因為它包含我不想使用的 pam_unix。然後,您需要pam_permit使沒有身份驗證器的使用者身份驗證成功(pam_google_authenticator返回忽略而不是通過)。

這仍然不允許 root 使用 ssh 金鑰登入; sshd 日誌

sshd[1244501]: fatal: Internal error: PAM auth succeeded when it should have failed

這是在SSH 上的 Google Authenticator PAM 會在沒有 2FA 的情況下阻止 root 登入

如上所述工作後,我認為按照 @zoredache 的建議,使用 SSH 配置對某些群組強制執行 2FA 實際上更好。這使您可以輕鬆地將某些 IP 列入白名單,因為也不需要 2FA。在這種情況下,sshd_config 例如說

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
#AuthenticationMethods any # default
PermitEmptyPasswords no

Match Group adm Address *,!172.16.1.0/24
    AuthenticationMethods publickey,keyboard-interactive

和 /etc/pam.d/ssh 說

 Standard Un*x authentication.
#@include common-auth

# Require authenticator; SSH should not allow any user in who doesn't have it
auth       sufficient   pam_google_authenticator.so debug nullok
auth       requisite    pam_deny.so

答案2

我認為您不需要或不想註解掉@include common-auth.或者至少我沒有,而且它似乎工作正常。但我仍然主要對此進行測試。

有人有一個食譜可以讓這個工作嗎?

沒有時間為您將其翻譯為 shell 腳本,但這是 ansible 劇本的摘錄,似乎對我有用。我懷疑即使你不使用 ansible,你也應該能夠理解它正在做什麼。

- hosts: linux_systems
  tasks:

  - name: Add group 'totp'
    group:
      name: totp
      state: present
      system: yes

  - name: Create directory for totp secrets
    file:
      state: directory
      path: /var/lib/google-authenticator
      owner: "0"
      group: "0"
      mode: "0700"

  - name: install libpam-google-authenticator
    apt:
      update_cache: yes
      cache_valid_time: '{{ apt_cache_valid_time | default(7200) }}'
      state: present
      name:
      - libpam-google-authenticator

  - name: Create secret for 'example-user'
    args:
      creates: /var/lib/google-authenticator/example-user
    shell: |
      TOTP_USER=example-user; \
      google-authenticator \
        --force --quiet \
        --emergency-codes=10 \
        --time-based \
        --qr-mode=none \
        --allow-reuse \
        --window-size=3 \
        --rate-limit=4 --rate-time=30 \
        --secret=/var/lib/google-authenticator/${TOTP_USER}

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/login
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/sshd
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update sshd ChallengeResponseAuthentication
    notify: Restart sshd
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: '^ChallengeResponseAuthentication .*'
      line: 'ChallengeResponseAuthentication yes'

  handlers:

  - name: Restart sshd
    service:
      name: sshd
      state: restarted

相關內容