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
ben lemasurier
fonte
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 [email protected]
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 [email protected]
Authenticated with partial success.
[email protected]'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.

ben lemasurier
fonte
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 [email protected]
Jakuje
fonte
" 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