Linux操作系统中的系统权限管理(包含基本权限讲解、用户、组及基本权限ACL)
目录
三、基本权限ACL(Access Control List)
一、Linux文件系统权限解析
1.1.常见的基本权限
Linux 采用 UGO 模型(User, Group, Other)定义权限,通过赋予某个用户或组能够以何种方式访问某个文件或文件夹(存放图片文件、视频文件、普通文件),从而实现了用户的访问隔离。即每个文件/目录的权限分为三类主体,即分别是:
最具体的权限具有优先权。用户权限覆盖组权限,后者又覆盖其他权限。
属主(User):文件所有者
属组(Group):文件所属组的成员
其他人(Other):既不是文件所有者也不是文件所属组成员的用户
所有人(ALL = U + G + O)即所有前面三组
例如:

其中,最后的 .:表示文件启用了SELinux安全上下文(或其他扩展属性)
1.1.1.基本权限的符号表示模式
Linux文件系统的权限管理中,将访问权限分为三种类型,分别是可读(Read)、可写(Write)、可执行(excute----x/X),三种基本的权限分别有不同的访问权限:
| 权限类别 | 可访问范围 |
| 读 |
允许操作: 查看文件内容:cat filename、less filename、head filename 等。
无法修改内容(如 vim filename 编辑后无法保存)。 |
| 写 |
允许操作: 修改文件内容:vim filename、echo "text" >> filename(追加)、sed -i 's/old/new/g' filename(替换)。 限制: 无 r 权限时,无法直接查看内容(但可通过覆盖式写入修改内容,如 echo "new" > filename)。 |
| 执行 |
允许操作: 运行可执行文件:
无 r 权限时,无法读取脚本内容(但可执行,如二进制程序或被加密的脚本)。 |

注释:
File Type:文件类型,通常- 代表普通文件(其他常见类型:d目录、l链接、b块设备等),
User:文件所有者的权限
Group:文件所属组的权限
Other User:其他用户
整体权限对文件和目录的影响概要表
| 权限 | 对文件的影响 | 对目录的影响 |
| r(读取) | 可以读取文件内容 | 可以列出目录的内容(文件名) |
| w(写入) | 可以更改文件内容 | 可以创建或删除目录中的任一文件 |
| x(执行) | 可以作为命令执行文件 | 目录可以成为当前工作目录。可以运行cd进入这个目录,但还需要读取权限才能列出里面的文件 |
| X(特殊执行) | 为目录添加执行权限 | 目录的执行权限。或则文件的执行权限(如果该文件具有至少一个执行粘滞位) |
1.1.2.基本权限的绝对模式表示
| 编号(编号越大,权限越小,外国人喜欢大的表示小的,例如M就表示分钟,m就表示月份) | 权限 |
|---|---|
| 4 | 读 |
| 2 | 写 |
| 1 | 执行 |
文件权限分为读、写和执行三种。每种状态都分为允许/不允许两种状态值,我们需要三位二进制数就可以表达出所有的状态组合。
| 读 | 写 | 执行 | 对应的八进制 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 2 |
| 0 | 1 | 1 | 3 |
| 1 | 0 | 0 | 4 |
| 1 | 0 | 1 | 5 |
| 1 | 1 | 0 | 6 |
| 1 | 1 | 1 | 7 |

1.1.3.更改文件访问权限
1.1.3.1.用户实体符号表示
用于更改文件权限的符号法使用字母代表不同的权限组:u表示用户,g表示组,o表示其他,a表示全部
| 符号 | 含义 |
|---|---|
| u | 文件或目录的所有者 |
| g | 同一组的成员 |
| o | 其他所有用户 |
| a | 所有用户 |
1.1.3.2.更改用户权限
Linux中可以允许管理员使用命令chmod(change mode)来更改文件的访问权限,并且可以通过以下的两种方式进行:
方式一:chmod 用户类型 +/-/=权限类别 文件名
用户类型分别是前面提到的,ugo或则a
+添加权限
-代表撤销
=授予权限
权限类别即可读,可写,可执行
使用符号法时,您不需要设置一组全新的权限。取而代之,您可以更改现有的一个或多个权限。使用加号(+)或减号(-)来分别添加或删除权限,或者使用等号(=)来替换一组权限的整个集合。
权限自身由单个字母来表示:r表示读取,w表示写入,x表示执行。只有文件是目录或者已为用户、组或其他人设置了执行权限时,您才能使用大写X作为权限标志来添加执行权限。
方式二:chmod 绝对模式 文件名
绝对模式,即使用八进制数字分别来对ugo的访问权限做管理
案例:
第一步:创建test.txt文件,并添加echo "hello world"

