Unix/BSD/Linux的口令机制初探(转)

  Freebird

  1.概述

  早期U N I X系统把用户口令保存在一个纯文本可读的“口令文件”中,这可能在系统管理员注意不到的情况下被截取并暴露。它也可能在一次偶然事件中泄露。

  从AT&T UNIX版本6开始,Thompson 等决定采用一个不同的方式: U N I X口令采用以美国军方M - 2 0 9密码机为模型的基于旋转的算法来进行编码。这种快速算法被证明对穷尽纯文本搜索有弱点并被AT&T UNIX版本7中出现的更先进的crypt ( )库代替。

  现在Unix/Linux将口令以不可读的方式保存在机器中。系统使用名为cryptographic hash的算法将口令转换成文本字符串。这个串即称为散列或者散列值。使用的算法可以有多种,但它们都是不可逆的,也就是说不能从散列值中恢复出原始口令。不同的系统,所使用的密码文件以及加密算法都可能不同。管理、维护好这些密码文件是保证系统安全的首要任务。(未特别说明,本文所有命令均在csh下以root身份运行。)

  2.加密算法简介

  2.1---crypt()简介---key 和 salt

  在Unix/Linux下存在多种散列算法。可以通过库函数crypt()调用这些系统支持的算法。crypt()有key和salt两个参数,并返回相应的散列值。salt亦即我们常说的“盐”,它只是简单的字符串,它的长度取决于所使用的算法,不同的散列算法它有不同的取值范围。所以,即使是相同的算法,相同的原始口令,使用不同的salt,也会得到不同的加密口令。salt的目的也就是为了加大口令破解的难度,当我们使用passwd命令来修改密码时,它会随机选择一个salt. s a l t使得使用预编译字典对加密口令进行攻击变得更困难。代替为字典中每个单词做一次单独加密,攻击者现在不得不对字典中每个单词的4 0 9 6种排列进行加密和储存。在2 0年前,s a l t是作为本质上的资源障碍引入的,但现在1 2位s a l t不再被认为是一种有效的防御方法。

  crypt()可以在C程序中直接调用,甚至可以用perl直接调用,(详细信息请man 3 crypt),如下例:

  %perl -e 'print crypt("mypass","s1")," "'

s1tROevFyi.yQ %perl -e 'print crypt("mypass","s2")," "' s2JQ85JElCMeU

  以上两例中s1、s2分别为salt 值,可以看到,相同的口令(上例中为mypass)使用不同的salt将得到不同的散列值。 以上两例使用的都是DES算法,加密后的散列值将salt值作为其前缀。

  2.2DES算法

  由美国政府和IBM研制。所有的Linux版本和几乎所有的Unix系统都支持DES.DES实际上为一个加密算法,但是crypt(3)将之做为散列算法。普通的DES算法容许的原始口令长度为8个字符,多余的口令也接受,但是多余部分会被系统自动摒弃。但有些系统(例如HP-UX)使用DES的多次迭代来解决此问题,这样就可以使用任意长度的密码。但是使用DES加密后的口令为13个字符长。

  2.3MD5算法

  它是真正的散列算法。允许无限长的口令。它使用的salt空间也别DES算法大得多,所以两口令相同的可能性更小。它也通过调用crypt(3)函数实现。MD5算法使用的 salt必须以$1$开头,并以$结尾。且salt长度为8个字符。例如要用abcdef为salt 散列mypass,那么如下:

  %perl -e 'print crypt("mypass","$1$abcdef$")," "'

