预计阅读本页时间:-
9.4 认证
每一个安全的计算机系统一定会要求所有的用户在登录的时候进行身份认证。如果操作系统无法确定当前使用该系统的用户的身份,则系统无法决定哪些文件和资源是该用户可以访问的。表面上看认证似乎是一个微不足道的话题,但它远比大多数人想象的要复杂。
用户认证是我们在1.5.7部分所阐述的“个体重复系统发育”事件之一。早期的主机,如ENIAC并没有操作系统,更不用说去登录了。后续的批处理和分时系统通常有为用户和作业的认证提供登录服务的机制。
早期的小型计算机(如PDP-1和PDP-8)没有登录过程,但是随着UNIX操作系统在PDP-11小型计算机上的广泛使用,又开始使用登录过程。早先的个人计算机(如Apple II和最初的IBM PC)没有登录过程,但是更复杂的个人计算机操作系统,如Linux和Windows Vista需要安全登录(然而有些用户却将登录过程去除)。公司局域网内的机器设置了不能被跳过的登录过程。今天很多人都直接登录到远程计算机上,享受网银服务、网上购物、下载音乐,或进行其他商业活动。所有这些都要求以登录作为认证身份的手段,因此认证再一次成为与安全相关的重要话题。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
决定如何认证是十分重要的,接下来的一步是找到一种好方法来实现它。当人们试图登录系统时,大多数用户登录的方法基于下列三个方面考虑:
1)用户已知的信息。
2)用户已有的信息。
3)用户是谁。
有些时候为了达到更高的安全性,需要同时满足上面的两个方面。这些方面导致了不同的认证方案,它们具有不同的复杂性和安全性。我们将依次论述。
那些想在某系统上惹麻烦的人首先必须登录到系统上,这决定了我们要采用哪一种认证方法。通常,我们把这些人叫做“黑客”。但是,在计算机界,“黑客”是对资深程序员的荣誉称呼。他们中也许有一些是欺诈性的,但大多数人并不是。我们在这方面理解错了。考虑到黑客真正的含义,我们应该恢复他们的名声,并把那些企图非法闯入计算机系统的人归结到骇客(Cracker)一类。通常“黑客”被分为并不从事违法活动的“白帽子黑客”和从事破坏活动的“黑帽子黑客”。在人们的经验中,绝大多数“黑客”长时间呆在室内,而且并不戴帽子,所以事实上很难通过他们的帽子来区分“黑客”的好坏。
9.4.1 使用口令认证
最广泛使用的认证方式是要求用户输入登录名和口令。口令保护很容易理解,也很容易实施。最简单的实现方法是保存一张包含登录名和口令的列表。登录时,通过查找登录名,得到相应的口令并与输入的口令进行比较。如果匹配,则允许登录,如果不匹配,登录被拒绝。
毫无疑问,在输入口令时,计算机不能显示被输入的字符以防在终端周围的好事之徒看到。在Windows系统中,将每一个输入的口令字符显示成星号。在UNIX系统中,口令被输入时没有任何显示。这两种认证方法是不同的。Windows也许会让健忘的人在输入口令时看看输进了几个字符,但也把口令长度泄露给了“偷听者”。(因为某种原因,英语有一个词汇专门表示偷听的意思,而不是表示偷窥,这里不是嘀咕的意思,这个词在这里不适用。)从安全角度来说,沉默是金。
另一个设计不当的方面出现了严重的安全问题,如9-17所示。在图9-17a中显示了一个成功的登录信息,用户输入的是小写字母,系统输出的是大写字母。在图9-17b中,显示了骇客试图登录到系统A中的失败信息。在图9-17c中,显示了骇客试图登录到系统B中的失败信息。

