第5章人事档案——Linux用户及组管理

无论是哪个操作系统中,用户及组管理是最基本,也是最重要的问题之一。用户需要使用操作系统时,都要先输入用户名及密码登录到系统后才可以使用,在安装RHEL 5.x后默认只有一个名为root的超级用户,该用户是整个系统的管理员,为了让其他用户也可以使用这个系统我们还需要建立其他的用户。在本章中将讲述Linux用户及用户组管理方式及相关操作。

5.1 Linux用户及组管理方式

每一个用户都需要给定一个单独的用户名,为了防止其他人使用自己的用户名,每个用户又会有一个对应的密码,这就构成了用户管理的基本结构。

在用户使用过程中,并不是每个用户都可以做任何的事情,所以需要为用户配置各种不同的权限,但有时多个用户会需要有相同的权限,为了操作方便可以在系统中建立一个用户组后,对用户组配置权限,只要加入该用户组的用户都会继承用户组的权限。在Windows中一个用户可以加入多个用户组,当用户加入多个用户组后,会继承这多个用户组的权限。在Linux系统也是这样,但在Linux系统中对用户来说用户组有两种:初始组、额外组。每个用户必须属于一个初始组,同时也可以加入到多个额外组中。对于Linux系统中的用户初始组是必需的,额外组是可选的。

5.1.1 用户管理方式

当在Linux系统中输入用户名及密码登录后,在整个使用过程中Linux系统会将每个用户看做一个32位的整数,这个整数就是UID。Linux的内部运作大部分都是使用UID,只有在显示给人看时才会把UID转换为对应的用户名。通过如下命令可以查看到当前登录用户的UID。在Linux系统中有以下三种类型的用户:

        [charles@srv ~]$ id
        uid=500(charles) gid=500(charles) groups=500(charles)

1.一般用户

一般用户是登录计算机工作的人。不同的人使用不同的用户名以便他们可以独立操作。每个不同的用户都有不同的UID。在RHEL 5.x建立一般用户时,默认情况下UID会是一个500到60000的整数。

2.超级用户

超级用户默认是root用户,该用户的UID为0。在Linux系统中只有UID为0的用户才有权访问系统中所有的文件、目录和其他资源以及一些系统调用,比如挂载文件系统、关闭计算机、建立用户等(虽然也可让非超级用户执行这些操作,但是这些也需要有一个UID为0的用户允许的情况下)。

3.系统用户

在Linux中有些服务在安装时会分配服务自身使用的UID和用户名。这些服务通常会利用一些文件,并用自身的UID运行一些进程。这样的用户被称为系统用户。在RHEL 5.x中为系统用户预留的UID是从1到499的整数。

提示

在RHEL 5.x中默认情况下,如果当前用户是管理员提示符应该以“#”结尾,如果当前用户是一般用户提示符应该以“$”结尾。

每个用户都会有一个家目录,该目录只有用户自己可以访问。一般用户的家目录在“/home”目录下一个和用户名相同的目录中;超级用户的家目录在“/root”中;系统用户的家目录根据服务的不同可能在其他目录中。

        [charles@srv ~]$ id
        uid=500(charles) gid=500(charles) groups=500(charles)
        [charles@srv ~]$ ll /home/
        total 20
        drwx------2 root     root     16384 Jan 29 19:08 lost+found
        drwx------3 charles charles  4096 Feb 14 09:51 charles   #用户“charles”的家目录。

5.1.2 用户组管理方式

在Linux系统中,每个用户对应一个UID,每个组也有一个GID。和UID一样,系统自身在运行过程中使用的是GID,只有在显示给用户查看时才会将GID转换为组名称。

在建立用户时默认情况下会建立一个与用户名相同名称的组,组的GID与用户的UID相同,这个组就是该用户的初始组。

当一个用户属于多个时,这个用户的权限一般应该是该用户初始组及所属额外组权限的并集。

5.1.3 相关配置文件/目录

Linux中所有的信息都是通过配置文件的方式保存,用户及用户组也不例外,在学习用户及用户组相关的命令之前,先来了解一些相关的配置文件。

