Linux系统中,用户是活动的主体,直接享有对系统文件和资源进行操作和控制的权利,所以如何对系统中的用户进行好的管理,是系统管理员保证系统安全必须认真完成的第一步工作。
在Linux操作系统中,每一个文件和程序都归属于一个特定的“用户”。每一个用户都由一个惟一的身份来标识,这个标识叫做用户ID(UserID,UID)。并且,系统中的每一个用户也至少需要属于一个“用户分组”,也就是由系统管理员所建立的用户小组,这个小组中包含着许多系统用户。与用户一样,用户分组也是由一个惟一的身份来标识的,该标识叫做用户分组ID(GroupID,GID)。用户可以归属于多个用户分组。对某个文件或程序的访问是以它的UID和GID为基础的。一个执行中的程序继承了调用它的用户的权利和访问权限。
用户文件和组文件 1. 用户账户文件——/etc/passwd
/etc/passwd文件是Unix安全的关键文件之一。这个文件的每一行保存一个用户的资料,而用户资料的每一个数据项采用冒号“: ”分隔。如下所示:
LOGNAME: PASSWORD: UID: GID: USERINFO: HOME: SHELL
每行的头两项是登录名和加密后的口令,后面的两个数是UID和GID,接着的一项是系统管理员想写入的有关该用户的任何信息。最后两项是两个路径名: 一个是分配给用户的HOME目录; 第二个是用户登录后将执行的shell(若为空格则缺省为/bin/sh)。所有用户口令的存放都是加密的,通常采用的是不可逆的加密算法,比如DES。任何拥有0值UID的用户都具有根用户(系统管理员)访问权限,通常,UID是这个特殊值的用户的登录名是“root”。允许任何其他用户或者用户名拥有0值的UID都可能危及系统安全。
2. 用户影子文件——shadow
由于/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
其中,各个域表示如下含义: 用户登录名、加密的用户口令、从1970年1月1日起到上次修改口令所经过的天数、两次修改口令之间至少经过的天数、口令还会有效的最大天数(如果是99999则表示永不过期)、口令失效前多少天内系统向用户发出警告、禁止登陆前用户名还有效的天数、用户被禁止登陆的时间、保留字段(暂未使用)。
3. 用户组账号文件——/etc/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文件中每一行的内容如下所示: 用户分组名、加过密的用户分组口令、用户分组ID号(GID)、以逗号分隔的成员用户清单。
4. 组账号文件——/etc/gshadow
如同用户账号文件的作用一样,组账号文件也是为了加强组口令的安全性,防止黑客对其实行的暴力攻击,而采用的一种将组口令与组的其他信息相分离的安全机制。其格式如下所示: 用户组名、加密的组口令、组成员列表。
验证用户和组文件 1. 使用pwck和grpck命令验证用户和组文件
上面所介绍的用户以及组账号文件都非常重要,对于系统验证用户和组具有重要意义。一旦上述文件发生错误,则会对系统造成影响。正是基于这个原因,Linux提供了pwck和grpck这两个命令分别验证用户以及组文件,以保证这两个文件的一致性和正确性。下面将分别加以介绍。
pwck用来验证用户账号文件(/etc/passwd)和影子文件(/etc/shadow)的一致性,它验证文件中的每一个数据项中每个域的格式以及数据的正确性。如果发现错误,该命令将会提示用户对出现错误的数据项进行删除。
该命令主要验证每个数据项是否具有: 正确的域数目、惟一的用户名、合法的用户和组标识、合法的主要组群、合法的主目录、合法的登录shell。如果检查发现域数目与用户名错误,则该错误是致命的,则需要用户删除整个数据项。其他的错误均为非致命的,将会需要用户进行修改,而不一定要删除整个数据项。下面的例子说明如何使用该命令:
//cat /etc/passwd
//显示系统中原来的用户账号文件
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
……
#vi /etc/passwd
//编辑该账号文件,并加入一项不存在的数据项
//“super:x:200:200:superman:/home/super:/bin/bash”
#pwck /etc/passwd //执行验证工作
//验证出系统并不存在该super用户
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp does not exist
user gopher: directory /var/gopher does not exist
user pcap: directory /var/arpwatch does not exist
user super: no group 200
user super: directory /home/super does not exist
pwck: no changes
//再次编辑该账号文件,加入不正确的数据项“super:x:200:200:superman:/home/super:”
//执行验证工作
#pwck /etc/passwd
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp does not exist
user gopher: directory /var/gopher does not exist
user pcap: directory /var/arpwatch does not exist
user super: no group 200
user super: directory /home/super does not exist
invalid password file entry
delete line `'? y
pwck: the files have been updated
上述执行的两次验证操作结果不一样,第一次并没有要求用户删除该不正确的数据项,原因是数据项中域的数目没有发生错误,而第二次域的数目少了一个(本来应该有七项,只有六项),所以是致命错误,系统提示用户进行删除,用户确定删除后该文件验证才通过。同样地,也可以用该命令来验证/etc/shadow文件的一致性。
与pwck命令相类似,grpck命令是用来验证组账号文件(/etc/group)和影子文件(/etc/gshadow)的一致性和正确性的。该命令验证文件中的每一个数据项中每个域的格式以及数据的正确性。如果发现错误,该命令将会提示用户对出现错误的数据项进行删除。
该命令主要验证每个数据项是否具有: 正确的域数目、惟一的组群标识、合法的成员和管理员列表。
如果检查发现域数目与组名错误,则该错误是致命的,则需要用户删除整个数据项。其他的错误均为非致命的,将会需要用户进行修改,而不一定要删除整个数据项。
下面的例子说明如何使用该命令:
//cat /etc/group //显示系统中原来的用户账号文件
root:x:0:root,patterson
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
kmem:x:9:
supersun:x:501:liyangsuper
liyangsuper:x:502:
patterson1:x:504:
programmer:x:2500:
jerry:x:503:
manager:x:2500:
#vi /etc/group
//编辑该账号文件,加入不正确的数据项“test:x”
//执行验证工作
#grpck /etc/group
invalid group file entry
delete line `tes