在图9-17b中,系统只要看到非法的登录名就禁止登录。这样做是一个错误,因为系统让骇客有机会尝试,直到找到合法的登录名。在图9-17c中,无论骇客输入的是合法还是非法的登录名,系统都要求输入口令并没有给出任何反馈。骇客所得到的信息只是登录名和口令的组合是错误的。
大多数笔记本电脑在用户登录的时候要求一个用户名和密码来保护数据,以防止笔记本电脑失窃。然而这种保护在有些时候却收效甚微,任何拿到笔记本的人都可以在计算机启动后迅速敲击DEL、F8或相关按键,并在受保护的操作系统启动前进入BIOS配置程序,在这里计算机的启动顺序可以被改变,使得通过USB端口启动的检测先于对从硬盘启动的检测。计算机持有者此时插入安装有完整操作系统的USB设备,计算机便会从USB中的操作系统启动,而不是本机硬盘上的操作系统启动。计算机一旦启动起来,其原有的硬盘则被挂起(在UNIX操作系统中)或被映射为D盘驱动器(在Windows中)。因此,绝大多数BIOS都允许用户设置密码以控制对BIOS配置程序的修改,在密码的保护下,只有计算机的真正拥有者才可以修改计算机启动顺序。如果读者拥有一台笔记本电脑,那么请先放下本书,先为BIOS设置一个密码。
1.骇客如何闯入
大多数骇客通过远程连接到目标计算机(比如通过Internet)、尝试多次登录(登录名和口令)的方法找到进入系统的渠道。许多人使用自己的名字或名字的某种形式作为登录名。如对Ellen Ann Smith来说,ellen、smith、ellen_smith、el1en-smith、ellen.smith、esmith、easmith等都可能成为备选登录名。黑客凭借一本叫做《4096 Names for Your New Baby》4096个为婴儿准备的名字的书外加一本含有大量名字的电话本,就可以对打算攻击的国家计算机系统编辑出一长串潜在的登录名(如ellen_smith可能是在美国或英国工作的人,但在日本却行不通)。
当然,仅仅猜出登录名是不够的。骇客还需要猜出登录名的口令。这有多难呢?简单得超过你的想象。最经典的例子是Morris和Thompson(1979)在UNIX系统上所做的安全口令尝试。他们编辑了一长串可能的口令:名和姓氏、路名、城市名、字典里中等长度的单词(也包括倒过来拼写的)、许可证号码和许多随机组成的字符串。然后他们把这一名单同系统中的口令文件进行比较,看看有多少被猜中的口令。结果有86%的口令出现在他们的名单里。Klein(1990)也得到过同样类似的结果。
也许有人认为优秀的用户会挑选特别的口令,实际上许多人并没有这么做。一份1997年伦敦金融部门关于口令的调查报告显示,82%的口令可以被轻易猜出。通常被用户采用的口令包括:性别词汇、辱骂语、人名(家庭成员或体育明星)、度假地和办公室常见的物体(Kabay,1997)。这样,骇客不费吹灰之力就可以编辑出一系列潜在的登录名和口令。
网络的普及使得这一情况更加恶化。很多用户并不只拥有一个密码,然而由于记住多个冗长的密码是一件困难的事情,因此大多数用户都趋向于选择简单且强度很弱的密码,并且在多个网站中重复使用他们(Florencio和Herley,2007;Gaw和Felten,2006)。
如果口令很容易被猜出,真的会有什么影响吗?当然有。1998年,《圣何塞信使新闻》报告说,一位在Berkeley的居民Peter Shipley,组装了好几台未被使用的计算机作为军用拨号器(war dialer),拨打了某一个分局内的10 000个电话号码[如(415)770-xxxx]。这些号码是被随机拨出的,以防电话公司禁用措施和跟踪检测。在拨打了大约260万个电话后,他定位了旧金山湾区的20 000台计算机,其中约200台没有任何安全防范。他估计一个别有用心的骇客可以破译其他75%的计算机系统(Denning,1999)。这就回到了侏罗纪时代,计算机实际只需拨打所有260万个电话号码。 [1]
并不只有加利福尼亚州才有这样的骇客,一个澳大利亚骇客曾经做过同样的尝试。在这个骇客闯入的系统中有在沙特阿拉伯的花旗银行的计算机,使他能够获得信用卡号码、信用额度(如500万美元)和交易记录。他的一个同伴也曾闯入过银行计算机系统,盗取了4000个信用卡号(Denning,1999)。如果滥用这样的信息,银行毫无疑问会极力否认自己有错,而声称一定是客户泄露了信息。
互联网是上帝赐给骇客的最好的礼物,它帮助骇客扫清了入侵计算机过程中的绝大多数麻烦,不需要拨打更多的电话号码,军用拨号器可以按下面的方式工作。每一台联入互联网的计算机都有一个(32位的)IP地址(IP Address)。人们通常把这些地址写成十进制点符号,如w.x.y.z,每一个字母代表从0到255的十进制IP地址。骇客可以非常容易地测试拥有这类IP地址的计算机,并通过向shell或控制台中输入命令
ping w.x.y.z
来判断该计算机是否在网上。如果计算机在网上,它将发出回复信息并告知走一个来回需要多少毫秒(虽然某些网站屏蔽了ping命令以防攻击)。黑客很容易写一个程序来自动发射大量的IP地址,当然也可以让军用拨号器来做。如果某台计算机被发现在网上的IP地址为w.x.y.z,骇客就可以通过输入
telnet w.x.y.z
尝试进入系统。
如果联机尝试被允许(也可能被拒绝,因为不是所有的系统管理员欢迎通过Internet来登录),骇客就能够开始从他的名单中尝试登录名和口令。起初可能会失败,但随着几次尝试后,骇客最后总是能进入系统并获取口令文件(通常位于UNIX系统的/etc/passwd下,而且对公众是可读的)。然后,他开始收集关于登录名使用频率等统计信息来优化进一步的搜索。
许多telnet(远程登录)后台程序在骇客尝试了许多不成功的登录后会暂停潜在的TCP连接,以降低骇客的连接速度。骇客这时会同时启动若干个并行线程,一次攻击不同的目标。他们的目标是在一秒中内进行尽可能多的尝试,利用尽可能多的带宽。从他们的观点来说,同时攻击好几台计算机并不是一个严重的缺陷。
除了依次ping计算机的IP地址外,骇客还可以攻击公司、大学或其他政府性组织等目标,如地址为foobar.edu的Foobar大学。骇客通过输入
dnsquery foobar.edu
就可以查到该大学的一长串IP地址,也可以使用nslookup或者dig程序(还可以通过向机器中键入“DNS query”来从网络中查找可以进行免费DNS查询的网站,例如www.dnsstuff.com)。因为许多机构都拥有65 536个连续的IP地址(过去常用的一整个分配单元),所以骇客一旦得到IP地址的前2个字节(dnsquery命令的结果),就可以连续地使用ping命令来看一看哪些地址有回应,并且可以接受telnet连接。完成这一步后,骇客就可以通过我们前面所介绍的猜用户名和口令的方法闯入系统。
毫无疑问,从解析主机名称找到IP地址的前2个字节,到ping所有的地址看哪些有反应,再看这些地址是否支持telnet连接,到最后大量地进行诸如(登录名和口令)对一类的猜测,这些过程都可以很好地自动完成。这一过程会进行大量的尝试,以便闯入,而且如果骇客的计算机性能稳定的话,可以不断地重复运行某些命令直到进入系统。一个拥有高速电缆或DSL连接的骇客可以一整天让计算机自动尝试进入某个系统,而他所做的只是偶尔看一下是否有反馈信息。
除了远程登录服务(telnet service)以外,很多计算机还提供了很多其他可以应用于互联网的服务。每个服务都与65 536个端口(port)中的一个相关联(attach),当骇客找到了一个活动的IP地址,通常情况下他会执行端口扫描(port scan)来确定每个端口允许哪些服务。某些端口可能会提供额外的服务,而骇客则可能利用这些服务侵入系统。
使用telnet攻击或端口扫描很明显比军用拨号器要快(无须拨号时间),而且成本低(无须长途电话费)。但它仅适用于攻击Internet上的计算机和telnet连接。而的确有许多公司(包括几乎所有的大学)都接受telnet连接,以保证雇员在出差时或在不同的办公室(或在家里的学生)进行远程登录。
不仅用户口令如此脆弱,而且超级用户口令有时也十分脆弱。特别是有些刚刚安装好的服务器从不更改出厂时的默认口令。一位Berkeley大学的天文学家Cliff Stoll曾经观测到自己计算机系统的不正常,于是他放置了一个陷阱程序来捕捉入侵者(Stoll,1989)。他观察到了一个如图9-18的入侵过程——某个骇客闯入了Lawrence Berkeley实验室(LBL)并想进入下一个目标。用于网上交换的uucp(UNIX到UNIX的COPY程序)账号拥有超级用户的权力,这样骇客可以闯入系统成为美国能源部计算机的超级用户。幸运的是,LBL并不是设计核武器的实验室,而它在Livermore的姐妹实验室却的确是设计核武器的。人们希望自己的计算机系统更加安全,但当另一家设计核武器的实验室Los Alamos丢失了一个装有2000年机密信息的硬盘以后,大家就没有理由相信系统是安全的了。

