前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 Google Authenticator 实现两步验证加固 SSH 安全

使用 Google Authenticator 实现两步验证加固 SSH 安全

作者头像
iMike
发布2019-06-11 17:53:09
3.9K1
发布2019-06-11 17:53:09
举报
文章被收录于专栏:运维之美运维之美

普通情况下的服务器登录,是 “服务器+密码” 这种直白的验证方式,但是这种方式太过简单,一旦密码泄露,服务器就有危险。 于是为了安全我们就要在登录上再加一把锁,那就是使用 Google Authenticator(谷歌身份验证器)这个工具,在登录的时候进行一次验证,只有 “验证通过了”+“密码正确” 才能登陆服务器。

安装前准备

1)关闭 Selinux

代码语言:javascript
复制
$ setenforce 0

2)安装软件依赖

代码语言:javascript
复制
$ yum -y install gcc make pam-devel libpng-devel libtool wget git

3)添加阿里云 EPEL 源

代码语言:javascript
复制
# RHEL 6 / CentOS 6
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
# RHEL 7 / CentOS 7
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

4)安装 Qrencode,谷歌身份验证器需要调用该程序生成二维码并显示。

代码语言:javascript
复制
$ yum install -y qrencode

安装谷歌身份验证器

这个时候很多教程会让你从 google-authenticator 仓库中下载相应安装包。

代码语言:javascript
复制
$ git clone https://github.com/google/google-authenticator.git

然而现在这个 Git 仓库里面已经不再含有 libpam 这个文件夹了,下载下来是一个错误的包。

那么这个时候你可以使用软件仓库里面自带的软件包来安装。

代码语言:javascript
复制
$ yum install google-authenticator

不过通过软件仓库安装的身份验证器的版本很老。如果你需要新版本的身份验证器,可以通过以下命令来下载。

代码语言:javascript
复制
$ wget https://github.com/google/google-authenticator-libpam/archive/1.04.tar.gz

下载下来 1.0.4 版本的身份验证器,然后拆包解压缩,里面包含这样几个文件:

然后使用以下命令进行编译和安装。

代码语言:javascript
复制
$ ./bootstrap.sh && ./configure && make && make install

安装过程完毕之后,还需运行下面的命令复制 Google 身份验证器的 PAM 模块到系统下。

代码语言:javascript
复制
$ cp /usr/local/lib/security/pam_google_authenticator.so /lib64/security/

调整登陆方式

1)编辑 /etc/pam.d/sshd 这个文件,CentOS 7.0 和 CentOS 6.x 可能有点差异。基本上就需要插入黄色框内的 auth required pam_google_authenticator.so 这行就可以了。

这里以 CentOS 7.0 为例,具体见下图。

修改完毕之后,保存退出。

注意: 1. 认证模块添加的顺序就是认证的验证步骤,如果你放在 password-auth 下面,就是先输入密码,再二次校验。 2. 修改了这步之后,服务器千万不能断开连接,否则再连是需要 Google 验证码的,而我们现在还没有生成验证码,所以肯定是无法连接服务器。如果是云服务器,可以通过登陆控制台的方式把这个文件修改回来,如果是实体服务器,那就呵呵呵了。

2)编辑 /etc/ssh/sshd_config 文件,只需修改下面这一个地方。

代码语言:javascript
复制
# 允许交互
ChallengeResponseAuthentication yes

3)保存退出之后,重启 SSH 服务。

代码语言:javascript
复制
# RHEL 6 / CentOS 6
$ Service sshd restart

# RHEL 7 / CentOS 7
$ Systemctl resart sshd

生成登陆验证码

这次以 root 用户为例,那么切换成 root 用户执行下面的过程。

1)执行 google-authenticator,由于我们之前已经安装了 qrencode,那么这个时候会生成一个超级超级巨大的二维码,给各位感受一下:

红色内容是生成的密钥,很重要。绿色的内容是备用的紧急救助码,紧急救助码就是当你无法获取认证码时(比如手机丢了),可以当做认证码来用。每用一个少一个,但其实可以手动添加的。

建议:如果 root 账户使用 Google Authenticator 的话一定要把紧急救助码另外保存一份。

代码语言:javascript
复制
Do you want me to update your "/home/test/.google_authenticator" file? (y/n) y

是否更新用户的 Google Authenticator 配置文件,选择 y 才能使上面操作对当前用户生效,其实就是在对应用户的 Home 目录下生成了一个 .google_authenticator 文件。 如果你想停用这个用户的 Google Authenticator 验证,只需要删除这个用户 Home 目录下的 .google_authenticator 文件就可以了。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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) n

是否增加时间误差?这里随便选择, n/y 都可以。

代码语言:javascript
复制
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

是否启用次数限制?这里选择 y,默认每 30 秒最多尝试登录 3 次。

如果想要写成脚本的话,那么上面交互式的设置也可用通过参数一次性设置。

代码语言:javascript
复制
$ google-authenticator -t -f -d -l test@chen.super -i MR.chen -r 3 -R 30 -W

-I 和 -i 是可以随便写的,但是 -i 后期可以改,-I 不能改。

搭配手机端

如果手机是 IOS,就去 Apple Store 里搜索 “Google Authenticator”,如果是安卓,就去应用商店搜索 “谷歌动态口令”。

安装完后,打开 App,点击 “开始设置”,选择 “扫描条形码” 扫描上面 google-authenticator 命令生成的二维码或者是选择 “输入密钥”,然后手机上就能看到对应的六位数认证码了。

最后一步,返回 Xshell,修改登陆方式,设置登陆方法为 Keyboard Interactive,如图:

这个时候,推荐各位保留原有的 SSH 链接不要动,在另外一个 Xshell 窗口登陆一下看看效果。如果正常的话,这个时候会看到系统会让你先输入一个 Verification code。这个值就是手机里的那个六位数,然后再输入密码,只有两个都是正确的,才能登陆!

至此整个配置完成,如果登陆时遇到问题,请查看日志文件 /var/log/secure。

使用浏览器查看动态密码

Google Authenticator 除了支持手机端外,也支持浏览器插件来生成动态口令。

Chrome 插件:http://t.cn/E9oafuV

Firefox 插件:http://t.cn/zjaEAlS

安装插件后,手动添加对应的密钥即可。

更改存储位置

在生成二维码那一步的时候,如果你错过了记住密钥也不要怕,系统会自动把密钥和紧急救助码保存在 ~/.google_authenticator 这个文件里。

如果想要改变密钥存储位置,请使用 --secret 参数。

代码语言:javascript
复制
$ google-authenticator --secret="/文件路径/用户名"

然后更改 /etc/pam.d/sshd 内的路径配置。

代码语言:javascript
复制
auth required pam_google_authenticator.so user=root secret=/PATH_FOLDER/${USER}

上面这句话里 “user=root” 用于强制 PAM 使用 root 用户权限来搜索文件。

另外请注意,由于我们当时切换成了 root 用户,所以密钥文件的所有者是 root。基于安全考虑,密钥文件必须是只读权限,可按以下指令修改。

代码语言:javascript
复制
$ chown root.root /PATH_FILE/SECRET_KEY_FILES
$ chmod 400 /PATH_FILE/SECRET_KEY_FILES

来源:Chris Chan's BLOG 原文:http://t.cn/E9ole3d 题图:来自谷歌图片搜索 版权:本文版权归原作者所有

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奇妙的Linux世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档