13.3. 一次性密码

预设FreeBSD已内置一次性密码(One-time Passwords In Everything,OPIE)。OPIE设计用来避免重送攻击(Replay attack),重送攻击指的是攻击者发现了某位使用者的密码,然后使用该密码来存取系统。由于在OPIE的环境下,一组密码只能被使用一次,被发现的密码对攻击者而言便没有什么作用。OPIE使用了安全的加密方式与诘问/响应系统(Challenge/response system)来管理密码。FreeBSD在实作上预设采用MD5加密。

OPIE使用了三种不同类型的密码,第一种是一般的UNIX®或Kerberos密码,第二种是由opiekey所产生的一次性密码,第三种是用来生一次性密码的秘密密码(Secret password),秘密密码与UNIX®密码无关且不应相同。

OPIE来说还有另外两个部份的数据很重要。其中一个是种子码(Seed)或称密钥(Key),由两个字母与五个数字组成。另一个则是叠代次数(Iteration count),是一个介于1到100间的数字。OPIE会将种子码与秘密密码串连后,套用MD5加密数次后(根据叠代次数),再将结果转换成六个简短的英文单字来产生一次性密码。认证系统会持续追踪最后使用的一次性密码,若使用者提供的密码加密后与前一次的密码相同则可通过认证。由于采用了单向的加密方式,若使用过的密码被成功撷取也无法拿来产生之后的一次性密码。叠代次数会在每一次登入成功之后减少,来保持使用者与登入程序间的同步。当叠代次数减少至1时,OPIE便要重新初始化。

这个整个程序会牵涉到几个程序。传送叠代次数、种子码与秘密密码来产生一组一次性密码或数个一次性密码的opiekey(1)。除了初始化OPIE之外,用来更改密码、叠代次数或种子码的opiepasswd(1)。会读取放在/etc/opiekeys的相关凭证档来列出使用者目前的叠代次数与种子码的 opieinfo(1)

本章节将介绍四种不同的操作,第一是如何在安全联机下做第一次的一次性密码设定,第二是如何使用在不安全的联机下使用opiepasswd,第三是如何在不安全的联机下登入系统,第四是如何产生数个可以被记录或打印下来在不安全的场所使的密钥。

13.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会设定采用假设指令在安全场所执行的Console模式,如在使用者掌控之中的电脑或者透过SSH联机到一台在使用者掌控之中的电脑。

提示出现后,输入用来产生一次性登入密钥的秘密密码,应使用一个不容易被猜出来的密码,且应与使用者登入帐号所使用的密码不同,密码必须介于10到127个字元长度之间,然后请记住这个密码。

ID行会列出登入名称(unfurl)、预设的叠代次数(499)以及预设的种子码(to4268)。在进行登入时,系统会记住这些参数并且显示出来,这也代表不需要另外记录这些信息。最后一行会列出根据这些参数与秘密密码所产生出来的一次性密码,在下一次登入时便要使用这个一次性密码。

13.3.2. 在不安全联机下做初始化

要在不安全的系统上初始化或更改秘密密码会需要某个可使用安全的联机的地方执行opiekey,这可能是在某一台信任的主机上的Shell。初始化需要设定叠代次数,100可能是不错的数字,种子码可以自行指定或随机产生,在不安全联机下要被初始化主机须使用opiepasswd(1)

% 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

要采用预设的种子码,可直接按下Return做初始化。接着在输入响应之前移到安全的联机然后给予相同的加密参数产生密码:

% 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

切换回不安全的联机,然后复制产生的一次性密码粘贴。

13.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的提示提供了一个很有用的功能,若在密码提示时按下Return,便会开启响应功能并显示输入的内容,这个功能在尝试手工输入打印出来的密码时很有用。

此时,要产生一次性密码来响应登入时的提示,这必须在受信任且可安全执行opiekey(1)的系统上完成。这个指令有提供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

在产生一次性密码后,回到登入画面继续登入。

13.3.4. 产生多组一次性密码

有时会无法存取信任的主机或没有安全的联机,在这种情况下,可以使用opiekey(1)来预先产生多个一次性密码,例如:

% 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则是指定最后一个叠代的编号。注意这些打印出的结果的顺序与使用的顺序相反。十足的偏执狂可能会想要用手写下结果,否则就列印出清单。每一行会同时显示叠代次数及一次性密码,在密码使用过后便可划掉。

13.3.5. 限制使用UNIX®密码

OPIE可以根据登入阶段的IP位置限制使用UNIX®密码,相关的档案为/etc/opieaccess,这个档案预设便存在。请参考opieaccess(5)来取得更多有关此档案的信息以及当使用时要考察的安全性问题。

这里有一个模板opieaccess

permit 192.168.0.0 255.255.0.0

这一行允许来源IP位址(容易受到诈骗的位址)符合指定值与掩码的使用者在任何时间可使用UNIX®密码登入。

若在opieaccess中没有符合的规则,预设会拒绝非OPIE的登入。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.