14.3.一次性密码

默认情况下,FreeBSD 包括对一次性密码的支持(OPIE)。OPIE 旨在防止重放攻击,在重放攻击中,攻击者发现用户的密码并使用它来访问系统。由于一个密码在 OPIE 中只使用一次,因此被发现的密码对攻击者来说没有什么用。OPIE 使用安全散列和挑战/回应系统来管理密码。FreeBSD 的实现默认使用 MD5 哈希值。

OPIE 使用三种不同类型的密码。第一种是常用的 UNIX® 或 Kerberos 密码。第二种是由 opiekey 生成的一次性密码。第三种类型的密码是"秘密密码",用于生成一次性密码。秘密密码与 UNIX® 密码无关,并且应该与 UNIX® 密码不同。

还有另外两种数据对 OPIE 很重要。一个是"种子"或"钥匙",由两个字母和五个数字组成。另一个是"迭代计数",一个介于 1 和 100 之间的数字。OPIE 通过连接种子和秘密密码来创建一次性密码,按照迭代计数指定的次数应用 MD5 哈希,并将结果转换为表示一次性密码的六个简短英语单词。身份验证系统会跟踪上次使用的一次性密码,如果用户提供的密码的哈希值等于以前的密码,则对用户进行身份验证。由于使用了单向哈希,因此如果捕获了成功使用的密码,则不可能生成将来的一次性密码。每次成功登录后,迭代计数都会减少,以使用户和登录程序保持同步。当迭代计数减少到 1 时,必须重新初始化 OPIE。

在这个过程中,有几个程序参与其中。通过向 opiekey(1)open in new window 传递迭代次数、种子和秘密密码,生成一个一次性密码,或者一个连续的一次性密码列表。除了初始化 OPIE 之外,opiepasswd(1)open in new window 还用于更改密码、迭代计数或种子。opieinfo(1)open in new window 检查 /etc/opiekeys 中的相关凭证文件,并打印出调用用户的当前迭代次数和种子。

本节描述了四种不同的操作:第一个是如何通过安全连接首次设置一次性密码;第二个是如何在不安全的连接中使用 opiepasswd;第三是如何在不安全的连接上登录;第四部分是如何生成一些可以写下来或打印出来的密钥,以便在不安全的地方使用。

14.3.1. 初始化 OPIE

要首次初始化 OPIE,请在安全位置运行以下命令:

% opiepasswd -c
Adding unfurl:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase:
Again new secret pass phrase:

ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED

-c 设置控制台模式,该模式假定命令从安全位置运行,例如用户控制的计算机或用户控制的计算机的 SSH 会话。

出现提示时,请输入将用于生成一次性登录密钥的密码。此密码应难以猜测,并且应与与用户的登录帐户的密码不同。长度必须介于 10 到 127 个字符之间。请记住此密码。

ID 行列出了登录名称(unfurl),默认的迭代次数(499),以及默认的种子(to4268)。当登录时,系统会记住这些参数并显示出来,也就是说,不需要记住这些参数。最后一行列出了生成的一次性密码,它与这些参数和秘密密码相对应。在下次登录时,可使用这个一次性密码。

14.3.2. 不安全的连接初始化

要在一个不安全的系统上初始化或改变秘密密码,需要一个安全的连接到某个可以运行 opiekey 的地方。这可能是一个可信机器上的 shell 提示。需要一个迭代次数,100 也许是一个好的值,可以指定种子,也可以使用随机生成的。在不安全的连接上,即被初始化的机器上,使用 opiepasswd(1)open in new window

% opiepasswd

Updating unfurl:
You need the response from an OTP generator.
Old secret pass phrase:
	otp-md5 498 to4268 ext
	Response: GAME GAG WELT OUT DOWN CHAT
New secret pass phrase:
	otp-md5 499 to4269
	Response: LINE PAP MILK NELL BUOY TROY

ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY

要接受默认种子,请按回车键。在输入访问密码之前,请转到安全连接并为其提供相同的参数:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

切换回不安全的连接,并将生成的一次性密码复制到相关程序。

14.3.3. 生成单个一次性密码

初始化 OPIE 并登录后,将显示如下提示:

% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.

FreeBSD/i386 (example.com) (ttypa)

login: <username>
otp-md5 498 gr4269 ext
Password:

OPIE 提示提供了一个有用的功能。如果在密码提示符处按下回车键,则提示将打开回显并显示键入的内容。这在尝试从打印输出中手动键入密码时非常有用。

此时,请生成一次性密码以回答此登录提示。这必须在可安全运行 opiekey(1)open in new window 的受信任系统上完成。此命令有适用于 Windows®、Mac OS® 和 FreeBSD 的版本。此命令需要迭代计数和种子作为命令行选项。使用正在登录的计算机上的登录提示中的剪切和粘贴。

在受信任的系统上:

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

生成一次性密码后,请继续登录。

14.3.4. 生成多个一次性密码

有时无法访问受信任的计算机或安全连接。在这种情况下,可以使用 opiekey(1)open in new window 事先生成多个一次性密码。例如:

% opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI

\-n 5 要求依次输入五个键,30 指定最后的迭代号是什么。请注意,这些都是按照使用的相反顺序打印出来的。真正偏执的人可能想用手写下结果;否则,就打印出列表。每一行都显示迭代次数和一次性密码。当密码被使用时,将其划掉。

14.3.5. 限制 UNIX® 密码的使用

OPIE 可以根据登录会话的 IP 地址限制 UNIX® 密码的使用。相关文件是 /etc/opieaccess,默认情况下该文件是存在的。有关此文件的更多信息以及使用它时需要注意的安全注意事项,请参阅 opieaccess(5)open in new window

下面是一个示例 opieaccess

permit 192.168.0.0 255.255.0.0

此行允许其 IP 源地址(容易受到欺骗)与指定值和掩码匹配的用户随时使用 UNIX® 密码。

如果 opieaccess 中没有匹配的规则,则默认为拒绝非 OPIE 登录。