常言道,安全不是一种产品,而是一个过程。虽然SSH协议本身在设计上采用了密码,因而很安全,但要是它未得到适当管理:无论是弱密码、密钥泄密还是过时的SSH客户软件,有人就会对你的SSH服务造成严重破坏。
至于SSH验证,公钥验证通常被认为比密码验证来得安全。然而,如果你从公共或共享的计算机登录,密钥验证实际上并不可取,甚至不太安全。因为在这类计算机上,总是有可能潜藏着隐形击键记录程序或内存抓取恶意软件(memory scraper)之类的威胁。要是你无法信任本地计算机,最好还是使用别的密码。这时候,“一次性密码”就派得上用场。顾名思义,每个一次性密码只能用一次。这种一次性密码可以在不可信任的环境下安全地使用,因为即使被人盗取,它们也无法再次使用。
生成一次性密码的办法之一就是通过谷歌验证器(Google Authenticator)。在本教程中,我将演示创建用于SSH登录的一次性密码的另一种方法:OTPW(~mgk25/otpw.html),这是一次性密码登录程序包。不像谷歌验证器,你不用依赖任何第三方即可生成并验证一次性密码。
OTPW简介
OTPW包括两部分:一次性密码生成器和集成PAM的验证实用例程。在OTPW中,一次性密码由生成器通过推理法生成,并由用户安全地携带(比如打印在纸张上)。所生成密码的密码散列然后存储在SSH服务器主机上。当用户用一次性密码登录时,OTPW的PAM模块就会验证密码,使用后让密码作废,防止再次使用。
第一步:在Linux上安装和配置OTPW
在Debian、Ubuntu或Linux Mint上:
用apt-get安装OTPW程序包。
$ sudo apt-get install libpam-otpw otpw-bin使用文本编辑工具,打开SSH的PAM配置文件(/etc/pam.d/sshd),注释掉下面这行代码(以禁用密码验证)。
#@include common-auth然后添加下面两行代码(以启用一次性密码验证):
auth required pam_otpw.so session optional pam_otpw.so在基于红帽的系统上,没有作为预制程序包的OTPW。于是,我们通过从源代码来构建的方法,安装OTPW。
首先,安装基本组件:
$ 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连接,就要准备好断开。
$ make $ sudo make install现在你需要更新SELinux策略,因为/usr/sbin/sshd试图写入到用户的主目录,而默认的SELinux策略不允许这个操作。下面这些命令可以起到更新策略的作用。如果你不使用SELinux,跳过这一步好了。
$ sudo grep sshd /var/log/audit/audit.log | audit2allow -M mypol $ sudo semodule -i mypol.pp下一步,用文本编辑工具打开SSH的PAM配置文件(/etc/pam.d/sshd),注释掉下面这行代码(以禁用密码验证)。
#auth substack password-auth然后添加下面两行代码(以启用一次性密码验证):
auth required pam_otpw.so session optional pam_otpw.so第二步:针对一次性密码配置SSH服务器
下一步是配置SSH服务器,以接受一次性密码。
用文本编辑工具打开/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第三步:用OTPW生成一次性密码
如前所述,你需要事先创建一次性密码,并将它们存储在远程SSH服务器主机上。为此,以你登录时所用的用户身份运行otpw-gen工具。
$ cd ~ $ otpw-gen > temporary_password.txt