如何在Linux上用一次性密码确保SSH登录安全?

译文
安全 数据安全
常言道,安全不是一种产品,而是一个过程。虽然SSH协议本身在设计上采用了密码,因而很安全,但要是它未得到适当管理:无论是弱密码、密钥泄密还是过时的SSH客户软件,有人就会对你的SSH服务造成严重破坏。

常言道,安全不是一种产品,而是一个过程。虽然SSH协议本身在设计上采用了密码,因而很安全,但要是它未得到适当管理:无论是弱密码、密钥泄密还是过时的SSH客户软件,有人就会对你的SSH服务造成严重破坏。

至于SSH验证,公钥验证通常被认为比密码验证来得安全。然而,如果你从公共或共享的计算机登录,密钥验证实际上并不可取,甚至不太安全。因为在这类计算机上,总是有可能潜藏着隐形击键记录程序或内存抓取恶意软件(memory scraper)之类的威胁。要是你无法信任本地计算机,最好还是使用别的密码。这时候,“一次性密码”就派得上用场。顾名思义,每个一次性密码只能用一次。这种一次性密码可以在不可信任的环境下安全地使用,因为即使被人盗取,它们也无法再次使用。

生成一次性密码的办法之一就是通过谷歌验证器(Google Authenticator)。在本教程中,我将演示创建用于SSH登录的一次性密码的另一种方法:OTPW(http://www.cl.cam.ac.uk/~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

如何在Linux上用一次性密码确保SSH登录安全?

在Fedora或CentOS/RHEL上:

在基于红帽的系统上,没有作为预制程序包的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

#p#

第二步:针对一次性密码配置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

#p#

第三步:用OTPW生成一次性密码

如前所述,你需要事先创建一次性密码,并将它们存储在远程SSH服务器主机上。为此,以你登录时所用的用户身份运行otpw-gen工具。

$ cd ~
$ otpw-gen > temporary_password.txt

如何在Linux上用一次性密码确保SSH登录安全?

它会要求你设置一个前缀密码。你以后登录时,就需要输入这个前缀密码以及一次性密码。实际上前缀密码是另一层保护机制。即使密码表落到了不法分子手里,前缀密码也会迫使对方采用蛮力攻击。

一旦前缀密码设置完毕,命令会生成280个一次性密码,并将它们存储在输出文本文件(比如temporary_password.txt)中。每个密码(默认情况下长度是8个字符)的前面是三位数的索引号。你可以将文件打印在纸张上,随身携带。

如何在Linux上用一次性密码确保SSH登录安全?

你还会看到~/.otpw文件已创建,这些密码的密码散列就存储在其中。每一行的头三位表明了将用于SSH登录的密码的索引号。

$ more ~/.otpw
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服务器:

$ 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程序包,设置用于SSH登录的一次性密码。你可能认识到,打印的密码表就好比是双因子验证中的安全令牌,只是比较平实罢了。不过,它更简单,你也不用依赖任何第三方即可实现。无论你使用什么机制来创建一次性密码,当你需要从不可信任的公共计算机登录到SSH服务器时,它们都大有帮助。欢迎留言交流。

英文:How to secure SSH login with one-time passwords on Linux

责任编辑:蓝雨泪 来源: 51CTO.com
相关推荐

2015-04-16 16:33:18

网络·安全技术周刊

2019-11-11 10:20:10

Linux重命名命令

2014-08-04 14:38:25

LinuxToken

2013-04-17 09:16:37

2014-03-06 15:16:18

安全管理linux安全

2011-04-18 13:36:42

2012-02-01 16:48:54

后门Putty

2010-11-24 16:32:50

2016-01-25 13:03:21

2023-09-26 07:11:15

KubernetesJob节点

2024-04-03 09:00:10

2024-02-28 08:18:13

Java日志项目

2021-07-26 09:56:19

AI 数据人工智能

2019-08-06 09:21:45

2021-08-12 09:48:21

Webpack Loa工具Webpack

2021-09-02 07:26:27

Django 验证码Framework

2024-07-17 11:27:26

2020-05-28 08:29:54

目录脚本测试

2012-09-18 15:04:31

Office 2013微软

2023-09-13 22:54:06

点赞
收藏

51CTO技术栈公众号