---
author: Dan Nanni
category: 系统运维
comments_data:
- date: '2014-08-31 15:29:19'
  message: 用二维码，有点意思。
  postip: 116.255.132.12
  username: netb2c
- date: '2014-08-31 19:33:00'
  message: '@小白在安同 考虑打包不'
  postip: 113.119.17.105
  username: 微博评论
- date: '2014-08-31 20:47:44'
  message: 嗯，这种GOOGLE 的多因子认证，都是用二维码绑定的。话说，咱们站点也支持 GOOGLE 认证的，你没试试？
  postip: 114.245.1.125
  username: linux
- date: '2014-08-31 21:03:00'
  message: 有趣的是增加了一把锁又为某人开放了一把锁
  postip: 220.181.108.146
  username: 微博评论
- date: '2014-08-31 22:03:00'
  message: 先 Mark //@冰雪聪明琳之风:@小白在安同 考虑打包不
  postip: 66.249.79.186
  username: 微博评论
- date: '2014-08-31 23:33:04'
  message: 回复@nihaoxiongfei:怎么说？
  postip: 157.55.39.187
  username: 微博评论
- date: '2014-08-31 23:33:04'
  message: 马//@小白在安同:先 Mark //@冰雪聪明琳之风:@小白在安同 考虑打包不
  postip: 157.55.39.187
  username: 微博评论
- date: '2014-09-01 07:33:01'
  message: Repost
  postip: 61.154.16.7
  username: 微博评论
- date: '2014-09-02 11:17:04'
  message: 这个能支持多手机验证么？
  postip: 223.104.1.91
  username: ''
- date: '2015-02-16 13:00:56'
  message: "最新的是linux桌面操作系统是fedora21功能很强大,fedora21有很多的新功能可以了解下：<br />\r\nfedora21新功能介绍与下载地址:itpux.
    com/article-12-1.html"
  postip: 119.130.188.65
  username: 来自 - 广东广州 的 Chrome/Windows 用户
- date: '2015-02-16 13:01:50'
  message: "fedora21安装教程:itpux .com/thread-2284-1-1.html<br />\r\nFedora21安装后的10大配置过程:itpux
    .com/thread-2285-1-1.html<br />\r\nfedora20安装教程:itpux .com/thread-243-2-1.html"
  postip: 119.130.188.65
  username: 来自 - 广东广州 的 Chrome/Windows 用户
- date: '2015-04-17 11:35:02'
  message: 可以，反正你用多个手机扫描上面的二维码即可。
  postip: 106.120.101.58
  username: linux
- date: '2015-07-17 15:28:58'
  message: 此话怎讲？
  postip: 116.113.74.191
  username: 来自 - 内蒙古呼和浩特 的 Chrome/Windows 用户
- date: '2016-04-13 11:14:06'
  message: 所有东西都弄好了&nbsp;&nbsp;重新登陆的时候老是密码错误。我去&nbsp;&nbsp;求解
  postip: 101.249.64.94
  username: 来自西藏的 Chrome 49.0|Windows 7 用户
- date: '2016-04-21 02:15:12'
  message: 小编好逗！图片上将紧急验证码打了码，却没将初始密钥打码。小编明白Google Authenticator的原理吗？只要有初始密钥，就可以和别人同步显示30秒临时验证码啊！
  postip: 220.170.88.133
  username: 来自湖南岳阳的 Chrome 50.0|Mac 10.11 用户
- date: '2016-04-21 19:42:51'
  message: 这里只是个例子罢了，严格来说，包括那个二维码也需要混淆一下。
  postip: 123.120.54.44
  username: linux [Chrome 49.0|Mac 10.11]
- date: '2017-08-09 17:59:35'
  message: 问一下，服务器没有外网支持这个么？
  postip: 123.126.70.240
  username: 来自北京的 Chrome 55.0|Windows 10 用户
- date: '2017-08-09 21:59:06'
  message: 与网络无关，只要保证你的服务器的时钟准确就行。
  postip: 61.186.25.153
  username: linux [Chrome 59.0|Mac 10.11]
- date: '2017-08-18 21:34:31'
  message: 大概是讲时钟服务漏洞？
  postip: 27.14.45.129
  username: 来自重庆的 Firefox 55.0|Windows 7 用户
count:
  commentnum: 19
  favtimes: 4
  likes: 0
  sharetimes: 9
  viewnum: 26971
