UNIX系统的口令防护机制
Walter Belgers
<翻译:yea(fritz_yea@163.com)>
walter@giga.win.tue.nl
1993年12月6日[1]
简介
本文意在提醒系统管理员,让他们对“合理设置口令[2]”这一问题的重要性产生足够的重视。容易猜的口令为黑客们(hackers[3])提供了侵入系统的可能性。现在,越来越多的计算机已经(或将要)连接到国际互联网。这意味着,互联网上会有越来越多的计算机用户,因此也会有越来越多的计算机黑客。一个好的口令防护机制,可以保护用户的系统不受黑客新手的骚扰。
我们现在面对着多种操作系统,每种系统里又有很多种安全保护机制。我在本文中将重点讨论UNIX系统的口令防护机制。这是因为,UNIX是一个非常流行的系统,尤其是在教育领域里,由于它(UNIX)的开放性,使得越来越多的黑客乐于至身其中。这一点在商业领域里正好相反,因为那里的数据(软件)是受保护的。例如,对竞争者而言,他不能篡改对手的软件。入侵UNIX系统有相当多的方法,同时也有相当多的程序能帮忙找到用户的口令。一个几乎没有UNIX知识的人也能使用这些程序。因此,设置一个好的口令,可以挡住那些黑客新手
(“高级黑客”即使不用口令也能侵入系统,这意味着系统的安全性不单由合理设置的口令决定)。
除了讨论“合理设置的口令(比如,不好猜的口令)”的重要性,我们还要了解口令防护机制是如何工作的。接下来我会例举一个使用了糟糕口令的实际例子。文章的最后,我会教大家一些设置合理口令的方法。
设置合理口令的重要性
黑客的目的通常就是要得到系统超级用户的权限(“根用户”)。一般的手段是,利用错误安装的软件、(系统)软件的漏洞以及操作者的失误。入侵一台计算机有许多种方法,但大多数都要求实施者有广博的知识。一个(相对)简单的方法是先以普通用户的身份登陆系统,然后四下搜寻系统的漏洞以使自己成为超级用户。前提是,黑客必须有有效的用户名和口令。
因此,最重要的是,系统中所有的(!)用户都必须选择不好猜的口令。每个用户的安全性都直接关系到整个系统的安全性。但用户大都不明白一个多用户系统是如何工作的,也不会没意识到,因为自己选一个好记忆的口令,将有可能间接导致某个外人操纵整个系统。有必要教导用户,不要产生下面这样的想法[Muf]: “我自己的账号的口令有什么样要紧的,毕竟,我也只是用它来打印些东西……”
用户有必要顾及到他所使用系统的安全性。在R. Pethia[Pet]的文章中提到:
“用户有责任为保障自己的数据而选用安全的设备和程序。他们同样也有责任促进其所使用系统的安全性。”
文章里还提到告知用户安全指标的重要性。一种解决方案是对新用户进行少量的培训。或者至少让他们明白,为什么选个好口令很重要。这事儿在系统管理员为新用户分配初始口令时就可以做。
黑客如何寻找口令
大多数UNIX系统并不使用我们下面要介绍的“影子口令文件[4]”。多数情况下,用户口令经过加密后,存放在/etc/passwd文件里,而如果本地系统是客户端的话,就存放在服务器的相应文件里。在后一种情况下,可以通过下面的命令察看:
$ ypcat passwd
口令文件里的每一行格式如下:
account:coded password data:uid:gid:GECOS-field:homedir:shell
比方说某个用户,他的账号名为gigawalt,加密后的口令是fURfuu4.4hY0U,用户识别号为129(用户ID可以是大于1的任何数,超级用户的ID是0),所属组群的识别号为129,用户信息(GECOS[5])里是他的全名Walter Belgers,个人的主目录是/home/gigawalt,使用C
shell(/bin/csh)。那么,在/etc/passwd 里看起来就是这样:
gigawalt:fURfuu4.4hY0U:129:129:Walter Belgers:/home/gigawalt:/bin/csh
而用了影子文件后情况就不太一样了。/etc/passwd中所有经过编码的口令都被一个星号“*”所替代,而真正的口令则放在另一个文件中,也就是影子文件。影子文件只有拥有特权的人(也就是root)才能读取,而一般用户根本无权访问。
用户口令将经过DES算法[6]的加密。使用DES时需要有一个密钥来加密和解密数据。加密UNIX口令总共经过了25次DES迭代。第一轮DES变换以64个0位作为初始输入,而用户输入的口令则作为加密的密钥。口令在变换时会被重新排列。排列总共有4096种可能。而对每个用户而言,选择怎样的排列方式是随机的。选定的排列方式被编码为一个2字节的字符串,我们称其为“粒子[7]”,并保存在口令文件中。第一轮的结果作为第二轮变换的输入,并使用相同的密钥和粒子。如此重复直到第25次变换完成并得到最终的输出。输出结果被编码为一个11字节的字符串保存在口令文件中。所以,最终的口令文件中包含了一段长13字节的经过编码的字符串,前两位是粒子而后11位是加密后的口令(在本例中,fU是粒子,Rfuu4.4hY0U是经过加密的口令——译注)。
这种加密方法几乎是不可逆的,就是说,我们可以很轻松的加密一段字符串,但是不能用同样的过程将密文解密成明文(原字符串),除非一个挨一个的试遍所有的密钥和粒子(穷举法,俗称暴力破解——译注)。这里所说的“不能”是指没有比暴力破解更快的方法。但是,仅经过一次DES迭代的数据是可以破解的,关于这方面的知识请参看[Til]。那么,既然无法解密被加密的口令,用户又是如何登陆进系统的?答案是:用户输入他/她的口令,然后系统根据口令文件中相应用户的粒子,按照前面提到的方法来加密64个0位。得到的结果再与口令文件中的密文进行比对,相一致的话就允许用户登陆了。更多有关UNIX系统中DES的详细工作信息请参阅[Fel2]。
整个过程的流程图:
正如我所说的,实际上人们无法破解密码。但是,人们却可以试着用些词语来加密64个0位,看看结果是否与口令“恰巧”一致。这样一来账号就被黑了。于是有人就会说,嘿,这样就能试遍所有的口令了。是的,可是这样做的话,即使用最快的计算机,算出密码时整个宇宙也早不存在了。用极强大的计算机,来暴力破解一个只由6个小写字母组成的口令,所花的时间还是可以接受的。目前在这种情况下最快的破解纪录是一个小时。那些尤其引起黑客兴趣的特权用户,绝对不能只用小写字母作口令!
我们看到了破解口令的一般方法就是来猜测它。所以你一定要保证系统里的用户不要使用好猜的口令。比如,凡是能从表里查到的词汇,不论是从字典还是百科全书,不论是天文学、植物学还是动物学的专业术语,都不要用!现在人们可以通过Internet轻易的组织出这么一张表。
假设口令文件里是这样写的:
gigawalt:fURfuu4.4hY0U:129:129:Walter Belgers:/home/gigawalt:/bin/csh
那么,口令最好不要是:
- 全部是英语词汇及其衍生词(比如“laugh”,“laughs”,“laughing”,等等。)。
- 全部是外语词汇(外语词典很容易找到)。
- 口令文件里可以找到的词汇,比如Walter,Belgers,gigawalt,等等。
- 具有某种模式,比如123456,qwerty,等等。
- 地理名称。
- 百科全书里的词汇(比如“Socrates”——苏格拉底)。
- 车牌号,门牌号,电话号码或其他与用户有关的东西。
- 名字。
-
所有这些的变体(walter,WALTER,retlaw,Walter,wAlter,walter0,walt3r,Retlaw4…),还包括使用两个词汇或加上随机字母。
一个真实的例子
为了证明用户选的口令有多糟糕,我将用一个猜密码的程序来破解某个实际的口令文件。
我用的程序是Crack v4.1,使用ufcrypt(ultra-fast crypt急速加密,DES算法的一种快速实现)算法,运行于一个SUN
ELC计算机集群上。该集群的运算能力相当于一台现代的PC(20
MIPS,每秒执行两千万条指令)。程序连续运行了近60个小时后被终止。而它所找到的口令其实是在最初的25小时里的成果。
结果如下:
机器性号:11x SUN ELC
账号总数:521个
破解总数:58个 (11.1%) (其中交互用户有56个
(10.7%))
总共耗时:59小时13分 (实际时间,而非CPU时间)
1 表中词汇 42 (7.2%)
2 常见名字 1 (0.2%)
3 用户/账号名 5 (0.9%)
4 短语和模式 3
(0.5%)
5 女子姓氏 2 (0.3%)
6 男子姓氏 4 (0.7%)
7 城市名称 1 (0.2%)
破解的口令如下:
1. cyclades,paardens,fiesta,regen,gnosis,police,fuselier,ballon,
smaragd,marques,farao,kasteel,valent,adagio,clematis,gehannes,koeien,
gnomen,onderkin,zeilboot,druppel,fietsen,testen,marathon,tamtam,global,
vrijheid,wolf,kwiek,basket,stones,klomp9,fiets9,Zoutje,Biefstuk,neenee,
tnbrg(这是将“tonbrug”去掉元音)。
2. fischer。
3. guest账号的口令竟然是“guest”!这当然不是用户的错,而是系统管理员的错。在荷兰,这种情况会被视作犯罪行为的(作者是荷兰人——译注)。
4. qwerty,unesco。
5. heather,joanne。
6. piet,atilla,Frans2,vatsug(“gustav(古斯塔夫)”倒过来拼)。
7. adelaide。
曾经有人对这些容易猜测的口令做过统计。在[Kle]中有记载, Daniel
Klein花了一个礼拜的CPU时间,破解了15000个口令中的21%。最初的2.7%是在前15分钟内找到的
(口令与账号相同,例如,账号名gigawalt,口令也是gigawalt)。这15000个口令中1%的统计结果如下:
表中词汇 7.4%
常见名字 4.0%
用户/账号名 2.7%
短语和模式 1.8%
女子姓氏 1.2%
男子姓氏
1.0%
机器名 1.0%
将这些结果与前面的进行比较意义不大,因为我们调查的范围实在太有限了。
而如果将调查范围扩大到美国的.COM公司的计算机系统,结果就有意义了(参见[Far])。你可能会认为,这些公司有好的安全制度。但是口令问题仍然存在,破解出根口令(root-password!)也不过花了一个小时多一点
(总共有1594个口令,其中15分钟内猜中了50个,35分钟内猜出了90个)。
找个好点儿的口令
上述阐明了,每个用户都使用好的口令是非常重要的。接下来我们看看有哪些方法能起个好的口令。一个好的口令要包含8个字符(UNIX口令最多支持8个字母,超出的部分会被忽略。所以用“Still
won't talk, eh, Spiff?”与用“Still
wo”做口令对UNIX而言没什么区别)。口令一定要好记但难猜,否则,要是用户找张纸把口令记下来的话,加密也就失去了意义(向破解直接去找这样的纸片就好了)。
口令不要全部只用大(小)写字母,也不要只用一个大写字母(“seCret”就不是好口令)。最好在口令中夹杂些非字母的字符(比如%,#,*,或标点等等)。有时某些控制符号也可以使用,但不是所有的都能用,有的控制符号会与某些网络协议冲突而产生不良结果。
几点建议:
- 选择两个总长为7个字母但相互又毫无关联的单词,用标点符号把它们连接起来,并适当的改变字母的大小写。比如:“Pit+idEa”,“plOVer#me”。
- 想一句有意义的话(但不要太常见),取其中每个单词的首字母组成口令。比如我们想了这么一句话 “My goldfish are called
Justerini and Brooks!”,那么我们的口令就是“MgacJaB!”(这里也要保证口令是8个字母,并且最好区分大小写和标点符号)。
- 利用元音和辅音组合出一个好读(这样便于记忆)但没有实际意义的生词。比如:“koDupaNy”,“eityPOop”。
降低破解的可能性
用户使用难猜但又好记的口令是非常重要的。有规则可以用于生成这样的口令。系统管理员也有责任提醒用户要这样做。
要降低被破解的风险性,可以遵循这样几条规则:
- 确保用户清楚口令的重要性以及如何选取正确的口令。
-
安装有如下功能的新版/bin/passwd(或yppasswd):可以检查口令是否过于浅显,看它是否含有标点,或者能否从字典里查到。
- 安装影子口令文件(或许还要相应地更换其它软件)。
-
设定口令有效期限,比如普通用户口令的有效期为三个月,特权用户的期限为一个月。但是时间间隔不要设得太短,以免有用户图省事而取一连串相关联的口令,如“Secret1”,“Secret2”,……
反而给黑客留下漏洞,一旦被他猜中了一个,后面的也就不用猜了。
- 用程序试着破解一下用户的口令,看看是否有可破解的口令。然后与这样的用户单独见面,跟他/她谈谈事情的重要性。
- 使用一次性口令(这样做有些极端,并且需要额外的投资,参见[Ven])。
-
限制特权账户的使用环境,比如规定root只能使用控制台,以免被人从网上窃听。如果不能这样的话,就要避免在公共场合下使用特权账号登陆系统,以免被监视或窃听[8]。
- 要时刻记得,整个系统的安全性由安全链上最薄弱的环节所决定,即使口令设置合理,系统也未必是安全的。
参考文献
[Bel] Walter Belgers, Password Security - A Case Study
(in Dutch), TimeWasters Online Magazine #5, march 9, 1993, can be obtained by
sending email with Subject 'TOM5' to
timewasters-request@win.tue.nl.
[Cur] David A. Curry, UNIX System Security,
Addison-Wesley, 1992.
[Far] Dan Farmer, Wietse Venema, Improving the Security of
Your Site by Breaking Into it, USENET newsgroup comp.security.unix,
can be obtained by anonymous ftp from ftp.win.tue.nl as
/pub/security/admin-guide-to-cracking.Z, 1993.
[Fel1] David C. Feldmeier, A High-Speed Software DES
Implementation, can be obtained by anonymous ftp from
thumper.bellcore.com as
/pub/crypt/des.ps.Z, 1989.
[Fel2] David C. Feldmeier, Philip R. Karn, UNIX Password
Security - Ten Years Later, Proceedings of Advances in Cryptology - CRYPTO
'89, 1989.
[Kle] Daniel V. Klein, ''Foiling the Cracker'': A Survey
of, and Improvements to, Password Security (revised paper), Proceedings of
the USENIX Security Workshop, summer 1990.
[Muf] Alec E. Muffet, Almost Everything You Wanted To Know
About Security (but were afraid to ask!), USENET newsgroup
alt.security.
[Pet] R. Pethia, S. Crocker, B. Fraser, RFC1281:
Guidelines for the Secure Operation of the Internet, november 1991.
[Til] Henk C.A. van Tilborg, An Introduction to
Cryptology, Kluwer Academic Publishers, 1988.
[Ven] Wietse Venema, Using SecurID tokens in an open
multi-host UNIX environment, can be obtained by anonymous ftp from
ftp.nic.surfnet.nl as /surfnet/net-security/docs/securid.ps,
1993.
[1]这篇论文是很十几年前写的,所以有些技术指标不如今天的先进,比如当时的UNIX的口令最多只有8位,计算机的运行速度很慢。但即使是这样,文章中谈到的人们忽视密码安全的现象,在今天看来仍然是常见的,所以它对今天的我们仍具有现实意义。这也是我翻译这篇文章的原因。我真诚希望每位计算机的使用者,尤其身处在今天这种偷窃技术高度发达的环境里,务必要重视和保护好自己的各种密码,绝对不能掉以轻心。不怀好意的人是无孔不入的!——译注
[2]Well-chosen Passwords - 合理设置的口令——译注。
[3]这里用“crackers(骇客)”其实更准确些,因为“hackers(黑客)”一词从历史上来说,是指那些有着深厚计算机软/硬件知识的人,他们努力学习并改进计算机的工作方式,而不是搞破坏。但我将继续使用大众所熟悉的“hacker”的那个意思,尽管那是个误解。
[4]Shadow Password File - 影子口令文件——译注。
[5]GECOS - General Electric Comprehensive Operating
System,一个二十世纪七十年代的历史遗留词汇,可能是一种老式的操作系统,也可能是一种标准,就跟POSIX似的——译注。
[6]DES - Data Encryption
Standard(数据加密标准)。美国于1976年11月23日通过并使用了56bit版的数据加密标准,而原文说是1979年通过的。在被使用了1/4个世纪之后,目前已经被新的加密标准AES(Advance
Encryption Standard,高级加密标准)所取代——译注。
[7]'Salt' -
结晶,粒子或其他什么东西,总之使用它来做个比喻。——译注。
[8]要时刻提防特洛伊木马之类的窃听程序,所以一定要在值得信赖的机器上使用特权账户,而且这样的机器最好比较独立,不要连在公共网络上,并只允许授权使用——译注。
[注意]:我翻译这篇文章时并未征得原作者的同意,因此对原文无任何权利,所以请勿在正规场合下引用本译文。本人对译文所带来的任何结果不承担任何责任,如需转载请务必注明原作者的权利和本声明。
最后修改日期:2004年11月7日