双因素身份认证(2FA)就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。
这里使用Google Authenticator来实现,它是跨平台的软件,并且支持PAM模块跟SSH协同工作。
服务端安装
yum install google-authenticator -y
配置并生成验证秘钥
google-authenticator Do you want authentication tokens to be time-based (y/n) y
以上确认输入之后系统会生成代表该“场景”密钥的二维码和密钥字符串,也提供了一个用于在浏览器中再次显示该二维码的 URL,但是需要翻墙;若是没有显示二维码请安装二维码生成器:yum install qrencode -y;接着显示了一个当前的校验码和几个紧急密钥(只限一次性使用)。紧急密钥你可以另行保存的一个安全的地方,以防你在无法使用 Google 身份验证器应用时使用。
Your new secret key is: GDFNUXMWFMQENF6F45WDLCO4OA Your verification code is 653134 Your emergency scratch codes are: 65002424 96623755 16972031 11670818 76578657
接下来提示是否保存相关设置到文件,输入Y,之后的提示分别是禁止同一令牌多次登录、时间容错设置、暴力破解防护、一路输入y就OK了。配置完成后会在主目录下生成一个权限为400的隐藏文件。
客户端扫描配置
打开手机安装的google-authenticator或者微信小程序“运维密码”扫描上面出现的二维码,匹配完成后就可以了。
配置SSH服务
添加认证模块,使用如下命令在 /etc/pam.d/sshd 文件添加认证模块:
echo "auth required pam_google_authenticator.so" >>/etc/pam.d/sshd
开启挑战式密码认证并重启ssh服务:
sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config systemctl restart sshd
测试登录
注意此时切勿退出当前的SSH连接,应该重新开个SSH连接测试。并且使用keyboard Interactive方法登录;第一步会提示输入密码,然后提示Verification code:对照输入手机显示的六位验证码,第一次连接不会成功。并且验证码只有30秒有效时间。
关于时差问题
因为可能使用的是国外的服务器,时区/时间跟国内的都不一样,造成时差问题;而双因素认证是基于时间戳的,如果无法达成时间一致,那么是无法登录系统的;解决办法:第一需要调整时区,第二开启时间同步。
调整时区:
tzselect #查询时区TZ值 timedatectl set-timezone 'Asia/Shanghai' #更改系统时区
同步时间:安装使用chrony同步阿里云NTP时间服务器
yum install -y chrony #安装软件 vim /etc/chrony.conf #编辑配置文件并填写阿里云NTP服务器 server ntp1.aliyun.com iburst systemctl start chronyd && systemctl enable chronyd && systemctl restart chronyd #启动、开机自启动、重启服务。 chronyc sources -v #查看同步信息