一、简介
双因子认证 – Two-factor authenticator(即 2FA),是一种通过组合两种不同的验证方式进行用户验证的机制。
OpenSSH双因子认证是信息安全等级保护中较为重要的安全检测项之一,要求远程登陆核心服务器时必须进行二次认证(指纹、虹膜、动态码等)。
配置免费开源的Google Authenticator动态码认证便是一个不错的双因子认证方案,轻松实现远程登陆核心服务器时,必须正确输入谷歌验证码和系统用户密码后才能正常远程登陆,Google Authenticator是基于TOTP实现的。
TOTP的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准RFC6238。
认证过程大体如下:
①用户开启双因子认证后,服务器生产一个密钥
②服务器提示用户扫描二维码生成密钥,并保存到用户的手机
③用户登录时输入验证码,服务器会将用户输入的验证码和本地的进行比对,验证通过后则可以登录。验证码周期为30s
二、安装
1、安装依赖包
#安装最新epel源
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
#依赖
yum install -y gcc autoconf automake libtool pam-devel
2、源码编译安装
##下载源代码
cd /usr/local/src/
wget --no-check-certificate https://github.com/google/google-authenticator-libpam/archive/1.07.tar.gz
tar xzf 1.07.tar.gz
cd google-authenticator-libpam-1.07/
##编译
./bootstrap.sh
./configure --prefix=/usr/local/google-authenticator
make
make install
##创建软链接
ln -s /usr/local/google-authenticator/lib/security/pam_google_authenticator.so /lib64/security/pam_google_authenticator.so
##将可执行文件加到环境变量
echo "export PATH=\$PATH:/usr/local/google-authenticator/bin" >> /etc/profile
source /etc/profile
3、rpm包安装
yum -y install google-authenticator
备注:源码编译安装和rpm包安装只需要一种即可,这里我采用的是rpm包安装方式。
三、配置谷歌密钥
# google-authenticator
Do you want authentication tokens to be time-based (y/n) y #是否启用基于时间的认证
Do you want me to update your "/home/proot/.google_authenticator" file? (y/n) y #将认证信息写入到这个文件内
your chances to notice or even prevent man-in-the-middle attacks (y/n) y #每次生成的验证码经过30s自动失效
Do you want to do so? (y/n) n #如果输入y,可以在4分钟查看8个有效的验证码,如果输入n,可以在一分半中查看三个有效验证码
Do you want to enable rate-limiting? (y/n) y #是否启用速率限制,主要是为了防止攻击
四、下载app创建动态码
首次创建动态码时需要输入secret key进行验证,手机不在身边需要紧急登陆时,则可以使用emergency scratch codes,使用后自动失效。
IOS:https://apps.apple.com/cn/app/google-authenticator/id388497605
Android:https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=zh_CN
五、配置OpenSSH PAM
# sudo sed -i '1a\auth required pam_google_authenticator.so' /etc/pam.d/sshd
六、配置OpenSSH并重启
# sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
# sudo systemctl restart sshd
七、登陆测试
目前仅proot用户实现了双因子认证,其他用户不论输入任何动态码都一律视为验证失败而导致无法正常登陆。其他用户配置双因子认证只需拷贝/home/proot/.google_authenticator
到对应用户的家目录再赋权即可。
# ssh proot@192.168.147.128
Verification code:
Password:
扩展:
##开启密钥,密码和验证码验证
# /etc/ssh/sshd_config添加
AuthenticationMethods publickey,password publickey,keyboard-interactive
# /etc/pam.d/sshd 将 auth substack password-auth 注释掉