3、文件系统权限:Linux文件权限(rwx)、chmod/chown/chgrp命令详解、SUID/SGID/Sticky Bit
文件权限这东西,说白了就是Linux系统的门禁系统。我见过太多新手在这上面栽跟头——要么权限开太大,系统被搞成筛子;要么权限锁太死,连自己都进不去。今天咱们就把这块彻底掰扯清楚。
3.1 认识rwx:权限的三元组
每个文件或目录,都挂着三组权限:所有者(u)、所属组(g)、其他人(o)。每组三个字符,r、w、x,缺一不可。
| 权限字符 | 对文件的意义 | 对目录的意义 |
|---|---|---|
| r(读取) | 可以查看文件内容 | 可以列出目录下的文件名 |
| w(写入) | 可以修改文件内容 | 可以在目录内创建/删除文件 |
| x(执行) | 可以运行文件(脚本/程序) | 可以进入目录(cd) |
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
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/
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的标志。
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 知识体系总览
下面这张图,把文件权限的核心逻辑串起来了。建议你存下来,以后遇到权限问题,先看这张图定位。
3.6 实战:权限审计三板斧
光说不练假把式。我每次接手新系统,都会做这三步权限审计:
- 扫描SUID/SGID文件:
find / -perm -4000 -o -perm -2000 2>/dev/null。看看有没有不该提权的程序。 - 检查关键目录权限:
/etc、/var/log、/tmp。确保没有全局可写但不应全局可写的目录。 - 验证用户主目录:
ls -la /home/。确保用户不能看别人的家目录。
文件权限这块,说难不难,说简单也不简单。关键是养成习惯——每次创建文件或目录,都问自己一句:这个权限,真的需要这么大吗?