权限管理

7319 字
37 分钟
权限管理

权限管理#

[TOC]



01.文件权限#

📌 准备两个窗口

  • root — 管理员
  • oldboy — 普通用户
rw- r-- r--

九位权限位置

  • r: read
    • 可读 cat less head tail
  • w: write
    • 可写 vim echo sed
  • x: execute
    • 可执行 普通文件不需要x权限
    • 文件中是可执行命令的时候才需要有x权限

📌 每3位为一组

  • rw-三位对应着文件属主的权限
  • r--三位对应着属组的权限
  • r--三位对应着陌生人的权限
Terminal window
[root@oldboy ~]# touch /home/oldboy.txt
# root用户进行创建
Terminal window
[oldboy@oldboy ~]$ ll /home/oldboy.txt
-rw-r--r-- 1 root root 9 Dec 18 16:07 /home/oldboy.txt
# oldboy用户进行查看

问: 我对oldboy.txt拥有什么权限?

(1)我是谁

Terminal window
[oldboy@oldboy ~]$
# 当前登录的用户是oldboy

(2)找出我和文件的关系

oldboy用户对于这个文件,既不是属主,也不是属组,那关系就只能是陌生人

(3)通过关系找到对应的权限位置

陌生人对应的权限位置是后三位 r—

只读权限


02.授权#

chmod#

chmod 是 “change mode” 的缩写 mode = 权限模式 chmod 命令用于更改文件或目录的权限模式(mode)

chown 是 “change owner” 的缩写 owner = 主人 chown 命令用于更改文件或目录的属主(owner)和属组(group)

📌 语法结构:

chmod ugo file # 方法1
chmod 数字 file # 方法2

⚠️ 参数选项:

chmod -R 644 # 基本不用
  • 修改目录目录下所有文件为644
    • 目录和目录下的文件,通常来讲它们的权限是不一样的
    • 如果仅修改文件,先用 find 绝对路径 -type f 查找,配合 xargs 修改

-R 递归修改权限

ugo#

📌 使用ugo方式进行授权

  • u — 表示前三位权限位

    属主

  • g — 表示中三位权限位

    属组

  • o — 表示其他位权限位

    陌生人

  • a — 表示所有位置

    all 所有

Terminal window
chmod +x 1.txt # 所有位加x权限
chmod +w 1.txt # 只为属主加w权限 -- 只有它是特殊
+(加)#

🌰 案例:给1.txt属主增加x权限

Terminal window
[root@oldboyedu ~]# chmod u+x 1.txt
[root@oldboyedu ~]# ll 1.txt
-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt

🌰 案例:给属主和属组增加x权限

Terminal window
[root@oldboyedu ~]# ll 1.txt
--w-r--r-- 1 root root 0 Nov 13 10:16 1.txt
[root@oldboyedu ~]# chmod ug+x 1.txt
[root@oldboyedu ~]# ll 1.txt
--wxr-xr-- 1 root root 0 Nov 13 10:16 1.txt

🌰 案例:给所有位置增加w权限

Terminal window
[root@oldboyedu ~]# chmod a+w 1.txt
[root@oldboyedu ~]# ll 1.txt
--wxrwxrw- 1 root root 0 Nov 13 10:16 1.txt
-(减)#

🌰 案例:给1.txt属主去掉w权限

Terminal window
[root@oldboyedu ~]# chmod u-w 1.txt
[root@oldboyedu ~]# ll 1.txt
-r-xr--r-- 1 root root 0 Nov 13 10:16 1.txt

🌰 案例:同时去掉r和x权限

Terminal window
[root@oldboyedu ~]# chmod u-rx 1.txt
[root@oldboyedu ~]# ll 1.txt
--w-r--r-- 1 root root 0 Nov 13 10:16 1.txt
# 可同时去掉多个

🌰 案例:所有位置去掉w权限

Terminal window
[root@oldboyedu ~]# chmod a-w 1.txt
[root@oldboyedu ~]# ll 1.txt
---xr-xr-- 1 root root 0 Nov 13 10:16 1.txt
=(赋值)#

🌰 案例:给1.txt属主授权为r权限

Terminal window
[root@oldboyedu ~]# chmod u=r 1.txt
[root@oldboyedu ~]# ll 1.txt
-r--r--r-- 1 root root 0 Nov 13 10:16 1.txt
# 可加一个或者多个
Terminal window
[root@oldboyedu ~]# chmod u=rwx 1.txt
[root@oldboyedu ~]# ll 1.txt
-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt
+w 的特殊性#

⚠️ 只为属主加w权限 — 只有它是特殊

Terminal window
[root@oldboyedu ~]# chmod +x 1.txt
[root@oldboyedu ~]# ll 1.txt
---xr-xr-x 1 root root 0 Nov 13 10:16 1.txt
[root@oldboyedu ~]# chmod +r 1.txt
[root@oldboyedu ~]# ll 1.txt
-r-xr-xr-x 1 root root 0 Nov 13 10:16 1.txt
[root@oldboyedu ~]# chmod +w 1.txt
[root@oldboyedu ~]# ll 1.txt
-rwxr-xr-x 1 root root 0 Nov 13 10:16 1.txt
# 只有属主有w权限

数字#

Terminal window
# 使用数字方式进行授权
r # 读 4
w # 写 2
x # 执行 1
# 授权时、将每三位的位置进行相加然后进行授权

🌰 案例:授权1.txt权限为 rwxr—r—

