CentOS开启SSH登录两步验证经验总结

参考文章:

Linux 利用Google Authenticator实现ssh登录双因素认证
TWO-STEP AUTHENTICATION FOR SSH ON CENTOS 6 USING GOOGLE AUTHENTICATOR
SSH 登录时出现如下错误:requirement "uid >= 1000" not met by user "root"

介绍:

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

说白了,就像我们几年前去银行办卡送的口令牌,以及网易游戏中的将军令,在你使用网银或登陆游戏时会再让你输入动态口令的。

安装:

Tips:如果了解服务器的时间是准确的,可不安装时间同步工具chrony,时间同步工具的安装请参考第一篇文章。

  1. 安装依赖组件:

    [root@localhost ~]# yum install -y git automake libtool pam-devel

  2. 安装谷歌认证模块


[root@localhost ~]# git clone https://github.com/google/google-authenticator-libpam.git <<<下载git目录>>>
[root@localhost ~]# ll <<<列出下载目录文件>>>
drwxr-xr-x 11 root root 4096 12月 27 16:29 google-authenticator-libpam

[root@localhost ~]# cd google-authenticator-libpam/
[root@localhost google-authenticator-libpam]# ./bootstrap.sh
[root@localhost google-authenticator-libpam]# ./configure
[root@localhost google-authenticator-libpam]# make && make install <<<到这里就已经安装成功了,接下来是进行配置>>>

[root@localhost google-authenticator-libpam]# cd ~ <<<接下来配置sshd使验证生效>>>
[root@localhost ~]# vim /etc/pam.d/sshd

auth       required     pam_google_authenticator.so no_increment_hotp <<<在sshd文件中加入一行这个,然后按ESC,之后输入:wq即可保存并退出,输入:q不保存,输入:w只写入不退出>>>

[root@localhost ~]# vim /etc/ssh/sshd_config <<<查看该配置文件中的下列三个项目是否都已开启>>>

asswordAuthentication yes
ChallengeResponseAuthentication yes
UsePAM yes

[root@localhost ~]# systemctl restart sshd <<<重启sshd使其生效>>>

[root@localhost ~]# google-authenticator <<<运行配置向导>>>

Do you want authentication tokens to be time-based (y/n) y
#你想做的认证令牌是基于时间的吗?
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
  https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3DN4HLEJOQHT27VCR6RX66WXB2SY%26issuer%3Dlocalhost.localdomain


Your new secret key is: N4HLEJOQHT27VCR6RX66WXB2SY <<<切记要保存好这些东东>>>
Your verification code is 299695
Your emergency scratch codes are:
  92790948
  26350870

Do you want me to update your "/root/.google_authenticator" file? (y/n) y
#你希望我更新你的“/root/.google_authenticator”文件吗(y/n)?
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
#你希望禁止多次使用同一个验证令牌吗?这限制你每次登录的时间大约是30秒, 但是这加大了发现或甚至防止中间人攻击的可能性(y/n)?
By default, a new token is generated every 30 seconds by the mobile app.
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. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) y
#默认情况下,令牌保持30秒有效;为了补偿客户机与服务器之间可能存在的时滞,
我们允许在当前时间前后有一个额外令牌。如果你在时间同步方面遇到了问题, 可以增加窗口从默认的3个可通过验证码增加到17个可通过验证码,
这将允许客户机与服务器之间的时差增加到4分钟。你希望这么做吗(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
#如果你登录的那台计算机没有经过固化,以防范运用蛮力的登录企图,可以对验证模块
启用尝试次数限制。默认情况下,这限制攻击者每30秒试图登录的次数只有3次。 你希望启用尝试次数限制吗(y/n)?

相关问题:

  1. 注意如果sshd文件中开启了谷歌认证模块,则通过ssh进行登录的话都需要验证,且验证如果不通过就无法ssh上去,所以建议在开启之前确保其他的验证登录方式可行。或保持一个一直连接的SSH直到配置成功。

  2. 首次登录可能不行,可通过如下方法排查错误:

    tail -n10 /var/log/secure

查看系统安全日志的后10行,如果提示由于pam_google.authenticator.so缺失导致无法验证,则请到/usr/local/lib/security中将缺失文件复制到对应目录下

  1. 如果提示uid >= 1000 not met by user root类似,到如下目录/etc/pam.d中修改login sshd system-auth password-auth等。将里面的uid>=1000的参数去掉

  2. 如果提示是key不行,多数是由于时间问题导致的。可尝试分别三次输入三个不同的验证码,来校准pam模块的时间

你可能感兴趣的:(CentOS开启SSH登录两步验证经验总结)