date: '2014-08-30 22:46:00'
editorchoice: false
excerpt: 近来很多知名企业都出现了密码泄露，业内对多重认证的呼声也越来越高。在这种多重认证的系统中，用户需要通过两种不同的认证程序：提供他们知道的信息（如
  用户名/密码），再借助其他工具提供用户所不知道的信息（如 用手机生成的一次性密码）。这种组合方式常叫做双因子认证或者两阶段验证。  为了鼓励广泛采用双因子认证的方式，Google公司发布了Google
  Authenticator，一款开源的，可基于开放规则（如 HMAP/基于时间）生成一次性密码的软件。这是一款跨平台软件，可运行在Linux, Android,
  iOS。Google公司同时也支持插件式鉴别模块PAM(
fromurl: http://xmodulo.com/2014/07/two-factor-authentication-ssh-login-linux.html
id: 3725
islctt: true
largepic: /images/p/201408/31/175954hcqkectacmgew6r2.jpg
permalink: /article-3725-1.html
pic: /images/p/201408/31/175954hcqkectacmgew6r2.jpg.thumb.jpg
related:
- displayorder: 0
  raid: 4521
- displayorder: 0
  raid: 8317
reviewer: ''
selector: ''
summary: 近来很多知名企业都出现了密码泄露，业内对多重认证的呼声也越来越高。在这种多重认证的系统中，用户需要通过两种不同的认证程序：提供他们知道的信息（如
  用户名/密码），再借助其他工具提供用户所不知道的信息（如 用手机生成的一次性密码）。这种组合方式常叫做双因子认证或者两阶段验证。  为了鼓励广泛采用双因子认证的方式，Google公司发布了Google
  Authenticator，一款开源的，可基于开放规则（如 HMAP/基于时间）生成一次性密码的软件。这是一款跨平台软件，可运行在Linux, Android,
  iOS。Google公司同时也支持插件式鉴别模块PAM(
tags:
- Google
- Authenticator
- SSH
- OTP
- 2FA
- 身份验证器
- 双因子认证
thumb: false
title: 如何为 Linux 系统中的 SSH 添加双重认证
titlepic: true
translator: nd0104
updated: '2014-08-30 22:46:00'
---

近来很多知名企业都出现了密码泄露，业内对多重认证的呼声也越来越高。在这种多重认证的系统中，用户需要通过两种不同的认证程序：提供他们知道的信息（如 用户名/密码），再借助其他工具提供用户所不知道的信息（如用手机生成的一次性密码）。这种组合方式常叫做双因子认证或者两阶段验证。


![](/images/p/201408/31/175954hcqkectacmgew6r2.jpg)


为了鼓励广泛采用双因子认证的方式，Google 公司发布了<ruby> <a href="https://github.com/google/google-authenticator/">  Google 身份验证器 </a> <rp>  （ </rp> <rt>  Google Authenticator </rt> <rp>  ） </rp></ruby>，一款开源的，可基于开放规则（如 HMAP/ 基于时间）生成一次性密码的软件。这是一款跨平台软件，可运行在 Linux、 [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)、 [iOS](https://itunes.apple.com/us/app/google-authenticator/id388497605)。Google 公司同时也支持插件式鉴别模块PAM （pluggable authentication module），使其能和其他也适用 PAM 进行验证的工具（如 OpenSSH）协同工作。


![](/images/p/201408/30/224639k1or06p39q5r3rs9.jpg)


在本教程中，我们将叙述集成 OpenSSH 和 Google 提供的身份验证器实现**如何为 SSH 服务设置双因子认证**。我将使用一款 Android 设备来生成一次性密码，本教程中需要两样武器：


(1) 一台运行着 OpenSSH 服务的 Linux 终端，


(2) 一台安卓设备。


### 在 Linux 系统中安装 Google 身份验证器


第一步需要在运行着 OpenSSH 服务的 Linux 主机上安装 Google 身份验证器。按照如下步骤安装 Google 身份验证器及其PAM模块。


#### 用安装包安装 Google 身份验证器


如果你不想自己构建 Google 身份验证器，在几个 Linux 发行版上有已经编译好的安装包。安装包里面包含 Google 身份验证器 二进制程序和 PAM 模块。


在 Ubuntu 上安装 Google 身份验证器：



```
$ sudo apt-get install libpam-google-authenticator

```

在 Fedora 上安装 Google 身份验证器：



```
$ sudo yum install google-authenticator

```

在 CentOS 上安装 Google 身份验证器 ，需要首先[启用 EPEL 软件库](http://linux.cn/article-2324-1.html)，然后运行如下命令（LCTT 译注：EPEL 库中可能已经删除了该软件包，请使用源代码编译方式安装）：



```
$ sudo yum install google-authenticator

```

如果不想使用已经编译好的安装包，或者你的 Linux 发行版不在此列，可以自行编译：


#### 在 Linux 上编译 Google 身份验证器


首先，安装构建 Google 身份验证器所需的软件包。


在 Debian、 Ubuntu 或 Linux Mint 上：



```
$ sudo apt-get install wget make gcc libpam0g-dev

```

在 CentOS、 Fedora 或 RHEL上：



```
$ sudo yum install wget make gcc pam-devel

```

然后下载 Google 身份验证器的源代码，并按如下命令编译（已经从 Google Code 迁移到了 Github）。



```
$ wget https://github.com/google/google-authenticator/archive/master.zip
$ unzip master.zip
$ cd google-authenticator-master/libpam
$ ./bootstrap.sh
$ ./configure
$ make

```

如果构建成功，你会在目录中看到 `pam_google_authenticator.so` 和 `google-authenticator` 两个文件。


最后，将 Google 身份验证器安装到合适位置。默认会安装到 `/usr/local/lib/security` 下，根据你的系统不同，你可能需要将其符号链接到 pam 库的位置（比如 CentOS 7 会在 `/usr/lib64/security`）。



```
$ sudo make install

```

#### 排错


当编译 Google 身份验证器时出现如下错误：



```
fatal error: security/pam_appl.h: No such file or directory

```

要修复这个问题，请安装如下依赖包。


在 Debian、 Ubuntu 或 Linux Mint 上：



```
$ sudo apt-get install libpam0g-dev

```

在 CentOS、 Fedora 或 RHEL 上：



```
$ sudo yum install pam-devel

```

当 Google 身份验证器安装好后，你需要在 Linux 主机上创建验证密钥，并且在安卓设备上注册，注意这项配置操作是一次性的。我们将详细叙述如何完成这些操作：


### 生成验证密钥


在 Linux 主机上运行 Google 身份验证器：



```
$ google-authenticator 

```

你将看到一个二维码，它使用如下图形表示我们数字形态的密钥。一会我们要用到它在安卓设备上完成配置。


![](/images/p/201702/09/100732xnkg8g8ttdjk8p9n.jpg)


Google 身份验证器会问一些问题，如果你不确定，就回答 `Y`。这个应急备用验证码（图中 `emergency scratch codes`）可以在你由于丢失了绑定的安卓设备的情况下（所以不能得到生成的一次性密码）恢复访问。最好将应急备用验证码妥善保存。


### 在安卓设备上运行 Google 身份验证器


我们需要在安卓设备上安装 [Google 身份验证器应用](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)才能完成双因子认证，到 Google Play 下载并安装一个。在安卓设备上运行 Google 身份验证器，找到下图所示中的配置菜单。


![](/images/p/201408/30/223958uw1zuzfpypm11bwf.jpg)


你可以选择“Scan a barcode” 或者“Enter provided key”选项。“Scan a barcode”允许你扫描二维码来完成密钥的输入，在此可能需要先安装扫描软件 [Barcode Scanner](https://play.google.com/store/apps/details?id=com.google.zxing.client.android) 应用。如果选择“Enter provided key”选项，你可以使用键盘输入验证密钥，如下图所示：


![](/images/p/201408/30/224001sibz2xpwhpwgxyli.jpg)


无论采用上述两种选项的任何方式，一旦成功，你将看到注册成功提示和一次性密码，如下图所示：


![](/images/p/201408/30/224004f1lfpcn0sffqz2p1.jpg)


### 为 SSH 服务器用 Google 身份验证器


最终我们需要修改两个文件来完成集成 Google 身份验证器和 OpenSSH 服务这临门一脚。


首先，修改 PAM 配置文件，命令和需添加的内容如下：



```
$ sudo vi /etc/pam.d/sshd 

```



---



```
auth required pam_google_authenticator.so

```

然后打开 SSH 配置文件，找到参数 `ChallengeResponseAuthentication`，并启用它。



```
$ sudo vi /etc/ssh/sshd_config 

```



---



```
ChallengeResponseAuthentication yes
```

最后，重启 SSH 服务。


在 Ubuntu、 Debian 和 Linux Mint 上：



```
$ sudo service ssh restart 

```

在 Fedora （或 CentOS/RHEL 7）上：



```
$ sudo systemctl restart sshd 

```

在 CentOS 6.x或 RHEL 6.x 上：



```
$ sudo service sshd restart 

```

不要退出当前的 ssh 链接，大多数 Linux 发行版重启 ssh 服务并不会中断当前已经建立的 ssh 连接。另外开个窗口去重新连接 ssh 服务，如果遇到问题，还可以在原来的 ssh 连接下修改和恢复。


### 验证双因子认证


在绑定的安卓设备上运行 Google 身份验证器，获得一个一次性验证码，该验证码 30 秒内有效，一旦过期，将重新生成一个新的验证码。


![](/images/p/201408/30/224006ldziduffbdab3bf4.jpg)


现在和往常一样，使用 SSH 登录终端



```
$ ssh user@ssh_server 

```

当提示你输入验证码的时候，输入我们刚获得的验证码。验证成功后，再输入 SSH 的登录密码。


![](/images/p/201408/30/224009f11pi7p1pvnonpky.jpg)


双因子认证通过在用户密码前新增一层来有效的保护我们脆弱的用户密码。你可以使用 Google 身份验证器来保护我们其他的密码，如 Google 账户、GitHub、WordPress.com、Dropbox.com、Outlook.com等等。是否使用这项技术，取决于我们自己，但采用双因子认证已经是行业的大趋势了。




---


via: <http://xmodulo.com/2014/07/two-factor-authentication-ssh-login-linux.html>


译者：[nd0104](https://github.com/nd0104) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出