使用useradd时,选项后面直接跟所添加的用户名时,该命令整个工作过程:读取添加用户配置文件/etc/login.defs和/etc/default/useradd文件,然后权限/etc/login.defs和/etc/default/useradd中所定义的规则添加用户;并向/etc/passwd、/etc/shadow和/etc/groups文件添加用户和用户组记录;同时会自动在/etc/login.defs中所约定的目录中建用户的家目录,并复制/etc/skel中的文件(包括隐藏文件)到新用户的家目录中。

1./etc/default/useradd文件

/etc/default/useradd文件用于定义建立用户时的规则。

        # useradd defaults file
        GROUP=100                                   #可创建普通组。
        HOME=/home                                  #将用户家目录建在目录/home中。
        INACTIVE=-1                                 #是否启用用户过期功能,“-1”表示不启用。
        EXPIRE=                                     #指定用户过期日期。
        SHELL=/bin/bash                             #指定用户默认使用的Shell。
        SKEL=/etc/skel                              #指定用户家目录模板目录。

2./etc/login.defs文件

/etc/login.defs文件用于定义建立用户时相关选项的默认值。

        [root@srv ~]# grep -v ^# /etc/login.defs | grep -v ^$
        MAIL_DIR       /var/spool/mail               #指定新建用户的默认邮箱目录。
        PASS_MAX_DAYS   99999                        #指定新建用户的密码最长使用时间。
        PASS_MIN_DAYS   0                            #指定新建用户的最短使用时间。
        PASS_MIN_LEN    5                            #指定新建用户的密码最小长度。
        PASS_WARN_AGE   7                            #指定新建用户的密码过期警告时间。
        UID_MIN                 500                  #指定新建用户的最小UID。
        UID_MAX               60000                  #指定新建用户的最大UID。
        GID_MIN                 500                  #指定新建用户组的最小GID。
        GID_MAX               60000                  #指定新建用户组的最大GID。
        CREATE_HOME     yes                          #指定新建用户时是否自动建立用户家目录。
        #指定新建用户的家目录的UMASK值(有关UMASK见第6章)。
        UMASK          077
        #如果用户对应初始组中没有其他成员时,在删除用户时是否一起删除对应初始组。
        USERGROUPS_ENAB yes
        #在保存用户密码时是否使用MD5加密用户密码,如果指定为“no”则会使用DES加密用
        #用户密码。
        MD5_CRYPT_ENAB yes

3./etc/skel目录

在Linux中系统使用命令建立用户时,所建立用户的登录脚本、家目录等所有信息都是以/etc/skel目录中的内容为模板。

        [root@srv ~]# ll -a /etc/skel/
        total 76
        drwxr-xr-x  4 root root  4096 Feb 14 14:11 .
        drwxr-xr-x 97 root root 12288 Feb 14 16:53 ..
        -rw-r--r--  1 root root   33 Oct 21  2008 .bash_logout
        -rw-r--r--  1 root root   176 Oct 21  2008 .bash_profile
        -rw-r--r--  1 root root   124 Oct 21  2008 .bashrc
        -rw-r--r--  1 root root   515 Dec 11  2007 .emacs
        drwxr-xr-x  4 root root  4096 Jan 29 19:25 .mozilla
        -rw-r--r--  1 root root   658 Apr 15  2009 .zshrc

如果在/etc/skel/目录中建立目录或放入文件,那么新建用户的家目录中就会有这些目录及文件;如果修改该目录中的用户配置文件、登录脚本内容,那么新建用户的用户配置文件、登录脚本也会采用修改后的内容。

提示

有关用户配置文件、登录脚本见第10章。

4./etc/passwd文件

/etc/passwd文件中保存了Linux系统中所有的用户信息,该文件中每一行都代表一个用户,有几行就代表有几个用户。不过需要特别留意的是,在文件中第一行就是UID为0的root用户也就是超级用户,在有些Linux系统中超级用户必须是在/etc/passwd文件的第一行,因此一般不要修改第一行;除了root用户以外,还有很多其他的用户,这些用户就是系统用户,如bin、daemon、adm、nobody等,这些用户是系统正常运作时所需要的,不能随意地删除。

        [root@srv ~]# head -3 /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

/etc/passwd文件中第一行有7列,第一列之间通过“:”分隔,每列含义如下:

(1)用户名,用户在登录时使用的名称。

