专注一件事
致力于让运维变得更简单、更高效、更快速。

CentOS 开启SSH双因素认证,增强SSH登录安全

本文于 2019-12-02 22:03 更新,部分内容具有时效性,如有失效,请联系邮件admin#cnitdog.com进行更新。

一、双因素身份认证介绍
双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。因每次认证时的随机参数不同,所以每次产生的动态密码也不同。由于每次计算时参数的随机性保证了每次密码的不可预测性,从而在最基本的密码认证这一环节保证了系统的安全性。

二、实现目的和方法
在SSH登录服务器时,不仅要输入用户名和密码,还要输入动态验证码,验证通过后登录成功。以下采用Google Authenticator进行开启双因素身份认证。

三、安装过程
1、首先安装时钟同步服务Chrony,以保证时间准确(在系统时间生成动态口令的其中一个主要因素,需要保持终端设备和服务器的系统时间一致,才能生成正确的动态口令),安装Chrony请参考:《CentOS 7利用chrony搭建NTP时钟服务器(替代ntp)
2、安装编译所需依赖组件

yum install -y git automake libtool pam-devel

3、从GitHub上下载Google Authenticator模块

git clone https://github.com/google/google-authenticator-libpam.git

4、安装编译Google Authenticator模块

[root@Cnitdog ~]# cd google-authenticator-libpam/
[root@Cnitdog google-authenticator-libpam]# ./bootstrap.sh
[root@Cnitdog google-authenticator-libpam]# ./configure
[root@Cnitdog google-authenticator-libpam]# make && make install
[root@Cnitdog google-authenticator-libpam]cp /usr/local/lib/security/pam_google_authenticator.so /lib64/security/

5、修改PAM文件,开启SSH登录时调用google-authenticator模块

vi /etc/pam.d/sshd

增加如下命令:

auth required pam_google_authenticator.so no_increment_hotp noskewadj

参数介绍:

no_increment_hotp #确保计数器不会因失败尝试而递增
noskewadj #不自动调整时间偏差
nullok #如果用户尚未设置OTP,则允许用户在没有OTP的情况下登录
echo_verification_code #默认情况下,PAM模块在用户输入验证码时不会回显验证码。

6、编辑 /etc/ssh/sshd_config 文件

vi /etc/ssh/sshd_config 

修改如下内容:

ChallengeResponseAuthentication yes #启用其它认证
UsePAM yes #启用UsePAM模块
PasswordAuthentication yes #允许密码认证

四、开始启用双因素认证保护SSH
1、运行google-authenticator 命令生成一个新的密钥

[root@Cnitdog ~]# google-authenticator
Do you want authentication tokens to be time-based (y/n) y #是否想做一个基于时间的令牌,这里选择 y
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/root@test%3Fsecret%3DSLZTXLFJ5KT5TWMP%26issuer%3Dtest
 #此处为二维码,使用手机端Google Authenticator进行扫描
 #此处为二维码,使用手机端Google Authenticator进行扫描
 #此处为二维码,使用手机端Google Authenticator进行扫描
 #此处为二维码,使用手机端Google Authenticator进行扫描
 #此处为二维码,使用手机端Google Authenticator进行扫描                                                                                                                                                                                                                       
Your new secret key is: ********
Your verification code is ****** #此处填写手机生成的数字验证码
Your emergency scratch codes are:
  ********
  ********
  ********
  ********
#以上5个代码是紧急代码,务必牢记,这是在你的动态口令无法使用的情况下使用的,记住,用一个失效一个。后期可以登陆上去后,重新生成!

Do you want me to update your "/root/.google_authenticator" file (y/n) y 
#是否更新你的google认证文件,第一次设置,一定要选择 y


Do you want to disallow multiple uses of the same authentication 
token? This restricts you to one login about every 30s, but it increases 
your chances to notice or even prevent man-in-the-middle attacks (y/n) y 
#是否禁止口令多用,为防止中间人欺骗。这里选择 y

By default, tokens are good for 30 seconds. In order to compensate for 
possible time-skew between the client and the server, we allow an extra 
token before and after the current time. If you experience problems 
with poor time synchronization, you can increase the window from its default 
size of +-1min (window size of 3) to about +-4min (window size of 
17 acceptable tokens).Do you want to do so? (y/n) y 
#默认情况,1个口令的有效期是30s,这里是为了防止主机时间和口令客户端时间不一致,设置的误差,根据具体需求,可以选择y,也可选n。

If the computer that you are logging into isn't hardened against brute-force 
login attempts, you can enable rate-limiting for the authentication module. 
By default, this limits attackers to no more than 3 login attempts every 30s. 
Do you want to enable rate-limiting (y/n) y 
#是否打开尝试次数限制,默认情况,30s内不得超过3次登陆测试,防止别人暴力破解。这里选择 y 

五、使用SSH登录工具进行登录。(以下采用putty登录演示)

赞(4)
尊重劳动成果,转载请注明出处:IT运维狗 » CentOS 开启SSH双因素认证,增强SSH登录安全