Unix BSD Linux的口令机制初探
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","\n"'
s1tROevFyi.yQ
%perl -e 'print crypt("mypass","s2","\n"'
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\$","\n"'
$1$abcdef$nRHvewzGzJoYskdQAIEQr
注:上例中的"\n"均为转义字符。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》
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|