练习一:让所有人都只有读写的权限
chmod a=wr test.txt

练习二:为文件的所有者添加执行权限
chmod u+x test.txt

练习三:让其他用户也有执行权限(拥有执行权限文件名颜色通常会变蓝)

chmod o+x test.txt

练习四:使用绝对模式来对文件进行赋权,需求为:让文件所有者拥有可读、可写、可执行权限,文件所有组拥有可读可写权限,其他用户责拥有读权限
分析:
u ---> 可读(4)+ 可写(2)+ 可执行(1) = 7
g ---> 可读(4)+ 可写(2) = 6
o ---> 可读(4) = 4
chmod 764 test.txt

练习五:取消其他用户的所有权限
chmod o-rwx text.txt
chmod 760 text.txt

1.2.linux系统中的特殊权限
Linux中的特殊权限有点坑,早些时候在部署Oracle集群的时候,其中就遇到了权限问题,最终排查的结果就是由于特殊权限(u + s)没给到,倒是共享盘无法被识别!!!!!
Linux操作系统中的特殊权限是除了基本用户、组和其他类型之外的第四种权限类型。顾名思义,特殊权限提供了额外的访问相关功能,超出了基本权限类型允许的范畴。
1.2.1.设置特殊权限(语法规则)
1)符号法
setuid=u+s;setgid=g+s;粘滞=o+t
2)八进制法
在添加的第三个前序位;setuid=4;setgid=2;粘滞=1
1.2.2.示例
通过使用符号法在example目录中添加setgid位:
chmod g+s example
通过使用符号法删除example目录上的setuid位:
chmod u-s example
使用八进制法,对example目录设置setgid位,并为用户和组添加读取、写入和执行权限,但其他不具有任何访问权限:
chmod 2770 example
使用八进制法,对example目录删除setgid位,并为用户和组添加读取、写入和执行权限,但其他不具有任何访问权限。注意,使用八进制法删除特殊权限时,您需要在权限值的开头添加额外的0:
chmod 0770 example
1.2.3.特殊权限一览表
特殊权限的影响,具体参见下表中的总结:
特殊:special
粘滞:sticky
| 权限 | 对文件的影响 | 典型场景 | 对目录的影响 |
| u + s(suid) | 当一个可执行文件设置了 SUID 权限后,任何用户(即使是普通用户)执行该文件时,都会临时获得该文件所有者(通常是 root)的权限。 |
最常见的就是 /bin/passwd 命令。 普通用户需要修改自己的密码,密码存储在 /etc/shadow 文件中。 这个文件只有 root 用户才有权写入。 为了让普通用户也能修改密码,/bin/passwd 文件被设置了 SUID 权限,其所有者为 root。 当普通用户执行 passwd 命令时,会临时以 root 身份运行,从而能够修改 /etc/shadow 文件。 |
SUID 只对二进制可执行文件有效,对 Shell 脚本无效(出于安全考虑,现代 Linux 内核会忽略脚本上的 SUID)。 这是一个高风险权限。如果一个程序设置了 SUID 且有安全漏洞,攻击者可能利用它获得 root 权限。因此,绝对不要随意给程序(如 vim、bash)设置 SUID。 |
| g + s(sgid) |
情况 A:设置在可执行文件上(类似 SUID) 情况 B:设置在目录上(更常用,重要) |
情况A:典型场景:某些需要访问特定硬件设备或系统文件的命令,如 /bin/umount。 情况B:典型场景:团队协作共享目录。 |
目录中创建的文件的组所有者与目录的组所有者相匹配。存在继承的关系。 |
| o + t(sticky) | 当一个目录被设置了 Sticky Bit 后,只有文件的所有者、目录的所有者或 root 用户才能删除或重命名该目录下的文件。其他用户,即使对该目录有写权限,也无法删除不属于自己的文件。 |
最常见的就是 /tmp 目录。 /tmp 是所有用户共享的临时目录,权限通常是 1777(即 drwxrwxrwt)。 如果没有 Sticky Bit,任何用户都可以删除其他用户在 /tmp 下创建的文件,这会造成混乱和安全问题。 有了 Sticky Bit,用户 alice 只能删除她自己创建的文件,而无法删除 bob 的文件。 |
对目录具有写入访问权限的用户仅可以删除其拥有的文件,而无法删除或强制保存到其他用户所拥有的文件。 |
1.3.特殊权限实验测试
1.3.1.实验前准备
1)创建测试用户
useradd testuser1
useradd testuser2

2)设置密码
passwd testuser1
passwd testuser2