Terminal window
rwx = 4+2+1 = 7
r-- = 4+0+0 = 4
r-- = 4+0+0 = 4
Terminal window
[root@oldboyedu ~]# chmod 744 1.txt
[root@oldboyedu ~]# ll 1.txt
-rwxr--r-- 1 root root 0 Nov 13 10:16 1.txt

🌰 案例:授权1.txt权限为 rw-------

Terminal window
[root@oldboyedu ~]# chmod 600 1.txt
[root@oldboyedu ~]# ll 1.txt
-rw------- 1 root root 0 Nov 13 10:16 1.txt

🌰 案例:授权1.txt权限为 rwxrwxrwx

⚠️ 企业工作中禁止授权777

Terminal window
[root@oldboyedu ~]# chmod 777 1.txt
[root@oldboyedu ~]# ll 1.txt
-rwxrwxrwx 1 root root 0 Nov 13 10:16 1.txt

03.umask#

📌 作用: 控制系统默认创建文件和目录的权限(了解)

  • 系统默认创建的文件权限: 644
  • 系统默认创建的目录权限: 755

目录每一位多加了个x,也就是可以cd进入到目录中

Terminal window
[root@oldboyedu ~]# touch a.txt
[root@oldboyedu ~]# mkdir oldboy
[root@oldboyedu ~]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 13 10:34 a.txt
# 文件644
drwxr-xr-x 2 root root 6 Nov 13 10:34 oldboy
# 目录755

📌 查看umask

Terminal window
[root@oldboyedu ~]# umask
0022

📌 使用文件的最大权限减去默认的umask 022 得到的是 644

  • 文件最大权限: 666 — 文件可读可写
666
-022
=644

📌 使用目录的最大权限减去默认的umask 022 得到的是 755

  • 目录最大权限: 777 — 目录最大权限
777
-022
=755

操作#

Terminal window
[root@oldboyedu ~]# umask 044
[root@oldboyedu ~]# umask
0044
# 修改umask
Terminal window
[root@oldboyedu ~]# touch a.txt
# 666
# -044
# =622 rw--w--w-
# 操作文件,得到权限
Terminal window
[root@oldboyedu ~]# mkdir oldboy
# 777
# -044
# =733 rwx-wx-wx
# 操作目录
Terminal window
[root@oldboyedu ~]# ll
total 0
-rw--w--w- 1 root root 0 Nov 13 10:37 a.txt
# 622 匹配得上
drwx-wx-wx 2 root root 6 Nov 13 10:37 oldboy
# 733 也匹配得上

⚠️ 注意:如果umask值为奇数,666减去后在奇数位加1,就是文件权限

  • 目录权限不需要加
Terminal window
[root@oldboyedu ~]# umask 032
[root@oldboyedu ~]# touch 1.txt
# 666
# -032
# =634
# 文件,奇数位+1
# +010
# =644
# 是减完后再+1
Terminal window
[root@oldboyedu ~]# mkdir oldboy
# 777
# -032
# =745
# 目录不发生改变

✅ 验证:

Terminal window
[root@oldboyedu ~]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 13 10:40 1.txt
# 644
drwxr-xr-x 2 root root 6 Nov 13 10:40 oldboy
# 745

04.rwx含义#

文件中#

📌 rwx对于文件的含义:

准备两个窗口:

  • root — 用来修改权限
  • oldboy — 执行命令

📌 环境准备:

Terminal window
[root@oldboyedu ~]# mkdir /oldboy
[root@oldboyedu ~]# touch /oldboy/{1..3}.txt
[root@oldboyedu ~]# echo pwd > /oldboy/1.txt
# 将pwd写入进去,写入的是字符
# 当文件有rx权限,可以执行pwd命令
# 只有x啥也干不了
# 下文有详细解析
[root@oldboyedu ~]# tree /oldboy/
/oldboy/
├── 1.txt
├── 2.txt
└── 3.txt
0 directories, 3 files
[root@oldboyedu ~]# chown oldboy.oldboy /oldboy/*
# 用root进行修改
# 没有-R 只修改目录下所有文件的属主和属组
# 并没有修改目录的属主和属组!!!
Terminal window
[root@oldboyedu ~]# ll /oldboy/
total 4
-rw-r--r-- 1 oldboy oldboy 4 Nov 13 10:44 1.txt
-rw-r--r-- 1 oldboy oldboy 0 Nov 13 10:43 2.txt
-rw-r--r-- 1 oldboy oldboy 0 Nov 13 10:43 3.txt
# 文件的默认权限是644

📌 开始测试

Terminal window
[root@oldboyedu oldboy]# chmod u=r 1.txt
# root修改权限
[root@oldboyedu oldboy]# ll 1.txt
-r--r--r-- 1 oldboy oldboy 4 Nov 13 10:44 1.txt

oldboy测试 这些都是在oldboy用户下进行测试的

测试结果:

  • r — 只读、其他什么权限都没有
    • 只要文件能让看,就能让我cp复制
  • w — 啥都不能干
    • 可以追加 >>vim不生效
    • 看都不让看,追加也没有意义!
  • x — 啥都不能干
    • 同上,单拎x没有意义!

文件中的 r、w、x 并不是我们想象中的那样: 只要有w就可以写? 只要有x就可以执行?