一旦骇客闯入了系统并成为超级用户,他就可能安装一个叫做包探测器(packet sniffer)的软件,该软件可以检查所有在网上进出的特定信息包。其中之一是查看哪些人从该系统上远程登录到别的计算机上,特别是作为超级用户登录。这些信息可以被骇客隐藏在某一文件下以便闲暇之余来取。通过这个办法,骇客可以从进入一个安全级别较低的计算机入手,不断地闯入更强安全性能的系统里。
目前越来越多的非法入侵都是一些技术上的生手造成的,他们不过是运行了一些在Internet上找到的脚本程序。这些脚本要么使用我们上面介绍的极端攻击,要么试图找到特定程序的bug。真正的骇客认为他们只是些脚本爱好者(script kiddy)。
通常脚本爱好者没有特定的攻击目标也没有特别想偷窃的信息。他们不过是想看看哪些系统较容易闯入罢了。有些脚本爱好者随便找一个网络攻击,有些干脆随机选取网络地址(IP地址的高位)看看哪些有反应。一旦获得了一个有效IP地址的数据库,就可以依次对计算机进行攻击了。结果是,一台全新的、有安全保卫的军方计算机,刚联网数小时后就受到了来自Internet的攻击,甚至除了系统管理员外还没有多少人知晓这台机器。
2.UNIX口令安全性
有些(老式的)操作系统将口令文件以未加密的形式存放在磁盘里,由一般的系统保护机制进行保护。这样做等于是自找麻烦,因为许多人都可以访问该文件。系统管理员、操作员、维护人员、程序员、管理人员甚至有些秘书都可以轻而易举得到。
在UNIX系统里有一个较好的做法。当用户登录时,登录程序首先询问登录名和口令。输入的口令被即刻“加密”,这是通过将其作为密钥对某段数据加密完成的:运行一个有效的单向函数,运行时将口令作为输入,运行结果作为输出。这一过程并不是真的加密,但人们很容易把它叫做加密。然后登录程序读入加密文件,也就是一系列ASCII代码行,每个登录用户一行,直到找出包含登录名的那一行。如果这行内(被加密后的)的口令与刚刚计算出来的输入口令匹配,就允许登录,否则就拒绝。这种方法的最大好处是任何人(甚至是超级用户)都无法查看任何用户的口令,因为口令文件并不是以未加密方式在系统中任意存放的。
然而,这种方法也可能遭到攻击。骇客可以首先像Morris和Thompson一样建立备选口令的字典并在空暇时间用已知算法加密。这一过程无论有多长都无所谓,因为它们是在进入系统前事先完成的。现在有了口令对(原始口令和经过了加密的口令)就可以展开攻击了。骇客读入口令文件(可公开获取),抽取所有加密过的口令,然后将其与口令字典里的字符串进行比较。每成功一次就获取了登录名和未加密过的口令。一个简单的shell脚本可以自动运行上述操作,这样整个过程可以在不到一秒的时间内完成。这样的脚本一次运行会产生数十个口令。
Morris和Thompson意识到存在这种攻击的可能性,引入了一种几乎使攻击毫无效果的技巧。这一技巧是将每一个口令同一个叫做“盐”(salt)的n位随机数相关联。无论何时只要口令改变,随机数就改变。随机数以未加密的方式存放在口令文件中,这样每个人都可以读。不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密。加密后的结果存放进口令文件。如图9-19所示,一个口令文件里有5个用户:Bobbie、Tony、Laura、Mark和Deborah。每一个用户在文件里分别占一行,用逗号分解为3个条目:登录名、盐和(口令+盐)的加密结果。符号e(Dog,4238)表示将Bobbie的口令Dog同他的随机,4238通过加密函数e运算后的结果。这一加密值放在Bobbie条目的第三个域。