3)创建实验目录
mkdir -p /tmp/lab
chmod 755 /tmp/lab
cd /tmp/lab

1.3.2.u + s场景
理解 SUID 如何让普通用户临时拥有文件所有者的权限。
1)查看一个已有suid的例子,系统自带
ls -l /bin/passwd

2)创建一个测试程序
# 编写一个简单的 C 程序,用于显示当前用户的 UID
cat > /tmp/lab/showuid.c << 'EOF'
#include <stdio.h>
#include <unistd.h>
int main() {
printf("真实用户ID (UID): %d\n", getuid());
printf("有效用户ID (EUID): %d\n", geteuid());
return 0;
}
EOF
# 编译程序
gcc -o /tmp/lab/showuid /tmp/lab/showuid.c

3)查看普通用户执行效果
# 切换到 testuser1
/tmp/lab/showuid

可以看到UID和EUID相同,都是testuser1。
4)设置SUID后再测试
chmod u+s /tmp/lab/showuid

结果:有效用户ID变成了0(root),说明testuser1执行时临时获取了root权限。

在长列表中,通常使用小写的s字符辨别出是否具有setuid权限。
1.2.2.g + s场景
理解 SGID 如何让目录下的新文件自动继承目录的所属组,方便团队协作。
1)创建共享目录并设置SGID
# 创建目录
mkdir /tmp/lab/teamdir
# 创建测试组
groupadd teamgroup
chown root:teamgroup /tmp/lab/teamdir
# 设置SGID
chmod g+s /tmp/lab/teamdir
# 查看权限(注意所属组的 x 变成了 s)
ls -ld /tmp/lab/teamdir

2)将testuser1和testuser2加入组
usermod -aG teamgroup testuser1
usermod -aG teamgroup testuser2

3)测试,未设置SGID时(对比)
# 先创建一个普通目录,不设置SGID
mkdir /tmp/lab/normaldir
chown root:teamgroup /tmp/lab/normaldir

# 创建testuser1文件
su - testuser1
touch /tmp/lab/normaldir/file1
ls -l /tmp/lab/normaldir/file1

可以注意到在未设置SGID的时候,用户该用户在该目录下创建的文件归宿也是testuser1,而不是teamgroup。
4)测试设置SGID 的teamdir目录

结果:可以注意到file2的文件归所组已经切换为teamgroup,即目录的所属组。
1.2.3.o + s场景
理解 Sticky Bit 如何防止用户删除不属于自己的文件。
1)创建共享目录并设置Sticky Bit
# 创建目录,所有用户都有写权限
mkdir /tmp/lab/shared
chmod 777 /tmp/lab/shared
# 设置Sticky Bit
chmod o+t /tmp/lab/shared
# 查看权限(留意其他人的x变成了t)
ls -ld /tmp/lab/shared

2)分别用两个用户创建文件
# 使用testuser1创建一个测试文件
su - testuser1
touch /tmp/lab/shared/file_a.txt
# 使用testuser2也创建一个测试文件
su - testuser2
touch /tmp/lab/shared/file_b.txt

3)测试:删除别人的文件(应该会提示失败)

4)删除自己的文件

二、更改文件属主/属组关系
2.1.chown命令
chown命令来源于(change owner),它用于配置一个文件属于谁、属组权。
1)既改属主、也改属组
语法:chown [-R] 用户名:组名 文件,也可以单独使用 chown 或 chgrp分别进行执行。不同之处在于,chgrp只能用它来更改组所有权,而且组名称前也不需要加冒号(:)。
在Linux系统中,chown -R 用户名.组名 使用 . 也能够执行通过,这是因为 chown 命令支持使用点号 . 代替冒号 : 作为用户与用户组的分隔符,但不推荐。
-R代表:递归(-R)将当前目录(.)下所有文件和子目录的所有者修改为 mysql 用户
示例1:

示例2:

2)只改属主
语法:chown 属主名 文件

3)只改属组
语法:chown .属组名 文件
案例:
第一步:创建两个用户分别时develop_user01、develop_user02
语法:useradd develop_user01/develop_user02
练习一:在develop_user01用户下创建一个脚本文件text.sh,然后确保同一个开发组的成员能够进行访问和修改。
创建一个名叫develop的组
将develop_user01、develop_user02添加至同一个附加组中

保证组用户至少有执行的权限,且将需要共享的文件目录添加至附加组中

验证:

2.2.chgrp命令
chgrp设置一个文件属于哪个组,属组
语法:chgrp -R 组名 文件 -R是递归的意思