📌 常见组合 — 它们通常是配合着来用的:

  • r — 单独使用表示只读
    • 可cp复制文件
  • rw — 对文件可读可写、文件的最高权限
  • rx可以执行文件中的命令
    • 可以执行pwd命令,它就不再是字符了
    • 如果只是想要执行,不需要有w写的权限!
  • rwx — 说明可读可写可执行的脚本文件

既然1.txt已经是oldboy的了,那我们可以对它进行别的操作吗?

这又是为什么呢???

📌 目录的权限决定了我们用户是否可以在里面创建、删除、改名的动作

  • 目录是由root创建的,所属主为root
  • 它的默认目录的权限是755
  • oldboy是陌生人,拥有 r-x 权限
  • 而上面对于目录下文件的操作(创建、删除、改名),主要是目录的 w 权限在控制
  • 因为陌生人oldboy没有目录的 w 权限,自然无法执行以上操作
Terminal window
[root@oldboy home]# ll -d /root
dr-xr-x--- 5 root root 248 Dec 18 16:07 /root
# /root目录不是默认的权限755

目录中#

📌 环境修改:

Terminal window
[root@oldboyedu ~]# chown oldboy.oldboy /oldboy
# 修改/oldboy目录的属组和属组为oldboy
[root@oldboyedu ~]# ll -d /oldboy
drwxr--r-x 2 oldboy oldboy 45 Nov 13 10:43 /oldboy
# 这次是目录

修改目录权限进行测试:

Terminal window
[root@oldboyedu oldboy]# chmod u=r /oldboy
# 修改权限用root
[root@oldboyedu oldboy]# ll -d /oldboy
dr--r--r-x 2 oldboy oldboy 45 Nov 13 10:43 /oldboy

目录的权限

  • r — 单独一个r,啥都不能干
    • 主要管理目录下的文件是否能够被ls查看!
  • w — 单独一个w,啥都不能干
    • 主要管理目录下的文件是否能被rm删除、touch/echo创建、mv改名
  • x — 单独一个x,只能进入到目录、其他啥也不能干
    • 这个x是管理是否能够进入到目录里面
    • 文件是否能够执行,需要查看对应的文件是否有x权限,而并非是目录的x权限
    • 文件仅有x权限,啥也干不了
  • wx能进去,目录下的文件能被创建、删除、改名
    • 但是没有目录的r权限,你ls看不见目录下的文件
    • 是否能cat查看,取决于文件本身,而并非目录

📌 常见的两种组合:

  • r-x所有用户都可以进入此目录
    • 可以ls查看目录下的内容
    • 对于文件里面的内容是否能查看,取决于文件本身的r权限
    • 不能创建、删除、改名(没有目录w权限)
  • rwx目录的最高控制权限
    • 可ls查看目录下的文件
    • 可创建、删除和改名目录下的文件
    • 可cd进入到目录里面
    • 关于具体文件内容的查看r、文件内容的修改w、文件的执行x,还得看具体的文件权限!!!

📌 权限问题:找出确定的权限位少了啥???

Terminal window
# 在oldboy用户下执行
# 文件默认权限为 rw-r--r-- 644
# 目录默认权限为 rwxr-xr-x 755
# 这里oldboy为这些目录的陌生人,只需看后三位权限即可!!!
touch /etc/a.txt
# oldboy没有/etc目录的w权限,目录rwx可创建,故无法在/etc/目录下创建文件
echo aaa >> /etc/passwd
# oldboy只有这个文件的r权限,缺少文件的w权限,文件rw可修改!没有办法修改文件的内容
cd /root/
# 没有/root/目录的x权限,目录rwx可进入
[root@oldboy home]# ll -d /root
dr-xr-x--- 5 root root 248 Dec 18 16:07 /root
# /root目录不是默认的权限755

虚拟用户启动服务#

为什么启动服务需要用虚拟用户,不能使用root启动?

  • root创建一个 /code 目录,属主属组都是root
  • 下面的 1.txt/code/uploads 都是root用户创建的

先不修改目录和文件的属主及权限

同时web的启动用户是root,那我们访问这个web的时候,是以root权限进行访问的

root的权限太大了

