带有yubikey的SSH两因素身份验证(2FA)


12

因此,我拥有了一个小巧的yubikey,并且我想在验证ssh会话时添加一个额外的安全层。在服务器端,我已经禁用了密码身份验证,并且仅允许登录时使用ssh密钥。

问题是,在为yubikey auth配置sshd和PAM之后,sshd仍然只需要一个ssh密钥,而我从未被要求提供yubikey的响应。

如何同时要求ssh key 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

顺便说一句,如果您在几天内没有得到满意的答复,请ping我,我将对这个问题给予健康的悬赏。我有专人负责,而且对此答案也很感兴趣。:)
EEAA 2015年

Answers:


4

好的,我一直坚持下去,我认为我已经提出了一个合理的解决方案。我以前想念的主要东西是sshd AuthenticationMethods publickey,password。这对公共密钥密码都提出了要求-现在由来处理“密码” PAM->auth-yubi。还需要进行其他更改,请参见下文:

(Ubuntu 14.04-值得信赖):

/etc/pam.d/yubi-auth

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

注意:您可以在此处获取访问ID和密钥

/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

验证

来自没有公钥的远程主机的SSH

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

$ 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)

改善

进行身份验证时,最好从远程ssh服务器上看到“ Yubikey Auth:”而不是“ password:”。

如果ssh服务器无法联系yubico的身份验证系统,该怎么办?理想的解决方案将是完全独立的。

评论和建议表示赞赏。


2

用Yubikey设置2FA可能很棘手(认为U2F有openssh 补丁),但是最简单的方法可能是Yubico官方网站上描述的方法。

基本上,这是将您的私钥存储在Yubikey上并用PIN保护的方法。它与您描述的2FA并不完全相同(但这是您拥有的东西以及您知道的东西),但是它甚至可以进一步提高安全性(在尝试不成功后,Yubikey会锁定)。

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

我相信pam模块只能对本地Yubikeys进行身份验证,而不能对通过ssh进行验证的身份验证 ”-我不确定您的意思。您是说不能使用Yubikey通过PAM对远程ssh服务器进行身份验证吗?
MadHatter

是。因为它需要与yubikey进行通信的方式,并且可能是使用某些本地库完成的。ssh中没有用于此的代码。
雅库耶2015年

那绝对是错的。我已将我的远程服务器配置为在本机yubikey模式OATH模式下接受基于yubikey的身份验证。yubikey的全部目的是提供一个简短的字符串,以便通过可能不安全的通道进行传输,并充当一次性密码。如果必须将yubikey物理连接到要进行身份验证的系统,它将没有太多用处。我认为您在PKCS模式下锁定yubikey也错了。
MadHatter

好的,你是对的。对于OTP模式,这是可能的。但是锁定是PKCS11标准的一部分。
Jakuje 2015年

1
谢谢您-我觉得您的回答会更好,而且会消除我的不满。
MadHatter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.