$1$abcdef$nRHvewzGzJoYskdQAIEQr

  注:上例中的" "均为转义字符。salt值为$1$abcdef$,原始密码为mypass,散列值为:$1$abcdef$nRHvewzGzJoYskdQAIEQr

  MD5算法得到的散列值为31个字符长,并且都以$1$开头。

  2.4其他算法:

  BSDI风格的DES和Blowfish使用也比较广泛,本文将在后面会有讨论。

  2.5 BSD使用的加密机制:

  各种D E S很长一段时间内一直是U N I X口令加密的主要算法,但还有其他算法可以代替D E S。现代B S D系统提供了一些其他算法的应用范例。缺省情况下, FreeBSD默认使用MD5加密机制,因为MD5没有出口限制,同时也更安全于DES。DES仍然可用,只不过DES存在的目的仅仅是为了和其他UNIX系统所用的密码的向后兼容性。并且使用DES的系统也能鉴别出MD5,因为MD5所用的Hash也在DES中被使用。

  O p e n B S D走得更远。其开发小组在加拿大,这样就不受美国的出口限制。O p e n B S D可以被配置成使用传统的UNIX crypt () 、比如“扩充加密”、M D 5或B l o w f i s h。M D 5由Ronald L.Rivest开发,它在RFC 1321中描述。F r e e B S D和O p e n B S D中基于M D 5的crypt ( ) 产生的口令条目包含版本号、s a l t和哈希口令,彼此之间用“ $”符号分隔。一个M D 5口令看起来如下:

  $ 1 $ c a e i H Q w X $ h s K q O j r F R R N 6 K 3 2 O W K C B f 1

  这里“$ 1”指明M D 5,“c a e i H Q w X”是s a l t。

  B l o w f i s h由Bruce Schneier在1 9 9 3年开发,是D E S的一个快速、压缩、简单且免费的替代品]。虽然S c h n e i e r指出B l o w f i s h不适合产生单向哈希,但O p e n B S D就为这个目的使用它。B l o w f i s h版的crypt ( )使用1 2 8位s a l t,足够使最坚定的破坏者泄气。用所有可能的s a l t值进行预编译的字典将十分昂贵。其最大口令长度为7 2个字符。B l o w f i s h算法是一个由p i的十六进制数字组成的固定字符串进行初始化的。初始化的B l o w f i s h状态由s a l t和口令进行扩展,该过程重复一定的次数(该数值也被编入口令串中)。最后的B l o w f i s h口令条目是使用B l o w f i s h状态对字符串“ O r p h e a n B e h o l d e r S c r y D o u b t”加密6 4次而得到的。

  加密的口令条目包含B l o w f i s h版本号、算法重复次数以及s a l t和哈希口令的连结—每个之间由“ $”字符隔开。一个编码“ 8”将声明2 5 6次循环。一个有效的B l o w f i s h口令看起来如下:

  $2a$12$eIAq8PR8sIUnJlHaohxX209x9O1m2vk97LJ5dsXdmB.eXF42qjchC

  在这个例子中,初始的扩展进行4 0 9 6次。给出了很大的重复次数和长的口令, B l o w f i s h加密的口令比其他基于传统D E S机制加密的口令更难被攻击。给出由这些算法改进所提供的额外安全措施后,它被应用在其他U N I X系统中只是一个时间问题了。

  2.6----如何得知你的系统使用的加密算法

  方法可以有很多,本人简单列举几个:

  方法(1)你可以通过查看 libcrypt[._*]链接到/usr/lib下的哪些库文件来得知你的系统密码所使用的加密算法。如果链接到libcrypt*库,那么使用的为MD5,如果为libdescrypt*,就应该为DES了。具体操作如下:

  %cd /usr/lib