此时,用户在 /code/uploads 目录上传进来一个照片,带有病毒 rm -rf /*

  • 又不小心执行了,那么整个系统就都崩了!

    因为我们的启动用户是root

📌 所以我们通常用虚拟普通用户来启动服务!

  1. 先修改 /code/uploads 目录的属主和属组为oldboy
  2. 默认目录权限为755
  3. 这样的话,oldboy就可以在里面创建文件了
  4. 更改启动用户为oldboy
  5. oldboy本身权限就很小
  6. oldboy用户在 /code/uploads 执行 rm -rf /* 命令
  7. 只能删除 /code/uploads 里面的文件(是uploads目录的属主,拥有rwx权限7)
  8. 有备份,可以进行数据恢复!
  9. 不能删除 /code/1.txt 文件(/code目录属主是root,并且陌生人只有rx权限,没有w,不能删除)
  10. 更不会对 / 根下的其他目录文件造成威胁!

05.隐藏权限#

lsattr#

查看隐藏权限

Terminal window
[root@oldboyedu ~]# touch 1.txt
[root@oldboyedu ~]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 13 11:32 1.txt
[root@oldboyedu ~]# lsattr 1.txt
-------------------- 1.txt
# 空的说明没有隐藏权限!

chattr#

设置隐藏权限

  • a — 只能 echo>> 追加内容、cat查看文件内容,其他啥都不能干
  • i只能cat查看文件内容,相当于锁住文件,啥都不能干
Terminal window
[root@oldboyedu ~]# chattr +a 1.txt
[root@oldboyedu ~]# lsattr 1.txt
-----a-------------- 1.txt

测试使用:

  • 除了 echo>> 追加内容、cat查看文件内容,其他啥都不能干
Terminal window
# 禁止的操作:
echo "overwrite" > test.log # ❌ 失败:Operation not permitted
rm test.log # ❌ 失败
vim test.log # ❌ 无法保存(因为 vim 试图覆盖)
  • ⚠️ 即使你是root用户,你也不能随意rm删除、vim编辑
  • 想要有别的、其他的操作,必须先去掉隐藏权限
Terminal window
[root@oldboyedu ~]# chattr -a 1.txt

i 锁住#

  • 只能cat查看文件内容,相当于锁住文件,啥都不能干
  • ⚠️ root用户也不行
  • 想要操作得先 -i 解锁


06.特殊权限#

📌 权限位: 12位

SUID#

  1. 授权命令为 s 权限、u+s
  2. 一般用于命令文件
  3. 则所有的用户执行命令时候拥有命令属主的权限
  4. 属主有什么权限,你就有什么权限
Terminal window
[root@oldboyedu ~]# ll /usr/bin/rm
-rwxr-xr-x 1 root root 67840 Apr 21 2022 /usr/bin/rm
[root@oldboyedu ~]# chmod u+s /usr/bin/rm
[root@oldboyedu ~]# ll /usr/bin/rm
-rwsr-xr-x 1 root root 67840 Apr 21 2022 /usr/bin/rm
[root@oldboyedu ~]# stat /usr/bin/rm
File: '/usr/bin/rm'
Size: 67840 Blocks: 136 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67357941 Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-11-12 14:38:56.811460805 +0800
Modify: 2022-04-21 15:20:32.000000000 +0800
Change: 2025-11-13 11:41:02.479001213 +0800
Birth: -
# 别的普通用户再执行rm的时候,就相当于这个文件的属主root在执行!
# 解除文件属主的s权限位:
[root@oldboyedu ~]# chmod u-s /usr/bin/rm

SGID#

  1. 授权为 g+s
  2. 修改属组,意义不大,和陌生人的权限一样,一般不动!

粘滞位#

  1. 只能删除自己创建的文件(也就是属主为自己的文件)
  2. 授权为: chmod 1777
  3. chmod o+t 只是前面变为1,后面两位没有修改
  4. 因为目录默认权限为0755,o+t 只是前面多个1罢了!变为1755
  5. 1755说明陌生人只有 r-x 没有 w 权限,这样的话,陌生人都不能创建和删除文件
  6. 所以我们创建粘滞位为 chmod 1777
  7. 常见的应用: /tmp 目录(回收站)

特殊权限数值符号作用对象功能描述
SUID4u+s可执行文件用户以文件属主身份执行
SGID2g+s可执行文件/目录文件以属组身份执行;目录下新建文件继承目录属组
Sticky1o+t目录只有文件所有者/root能删除文件
字符含义
sSUID 已设置 且 所有者有执行权限(x)→ 生效
SSUID 已设置 但 所有者没有执行权限(x)→ 未生效

💡 原因:SUID 只有在文件所有者具有执行权限时才真正生效。如果缺少 x,即使设置了 SUID,也不会起作用

特殊权限都是这个样子的!!!

⚠️ 规律:

  • 若所有者有 x,则显示为小写 s
  • 若所有者无 x,则显示为大写 S
Terminal window
# 特殊权限:
SUID = 4000 # u+s
SGID = 2000 # g+s
Sticky = 1000 # o+t
# 组合示例:
4755 = rwsr-xr-x # SUID+755
2755 = rwxr-sr-x # SGID+755
1755 = rwxr-xr-t # Sticky+755

🌰 需求:在系统中创建 /data 目录,这个目录所有的用户都可以在里面创建文件和删除自己的文件,但不能删除其他用户的

Terminal window
# 依旧是两个窗口,root和oldboy用户
# ===== 切root =====
[root@oldboy /]# rm -rf /data
[root@oldboy /]# mkdir /data
[root@oldboy /]# ll -d /data
drwxr-xr-x 2 root root 6 Dec 19 11:58 /data
[root@oldboy /]# echo aaa > /data/1.txt
[root@oldboy /]# ll /data/1.txt
-rw-r--r-- 1 root root 4 Dec 19 12:05 /data/1.txt
# ===== 切oldboy =====
[oldboy@oldboy ~]$ cd /data
[oldboy@oldboy data]$ ll
total 4
-rw-r--r-- 1 root root 4 Dec 19 12:05 1.txt
# 是因为目录的后三位有r和x权限,oldboy才能进入到这个目录,并查看目录下的内容
[oldboy@oldboy data]$ cat 1.txt
aaa
# 是因为这个文件后三位有r权限所以能够查看文件里面的内容!
[oldboy@oldboy data]$ echo bbb >> 1.txt
-bash: 1.txt: Permission denied
# 因为文件后三位只有r权限并没w权限,自然没有办法进行文件内容的修改
[oldboy@oldboy data]$ ./1.txt
-bash: ./1.txt: Permission denied
# 文件后三位没有x权限,没法执行!
[oldboy@oldboy data]$ touch 2.txt
touch: cannot touch '2.txt': Permission denied
[oldboy@oldboy data]$ rm -rf 1.txt
rm: cannot remove '1.txt': Permission denied
# 这里得看/data目录权限,目录后三位仅有r-x权限,没有w,不能进行文件的创建、删除!
# ===== 切root给/data目录后三位增加w权限 =====
[root@oldboy /]# chmod o+w /data/
[root@oldboy /]# ll -d /data/
drwxr-xrwx 2 root root 19 Dec 19 12:05 /data/
# ===== 切oldboy =====
[oldboy@oldboy data]$ touch 2.txt
[oldboy@oldboy data]$ ll
total 4
-rw-r--r-- 1 root root 4 Dec 19 12:05 1.txt
-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:23 2.txt
# 因为目录有了rwx权限,自然是可以对目录下的文件随意创建、rm删除
# 可以删除自己的文件,也可以删除root的文件!!!
# 是否可以删除文件和文件本身的权限没有关系,取决于目录的权限!
# 2.txt的属主属组为oldboy,因为这个文件是oldboy用户创建的
# 而1.txt的属主和属组为root
[oldboy@oldboy data]$ rm -rf 2.txt
[oldboy@oldboy data]$ rm -rf 1.txt
[oldboy@oldboy data]$ ll
total 0
# 两个都能删掉了!

那么如何规划不能删除别人的文件,而只能删除属主为自己的文件呢?

于是我们就引出了粘滞位

Terminal window
# ===== 切root =====
[root@oldboy /]# chmod 1777 /data
[root@oldboy /]# stat /data
File: '/data'
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 868706 Links: 2
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-12-19 12:47:19.182280711 +0800
Modify: 2025-12-19 12:23:55.283895328 +0800
Change: 2025-12-19 12:55:20.482526180 +0800
[root@oldboy /]# touch /data/1.txt
[root@oldboy /]# ll /data/1.txt
-rw-r--r-- 1 root root 0 Dec 19 12:57 /data/1.txt
# ===== 切oldboy验证 =====
[oldboy@oldboy data]$ touch 2.txt
[oldboy@oldboy data]$ ll
total 0
-rw-r--r-- 1 root root 0 Dec 19 12:57 1.txt
-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:58 2.txt
[oldboy@oldboy data]$ rm -rf 2.txt
# 自己的文件,删除成功!
[oldboy@oldboy data]$ rm -rf 1.txt
rm: cannot remove '1.txt': Operation not permitted
# 别人的文件,删不掉!✅ 粘滞位生效

那如果我们改变root属组为oldboy,同时用oldboy用户删除能成功吗?

Terminal window
# ===== 切root =====
[root@oldboy /]# chown oldboy:oldboy /data/1.txt
[root@oldboy /]# ll /data/1.txt
-rw-r--r-- 1 oldboy oldboy 0 Dec 19 12:57 /data/1.txt
# ===== 切oldboy验证 =====
[oldboy@oldboy data]$ rm -rf 1.txt
[oldboy@oldboy data]$ ll
total 0
# 能删除!因为文件属主变成了oldboy,oldboy可以删除自己的文件
# 粘滞位只管"属主是不是自己",不看属组!

07.ACL权限管理#

Terminal window
# ACL:可以为单个用户或单个组设置特定权限

基本命令#

Terminal window
# (1)getfacl - 查看ACL权限
'get f acl' # 查看ACL权限
getfacl 目录名or文件名
# (2)setfacl - 设置ACL权限
setfacl -m u:用户名:权限 file
setfacl -m g:组名:权限 file
# -m 设置用户或者组的ACL
# 为用户设置无权限(明确拒绝)
setfacl -m u:用户名:- file
'后面跟的是- 无权限!'
# 删除特定用户的ACL
setfacl -x u:用户名 file
'后面无需再跟: 一个:就够用了!'
# 清除所有ACL,恢复基本权限
setfacl -b file
# (3)识别带有ACL的文件
# 使用ls -l时,权限位后有+号表示该文件有ACL:
-rw-rw-r--+ # 后面有+号!
# (4)复制文件的acl权限
getfacl 1.txt | setfacl --set-file=- 2.txt
# 等于号后面有个 - ,它是标准输入
# --set-file 长选项赋值给 2.txt
Terminal window
root@rocky10:/test# touch 1.txt 2.txt
root@rocky10:/test# ll *.txt
-rw-r--r--. 1 root root 0 Mar 6 08:51 1.txt
-rw-r--r--. 1 root root 0 Mar 6 08:51 2.txt
root@rocky10:/test# setfacl -m u:test:rwx 1.txt
root@rocky10:/test# ll *.txt
-rw-rwxr--+ 1 root root 0 Mar 6 08:51 1.txt
-rw-r--r--. 1 root root 0 Mar 6 08:51 2.txt
root@rocky10:/test# getfacl 1.txt | setfacl --set-file=- 2.txt
# 把1.txt的权限赋值给2.txt
root@rocky10:/test# getfacl 2.txt
# file: 2.txt
# owner: root
# group: root
user::rw-
user:test:rwx
# 这样2.txt也有了test用户的权限!
group::r--
mask::rwx
other::r--

ACL生效顺序#

当系统检查权限时,按以下顺序匹配(一旦匹配成功即停止):

  1. 所有者(user::)
  2. 自定义用户(user:username:)— ACL
  3. 所属组(group::)或自定义组(group:groupname:)— ACL
  4. 其他人(other::)

用 getfacl,是可以直接查看出顺序的!

实验#

Terminal window
[root@Rocky10 home]# mkdir test
[root@Rocky10 home]# getfacl test
# -------------------
# file: test
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
# 上面都是默认的权限,也就是ll -d显示出来的权限!
# -------------------
[root@Rocky10 home]# ll -d test/
drwxr-xr-x. 2 root root 6 Mar 6 09:14 test/
[root@Rocky10 home]# useradd www
[root@Rocky10 home]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
# 使用www用户测试!!
[root@Rocky10 home]# setfacl -m u:www:r-x ./test/
[root@Rocky10 home]# ll -d ./test/
drwxr-xr-x+ 2 root root 6 Mar 6 09:14 ./test/
# 后面有+号!
'说明有ACL权限控制'
[root@Rocky10 home]# getfacl ./test/
# file: test/
# owner: root
# group: root
user::rwx
user:www:r-x # 在这里!
group::r-x
mask::r-x # 多了一个mask!!
other::r-x
[root@Rocky10 home]# useradd hhh
[root@Rocky10 home]# id hhh
uid=1001(hhh) gid=1002(hhh) groups=1002(hhh)
[root@Rocky10 home]# chown hhh:hhh ./test/
[root@Rocky10 home]# getfacl ./test/
# file: test/
# owner: hhh
# group: hhh
user::rwx
user:www:r-x
'即使修改属主属组,它也不会消失!'
group::r-x
mask::r-x
other::r-x
[root@Rocky10 home]# chown root:root ./test/
# 修改回来!
[root@Rocky10 home]# setfacl -m g:hhh:--x ./test/
# 增加个别组的权限
[root@Rocky10 home]# getfacl ./test/
# file: test/
# owner: root
# group: root
user::rwx
user:www:r-x
group::r-x
group:hhh:--x # 在这!
mask::r-x
other::r-x
[root@Rocky10 home]# setfacl -x g:hhh ./test
# 删除组hhh的权限!
[root@Rocky10 home]# getfacl ./test/
# file: test/
# owner: root
# group: root
user::rwx
user:www:r-x
group::r-x # 没有组hhh的权限了!
mask::r-x
other::r-x
[root@Rocky10 home]# setfacl -b ./test/
# 清空默认的ACL控制列表
'命令是setfacl了,并不是getfacl,它是用来查看的!'
# getfacl 测试 -b 选项(注意:getfacl没有-b选项!)
[root@Rocky10 home]# getfacl -b ./test/
getfacl: invalid option -- 'b'
Usage: getfacl [-aceEsRLPtpndvh] file ...
Try `getfacl --help' for more information.
[root@Rocky10 home]# getfacl ./test/
# file: test/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

mask的值#

Terminal window
# mask的值并不限制属主(owner)和 others 的权限,
# 它只限制所有命名用户(named users)、所属组(owning group)
# 以及命名组(named groups)的有效权限(effective permissions)。
# 也就是说:
# user::(文件属主) → 不受 mask 影响
# other::(其他人) → 不受 mask 影响
# group::(文件所属组) → 受 mask 限制
# group:hhh:(命名组) → 受 mask 限制
# user:xxx:(命名用户) → 也受 mask 限制
Terminal window
[root@Rocky10 home]# getfacl 1.txt
# file: 1.txt
# owner: root
# group: root
user::rw-
group::r--
group:hhh:r--
mask::r-- '现在是r--'
other::r--
[root@Rocky10 home]# setfacl -m m::- 1.txt
# -m选项!!!
# m:留空:-
# 这里我设置的是-没有任何权限,实际上默认设置即可
[root@Rocky10 home]# getfacl 1.txt
# 再次查看!
# file: 1.txt
# owner: root
# group: root
user::rw- '没有变'
group::r-- #effective:--- '实际有效'
group:hhh:r-- #effective:--- '实际有效'
mask::--- '改为---'
other::r-- '没有变'

📋 练习任务#

准备工作#

Terminal window
# 以root身份执行以下准备命令
[root@Rocky10 ~]# groupadd dev
[root@Rocky10 ~]# groupadd test
groupadd: group 'test' already exists
[root@Rocky10 ~]# useradd -m -G dev alice # 开发部员工
[root@Rocky10 ~]# useradd -m -G dev bob # 开发部员工
[root@Rocky10 ~]# useradd -m -G test carol # 测试部员工
[root@Rocky10 ~]# useradd -m -G test dave # 测试部员工
[root@Rocky10 ~]# mkdir -p /company/{dev_share,test_share,public,scripts}
[root@Rocky10 ~]# tree /company/
/company/
├── dev_share
├── public
├── scripts
└── test_share
5 directories, 0 files

任务一:基础权限设置(chmod)#

📌 目标:配置开发部共享目录,使部门成员可以协作,但禁止其他部门访问

要求

(1) 设置 /company/dev_share 的权限为:rwxrwx---

Terminal window
[root@Rocky10 ~]# chmod 770 /company/dev_share/
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx---. 2 root root 6 Mar 5 13:12 /company/dev_share/

(2) 确保只有 dev 组的成员能进入该目录

Terminal window
[root@Rocky10 ~]# chown -R :dev /company/dev_share/
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx---. 2 root dev 6 Mar 5 13:12 /company/dev_share/

(3) 创建文件 project.txt,设置权限为 rw-rw----(部门成员可读写,其他人无权限)

Terminal window
[root@Rocky10 ~]# touch /company/dev_share/project.txt
[root@Rocky10 ~]# ll -d /company/dev_share/project.txt
-rw-r--r--. 1 root root 0 Mar 5 13:57 /company/dev_share/project.txt
[root@Rocky10 ~]# chmod 660 /company/dev_share/project.txt
[root@Rocky10 ~]# ll -d /company/dev_share/project.txt
-rw-rw----. 1 root root 0 Mar 5 13:57 /company/dev_share/project.txt
[root@Rocky10 ~]# chown :dev /company/dev_share/project.txt
[root@Rocky10 ~]# ll -d /company/dev_share/project.txt
-rw-rw----. 1 root dev 0 Mar 5 13:57 /company/dev_share/project.txt

验证命令

Terminal window
[root@Rocky10 ~]# su - alice -c "touch /company/dev_share/alice_file.txt" # 应该成功
[root@Rocky10 ~]# su - carol -c "ls /company/dev_share" # 应该失败(权限拒绝)
ls: cannot open directory '/company/dev_share': Permission denied

任务二:所有权管理(chown + chgrp)#

📌 目标:正确设置文件所有者和所属组,确保部门隔离

要求

(1)/company/dev_share 的所属组改为 dev

Terminal window
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx---. 2 root dev 47 Mar 5 14:00 /company/dev_share/

(2) 创建用户 manager 作为部门经理,将 project.txt 的所有者改为 manager

Terminal window
[root@Rocky10 ~]# useradd manager
[root@Rocky10 ~]# ll /company/dev_share/project.txt
-rw-rw----. 1 root dev 0 Mar 5 13:57 /company/dev_share/project.txt
[root@Rocky10 ~]# chown manager:manager /company/dev_share/project.txt
[root@Rocky10 ~]# ll /company/dev_share/project.txt
-rw-rw----. 1 manager manager 0 Mar 5 13:57 /company/dev_share/project.txt

(3) 确保 manager 可以读写,但 manager 不属于 dev 组时不能通过组权限访问

Terminal window
su - manager -c "echo manager > /company/dev_share/project.txt"
su - manager -c "cat /company/dev_share/project.txt"
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx---. 2 root dev 47 Mar 5 14:00 /company/dev_share/
# 目录属组仍是dev
'这里注意一点,就是other是没有x权限,也就是别人压根进不去这个目录中'
# 给目录other位加上x权限:
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/
[root@Rocky10 ~]# su - manager -c "echo manager > /company/dev_share/project.txt"
[root@Rocky10 ~]# su - manager -c "cat /company/dev_share/project.txt"
manager
# 这个时候既能够写入,又能够查看文件里面的内容了!

🌰 进阶:使用 chown 一次性同时修改所有者和所属组(提示:chown user:group file

Terminal window
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/
[root@Rocky10 ~]# chown -R manager:manager /company/dev_share/
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx--x. 2 manager manager 47 Mar 5 14:00 /company/dev_share/

任务三:SGID 特殊权限(g+s)#

📌 目标:确保开发部成员创建的文件自动继承 dev 组身份,方便协作

要求

(1)/company/dev_share 设置 SGID 权限

Terminal window
[root@Rocky10 ~]# chown -R root:dev /company/dev_share/
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrwx--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/
# 先把它改回来!
[root@Rocky10 ~]# chmod g+s /company/dev_share/
[root@Rocky10 ~]# ll -d /company/dev_share/
drwxrws--x. 2 root dev 47 Mar 5 14:00 /company/dev_share/

(2) 切换到 alice 身份,在该目录下创建文件 shared_code.sh (3) 验证该文件的所属组是否为 dev(而非 alice 的主组)

Terminal window
[root@Rocky10 ~]# id alice
uid=1001(alice) gid=1002(alice) groups=1002(alice),1001(dev)
[root@Rocky10 ~]# su - alice -c "touch /company/dev_share/shared_code.sh"
[root@Rocky10 ~]# ll /company/dev_share/shared_code.sh
-rw-r--r--. 1 alice dev 0 Mar 5 14:36 /company/dev_share/shared_code.sh
# 属主为alice,但是属组为dev ✅

📌 关键问题:如果不设置 SGID,alice 创建的文件默认属于哪个组?如何查看?

Terminal window
'属于alice的主组,也就是它自己!'
[root@Rocky10 ~]# ll -d /home/alice/
drwx------. 4 alice alice 92 Mar 5 14:00 /home/alice/
[root@Rocky10 ~]# su - alice -c "touch /home/alice/test.txt"
[root@Rocky10 ~]# ll /home/alice/test.txt
-rw-r--r--. 1 alice alice 0 Mar 5 14:42 /home/alice/test.txt
# 属组是 alice(主组),不是 dev

任务四:Sticky Bit 特殊权限(o+t)#

📌 目标:创建公共交换区,允许所有人上传文件,但只能删除自己的文件

📌 场景/company/public 作为部门间文件交换区

要求

(1) 设置目录权限为 777,并添加 Sticky Bit

Terminal window
[root@Rocky10 ~]# ll -d /company/public/
drwxr-xr-x. 2 root root 6 Mar 5 13:12 /company/public/
[root@Rocky10 ~]# chmod 1777 /company/public/
[root@Rocky10 ~]# ll -d /company/public/
drwxrwxrwt. 2 root root 6 Mar 5 13:12 /company/public/
# 有小t ✅

(2) alice 创建文件 to_test.txt

Terminal window
[root@Rocky10 ~]# su - alice -c "touch /company/public/to_test.txt"
[root@Rocky10 ~]# ll /company/public/to_test.txt
-rw-r--r--. 1 alice alice 0 Mar 5 14:57 /company/public/to_test.txt

(3) carol(测试部)尝试删除该文件 — 应该失败

Terminal window
[root@Rocky10 ~]# id carol
uid=1003(carol) gid=1004(carol) groups=1004(carol),1000(test)
[root@Rocky10 ~]# su - carol -c "rm -rf /company/public/to_test.txt"
rm: cannot remove '/company/public/to_test.txt': Operation not permitted
# ❌ 删不掉别人的文件!

(4) carol 可以创建自己的文件 from_test.txt (5) 只有 root 和文件所有者能删除文件

Terminal window
[root@Rocky10 ~]# su - carol -c "touch /company/public/from_test.txt"
[root@Rocky10 ~]# ll /company/public/from_test.txt
-rw-r--r--. 1 carol carol 0 Mar 5 15:01 /company/public/from_test.txt
# 测试删除部分!
[root@Rocky10 ~]# su - alice -c "rm -rf /company/public/from_test.txt"
rm: cannot remove '/company/public/from_test.txt': Operation not permitted
# alice 尝试删除carol的文件,删除不掉!
[root@Rocky10 ~]# su - carol -c "rm -rf /company/public/from_test.txt"
[root@Rocky10 ~]# ll /company/public/from_test.txt
ls: cannot access '/company/public/from_test.txt': No such file or directory
# 自己可以删除自己的文件!✅
[root@Rocky10 ~]# rm -rf /company/public/*
[root@Rocky10 ~]# ll /company/public/
total 0
# root随便删除!✅

任务五:SUID 特殊权限(u+s)⭐进阶#

📌 目标:创建一个只允许特定组使用的管理脚本

📌 场景/company/scripts/backup.sh 需要以 root 权限执行备份,但只允许 dev 组成员使用

要求

创建脚本:

/company/scripts/backup.sh
cat > /company/scripts/backup.sh <<EOF
#!/bin/bash
echo "Backup started by: \$(whoami)"
tar czf /tmp/backup_\$(date +%Y%m%d).tar.gz /company/dev_share 2>/dev/null
echo "Backup completed: /tmp/backup_\$(date +%Y%m%d).tar.gz"
EOF
'直接复制粘贴即可!!!'

(1) 设置脚本权限:rwxr-x---(仅所有者和组可执行)

Terminal window
[root@Rocky10 ~]# chmod 750 /company/scripts/backup.sh
[root@Rocky10 ~]# ll /company/scripts/backup.sh
-rwxr-x---. 1 root root 192 Mar 5 15:09 /company/scripts/backup.sh

(2) 设置 SUID 权限,使脚本始终以所有者(root)身份运行

Terminal window
[root@Rocky10 ~]# chmod u+s /company/scripts/backup.sh
[root@Rocky10 ~]# ll /company/scripts/backup.sh
-rwsr-x---. 1 root root 192 Mar 5 15:09 /company/scripts/backup.sh
# 前面有一个小s

(3) 所属组设为 dev,确保只有开发部成员能执行

Terminal window
[root@Rocky10 ~]# chown :dev /company/scripts/backup.sh
[root@Rocky10 ~]# ll /company/scripts/backup.sh
-rwxr-x---. 1 root dev 192 Mar 5 15:09 /company/scripts/backup.sh
# 测试部分
[root@Rocky10 ~]# ll -d /company/scripts/
drwxr-xr-x. 2 root root 23 Mar 5 15:09 /company/scripts/
[root@Rocky10 ~]# su - carol -c "sh /company/scripts/backup.sh"
sh: /company/scripts/backup.sh: Permission denied
# carol测试人员不允许访问!!❌
[root@Rocky10 ~]# su - alice -c "sh /company/scripts/backup.sh"
Backup started by: root
Backup completed: /tmp/backup_20260305.tar.gz
# alice开发人员成功访问✅

📌 安全思考:为什么 SUID 脚本有安全风险?实际生产环境中应该用什么替代方案?

文件所有者一般都是root(root来创建),要是脚本都以root身份运行风险太大了,root权限太高,万一有人篡改脚本里面的内容,就全完了!!!

替代方案:

  1. 使用 sudo 精细授权 — 通过 sudoers 文件授权特定用户执行特定命令
  2. 调整文件/目录权限或组策略

任务六:综合权限计算#

📌 根据以下权限字符串,写出对应的数字模式和符号模式

权限显示数字模式符号模式说明
-rwsr-xr-x4755set uid可执行文件带SUID
drwxrwsr-x2775set gid目录带SGID
drwxrwxrwt1777粘滞位临时目录带Sticky
-rwSr--r--4644set uidSUID设置但无执行权限(大写S)

权限数字速查表#

Terminal window
r = 4, w = 2, x = 1
# 特殊权限:
SUID = 4000 # u+s
SGID = 2000 # g+s
Sticky = 1000 # o+t
# 组合示例:
4755 = rwsr-xr-x # SUID+755
2755 = rwxr-sr-x # SGID+755
1755 = rwxr-xr-t # Sticky+755

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

权限管理
https://www.kpyun.fun/posts/basics/core/core15/
作者
久棹
发布于
2025-08-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录