如何在 Ubuntu 14.04 上安装和使用 OTPW 获取单次使用 SSH 密码

介绍

SSH 带有几个安全功能来确保您的连接是安全的,并且您可以无需担心地对远程主机进行身份验证。

然而,有些情况下,使用 SSH 密钥是不合理的,或者实际上可能不安全的。 假设您试图从公共计算机或试图为朋友解决问题的计算机中使用 SSH。

如果您在这种情况下使用一个密钥对,即使您的密钥是密码保护的,密钥将被解密并放入本地机器的内存中,以便至少进行身份验证,这意味着如果您不信任本地机器,它将易受攻击。

一次密码验证(One Time Password Authentication)或OTPW的系统是为了在这种情况下运作而创建的。

在本指南中,我们将在Ubuntu 14.04 VPS实例上设置OTPW,这将允许我们使用两组密码登录,只能使用一次。

基本概念

OTPW的工作方式是通过连接到PAM身份验证系统。

在您配置系统允许使用 OTPW 登录后,您可以通过提供前缀密码来生成一组密码chunks,然后您可以打印这些密码,将它们保存在您可以访问和您信任的设备上(例如在您的手机上加密),或在您可以使用您不信任的计算机访问的其他格式中。

现在,当您被要求使用密码时,您将得到一个参考号码,您将输入您创建的预先密码,然后是与该参考号码相关联的密码部分。

如果有人在您的计算机上密钥登录或能够看到您输入密码,这并不重要,因为它在您登录后不会有效。

安装组件

要配置此系统,我们需要先安装必要的组件。

由于身份验证完全由服务器端处理,客户端与常规密码提示不一样,我们将只在我们的服务器上安装几个包。

我们将更新我们的包缓存并从库存中安装这些:

1sudo apt-get update
2sudo apt-get install otpw-bin libpam-otpw

正如你所看到的,该机制分为两部分。第一个组件用于生成和管理一次密码。第二个是与PAM一起使用的插件来对这些密码文件进行身份验证。

编辑 PAM 以利用 OTPW

在我们使用实际密码做任何事情之前,我们需要添加OTPW作为PAM的选项。

我们希望以一种限制常规密码登录的方式实现这一点,因为我们假定您已经在您信任的计算机上安装了设置SSH密钥进行身份验证。

要做到这一点,我们只会更改与SSH登录有关的文件,这不会干扰我们的本地登录或通过DigitalOcean网页控制台的登录。

打开 SSH PAM 配置文件:

1sudo nano /etc/pam.d/sshd

至于文件的顶部,有一个指令,旨在导入共同的文件. 这个文件允许正常的密码验证,而不使用OTPW系统,我们不希望我们的SSH会话。

1#@include common-auth

下面,让我们添加一些允许我们使用OTPW系统来处理密码请求的行:

1auth required pam_otpw.so
2session optional pam_otpw.so

完成后,保存并关闭文件。

配置SSHD

现在我们已经配置了 SSH daemon 的 PAM 模块以使用 OTPW,我们可以用相应的值来配置 daemon 本身。

打开带 root 特权的文件,查看文件:

1sudo nano /etc/ssh/sshd_config

我们正在寻找几个单独的值. 我们需要检查这些参数中的每个参数是否设置为下面的值. 如果您找不到任何参数,请添加并设置它们。

1UsePrivilegeSeparation yes
2PubkeyAuthentication yes
3ChallengeResponseAuthentication yes
4PasswordAuthentication no
5UsePAM yes

一旦您设置了这些参数,您想重新启动我们的 SSH 示范器,以便我们的更改能够产生影响:

1sudo service ssh restart

创建 OTPW 密码文件

现在我们的系统已配置为没有公共密钥的SSH用户使用OTPW,我们可以创建这个系统所需的两个密码文件。

我们将创建的第二个文件是人类可读的一次性密码,我们应该将其复制到安全设备,打印出来,或以其他方式将其放置在安全、便携的位置。

所有我们需要做的是生成这个列表,就是调用otpw-gen命令,这通常会输出可读的文本来标准化,但我们可以将其输入到一个文件中以便保持安全:

1cd ~
2otpw-gen > nothingtosee.txt

这将生成一个随机的种子,并请求密码前缀. 你应该使用相同的常识规则,你会使用任何常规的密码. 确保你记得密码。

之后,你将有一个 ~/.otpw 文件,其中包含密码补丁的哈希值,每行一个:

 1OTPW1
 2280 3 12 8
 3253tFMngG2PNYhn
 4132Kua%SZ+esb6t
 5237yH7D2FMbQsyW
 6125rrXfBRwnF+A%
 7106gJxhJE4jkknj
 804135:5:knWIB4:
 9232/d4kI:n57IcD
10244RASe8ka63b8Z
11057GmqfFe=pXQqu
12. . .

