Linux作为一种多任务、多用户的操作系统,在同一时间段上可能为众多用户使用,且用户的管理直接关系到整个系统的安全,用户需要对其中的密码管理和帐户文件管理进行着重的强调和保护。
(更多详细内容请关注Linux系统全方位管理专题:http://os.51cto.com/art/201009/228849.htm )
Linux用户管理主要分为两方面:密码管理,以及用户与用户组的管理。下面将对这两方面分别进行阐述。
密码是用户登录Linux系统的钥匙,如果没有钥匙总是要费一番力气后,才能登录到目标操作系统。无论入侵者采用何种远程攻击,如果无法获得管理员或超级管理员的用户密码,就无法完全控制整个系统。若想访问系统,最简单也是必要的方法就是窃取用户的密码。因此,对系统管理员账户来说,最需要保护的就是密码,如果密码被盗,也就意味着灾难的降临。
入侵者大多是通过各种系统和设置漏洞,获得管理员密码来获得管理员权限的,然后,再实现对系统的恶意攻击。账号的弱密码设置会使入侵者易于破解而得以访问计算机和网络,而强密码则难以破解,即使是密码破解软件也难以在短时间内办到。密码破解软件一般使用3种方法进行破解:字典猜解、组合猜解和暴力猜解。毫无疑问,破解强密码远比破解弱密码困难得多。因此,系统管理员账户必须使用强密码。
据统计,大约80%的安全隐患是由于密码设置不当引起的。因此,密码的设置无疑是十分讲究技巧的。在设置密码时,请遵守密码安全设置原则,该原则适用于任何使用密码的场合,既包括Windows操作系统,也包括UNIX/Linux操作系统。
John the Ripper是一个工具软件,用于在已知密文的情况下尝试破解出明文的破解密码软件。目前的最新版本是JOHN1.7版,主要支持对DES、MD5两种加密方式的密文进行破解工作。它可以工作于多中不同的机型以及多种不同的操作系统之下,目前已经测试过能够正常运行的操作系统有:Linux x86、freeBSD、x86、Solaris、SPARC、OSF/1 Alpha、DOS、WinNT/WinXP系列等。
John the Ripper官网:http://www.openwall.com/john/
John the Ripper 1.7是目前比较好的破解密码工具,在解密过程中会自动定时存盘,用户可以强迫中断解密过程(使用ctrl+c组合键),下次还可以从中断的地方继续进行下去(john-restore命令)。任何时候敲击键盘,用户都可以看到整个解密的进行情况,所有已经被破解的密码会被保存在当前目录下的JOHN.POT文件中,SHADOW中所有密文相同的用户会被归成一类,这样JOHN就不会进行无谓的重复劳动了。在程序的设计中,关键的密码生成的条件被放在JOHN.INI文件中,用户可以自行修改设置,不仅支持单词类型的变化,而且支持自己编写C的小程序限制密码的取值方式。
在使用该软件前,我们可以从网上下载其最新版本john-1.7.3.4 for Linux版本,它包含DOC、SRC和RUN三个目录,在SRC目录下,在机器上执行如下命令即可:
#make #make clean linux-x86-any
安装好后,可以切换到RUN目录下,进行测试,如下所示:
#cd ../run #./john –test
John the ripper提供了如下多达10余种的命令,供用户选择使用:
除了口令破解程序之外,在这个软件包中,还包含了其他几个实用工具,它们对于实现口令破解都有一定的帮助,这些工具都放置在run目录下,下面分别予以简要介绍。
(1)unshadow PASSWORD-FILE SHADOW-FILE
unshadow命令将passwd文件和shadow文件组合在一起,其结果用于John破解程序。通常应该使用重定向方法将这个程序的结果保存在文件中,之后将文件传递给John破解程序。
(2)unafs DATABASE-FILE CELL-NAME
unafs从二进制AFS数据库中提取口令散列值,并生成John可用的输出,通常应该把这个输出重定向到文件中。
(3)unique OUTPUT-FILE
删除字典表中的重复词汇,但不改变字典表中各词条项的顺序。
安装好后,我们可以灵活使用如下几种方式来对自己的账户密码进行测试:
通常情况下,许多用户的密码命名方式非常简单,比如foo、hello、world等等,或者很多都是与用户名相同的密码口令,那么我们一般可以先采用简单解密方式来对系统中的密码进行简单的初步试探,如果发现能够成功破解,那么就需要对这些密码口令的强度进行加强,如下所示:
#./john –single “/etc/shadow” Loaded 2 password hashes with 3 different salts (FreeBSD MD5 [32/32]) liyang (liyang) guesses: 1 time: 0:00:00:00 100% c/s: 6975 trying: 999991900
在上述命令中,我们发现系统存在一个liyang用户,其用户名和密码均为liyang,因而通过最简单的方式便能将其发现和利用,如果为黑客破解则将造成不可设想的后果,因而我们的用户应该立即根据此种情况进行口令加强。
其次,用户可以使用字典文件来对系统用户的恶密码强度进行试探和测试。人们常用hello、superman、cooler、asdfgh、123456等作为自己的密码。而-rules参数则在此基础上再加上些变化,如字典中有单词cool,则JOHN还会尝试使用cooler、CoOl、Cool等单词变化进行解密。一般视SHADOW中的用户多少及用户的字典大小、用户的机器速度,解密时间从几小时到几天不等。下面给出使用该方式进行解密的例子,假设我们已经生成了一个password.lst文件,其中包含了常用的以字典单词为依据的密码,那么我们对系统中的用户密码使用该方式进行试探破解,由于字典中保留了young这样一个单词,因而用户google的密码所以也被试探出来,网络管理员同样需要对该密码进行加固,比如添加适当的后缀、字母和数字等:
# ./john --wordlist=password.lst "/etc/shadow"
Loaded 2 password hashes with 2 different salts (FreeBSD MD5 [32/32])
young (google)
guesses: 1 time: 0:00:00:01 100% c/s: 3571 trying: zhongguo
Linux操作系统采用了UNIX传统的方法,把全部的用户信息保存为普通的文本文件。用户可以通过对这些文件进行修改来管理用户和组。
(1) 用户账号文件——passwd
/etc/passwd文件是UNIX安全的关键文件之一。该文件用于用户登录时校验用户的登录名、加密的口令数据项、用户ID(UID)、默认的用户分组ID(GID)、用户信息、用户登录子目录以及登录后使用的shell。这个文件的每一行保存一个用户的资料,而用户资料的每一个数据项采用冒号“:”分隔。如下所示:
LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
每行的头两项是登录名和加密后的口令,后面的两个数是UID和GID,接着的一项是系统管理员想写入的有关该用户的任何信息,最后两项是两个路径名:一个是分配给用户的HOME目录,另一个是用户登录后将执行的shell(若为空格则默认为/bin/sh)。
下面是一个实际的系统用户的例子:
cracker:x:6018: 6018: cracker:/home/ cracker:/bin/bash
该用户的基本信息为:
用户的登录名是用户用来登录的识别,由用户自行选定,主要由方便用户记忆或者具有一定含义的字符串组成。
所有用户的口令的存放都是加密的,通常采用的是不可逆的加密算法,比如DES(Data Encryption Standard,数据加密标准)。当用户在登录提示符处输入它们的口令时,输入的口令将由系统进行加密。再把加密后的数据与机器中用户的口令数据项进行比较。如果这两个加密数据匹配,就可以让这个用户进入系统。在/etc/passwd文件中,UID信息也很重要。系统使用UID而不是登录名区别用户。一般来说,用户的UID应当是独一无二的,其他用户不应当有相同的UID数值,只有UID等于0时可以例外。任何拥有0值UID的用户都具有根用户(系统管理员)访问权限,因此具备对系统的完全控制。通常,UID为0这个特殊值的用户的登录名是“root”。根据惯例,从0到99的UID保留用做系统用户的UID。如果在/etc/passwd文件中有两个不同的入口项有相同的UID,则这两个用户对文件具有相同的存取权限。
每一个用户都需要有地方保存专属于自己的配置文件。这需要让用户工作在自己定制的操作环境中,以免改变其他用户定制的操作环境,这个地方就叫做用户登录子目录。在这个子目录中,用户不仅可以保存自己的配置文件,还可以保存自己日常工作用到的各种文件。出于一致性的考虑,大多数站点都从/home开始安排用户登录子目录,并把每个用户的子目录命名为其上机使用的登录名。
当用户登录进入系统时,都有一个属于自己的操作环境。用户遇到的第一个程序叫做shell。在Linux系统里,大多数shell都是基于文本的。Linux操作系统带有好几种shell供用户选用。用户可以在/etc/shells文件中看到它们中的绝大多数。用户可以根据自己的喜好来选用不同的shell进行操作。按照最严格的定义,在上面所介绍的/etc/passwd文件中,每个用户的口令数据项中并没有定义需要运行某个特定的shell,其中列出的是这个用户上机后第一个运行的程序是哪个。综上所述,通过使用cat命令查看/etc/passwd文件(#cat /etc/passwd)。
(2) 用户影子文件——shadow
Linux使用不可逆的加密算法如DES来加密口令,由于加密算法是不可逆的,所以黑客从密文是得不到明文的。但/etc/passwd文件是全局可读的,加密的算法是公开的,恶意用户取得了/etc/passwd文件,便极有可能破解口令。而且,在计算机性能日益提高的今天,对账号文件进行字典攻击的成功率会越来越高,速度越来越快。因此,针对这种安全问题,Linux/UNIX广泛采用了“shadow(影子)文件”机制,将加密的口令转移到/etc/shadow文件里,该文件只为root超级用户可读,而同时/etc/passwd文件的密文域显示为一个x,从而最大限度地减少了密文泄露的机会。
/etc/shadow文件的每行是8个冒号分割的9个域,格式如下:
username: passwd: lastchg: min: max: warn: inactive: expire: flag
如下所示的是一个系统中实际影子文件的例子:
liyang:$1$ciY58zQZ$iKVHLSVZZgM75.lGp5Rmv.:14633:0:99999:7:::
我们对最后一个用户的信息进行解释,该信息表明了如下含义:
(3) 组账号文件——group
/etc/passwd文件中包含着每个用户默认的分组ID(GID)。在/etc/group文件中,这个GID被映射到该用户分组的名称以及同一分组中的其他成员去。
/etc/group文件含有关于小组的信息,/etc/passwd中的每个GID在文件中应当有相应的入口项,入口项中列出了小组名和小组中的用户,这样可方便地了解每个小组的用户,否则必须根据GID在/etc/passwd文件中从头至尾地寻找同组用户,这提供了一个比较快捷的寻找途径。/etc/group文件对小组的许可权限的控制并不是必要的,因为系统用来自于/etc/passwd文件的UID、GID来决定文件存取权限,即使/etc/group文件不存在于系统中,具有相同的GID用户也可以小组的存取许可权限共享文件。小组就像登录用户一样可以有口令。如果/etc/group文件入口项的第二个域为非空(通常用x表示),则将被认为是加密口令。/etc/group文件中每一行的内容如下所示:
如下是系统中一个具体的/etc/group文件中记录的例子:
adm:x:4:root,adm,daemon
以上面文件第四行为例子,它说明在系统存在一个adm的用户组,它的信息如下:
(4) 组账号文件——gshadow
如同用户账号文件的作用一样,组账号文件也是为了加强组口令的安全性,防止黑客对其实行的暴力攻击,而采用的一种将组口令与组的其他信息相分离的安全机制。其格式如下所示内容:
下面是系统中一个具体的/etc/gshadow文件的例子:
mail:::mail,postfix,exim
以组mail为例,其加密后的组口令被隐藏,其组成员包括mail、postfix和exim。其他的以“::”结尾的组表明没有组成员,但是用户可以自行添加。
总结
对于Linux系统的全方位保护,我们已经介绍了文件系统保护、进程管理、以及本文的用户管理。除了已经介绍过的这三项,Linux日志管理也是必不可缺的一环,这将在下篇文章中进行介绍。