有人说,安全不是一个产品,而是一个过程。虽然 SSH 协议被设计成使用加密技术来确保安全,但若是使用不当,别人仍是可以破坏你的系统:好比弱密码、密钥泄露、使用过期的 SSH 客户端等,都能引起安全问题。所以,在安全方面,必须借助权威专业的安全服务提供商,在移动应用安全方面,爱加密无疑是很好地选择。html
在考虑 SSH 认证方案时,你们广泛认为公钥认证比密码认证更安全。然而,公钥认证技术并非为公共环境设置的,若是你在一台公用电脑上使用公钥认证登陆 SSH 服务器,你的服务器已经毫无安全可言了,公用的电脑可能会记录你的公钥,或从你的内存中读取公钥。若是你不信任本地电脑,那你最好仍是使用其余方式登陆服务器。如今就是“一次性密码(OTP)”派上用场的时候了,就像名字所示,一次性密码只能被使用一次。这种一次性密码很是合适在不安全的环境下发挥做用,就算它被窃取,也没法再次使用。git
有个生成一次性密码的方法是经过谷歌认证器,但在本文中,我要介绍的是另外一种 SSH 登陆方案:OTPW,它是个一次性密码登陆的软件包。不像谷歌认证,OTPW 不须要依赖任何第三方库。安全
OTPW 由一次性密码生成器和 PAM 认证规则组成。在 OTPW 中一次性密码由生成器事先生成,而后由用户以某种安全的方式得到(好比打印到纸上)。另外一方面,这些密码会经过 Hash 加密保存在 SSH 服务器端。当用户使用一次性密码登陆系统时,OTPW 的 PAM 模块认证这些密码,而且保证它们不能再次使用。服务器
使用 apt-get 安装:session
$ sudo apt-get install libpam-otpw otpw-bin
打开针对 SSH 服务的 PAM 配置文件(/etc/pam.d/sshd),注释掉下面这行(目的是禁用 PAM 的密码认证功能):ssh
#@include common-auth
添加下面两行(用于打开一次性密码认证功能):工具
auth required pam_otpw.so
session optional pam_otpw.so
在基于 RedHat 的发行版中没有编译好的 OTPW,因此咱们须要使用源代码来安装它。测试
首先,安装编译环境:ui
$ sudo yum git gcc pam-devel
$ git clone https://www.cl.cam.ac.uk/~mgk25/git/otpw
$ cd otpw
打开 Makefile 文件,编辑以“PAMLIB=”开头的那行配置:加密
64 位系统:
PAMLIB=/usr/lib64/security
32 位系统:
PAMLIB=/usr/lib/security
编译安装。须要注意的是安装过程会自动重启 SSH 服务一下,因此若是你是使用 SSH 链接到服务器,作好被断开链接的准备吧(LCTT 译注:也许不会被断开链接,即使被断开链接,请使用原来的方式从新链接便可,如今尚未换成一次性口令方式。)。
$ make
$ sudo make install
如今你须要更新 SELinux 策略,由于 /usr/sbin/sshd 会往你的 home 目录写数据,而 SELinux 默认是不容许这么作的。若是没有使用 SELinux 服务(LCTT 注:使用 getenforce 命令查看结果,若是是 enforcing,就是打开了 SELinux 服务),请跳过这一步。
$ sudo grep sshd /var/log/audit/audit.log | audit2allow -M mypol
$ sudo semodule -i mypol.pp
接下来打开 PAM 配置文件(/etc/pam.d/sshd),注释下面这行(为了禁用密码认证):
#auth substack password-auth
添加下面两行(用于打开一次性密码认证功能):
auth required pam_otpw.so
session optional pam_otpw.so
打开 /etc/ssh/sshd_config 文件,设置下面三个参数。你要确保下面的参数不会重复存在,不然 SSH 服务器可能会出现异常。
UsePrivilegeSeparation yes
ChallengeResponseAuthentication yes
UsePAM yes
你还须要禁用默认的密码认证功能。另外能够选择开启公钥认证功能,那样的话你就能够在没有一次性密码的时候使用公钥进行认证。
PubkeyAuthentication yes
PasswordAuthentication no
重启 SSH 服务器。
Debian, Ubuntu 或 Linux Mint 发行版:
$ sudo service ssh restart
Fedora 或 CentOS/RHEL 7 发行版:
$ sudo systemctl restart sshd
(LCTT 译注:虽然这里重启了 sshd 服务,可是你当前的 ssh 链接应该不受影响,只是在你完成下述步骤以前,没法按照原有方式创建新的链接了。所以,保险起见,要么多开一个 ssh 链接,避免误退出当前链接;要么将重启 sshd 服务器步骤放到步骤3完成以后。)
以前提到过,你须要事先建立一次性密码,并保存起来。使用 otpw-gen 命令建立密码:
$ cd ~
$ otpw-gen > temporary_password.txt
这个命令会让你输入密码前缀,当你之后登陆的时候,你须要同时输入这个前缀以及一次性密码。密码前缀是另一层保护,就算你的一次性密码表被泄漏,别人也没法经过暴力破解你的 SSH 密码。
设置好密码前缀后,这个命令会产生 280 个一次性密码(LCTT 译注:保存到 ~/.otpw 下),并将它们导出到一个文本文件中(如 temporary_password.txt)。每一个密码(默认是 8 个字符)由一个 3 位十进制数索引。你须要将这个密码表打印出来,并随身携带。
查看 ./.otpw 文件,它存放了一次性密码的 HASH 值。头 3 位十进制数与你随身携带的密码表的索引一一对应,在你登陆 SSH 服务器的时候会被用到。
$ more ~/.otpw
<pre name="code" class="plain">OTPW1
280 3 12 8
191ai+:ENwmMqwn
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z
使用普通的方式登陆 SSH 服务器:
$ ssh user@remote_host
若是 OTPW 成功运行,你会看到一点与平时登陆不一样的地方:
Password 191:
如今打开你的密码表,找到索引号为 191 的密码。
023 kBvp tq/G 079 jKEw /HRM 135 oW/c /UeB 191 fOO+ PeiD 247 vAnZ EgUt
从上表可知,191 号密码是“fOO+PeiD”。你须要加上密码前缀,好比你设置的前缀是“000”,则你实际须要输入的密码是“000fOO+PeiD”。
成功登陆后,你此次输入的密码自动失效。查看 ~/.otpw 文件,你会发现第一行变成“—————”,这表示 191 号密码失效了。
OTPW1
280 3 12 8
---------------
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z
在这个教程中,我介绍了如何使用 OTPW 工具来设置一次性登陆密码。你也许意识到了在这种双因子的认证方式中,打印一张密码表让人感受好 low,可是这种方式是最简单的,而且不用依赖任何第三方软件。不管你用哪一种方式建立一次性密码,在你须要在一个不可信任的环境登陆 SSH 服务器的时候,它们都颇有用。