使用者ID:UID与GID
在使用Linux的过程中,经常会遇到各种用户ID(user identifier, UID)和组ID(group identifier, GID),Linux也是通过对这些ID的管理实现的自主访问控制(discretionary access control, DAC)。
用户ID(英语:user identifier,一般缩写为User ID或UID),全称用户标识符,在类UNIX系统中是内核用来辨识用户的一个无符号整型数值,亦是UNIX文件系统与进程的必要组成部分之一。
虽然我们登录Linux主机时使用的是账户,但是对于Linux系统而言,它只认识ID。而ID与账户的对应就记录在/etc/passwd文件中。可以通过命令id查看各个id与账户名的对应关系:
从上图中我们可以看到,我的用户名是wang,它的UID是1000,GID也是1000。
UID范围在不同系统中,UID值范围也有所不同,但一般来说UID是由一个16bit的无符号整数表示的,其范围在0-65535之间。
UID 账户0 root,超级用户的UID总为0
65535 nobody,总是UID的最大值
1~999 一般约定是系统保留范围,由系统使用
1000~65534 一般用户UID
UID与GID分类
值得注意的是,以下的分类都是针对进程而言的,只有进程才会有下述几种ID。
中文 英文 解释有效用户ID与有效组ID Effective UID, EUID, Effective GID, GID 在创建和访问文件时发挥作用。具体来说,创建文件时,系统内核将根据创建文件的进程的EUID与EGID设定文件的所有者/组属性,而在访问文件时,内核亦根据访问进程的EUID与EGID决定其能否访问文件。
真实用户ID与真实用户组 Real UID, RUID, Real GID, RGID 用于辨识进程的真正所有者,且会影响到进程发送信号的权限。
暂存用户ID Saved UID, SUID 特权权限运行的进程暂时需要做一些不需特权的操作时使用,这种情况下进程会暂时将自己的有效用户ID从特权用户(常为root)对应的UID变为某个非特权用户对应的UID,而后将原有的特权用户UID复制为SUID暂存;之后当进程完成不需特权的操作后,进程使用SUID的值重置EUID以重新获得特权。
文件系统用户ID File System UID, FSUID 在Linux中使用,且只用于对文件系统的访问权限控制,在没有明确设定的情况下与EUID相同(若FSUID为root的UID,则SUID、RUID与EUID必至少有一亦为root的UID),且EUID改变也会影响到FSUID。设立FSUID是为了允许程序(如NFS服务器)在不需获取向给定UID账户发送信号的情况下以给定UID的权限来限定自己的文件系统权限。
访问文件
举例而言,假设我要执行以下命令,sudo vim /etc/apt/sources.list,我当前的用户是wang,那么这个这个进程的RUID就是1000(对应wang这个账户),而sudo指使使用root权限,因此该进程的EUID就是0(root账户)。我们查看/etc/apt/sources.list文件的所有者和所有组,它的所有者是root,组是root。因此我们必须使用sudo进行提权,也即是修改进程的EUID为0,这样才能够访问/etc/apt/sources.list文件,但是RUID依然是1000。
创建文件再举例创建文件。如下图所示:
文件的所有组和所有者依然与进程的EUID和EGID指定,而非RUID和RGID。 父子进程
子进程继承了父进程所有的各种UID和GID。
权限控制这里描述的权限控制是指Linux中基于用户和用户组以及r\w\x权限的控制,其中r表示可读,w表示可写,x表示可执行。
Linux一般把文件存取的身份分为三个类别:owner/group/others,且三种身份都各有read/write/execute权限。
查看/etc/shadow的详细信息如下图所示:
分析如下: 权限 链接数 所有者 所有组 文件大小 文件最后被修改的时间 文件名
-rw-r----- 1 root shadow 1.6K May 9 2021 /etc/shadow