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

19

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

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

Seguir / adaptar essas instruções recebeu um aviso de senha, bem como um prompt do Google Auth:

Eu instalei o pacote, editei meus arquivos /etc/ssh/sshd_config e /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 do pedido, mas é sshd_config também?

O que estou fazendo de errado? Qualquer ajuda seria apreciada.

    
por JT. 19.09.2014 / 17:42

3 respostas

27

Trabalhe bem, primeiro fiz:

apt-get install libpam-google-authenticator

Em /etc/pam.d/sshd alterei / adicionei as seguintes linhas (no topo):

# @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 a autenticação com chave pública. Não tenho certeza de 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

    
por 29.09.2014 / 21:19
7

Finalmente, consegui que isso funcionasse colocando auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullok no topo de /etc/pam.d/sshd .

De acordo com a página man pam.d :

  • success=done significa que, se o Google Authenticator for desativado, nenhuma outra autenticação será realizada, o que significa que não há 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.

Portanto, [success=done new_authtok_reqd=done default=die] é uma mistura entre os valores de controle sufficient e requisite , pois queremos comportamento de ambos: se sucesso, terminar imediatamente (suficiente) e, se falhar, também terminar imediatamente (requisito) .

Observe que o argumento nullok para pam_google_authenticator.so significa que, se um arquivo ~/.google_authenticator 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 2FA.

    
por 09.02.2016 / 02:07
6

A resposta de Linus Kendall deve funcionar em sistemas mais antigos, mas em máquinas Linux mais recentes é problemático; no meu servidor web baseado em arch linux, a configuração resulta em pam pedindo meu código autenticador e minha senha depois de receber minha chave ssh (ou seja, eu preciso de todos os 3).

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

auth sufficient pam_google_authenticator.so

E, em seguida, para fazer as mesmas edições em '' / etc / ssh / sshd 'que Linus mencionou:

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

Isso deve pedir seu token autenticador depois que o servidor aceitar sua chave pública. Não deve pedir sua senha.

Como uma nota lateral, se você deseja ter uma conta de usuário sftp, provavelmente será necessário ignorar o google authenticator para fazê-lo funcionar. Aqui está uma sugestão de como fazer isso com segurança usando uma cadeia 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 em / path / to / ftp / dir root somente (por exemplo, chown root:root /path/to/ftp/dir , chmod 755 /path/to/ftp/dir . Todos os pais acima desse diretório também precisam de permissões seguras. A maneira como eu costumo fazer isso é fazendo o diretório chroot /home/shared/user , criando um diretório lá (eg 'data') e então 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, você terá login de chave pública + google authenticator para seus usuários ssh e uma conta sftp protegida por senha funcional para transferência de dados.

    
por 04.12.2015 / 21:24