如何用一次性密码通过 ssh 安全登录 linux-mile米乐体育

有人说,安全不是一个产品,而是一个过程(lctt 注:安全公司 mcafee 认为,安全风险管理是一个方法论,而不是安全产品的堆叠)。虽然 ssh 协议被设计成使用加密技术来确保安全,但如果使用不当,别人还是能够破坏你的系统:比如弱密码、密钥泄露、使用过时的 ssh 客户端等,都能引发安全问题。

在考虑 ssh 认证方案时,大家普遍认为公钥认证比密码认证更安全。然而,公钥认证技术并不是为公共环境设置的,如果你在一台公用电脑上使用公钥认证登录 ssh 服务器,你的服务器已经毫无安全可言了,公用的电脑可能会记录你的公钥,或从你的内存中读取公钥。如果你不信任本地电脑,那你最好还是使用其他方式登录服务器。现在就是“一次性密码(otp)”派上用场的时候了,就像名字所示,一次性密码只能被使用一次。这种一次性密码非常合适在不安全的环境下发挥作用,就算它被窃取,也无法再次使用。

有个生成一次性密码的方法是通过谷歌认证器,但在本文中,我要介绍的是另一种 ssh 登录方案:otpw,它是个一次性密码登录的软件包。不像谷歌认证,otpw 不需要依赖任何第三方库。

otpw 是什么

otpw 由一次性密码生成器和 pam 认证规则组成。在 otpw 中一次性密码由生成器事先生成,然后由用户以某种安全的方式获得(比如打印到纸上)。另一方面,这些密码会通过 hash 加密保存在 ssh 服务器端。当用户使用一次性密码登录系统时,otpw 的 pam 模块认证这些密码,并且保证它们不能再次使用。

步骤1:otpw 的安装和配置

在 debian, ubuntu 或 linux mint 发行版上

使用 apt-get 安装:

$ sudo apt-get install libpam-otpw otpw-bin

打开针对 ssh 服务的 pam 配置文件(/etc/pam.d/sshd),注释掉下面这行(目的是禁用 pam 的密码认证功能):

#@include common-auth

添加下面两行(用于打开一次性密码认证功能):

auth       required     pam_otpw.so session    optional     pam_otpw.so

在 fedora 或 centos/rhel 发行版上

在基于 redhat 的发行版中没有编译好的 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 连接到服务器,做好被断开连接的准备吧(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

步骤2:配置 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

(lctt 译注:虽然这里重启了 sshd 服务,但是你当前的 ssh 连接应该不受影响,只是在你完成下述步骤之前,无法按照原有方式建立新的连接了。因此,保险起见,要么多开一个 ssh 连接,避免误退出当前连接;要么将重启 sshd 服务器步骤放到步骤3完成之后。)

步骤3:使用 otpw 产生一次性密码

之前提到过,你需要事先创建一次性密码,并保存起来。使用 otpw-gen 命令创建密码:

$ cd ~ $ otpw-gen > temporary_password.txt

这个命令会让你输入密码前缀,当你以后登录的时候,你需要同时输入这个前缀以及一次性密码。密码前缀是另外一层保护,就算你的一次性密码表被泄漏,别人也无法通过暴力破解你的 ssh 密码。

设置好密码前缀后,这个命令会产生 280 个一次性密码(lctt 译注:保存到 ~/.otpw 下),并将它们导出到一个文本文件中(如 temporary_password.txt)。每个密码(默认是 8 个字符)由一个 3 位十进制数索引。你需要将这个密码表打印出来,并随身携带。

查看 ./.otpw 文件,它存放了一次性密码的 hash 值。头 3 位十进制数与你随身携带的密码表的索引一一对应,在你登录 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 工具来设置一次性登录密码。你也许意识到了在这种双因子的认证方式中,打印一张密码表让人感觉好 low,但是这种方式是最简单的,并且不用依赖任何第三方软件。无论你用哪种方式创建一次性密码,在你需要在一个不可信任的环境登录 ssh 服务器的时候,它们都很有用。你可以就这个主题来分享你的经验和观点。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图