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 requiredauth sufficient이전과 이후를 @include common-auth하지만 그들은 인증이없는 사용자의 모든 결과는 암호를 묻는되는 및 인증 때로는 사용자는 암호를 요청 받고.

누구든지이 작업을 수행하는 레시피가 있습니까?

answer

여기 내 작업 구성이 있습니다. 일부 사용자는 인증자가 활성화되어 있고 일부는 활성화되어 있지 않으며 공개 키가 있는 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 키로 루트 로그인을 허용하지 않습니다. SSH 로그

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

이것은 SSH의 Google Authenticator PAM이 2FA 없이 루트 로그인을 차단하는 데 설명되어 있습니다 .

위와 같이 작동 하면 @zoredache가 제안한 대로 SSH 구성을 사용하여 특정 그룹에 대해 2FA를 적용하는 것이 실제로 더 낫다고 생각합니다. 이를 통해 2FA도 필요하지 않은 특정 IP를 쉽게 화이트리스트에 추가할 수 있습니다. 이 경우 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

나는 당신이 @include common-auth. 또는 적어도 나는하지 않았고 올바르게 작동하는 것처럼 보였습니다. 그러나 나는 여전히 대부분 이것을 테스트하고 있습니다.

Does anyone have a recipe to make this work?

그것을 쉘 스크립트로 번역할 시간이 없지만 이것은 저에게 효과가 있는 것으로 보이는 가능한 플레이북의 일부입니다. 나는 당신이 가능한 것을 사용하지 않더라도 이것이하는 일을 따라갈 수 있어야한다고 생각합니다.

- 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