Tentando obter SSH com chave pública (sem senha) + autenticador do google trabalhando no Ubuntu 14.04.1

20

Estou usando o Ubuntu 14.04.1 (com OpenSSH 6.6 e libpam-google-authenticator 20130529-2).

Estou tentando configurar logins SSH onde a chave pública é autenticada (sem senha) e um usuário é solicitado a fornecer um código do Authenticator do Google.

Seguir / adaptar essas instruções me deu um prompt de senha e um prompt de autenticação do Google:

Instalei o pacote, editei meus arquivos /etc/ssh/sshd_confige/etc/pam.d/ssh

Em /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

e na parte inferior de /etc/pam.d/ssh:

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

Eu sei que o PAM depende da ordem, mas sshd_configtambém é ?

O que estou fazendo errado? Qualquer ajuda seria apreciada.

JT.
fonte

Respostas:

28

Tê-lo funcionando bem, primeiro fez:

apt-get install libpam-google-authenticator

Em /etc/pam.d/sshdeu mudei / adicionei as seguintes linhas (na parte superior):

# @include common-auth
auth required pam_google_authenticator.so

E em /etc/ssh/sshd_config:

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

Funciona bem e agora recebo um prompt "Código de verificação" após autenticação com chave pública. Não sei como permitir a autenticação com senha + token OU chave + token, pois agora removi efetivamente o método de autenticação de senha do PAM.

Usando o Ubuntu 14.04.1 LTS (GNU / Linux 3.8.0-19-genérico x86_64) com ssh -v: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 de janeiro de 2014

Linus Kendall
fonte
Então, pelo bem da posteridade, percebi o meu problema. Eu também tentei PasswordAuthentication no, mas não foi isso. O problema é / era que eu tinha / tem ControlMaster autoe ControlPathdirectivas em meu arquivo ~ / .ssh / config. Eu queria ter certeza de não me trancar, para que eu sempre deixasse uma sessão SSH aberta. Como meu computador apenas os reutilizava, eu sempre entrava sem o sistema pedindo um token. Marquei sua resposta como correta, pois alguém que a seguisse obteria uma configuração de trabalho. Obrigado!
JT.
2
Estou usando CentOS 7. Eu tenho PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactive, e UsePAM yesno sshd_config. Ele valida minha chave e, em seguida, solicita meu token do Google Authenticator e também solicita minha senha. Me faz fazer os três - não posso pular nenhum deles. Eu também tentei AuthenticationMethods publickey,keyboard-interactive:pamconforme sugerido pela página de manual, mas isso não mudou nada. Alguma ideia?
Nick Williams
6
@NickWilliams Eu estava tendo o mesmo problema. O que o corrigiu foi que eu precisava elogiar a @include common-authlinha que as respostas mostram. Eu apenas pensei que era um comentário para a pam_google_authenticatorlinha em /etc/pam.d/sshd no começo.
freb 27/02
5
Obrigado! Minha solução não era exatamente a mesma (eu precisava comentar auth substack password-auth), mas seu comentário resolveu meu problema!
Nick Williams
7

Eu finalmente consegui colocar isso em funcionamento, colocando auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullokno topo /etc/pam.d/sshd.

De acordo com a página de manual pam.d :

  • success=done significa que, se o Google Authenticator sair, não será mais realizada a autenticação, o que significa que não haverá solicitação de senha adicional.
  • default=die significa que, se o Google Authenticator rejeitar a tentativa de login, a autenticação falhará imediatamente, ignorando o prompt de senha.

Assim, [success=done new_authtok_reqd=done default=die]é uma espécie de mistura entre os valores de controle sufficiente requisite, já que queremos um comportamento de ambos: se o sucesso for finalizado imediatamente (suficiente) e se o fracasso também for finalizado imediatamente (requisito).

Observe que o nullokargumento pam_google_authenticator.so significa que, se um ~/.google_authenticatorarquivo não for encontrado para um usuário, a autenticação de chave pública continuará normalmente. Isso é útil se eu quiser bloquear apenas um subconjunto de minhas contas com o 2FA.

bluegate010
fonte
6

A resposta de Linus Kendall deve funcionar em sistemas mais antigos, mas em máquinas Linux mais recentes é problemática; no meu servidor web baseado em arch linux, essa configuração resulta em pam solicitando meu código de autenticador e minha senha após receber minha chave ssh (ou seja, preciso dos 3).

Uma solução mais simples que evita esse problema e deve funcionar em todos os sistemas é alterar a entrada /etc/pam.d/sshdpara:

auth sufficient pam_google_authenticator.so

E então, faça as mesmas edições em `` / etc / ssh / sshd` que Linus mencionou:

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

Isso deve solicitar seu token de autenticador após o servidor aceitar sua chave pública. Não deve solicitar sua senha.

Como observação lateral, se você deseja ter uma conta de usuário sftp, provavelmente precisará ignorar o Google Authenticator para fazê-la funcionar. Aqui está uma sugestão de como fazer isso com segurança usando uma prisão sftp. Em etc/ssh/sshd_config:

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

Você precisará fazer as permissões somente na gravação raiz de / path / to / ftp / dir (por exemplo chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dirtodos os pais acima desse diretório também precisam de permissões seguras. A maneira como costumo fazer isso é criar o diretório chroot /home/shared/user, criando um diretório diretório lá (por exemplo, 'dados') e, em seguida, montando qualquer diretório que eu queira compartilhar assim:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

Se você seguir todas essas etapas, terá uma chave pública + login do autenticador do google para seus usuários ssh e uma conta sftp protegida por senha funcional para transferência de dados.

Mike Dacre
fonte
Isso funciona muito bem. E como, por algum motivo, não me sinto à vontade para comentar a autenticação comum, isso foi mais ideal do que a solução de Linus.
Luke Sapan
Muito obrigado! desperdiçado uma noite depuração ssh, perguntando por que eu ainda tenho que digitar senha após pubkey + authcode ......
felix021