现在我们回顾一下骇客非法闯入计算机系统的整个过程:首先建立可能的口令字典,把它们加密,然后存放在经过排序的文件f中,这样任何加密过的口令都能够被轻易找到。假设入侵者怀疑Dog是一个可能的口令,把Dog加密后放进文件f中就不再有效了。骇客不得不加密2n 个字符串,如Dog0000、Dog0001、Dog0002等,并在文件f中输入所有知道的字符串。这种方法增加了2n 倍的f的计算量。在UNIX系统中的该方法里n=12。
对附加的安全功能来说,有些UNIX的现代版使口令不可读但却提供了一个程序可以根据申请查询口令条目,这样做极大地降低了任何攻击者的速度。对口令文件采用“加盐”的方法以及使之不可读(除非间接和缓慢地读),可以抵挡大多数的外部攻击。
3.一次性口令
很多管理员劝解他们的用户一个月换一次口令。但用户常常不把这些忠告放在心上。更换口令更极端的方式是每次登录换一次口令,即使用一次性口令。当用户使用一次性口令时,他们会拿出含有口令列表的本子。用户每一次登录都需要使用列表里的后一个口令。如果入侵者万一发现了口令,对他也没有任何好处,因为下一次登录就要使用新的口令。惟一的建议是用户必须避免丢失口令本。
实际上,使用Leslie Lamport巧妙设计的机制,就不再需要口令本了,该机制让用户在并不安全的网络上使用一次性口令安全登录(Lamport,1981)。Lamport的方法也可以让用户通过家里的PC登录到Internet服务器,即便入侵者可以看到并且复制下所有进出的消息。而且,这种方法无论在服务器和还是用户PC的文件系统中,都不需要放置任何秘密信息。这种方法有时候被称为单向散列链(one-way hash chain)。
上述方法的算法基于单向函数,即y=f(x)。给定x我们很容易计算出y,但是给定y却很难计算出x。输入和输入必须是相同的长度,如256位。
用户选取一个他可以记住的保密口令。该用户还要选择一个整数n,该整数确定了算法所能够生成的一次性口令的数量。如果,考虑n=4,当然实际上所使用的n值要大得多。如果保密口令为s,那么通过单向函数计算n次得到的口令为:
P1 =f(f(f(f(s))))
第2个口令用单向函数运算n-1次:
P2 =f(f(f(s)))
第3个口令对f运算2次,第4个运算1次。总之,Pi-1 =f(Pi )。要注意的地方是,给定任何序列里的口令,我们很容易计算出口令序列里的前一个值,但却不可能计算出后一个值。如,给定P2 很容易计算出P1 ,但不可能计算出P3 。
口令服务器首先由P0 进行初始化,即f(P1 )。这一值连同登录用户名和整数1被存放在口令文件的相应条目里。整数1表示下一个所需的口令是P1 。当用户第一次登录时,他首先把自己的登录名发送到服务器,服务器回复口令文件里的整数值1。用户机器在本地对所输入的s进行运算得到P1 。随后服务器根据P1 计算出f(P1 ),并将结果同口令文件里的(P0 )进行比较。如果符合,登录被允许。这时,整数被增加到2,在口令文件中P1 覆盖了P0 。
下一次登录时,服务器把整数2发送到用户计算机,用户机器计算出P2 。然后服务器计算f(P2 )的值并将其与口令文件中存放的值进行比较。如果两者匹配,就允许登录。这时整数n被增加到3,口令文件中由P2 覆盖P1 。这一机制的特性保证了即使入侵者可以窃取Pi 也无法从Pi 计算出Pi+1 ,而只能计算出Pi-1 ,但Pi-1 已经使用过,现在失效了。当所有n个口令都被用完时,服务器会重新初始化一个密钥。
4.挑战-响应认证
另一种口令机制是让每一个用户提供一长串问题并把它们安全地放在服务器中(如可以用加密形式)。问题是用户自选的并且不用写在纸上。下面是用户可能选择的问题:
1)谁是Marjolein的姐妹?
2)你的小学在哪一条路上?
3)Woroboff女士教什么课?
在登录时,服务器随机提问并验证答案。要使这种方法有效,就要提供尽可能多的问题和答案。
另一种方法叫做挑战-响应。使用这种方法时,在登录为用户时用户选择某一种运算,例如x2 。当用户登录时,服务器发送给用户一个参数,假设是7,在这种情形下,用户就输入49。这种运算方法可以每周、每天后者从早到晚经常变化。
如果用户的终端设备具有十分强大的运算能力,如个人计算机、个人数字助理或手机,那么就可以使用更强大的挑战响应方法。过程如下:用户事先选择密钥k,并手工放置到服务器中。密钥的备份也被安全地存放在用户的计算机里。在登录时,服务器把随机产生的数r发送到用户端,由用户端计算出f(r,k)的值。其中,f是一个公开已知的函数。然后,服务器也做同样的运算看看结果是否一致。这种方法的优点是即使窃听者看到并记录下双方通信的信息,也对他毫无用处。当然,函数f需要足够复杂,以保证k不能被逆推。加密散列函数是不错的选择,r与k的异或值(XOR)作为该函数的一个参数。迄今为止,这样的函数仍然被认为是难以逆推的。