(2)密码,在早期的UNIX系统中该列用于存放用户的密码,但是因为这个文件的权限是所有的程序都能够读取,所以很容易造成用户密码的被窃取,因此后来就将这个字段的密码数据存放/etc/shadow中。而该列会使用一个“x”表示密码已经被移动到/etc/shadow文件中。

(3)UID,该用户对应的UID。

(4)GID,该用户初始组的GID。

(5)用户说明信息,该列并没有什么重要用途,只是用来解释这个用户的意义。

(6)家目录,记录该用户的家目录所有位置。

(7)Shell,用户在登录时会运行一个程序,该程序就是登录Shell(有关Shell相关内容见第9章),在RHEL 5.x中默认的Shell是“/bin/bash”。有一些禁止用户登录的方式就是为用户指定“/sbin/nologin”的登录Shell。

5./etc/shadow文件

/etc/shadow文件保存了系统中所有用户的密码,该文件也是每行一个用户密码。

        [root@srv ~]# head -3 /etc/shadow
        root:$1$PCWBPGyb$U.kzd76zm3mSKYTP/BZd40:14638:0:99999:7:::
        bin:*:14638:0:99999:7:::
        daemon:*:14638:0:99999:7:::

/etc/shadow文件中第一行有9列,第一列之间通过“:”分隔,每列含义如下:

(1)用户名,由于密码也需要与用户对应,该文件的第一列就是用户名。用户名必须与/etc/passwd文件中的用户名一一对应。

(2)密码,该用户的密码,而且是经过加密过的密码,只会看到有一些特殊符号。该文件只有root用户才可以读写。另外,如果是在该列的第一个字符为“!”,表示这个账号并不会被用来登录的意思。所以不想让某个用户登录时,也可以在这个文件中,将他的密码字段的最前面多加一个“!”。

(3)最近更动密码的日期,该列记录了该用户最后一次修改密码日期,这里的日期是以“1970年1月1日”作为1,而“1971年1月1日”则为366,所以这个日期是一个累加值。

(4)密码最短更改时间,该列记录了对应用户最短需要经过几天才可以被修改密码。如果是0,表示密码随时可以更改。比如设置为10天的话,那么当用户修改密码后,10天内都无法改变这个密码。

(5)密码最长使用时间,为了保存自己的密码安全,最常见的做法就是定期修改自己的密码,密码最长使用时间指定了一个密码多少天后必须修改,否则对应用户将被禁用。如果设置为99999的,那么密码可以无限期地使用。

(6)密码更改警告时间:当用户因为密码最长时间快要到的时候,Linux系统会依据这个字段的配置的天数发出警告,提醒再过指定的时间后密码就会失效。比如指定为5,表示当离密码最长使用时间还有5天时向用户发出警告。

(7)密码过期的时间:如果用户过了警告时间还没有更改密码使得密码失效后,还可以用这个密码在指定的天数内进行登录。比如指定为7,表示密码过期后7天内还可以登录。

(8)用户失效日期:在到达用户失效时间指定的天数后,用户将无法使用。这个日期和“最近更动密码的日期”一样,使用1970年以来的总日数设置。

(9)保留:最后一个字段是保留的,目录还没有作用。

6./etc/group文件

/etc/group文件保存了系统中所有用户组信息,该文件也是每行一个用户组,有几行就代表有几个用户组。

        [root@srv ~]# head -3 /etc/group
        root:x:0:root
        bin:x:1:root,bin,daemon
        daemon:x:2:root,bin,daemon

/etc/group文件中第一行有4列,第一列之间通过“:”分隔,每列含义如下:

(1)组名称,该组的名称。

(2)组密码,该组的密码,该列与“/etc/passwd”文件一样这里使用一个“x”表示该组的密码记录在“/etc/gshadow”文件中。对于目前的Linux系统组密码已经没有作用。

(3)GID,该组对应的GID。

(4)组成员,将该组作为额外组的所有用户。前面已经提到在Linux系统中每一个用户都必须属于一个初始组,同时还可以属于任意个额外组,而且当建立用户时默认用户建立一个与用户名相同的组作为该用户的初始组。初始姐不需要在该列中定义,该列中所有用户都是把该列作为额外组的用户。如想要让用户“charles”也加入root这个组,那么在第一行的最后面加上“,charles”,注意不要有空格,使其成为“root:x:0:root,charles”就可以。

提示

将用户加入root组并不会使该用户具有管理员的权限。