3、文件系统权限:Linux文件权限(rwx)、chmod/chown/chgrp命令详解、SUID/SGID/Sticky Bit

文件权限这东西,说白了就是Linux系统的门禁系统。我见过太多新手在这上面栽跟头——要么权限开太大,系统被搞成筛子;要么权限锁太死,连自己都进不去。今天咱们就把这块彻底掰扯清楚。

3.1 认识rwx:权限的三元组

每个文件或目录,都挂着三组权限:所有者(u)、所属组(g)、其他人(o)。每组三个字符,r、w、x,缺一不可。

权限字符 对文件的意义 对目录的意义
r(读取) 可以查看文件内容 可以列出目录下的文件名
w(写入) 可以修改文件内容 可以在目录内创建/删除文件
x(执行) 可以运行文件(脚本/程序) 可以进入目录(cd)
⚠️ 目录权限的陷阱: 很多人以为目录的r权限就够了。错!没有x权限,你连cd都进不去,更别提读文件了。我曾经排查过一个“文件明明存在却打不开”的故障,最后发现就是目录缺了x位。

3.2 chmod:改权限的瑞士军刀

chmod有两种玩法:符号模式和数字模式。我个人习惯用数字模式,简洁、不易出错。

3.2.1 数字模式

r=4,w=2,x=1。把三组数字加起来就行。

# 755:所有者全权限,组和其他人读+执行
chmod 755 script.sh

# 644:所有者读写,组和其他人只读
chmod 644 config.conf

# 700:只有所有者能碰
chmod 700 private_key.pem
💡 我的习惯: 脚本文件给755,配置文件给644,密钥文件给600或700。这个原则用了十年,没出过权限事故。

3.2.2 符号模式

适合快速微调。u、g、o分别代表所有者、组、其他人,+和-控制添加或移除。

# 给所有者加执行权限
chmod u+x script.sh

# 移除其他人的写权限
chmod o-w data.txt

# 给所有角色加读权限
chmod a+r public.log

3.3 chown和chgrp:谁的文件谁做主

chown改所有者,chgrp改所属组。这两个命令经常一起用。

# 把文件所有者改成www-data
chown www-data index.html

# 同时改所有者和组
chown www-data:www-data index.html

# 递归修改整个目录
chown -R www-data:www-data /var/www/
⚠️ 递归操作要小心: 我曾经在线上环境手滑,把/etc目录的所有者全改成了普通用户。结果sshd起不来,只能重启进单用户模式修复。所以,chown -R之前,一定要确认路径写对了。

3.4 SUID、SGID、Sticky Bit:权限的进阶玩法

这三个特殊权限,是Linux权限体系里最容易被忽略、也最容易出安全问题的地方。

特殊权限 表示方式 作用
SUID rwsr-xr-x(4开头) 执行时临时获得文件所有者的权限
SGID rwxrwsr-x(2开头) 执行时临时获得文件所属组的权限;对目录生效时,新建文件继承目录的组
Sticky Bit rwxrwxrwt(1开头) 只有文件所有者或root才能删除/重命名文件

3.4.1 SUID:危险的“变身”能力

最经典的例子是/usr/bin/passwd。普通用户要改密码,但密码文件/etc/shadow只有root能写。怎么办?SUID上场了——passwd程序带着root权限跑,改完密码就退出。

# 查看passwd的权限
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root 59976 ...

看到那个s了吗?它代替了所有者位的x。这就是SUID的标志。

🔴 安全红线: 不要随便给脚本或程序设置SUID。我曾经审计过一个系统,发现有人给bash设了SUID——这意味着任何用户都能以root身份执行命令。这种后门,查到一个封一个。

3.4.2 SGID:团队协作的利器

SGID对目录特别有用。想象一下,你们团队共享一个项目目录,希望所有人新建的文件都自动属于devops组,而不是各自的主组。

# 设置SGID
chmod g+s /shared/project

# 验证
ls -ld /shared/project
# 输出:drwxrwsr-x 2 root devops 4096 ...

现在,不管谁在/shared/project里创建文件,所属组都会自动变成devops。省去了反复chgrp的麻烦。

3.4.3 Sticky Bit:公共目录的守护神

/tmp目录就是Sticky Bit的典型应用。任何人都能往/tmp里写文件,但只有文件所有者或root才能删。

# 查看/tmp权限
ls -ld /tmp
# 输出:drwxrwxrwt 20 root root 4096 ...

那个t,就是Sticky Bit。没有它,你写的临时文件可能被隔壁用户随手删掉。

3.5 知识体系总览

下面这张图,把文件权限的核心逻辑串起来了。建议你存下来,以后遇到权限问题,先看这张图定位。

Linux 文件权限知识体系 基础权限 rwx 所有者 (u) 所属组 (g) 其他人 (o) r=4, w=2, x=1 权限管理命令 chmod - 改权限 chown - 改所有者 chgrp - 改所属组 数字/符号两种模式 特殊权限 SUID (4) - 临时提权 SGID (2) - 继承组 Sticky Bit (1) - 防删除 chmod 4xxx / 2xxx / 1xxx ⚠️ 安全原则:最小权限 + 定期审计 SUID/SGID 要严格控制,Sticky Bit 用于共享目录 实践流程:ls -l 查看 → 分析 → chmod/chown 调整 → 验证 常用命令速查 chmod 755 file | chown user:group file | chmod u+s file find / -perm -4000 2>/dev/null # 查找所有SUID文件

3.6 实战:权限审计三板斧

光说不练假把式。我每次接手新系统,都会做这三步权限审计:

  1. 扫描SUID/SGID文件:find / -perm -4000 -o -perm -2000 2>/dev/null。看看有没有不该提权的程序。
  2. 检查关键目录权限:/etc、/var/log、/tmp。确保没有全局可写但不应全局可写的目录。
  3. 验证用户主目录:ls -la /home/。确保用户不能看别人的家目录。
💡 我的小工具: 我写过一个脚本,每天凌晨跑一遍权限审计,发现异常就发告警。比如某个系统文件突然变成了777,或者多了个SUID的shell脚本。这种自动化检查,能帮你省下不少半夜爬起来救火的时间。

文件权限这块,说难不难,说简单也不简单。关键是养成习惯——每次创建文件或目录,都问自己一句:这个权限,真的需要这么大吗?