您还将您的未加密字符串及其参考号码插入到 `~/nothingtosee.txt 的文件中。

 1OTPW list generated 2014-04-03 18:06 on sshd
 2
 3000 /rGF h5Hq 056 /zi5 %yTJ 112 J7BT HdM=  168 fdBm X%Tn 224 69bi =9mE
 4001 GoOG jxYQ 057 E=o3 kuEF 113 zwit p27J 169 nHK9 CXRx 225 IihF =o8g
 5002 Xm=E PuXc 058 Ok27 ZJ++  114 On=5 pNYH 170 ZRDa mB5e 226 yYsb CAfn
 6003 deL+ iHs7 059 /WGS :J4M 115 ZZd/ 8zyU 171 acDd dESV 227 ddjg ipcR
 7004 KhDn NdfS 060 =tEz ACye 116 FkQ9 8kSu 172 iRSR nZWT 228 9hHd veZ9
 8005 rGFG K5=7 061 MvUW LRxc 117 2YwY axJJ 173 kEV5 T/Vz 229 wx%n Le6P
 9006 GWi2 fHjf 062 qOR: WN2x 118 FvD4 oNjT 174 99OT 8KPy 230 /I=Y hicP
10007 XPom pEYp 063 8Xvm vZGa 119 UNjF :Kys 175 b95i SU3R 231 keLn aDcK
11008 fJI% 3Qs2 064 3I7Q I2xc 120 5Tm9 REQK 176 AVg: 4ijE 232 :aIF op6V
12009 P/Sn dSxA 065 A+J6 =4zo 121 LAyj 3m2+  177 TMuN 9rJZ 233 SWvB %+cL
13. . .

左列是参考号码,随后为尾声8个字符,尾声中的第一个和最后4个字符之间的空间是可读性的,可在输入尾声时可选取。

默认情况下,发电机会产生足够的补丁,以适应标准纸张,这对于打印和输出的一种方式非常好。

您需要为您想要配置一次性密码访问的每个用户完成此过程。

尝试它出来

从没有配置您的SSH密钥的计算机(您也可以暂时将密钥从您的~/.ssh目录中移除),您可以测试新的一次性密码系统。

登录您已与 OTPW 配置的用户,您通常会:


1Password 253:

正如你所看到的,我们得到了OTPW想要的补丁。

首先,输入你的前缀密码,然后直接跟随同一行上的后缀,没有前缀密码和后缀之间的空间. 如果您愿意,您可以保留在后缀文件中显示的空间。

因此,让我们假设我的前缀密码是crazyburr!to,并且后缀文件有一个看起来像这样的列:

1249 N4HY RsbH
2250 +vAz fawn
3251 O4/R ZrhM
4252 c6kP jgUT
5253 I=aA OKSz
6254 aYzA :F64
7255 3ezp ZpIq
8256 ggIi TD2v

在这种情况下,我们可以输入crazyburr!toI=aA OKSzcrazyburr!toI=aOKSz

如果你检查你的 ~/.otpw 文件,你会看到其中一个 hashed 行已经被代替了 dashes:

 1. . .
 2091icM5kSPVOdcU
 3274Uf3q/=kTYcu8
 4229fHfmIsCj7mjQ
 5---------------
 6115EzDO6=jM/sOT
 7143iWCdteSk3kg7
 8265S+QTGcg+MAZO
 9174UgXchxsI2g:G
10. . .

这意味着补丁已经被使用,不再有效。

如果两个人同时尝试登录帐户,OTPW将相反地请求你的前缀密码,然后是3个后缀.所请求的3个后缀中的每一个将是不同的,所以正在键入并试图击败你打入密钥的人将无法成功完成。

快速将看起来像这样:

1Password 161/208/252:

在这种情况下,创建一个~/.otpw.lock文件.成功登录后,它应该被删除,但存在一个错误,这导致在某些情况下无法工作。

1rm ~/.otpw.lock

下次,您将被要求只使用一个密码。

警告和bug

我上面提到有时锁文件在您成功登录后不会自动删除,这尤其常见,当用户在完成提示之前通过键入 CTRL-C 取消连接时。

另一个相对重要的错误是报告剩余的有效 OTPW 条目数量,通常由 PAM 配置中的会话行处理,但目前它没有正常工作。

为了解决这个问题,Wolfgang Kroener 写了一种非常简单的 bash 脚本,它在 Debian 邮件列表线程中实现了这种功能。

1nano ~/.bashrc

向下,点击此处:

1if [ "$SSH_TTY" -a -f $HOME/.otpw ]; then
2  PW_LINES=$(wc -l <$HOME/.otpw)
3  PW_USED=$(grep -- ---- $HOME/.otpw | wc -l)
4  echo "OTPW $PW_USED/`echo $PW_LINES-2 | bc` used"
5fi

您还可以将此添加到一个更集中的位置,这样它将根据每个用户是否存在 ~/.otpw 文件而输出。

现在,当您登录时,您将收到当前剩余密码的统计数据:

1OTPW 6/280 used

OTPW 建议在您获得 50% 以下的可用密码时重建您的密码列表,您可以通过重新运行生成命令来完成此操作:

1otpw-gen > anotherfile.txt

这将重写您以前的密码补丁,因此在此过程之后,它们将变得不可用。

结论

设置 OTPW 可以为您提供从不安全位置登录服务器的选项.虽然它确实遭受了常规密码登录的一些缺点,但它提供了基于密钥的登录之间的中间区,这些登录永远不应该转移到不安全的计算机,以及常规密码登录,这些登录具有许多缺陷和漏洞。

Published At
Categories with 技术
Tagged with
comments powered by Disqus