%ls -l libcrypt[._]* lrwxr-xr-x  1 root  wheel       11 Jun  9 06:18 /usr/lib/libcrypt.a@ -> libscrypt.a lrwxr-xr-x  1 root  wheel       12 Jun  9 06:19 /usr/lib/libcrypt.so@ -> libscrypt.so lrwxr-xr-x  1 root  wheel       14 Jun  9 06:21 /usr/lib/libcrypt.so.2@ -> libscrypt.so.2 lrwxr-xr-x  1 root  wheel       13 Jun  9 06:22 /usr/lib/libcrypt_p.a@ -> libscrypt_p.a %

  注意:在FreeBSD4.4中,从FreeBSD 4.4开始就完全由login.conf来控制所使用的加密算法,并且默认已经设置为MD5,要改为DES,只须将其中:password_format段的md5替换成des。任何使修改生效,本文后面有详细的说明。

  附:我们强烈建议用户尽可能的使用MD5库而非DES.所以往往也很有必要将一些安装了DES加密算法的系统的DES库转换成MD5库,操作也很简单,只须先删除libcrypt[._*]链接,然后将它们重新链接到相应到md5库。(即以s代替des):

  Links DES MD5

  ----- --- ---

  libcrypt.a libdescrypt.a libscrypt.a

  libcrypt.so libdescrypt.so libscrypt.so

  libcrypt.so.2 libdescrypt.so.2 libscrypt.so.2

  libcrypt_p.a libdescrypt_p.a libscrypt_p.a

  方法(2)查看/etc/login.conf中的password_format段。其值md5,des,blf分别对应MD5,DES和blowfish.

  方法(3)查看密码文件/etc/passwd或者/etc/shadow(BSD 下相应为/etc/master.passwd),根据密码特征得知使用的加密算法。例如以$1$开头的为MD5,以$2$开头的为blowfish.DES没有明显的特征,但它的密码段相对较短,且均为字母,没有$之类的字符,也很容易辨别!

  3.密码文件

  3.1概述:

  正如大家所熟悉的,Unix下都存在一个/etc/passwd文件以存放用户的密码文件,但是在不同的Unix,Linux,BSD 中它们所起的作用也不尽相同。某些Unix和Linux还使用shadow文件,但FreeBSD中相应的却为/etc/master.passwd文件。下面将对这些文件进行详细说明。

  3.2/etc/passwd文件

  传统的Unix中均使用该文件来存放用户密码。该文件以加密的方式保存口令,其中的口令必须通过passwd口令来生成(如果使用NIS,相应的为ypasswd),或者从另一账号中复制过来。

  P a s s w d文件中的每个条目看起来如下:

  n a m e : c o d e d - p a s s w d : U I D : G I D : u s e r - i n f o : h o m e - d i r e c t o r y : s h e l l

  7个域中的每一个由冒号隔开。空格是不允许的,除非在u s e r- i n f o域中使用。下面总结了

  每个域的含义:

  ①name—给用户分配的用户名,这不是私有信息。

  ② c o d e d - p a s s w d—经过加密的用户口令。如果一个系统管理员需要阻止一个用户登录,则经常用一个星号( : * :)代替。该域通常不手工编辑。用户应该使用p a s s w d命令修改他们的口令。值得注意的一点是许多最近的U N I X 产品依赖“影子口令” — 不在/ e t c / p a s s w d中保存的口令。

  ③ UID—用户的唯一标识号。习惯上,小于1 0 0的U I D是为系统帐号保留的。

  ④ G I D—用户所属的基本分组。通常它将决定用户创建文件的分组拥有权。在Red Hat L i n u x中,每个用户帐号被缺省赋予一个唯一分组。

  ⑤ u s e r- i n f o—习惯上它包括用户的全名。邮件系统和f i n g e r这样的工具习惯使用该域中的信息。该域也被称作G E C O S域。

  ⑥ home-directory—该域指明用户的起始目录,它是用户登录进入后的初始工作目录。

  ⑦ s h e l l—该域指明用户登录进入后执行的命令解释器所在的路径。有好几种流行的S h e l l,包括Bourne Shell (/bin/sh),C Shell (/bin/csh),Korn Shell (/bin/ksh)和Bash Shell( / b i n / b a s h )。注意可以为用户在该域中赋一个/ b i n / f a l s e值,这将阻止用户登录。

  注意:当编辑/etc/passwd文件来建立一个新账号时,应在密码字段放一个"*",(一些伪用户,例如daemon也如此)以避免用户未经权而使用该账号。直到你为此新建账号设置了真实密码。

  3.2/etc/shadow文件

  传统上,/ e t c / p a s s w d文件在很大范围内是可读的,因为许多程序需要用它来把U I D转换为用户名。例如,如果不能访问/ e t c / p a s s w d,那么ls -l命令将显示数字U I D而不是用户名。不幸的是,使用口令猜测程序,具有加密口令的可读/ e t c / p a s s w d文件表现出巨大的安全危险。多数近来的U N I X产品支持一个变通方法:影子口令文件。影子口令系统把口令文件分成两部分: / e t c / p a s s w d和影子口令文件。影子口令文件保存加密的口令;/ e t c / p a s s w d中的c o d e d - p a s s w o r d域都被置为“X”或其他替代符号。影子口令文件只能被r o o t或像p a s s w d这样的s e t _ u i d程序在需要合法访问时读取,其他所有非授权用户都被拒绝访问。习惯上,影子口令文件保存在/ e t c / s h a d o w中,尽管有些系统使用可选的路径和文件名。例如B S D系统把加密的口令保存在/ e t c / m a s t e r. p a s s w d。

  /etc/shadow剖析

  / e t c / s h a d o w文件包含用户名和加密口令以及下面一些域:

  (1) 上一次修改口令的日期,以从1 9 7 0年1月1日开始的天数表示。

  (2) 口令在两次修改间的最小天数。口令在建立后必须更改的天数。

  (3)口令更改之前向用户发出警告的天数。

  (4)口令终止后帐号被禁用的天数。

  (5)自从1 9 7 0年1月1日起帐号被禁用的天数。

  (6)保留域。

  下面是一个Red Hat Linux系统中/ e t c / s h a d o w文件的例子:

  root:mGqwuvdF41bc:10612:0:99999:7:::

