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_permit
necessá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-auth
deve ser desabilitado porque inclui pam_unix, que não quero usar. Então você precisa pam_permit
tornar a autenticação bem-sucedida para usuários sem autenticador (para os quais pam_google_authenticator
os 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