介绍
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 配置的用户,您通常会:
1ssh [email protected]
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 OKSz
或crazyburr!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 可以为您提供从不安全位置登录服务器的选项.虽然它确实遭受了常规密码登录的一些缺点,但它提供了基于密钥的登录之间的中间区,这些登录永远不应该转移到不安全的计算机,以及常规密码登录,这些登录具有许多缺陷和漏洞。