三、基本权限ACL(Access Control List)
3.1.基本权限ACL的诞生?
试想一下,chmod是否能对一个独立的用户(非组用户)/ 独立组来进行管理?
回顾:chmod 仅支持三类权限对象,语法为 chmod [ugoa][+-=][rwx] 文件,因此它就无法实现:能单独允许用户 bob 读取文件,而其他非组用户无权访问。
结论:在 Linux 中,传统的 chmod 命令无法直接针对独立用户(非所有者、非所属组、非其他用户)设置权限,它只能按 “所有者(u)- 所属组(g)- 其他用户(o)” 三类角色分配权限。若需为特定用户单独设置权限(例如允许用户 alice 读写文件,而其他用户无权限),需通过 ACL——access control list(访问控制列表) 实现。
3.2.基本权限ACL和UGO权限有什么不同?
chmod 无法针对独立用户设置权限,仅支持 u/g/o 三类角色,且只能一个用户,一个组和其他用户。
ACL(setfacl / getfacl)是解决方案,可精细化控制单个用户/组的权限,能设置不同用户,不同的基本权限(r、w、x)。对象数量不同。适用于多用户共享场景。
注意:ACL 权限优先级高于传统权限
总:
| 特性 | chmod | ACL |
| 权限对象 | 所有者、所属组、其他用户 | 可指定任意用户、组 |
| 精细化程度 | 仅三类角色 | 支持为每个用户/组单独设置权限 |
| 兼容性 | 所有Linux系统支持 | 系统文件系统启用ACL(主流默认支持) |
set force acl
get force acl
force:强制,迫使
语法:
setfacl -m u:xiaowang:rw /home/test.txt
serfacl:命令
-m: 设置
u:xiaowang:rw 用户或组:用户名:权限
/home/test.txt: 文件对象
3.2.1.查看文件有哪些acl权限

3.2.2.设置用户bob权限
例1:setfacl -m u:bob:rw /home/text.txt
例2:setfacl -m u:bob:- /home/text.txt
核心选项
| 选项 | 功能描述 |
|---|---|
-m |
修改 ACL 规则(添加或更新权限,常用)。 |
-x |
删除指定 ACL 规则(仅删除用户/组的 ACL 权限,保留其他规则)。 |
-b |
清除所有 ACL 规则(保留传统权限 u/g/o)。 |
-k |
删除默认 ACL(仅对目录有效)。 |
-R |
递归应用规则(对目录及其所有子文件/子目录生效)。 |
-d |
设置默认 ACL(仅对目录有效,新创建的文件/子目录会继承此 ACL)。 |
--set |
覆盖原有所有 ACL 规则(需完整指定所有权限,谨慎使用)。 |
规则需遵循:
类型:对象:权限
其中:
类型:u(用户)、g(组)、m(掩码 mask)、o(其他用户)。
对象:用户名或组名(u:或g:后不指定对象时,对应传统权限中的所有者/所属组)。
权限:r(读,4)、w(写,2)、x(执行,1),或用数字表示(如rw-=6、rwx=7)。
3.2.3.查看ACL
例:getfacl /home/test.txt
3.2.4.删除ACL
1)删除部分acl权限
例:setfacl -x g:bob /home/test.txt
2)删除所有acl权限
例:setfacl -b /home/test.txt
3.2.5.场景示例
1)为特定用户添加权限
举例:允许用户bob读写project.txt(所有者develop_user01,所属组为develop)

2)为特定组添加权限
举例:允许hr组读取并执行/home/develop_user01/shell目录(注意,目录需x权限才能进入,文件需x权限才能执行)
setfacl -m g:hr:rx /data/scripts # g:hr:rx 表示组 hr 拥有读和执行权限
注意:目录需 x 权限才能进入,文件需 x 权限才能执行。
3)递归设置目录及其子内容的acl
举例:为/shared目录继器所有子文件/子目录添加用户bob的读写权限
setfacl -R -m u:bob:rw /shared # -R 递归应用到子内容
4)设置默认ACL(新文件自动继承权限)
举例:在/project目录中,新创建的文件/子目录默认允许组develop读写
# 为目录设置默认 ACL(仅对目录有效)
setfacl -d -m g:develop:rw /project
-d表示“默认ACL”,新文件会继承此规则(但已有文件不会受影响)
验证:创建新文件后用getfacl查看,会显示:default:group:develop:rw-
5)删除指定用户/组的ACL权限
举例:移除用户bob对test.txt的ACL权限。
setfacl -x u:bob test.txt # -x 仅删除用户 bob 的规则,其他权限不变
6)清除所有ACL规则
举例:删除test.txt的所有ACL权限,恢复传统权限
setfacl -b test.txt # -b 清除所有 ACL,保留 u/g/o 的传统权限
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)