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

.google_authenticator 파일이 없는 사용자가 계속 로그인되도록 올바른 PAM 구성을 수행할 수 없었습니다. 사용하는 항목에 따라 사용자에게 비밀번호를 입력하라는 메시지가 표시되거나(비밀번호가 없음) 표시되지 않습니다. 전혀 허용되지 않습니다.

/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 required또한 이전 auth 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통과 대신 무시를 반환함).

여전히 ssh 키를 사용한 루트 로그인은 허용되지 않습니다. SSHD 로그

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

이에 대해서는 다음에서 논의됩니다.SSH의 Google Authenticator PAM은 2FA 없이 루트 로그인을 차단합니다..

위와 같이 작동하게되면, @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. 아니면 적어도 나는 그렇게 하지 않았는데 제대로 작동하는 것 같았습니다. 그러나 나는 아직도 주로 이것을 테스트하고 있습니다.

이 작업을 수행할 수 있는 레시피가 있는 사람이 있나요?

이를 쉘 스크립트로 번역할 시간이 없지만 이것은 나에게 적합한 것으로 보이는 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

관련 정보