Autenticação de dois fatores SSH (2FA) com um yubikey


12

Então, eu tenho esse pequeno yubikey e quero adicionar uma camada adicional de segurança ao autenticar sessões ssh. No lado do servidor, já desabilitei a autenticação por senha e só permiti o uso de chaves ssh ao efetuar login.

O problema é que, depois de configurar o sshd e o PAM para a autenticação do yubikey, o sshd ainda exige apenas uma chave ssh, nunca me pedem para fornecer uma resposta do yubikey.

Como eu exijo as teclas ssh e yubikey?

(ubuntu 14.04 - trusty)

/etc/pam.d/common-auth:

auth    required    pam_yubico.so mode=client try_first_pass id=<id> key=<secret>
auth    [success=1 default=ignore]  pam_unix.so nullok_secure try_first_pass
# here's the fallback if no module succeeds
auth    requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth    required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth    optional            pam_cap.so
# end of pam-auth-update config

/etc/ssh/sshd_config:

...

PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes

Aliás, se você não receber uma resposta satisfatória em alguns dias, faça um ping e eu colocarei uma recompensa saudável nessa questão. Tenho representante para gravar, e também estou interessado nesta resposta. :)
— EEAA

Respostas:


4

Ok, continuei e acho que encontrei uma solução razoável. A principal coisa que eu estava perdendo anteriormente era do sshd AuthenticationMethods publickey,password. Isso reforça o requisito de uma chave pública e uma senha - a "senha" está sendo manipulada agora PAM->auth-yubi. Alterações adicionais também foram necessárias, veja abaixo:

(ubuntu 14.04 - confiável):

/etc/pam.d/yubi-auth

auth    required pam_yubico.so mode=client try_first_pass id=<id> key=<key>

Nota: você pode obter seu ID de acesso e chave secreta aqui

/etc/pam.d/sshd

# Standard Un*x authentication.
#@include common-auth

# Yubikey auth
@include yubi-auth

/ etc / ssh / sshd_config

UsePAM yes
ChallengeResponseAuthentication no
AuthenticationMethods publickey,password
PasswordAuthentication yes

service ssh restart

Verificação

SSH de um host remoto sem uma chave pública

root@0a6442bcb21c:/# ssh ben@192.168.1.20
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is ea:2a:e3:98:35:72:66:b1:e0:65:6b:3f:60:8a:af:ab.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
Permission denied (publickey).

SSH de um host remoto com uma chave pública

$ ssh ben@192.168.1.20
Authenticated with partial success.
ben@192.168.1.20's password:
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-33-generic x86_64)

Melhoria

Seria bom ver "Yubikey Auth:" em vez de "password:" no servidor ssh remoto ao autenticar.

O que acontece quando o servidor ssh não consegue entrar em contato com o sistema de verificação de autenticação do yubico? Uma solução ideal seria totalmente independente.

Comentários e sugestões apreciados.


2

Configurar o 2FA com o Yubikey pode ser complicado ( apesar de existir um patch openssh para o U2F ), mas a maneira mais fácil é provavelmente a descrita no site oficial do Yubico .

É basicamente a maneira de armazenar sua chave privada no Yubikey e protegê-la com PIN. Não é exatamente o 2FA que você descreve (mas é algo que você tem e o que você sabe ), mas aumenta ainda mais a segurança (o Yubikey bloqueia após algumas tentativas malsucedidas).

TL: DR;

OPENSC_LIBS=`locate opensc-pkcs11.so`
yubico-piv-tool -s 9a -a generate -o public.pem
yubico-piv-tool -a verify-pin -P 123456 -a selfsign-certificate -s 9a \
  -S "/CN=SSH key/" -i public.pem -o cert.pem
yubico-piv-tool -a import-certificate -s 9a -i cert.pem
ssh-keygen -D $OPENSC_LIBS/opensc-pkcs11.so -e
ssh -I $OPENSC_LIBS/opensc-pkcs11.so user@remote.example.com

" Acredito que o módulo pam é capaz de autenticar apenas os Yubikeys locais, e não os que usam ssh " - não sei bem o que você quer dizer com isso. Você quer dizer que um Yubikey não pode ser usado para autenticar em um servidor ssh remoto via PAM?
— MadHatter

Sim. Porque ele precisa da maneira de se comunicar com o yubikey e provavelmente é feito usando alguma biblioteca local. Não há código para isso no ssh.
— Jakuje

Isso está definitivamente errado. Eu configurei meus servidores remotos para aceitar autenticação baseada em yubikey no modo nativo yubikey e no modo OATH . O objetivo principal de um yubikey é fornecer uma cadeia curta (ish) para transmitir por um canal potencialmente inseguro, para atuar como uma senha descartável. Se o yubikey tivesse que ser fisicamente conectado ao sistema ao qual estava se autenticando, seria muito menos útil. Eu acho que você está errado sobre o bloqueio yubikey no modo PKCS também.
— MadHatter

OK, você está certo. Para o modo OTP é possível. Mas o bloqueio faz parte do padrão PKCS11.
— Jakuje

1
Obrigado por isso. Considero que a sua resposta é muito melhor para as melhorias e removerei o meu voto negativo.
— MadHatter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.