A autenticação de chave pública SSH com o Google Authenticator ainda pede senha

A autenticação de chave pública SSH com o Google Authenticator ainda pede senha

Estou tentando habilitar 2FA com ssh usando libpam-google-authenticator. Nem todos os usuários precisam do autenticador habilitado. Todo mundo usa chaves públicas ssh e ninguém tem senha. Estou executando o Debian buster e também tentei o libpam-google-authenticator do bullseye.

Meu problema é que não importa o que eu coloquei na configuração do PAM,usuários sem autenticador habilitado nunca fazem login direto, mas sempre pedem uma senha.

Instalei libpam-google-authenticator e configurei /etc/ssh/sshd_config com:

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

Não consegui definir a configuração correta do PAM para que os usuários sem um arquivo .google_authenticator ainda estejam logados. Dependendo do que eu uso, os usuários serão solicitados a fornecer uma senha (eles não têm uma) ou não permitido entrar.

Em /etc/pam.d/sshd eu tentei (assimTentando obter SSH com chave pública (sem senha) + autenticador google funcionando no Ubuntu 14.04.1):

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

Nesse caso, os usuários sem configuração de autenticador serão rejeitados com a seguinte depuração;

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_permitnecessário configurar o caso substituto?

Eu também tentei várias combinações de antes e depois auth required, mas todas elas resultaram na solicitação de uma senha aos usuários sem autenticador e, às vezes, aos usuários COM autenticador também sendo solicitada uma senha.auth sufficient@include common-auth

Alguém tem uma receita para fazer isso funcionar?

Responder1

Aqui está minha configuração de trabalho. Alguns usuários têm o autenticador habilitado e outros não, e apenas logins SSH com chaves públicas são permitidos, nunca senhas.

Em /etc/ssh/sshd_config,

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

Em /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-authdeve ser desabilitado porque inclui pam_unix, que não quero usar. Então você precisa pam_permittornar a autenticação bem-sucedida para usuários sem autenticador (para os quais pam_google_authenticatoros retornos são ignorados em vez de aprovados).

Isso ainda não permite o login do root com uma chave ssh; registros sshd

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

Isto é discutido emGoogle Authenticator PAM em SSH bloqueia login root sem 2FA.

Tendo feito isso funcionar como acima, acho que é realmente melhor aplicar 2FA para determinados grupos usando a configuração SSH como sugerido por @zoredache. Isso permite facilmente que você coloque certos IPs na lista de permissões, pois também não exige 2FA. Neste caso, sshd_config diz, por exemplo

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

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

e /etc/pam.d/ssh diz

 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

Responder2

Eu não acho que você precise ou queira comentar o arquivo @include common-auth. Ou pelo menos não o fiz e pareceu funcionar corretamente. Mas ainda estou testando isso principalmente.

Alguém tem uma receita para fazer isso funcionar?

Não tenho tempo para traduzi-lo para um script de shell para você, mas este é um trecho de um manual ansible que parece funcionar para mim. Eu suspeito que você deve ser capaz de acompanhar o que isso está fazendo, mesmo se não estiver usando o 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

informação relacionada