bin:*:10612:0:99999:7::: daemon*:10612:0:99999:7::: adm:*:10612:0:99999:7::: lp*:10612:0:99999:7::: sync:*:10612:0:99999:7::: shutdown:*:10612:0:99999:7::: halt:*:10612:0:99999:7::: mail:*:10612:0:99999:7::: news:*:10612:0:99999:7::: uucp:*:10612:0:99999:7::: operator:*:10612:0:99999:7::: freebird:sdfaBh45ZiQn1llfa:10612:0:99999:7:::

  缺省情况下,口令更新并不开启。于是没有口令更改前的最小天数,也没有口令必须更改的日期。口令在99 999天内必须更换的声明几乎无用,因为从现在起几乎还有2 5 0年。在口令终止前7天警告用户的声明也没用,除非选择使用口令更新。在本例中没有声明,还可以在口令终止和帐号禁用之间设置一个时间段。

  在可选影子口令功能的系统中,用一条相对简单的命令设置并更新影子口令文件:p w c o n v。该命令在影子口令文件不存在的情况下创建一个新的。如果已存在一个影子文件,p w c o n v把/ e t c / p a s s w d中的新用户添加到/ e t c / s h a d o w中,把/ e t c / p a s s w d中没有的用户从影子文件中删去,并把口令从/ e t c / p a s s w d移到影子文件中。在Red Hat Linux中,p w c o n v把新的/ e t c / p a s s w d文件写到一个名为n p a s s w d的文件中,把新影子文件写到n s h a d o w中。这些新文件需要手工进行重命名或拷贝。用户可以用p w u n c o n v命令返回到不使用影子文件的情况下,它把影子文件中的信息合并回传统的口令文件中。

  提示:早期的L i n u x不支持影子口令。

  注意:在solaris下,必须使用隐蔽口令文件,在Linux下,如果用户安装了shadow软件也可以使用。

  3.2/etc/master.passwd

  在BSD下,实际的口令文件是/etc/master.passwd.,这里的密码都是简单的文本数据库,每个用户占一行,行中字段用":"隔开。/etc/master.passwd权限为0600,而/etc/passwd为0644,这就意味着任何人都人存取/etc/passwd.但只有root才能读取/etc/master.passwd.

  在BSD中,/etc/master.passwd是/etc/passwd的超集,它直接生成/etc/passwd文件。所以在BSD中/etc/passwd文件总是不需要直接进行编辑。一旦运行vipw,passwd,chfn,chsh或者chpass这些命令,也是对/etc/master.passwd进行修改。并且修改后会自动生成/etc/passwd.(一同生成的还有由pwd_mkdb工具生成的/etc/master.passwd的散列表形式。)

  平面文件数据库(/etc/passwd,/etc/master.passwd)都只对少量用户合适,用户一多,查找速度就慢。因此在BSD 下相应的还有两个数据库格式的散列表/etc/pwd.db和/etc/spwd.db,其权限也和上面两文件对应。每次运行chfn,passwd等命令后,pwd_mkdb都会自动修改这两个文件。

  提示:若希望根据另一个FreeBSD重新构件用户列表或者从另一个FreeBSD机器移植一个用户列表,只须简单的把新的master.passwd(比如master.passwd.new)文件置于/etc/下(或/ 下),然后运行如下命令(注意先备份):

  %cp /etc/master.passwd /etc/master.passwd.bak

%pwd_mkdb -p /etc/master.passwd.new

  这样/etc/master.passwd文件将被覆盖,其他三个文件也得以重建。(-p即为生成新的/etc/passwd)

  注意:/etc/master.passw文件和shadow文件形式和功能都相同,但是和/etc/master.passwd不同的是,Linux下(或其他系统)使用的/etc/shadow文件并非/etc/passwd文件的超集。/etc/passwd文件也并非由/etc/shadow文件产生,需要手工维护这两个文件。

  4.BSD下使用“密码过期机制”

  “密码过期”意即超过规定的时间密码无效,用户必须在此之前修改密码。要实现此功能,需要修改/etc/login.conf文件,在default段中加入passwordtime=90d(或者2y,6w,24h之类的)如:

  default:

    :password_format=md5:     :copyright=/etc/COPYRIGHT:     :welcome=/etc/motd:     :passwordtime=24h:

  因为/etc/login.conf数据库必须编译成一个散列表,所以必须运行cap_mkdb程序,以生成此散列表,然后才能使修改生效。如下操作:

  %cap_mkdb /etc/login.conf

  这样,若24小时内未修改密码,登陆时将提示输入新的密码。

  注意:在设置passwordtime属性时,passwd会在/etc/master.passwd的第六字段写入最后一次修改密码的时间。

  /etc/login.conf在密码及其他设置方面还有很多值得使用的地方,不妨man 看看。

  后记

  本文只简要的说明了一下Unix/Linux特别是BSD的口令机制,要也因本人水平,不能在此文深入的论述此问题。关于密码的安全性,以及密码破解和任何使用更安全的加密机制等问题,本人会在以后撰文论述。

  参考资料:

  man 5 passwd

  man 3 crypt

  man md5

  man des

  man login.conf

  DES-to-MD5-(mini)HOWTO

  《Hacking Linux Exposed》

  《Unix System Administrator Handbook》

  作者简介:

  Freebird,姓名:匡萃彪。CNFUG核心成员。Unix/Linux/BSD的狂热追随者,熟悉BSD,Linux,Solaris,C,Shell。主要研究方向:各种服务器架设、系统和网络安全、内核源码分析以及英文文档翻译。欢迎您通过freebird@cnfug.org与本人联系。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14102/viewspace-116637/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14102/viewspace-116637/

