Linux账户系统

基本概念

User Name and User ID

Linux系统使用用户名和用户ID(UID)来识别用户。当创建一个用户账户时,除了指定用户名外还将从预先设定的范围内指定一个UID。UID的范围由用户的角色来规范,通常,root使用0,系统用户使用1~499之间的数字,而普通用户使用500及更大的数字。

Password

每个用户账户都有自己的密码,这些密码被加密存储在计算机上。Linux本地账户的密码被存储在 /etc/passwd 文件或 /etc/shadow 文件中。当用户使用用户名和密码登录系统时,Linux会将密码进行加密后再与该用户存储在系统中的密码值进行比对,若比对结果一致则获准登录。

管理员一般会使用 /etc/passwd 文件来保存用户账户信息,而将用户密码保存在 /etc/shadow 文件中。这时, /etc/passwd 文件中的原本用于保存密码的字段会使用一个占位符 x 来替代密码加密值。

Primary Group Name and Group ID

Linux使用“组”来管理和组织用户账户。当权限和许可被分配给一个组时,该组中的所有成员账户将继承这些权限与许可。每个组都拥有唯一的名称和标识号(GID)。

基本组(Primary Group)是指用户默认所属的组,其组名和组ID都被保存在 /etc/passwd 文件中该用户所对应的记录中。

每个用户除了属于一个基本组(默认组)外,还可以同时是其他用户组的成员,这些额外所属的组称为用户的附加组(Secondary Group)。

Secondary Group Names and Group IDs

早期的Unix/Linux是没有附加组的概念的,用户只能属于一个组,并且记录在 /etc/passwd 文件中。后来,为了用户能够获取到其他组的权限,Linux系统允许用户同时属于多个组,并将用户与组的关系记录在 /etc/group 文件中。

用户与组的所属关系,除了记录在 /etc/group 文件中的外,还有一个组记录在 /etc/passwd 文件中,称为基本组(Primary Group),相应的,其他的组称为用户的附加组(Secondary Group 或 Supplementary Group)。

Home Directory

家目录(Home Directory)是用户用来存放自己私有文档的文件夹。在多用户环境中,每个用户都分配有一个特定的目录,该目录只有用户自己和管理员用户才具有访问权限。此外,家目录也提供了一个用于存放用户专属配置文件的地方,这样,每当用户登录系统后,都可以回到之前所使用的系统环境中,而无须担心其他用户的使用对此造成影响。

通常,绝大多数的系统中都会把家目录分配到 /home 中,并以用户登录名作以区分(如: /home/wzh )。root 用户的家目录是比较特殊的,一般都是 /root 。当然,家目录并不一定得在 /home 下,但分配在这个目录下会使得管理起来更具组织性。也有一些系统管理员会先将 /home 按功能或部门划分为子目录,再将用户的家目录分配到相应的子目录中(如:/home/dba/wzh)。

Preferred Shell

Shell 是一个命令语言解释器,可以执行从标准输入设备(键盘)或文件读入的命令。Shell 不属于系统内核,它通过调用系统内核来实现像执行程序或创建文件这样的操作。

对于绝大多数的Linux发行版,一般会有若干种标准的shell可供使用,通常默认是 /bin/bash

基本组与附加组的区别

基本组是用户默认活动的组,在 /etc/passwd 文件中有记录,附加组只记录在 /etc/group 中。用户必须且只能有一个基本组,但可以没有附加组或者有一到多个附加组。

组的分类

  1. 系统视角:

    管理员组:GID为 0

    系统用户组:一般 GID 为 1 ~ 499,在某些发行版(如 CentOS7)中为 1~999

    登录用户组:一般 GID 为 500 ~ 60000,在某些发行版(如 CentOS7)中为 1000-60000

  2. 用户视角:

    基本组:用户默认组,记录在/etc/passwd 文件中的组。

    附加组:用户所属的其他组。

  3. 从属关系视角:

    公共组:组内有多个用户。

    私有组:与用户同名,且只包含该同名用户。

活动组(Active Group)

在Linux中,用户可以同时属于多个组,并继承这些组的权限许可,但用户在同一时间却只能有一个活动组。从权限控制的角度来说,用户所属的组是没有太多区别的,用户可以自由访问任何一个其任意所属组有权限访问的文件。然而,Linux文件权限系统的设计却要求任何文件都只能有一个所属组,因此,当用户在创建文件时必须明确要使用哪个组来作为新建文件的所属组。用户在创建文件时所使用的组就是用户的活动组。

通常,用户的基本组是用户登陆系统后默认的活动组。

用户可以使用 newgrp 命令切换活动组,也可以使用 sg 命令以指定的组作为活动组来执行某个命令。

newgrp 命令

该命令用于变更当前登录用户的活动组,其使用格式为 newgrp [-] [group] 。运行该命令后,用户将进入系统新初始化的一个shell中,在新shell中用户的活动组为newgrp 命令所指定的组。

newgrp 命令参数只能是组名称而不能是组的ID,缺省参数的情况下,用户的活动组将变更为 /etc/passwd 文件中指定的基本组。

若用户并不属于 newgrp 命令所指定的组时,运行命令后会提示输入密码,此时正确输入组密码后会进入以指定组为活动组的新的 shell 中,并临时将用户加入该组,退出shell后既失效。

root用户不受组密码的约束,可以切换任意存在的组为其活动组。

例1:

例1中,用户wzh不属于testgroup组,因此,要以该组作为活动组时需要输入testgroup组的密码。使用 newgrp 命令后进入了一个新的shell中,使用exit可以退出回到原来的shell中。退出后用户wzh不再属于testgroup组。

例2:

例2中,用户wzh属于testgroup组,因此可以使用newgrp切换而无须输入密码。

例3:

例3中,当给 newgrp 命令加上 sudo 前缀时,用户和组都发生了变化,这是因为此时是以管理权限(身份)运行了 newgrp 命令,相当于是 root 在操作,新打开的shell中用户自然是 root 了。

sg 命令

命令格式为 sg [-] [group [-c ] command] ,当command为多个单词时,需使用双引号将该参数包围。

该命令可以让用户以指定的组为活动组来执行命令,从用法上来看,和 sudo 有些类似,都作用于另一命令。

虽然同是变更用户的活动组,但与 newgrp 不同的是, sg 命令并不会新初始化一个shell,当其所修饰的命令执行完后指定的活动组即失效。

例:

真实组(Real Group)与有效组(Effective Group)

这两个概念和程序在系统中的运行有关。当用户运行某个程序时,这个程序将以该用户及其当前活动组的权限运行。但程序并不一定都是以用户当前活动组的权限运行,而有可能通过 setgid 功能以该程序所属组的权限运行。于是,程序运行时控制实际权限的组就是有效组。有效组可以是用户的活动组也可以是程序所属组,当程序所属组为有效组时,相应的,该用户的活动组便是所谓真实组。

组规则

在Linux中,每个用户必须至少属于一个组。

从用户的角度来看,每个用户都有一个基本组,零或若干个附加组。

从组的角度来看,每个组可以有零或若干个用户。

一个组可以是某些用户的基本组,同时也可以是其他用户的附加组。

发表评论

电子邮件地址不会被公开。