Unix/BSD/Linux的口令机制初探(转)相关推荐

  1. Unix BSD Linux的口令机制初探

    1.概述 早期UNIX系统把用户口令保存在一个纯文本可读的"口令文件"中,这可能在系统管理员注意不到的情况下被截取并暴露.它也可能在一次偶然事件中泄露. 从AT&T UNI ...

  2. 简要聊聊UNIX,MINIX,LINUX,BSD的区别与特质

    聊聊linux,minux,bsd,unix的历史与区别 Linux.MINIX.BSD和UNIX都是类UNIX操作系统,它们都是基于UNIX操作系统的,但也有很多不同点. UNIX操作系统最早由贝尔 ...

  3. Linux 线程实现机制分析

    本文转自:http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位 ...

  4. Linux 线程实现机制分析--转

    http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程 ...

  5. Linux用户安全及Linux PAM验证机制

    一.Linux身份验证 1.用户与系统管理员     >用户分为系统管理员与普通管理用户两大类.            >每个用户在系统中都有唯一的用户名,是用户使用系统的凭证.      ...

  6. Unix与Linux

    花了一天时间,终于把unix.linux.ios.android区别大致联系搞清楚,好像很复杂的样子- 2015-10-31   熊三的馆  文章来源  阅 2272  转 3 转藏到我的图书馆 微信 ...

  7. linux和unix区别_Unix vs Linux – Unix和Linux之间的区别

    linux和unix区别 Here you will learn about difference between unix and linux i.e. unix vs linux. 在这里,您将了 ...

  8. linux内核网络子系统初探---概述

    linux内核网络子系统初探-概述 一.网络模型 简单介绍 学习网络时,必定能在各种教材资料里见到以下三种网络模型: 三种模型间的差异: OSI七层模型是理论上的网络模型,从功能方面分成了相对独立的7 ...

  9. [转载]Linux 线程实现机制分析

    自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads ...

最新文章

  1. Android代码入侵原理解析(一)
  2. Windows——完全控制面板(上帝模式)
  3. 小白的奇幻数学课堂(part3)--你能把一张纸对折7次以上吗
  4. 易中天讲的很有哲理的十句话【转】
  5. FIRST集和FOLLOW集的构造
  6. 遗传算法解决TSP问题MATLAB实现(详细)
  7. 关于word使用之三线表制作
  8. 基于梳状滤波器的的语音增强
  9. 支付宝开发中,抱歉,该商户未开通支付宝服务,无法支付
  10. 一份完整App运营推广计划方案
  11. 服务器开机显示f1 f2,开机按f1的解决方法|开机按f2的解决方法|电脑开机按f1怎么解决...
  12. 含根式的定积分计算_定积分计算详细步骤
  13. Eclipse Neno版本 安装插件开发JavaEE
  14. 单片机c语言拟合二次曲线y=a0+a1x+a2x^2
  15. 【Unity2D】制作可以左右移动的平台
  16. Ajax 异步同步请求
  17. React Tutorial (updating)
  18. 计算机应用etf基金代码,国泰中证计算机主题ETF联接C
  19. linux命令eric,linux命令杂记 - erichd的个人页面 - OSCHINA - 中文开源技术交流社区
  20. 解读BPM风潮:缘何受到企业青睐?(转载)

热门文章

  1. 苏州企业所得税汇算清缴十大风险点(上)
  2. 10-STM32F1-RTC and BKP
  3. 华为设备配置IS-IS的负载分担
  4. linux系统CPU隔离isolcpu参数设置
  5. 【操作系统】操作系统的功能管理与分类
  6. 新浪微博授权失败,redirect_url与应用注册的网址不一致
  7. apikey、apisecret在api请求中的使用
  8. numpy求矩阵的逆和伪逆
  9. 影视广告创意与制作(三)
  10. 微软再推 Rust 语言免费中文教程,更香了!