拒绝瞎 777!一文搞懂 Linux 文件权限底层到高阶玩法
在 Linux 操作系统的安全体系中,文件权限管理是核心基石之一。它通过精细化的权限分配机制,实现了对文件访问、修改、执行等操作的严格管控,保障了系统数据的安全性与完整性。本文将从基础权限原理出发,逐步深入到权限配置、特殊权限应用及默认权限管理,结合实操案例,为你全面拆解 Linux 文件权限管理的核心逻辑与实践技巧。
文章目录
- 一、Linux 文件系统权限基础原理
- 1.三类权限主体
- 2.权限字符串解析:10位字符的核心含义
- 3.权限优先级规则
- 4.rwx 权限的核心含义(文件 vs 目录)
- 二、文件权限管理实操:chmod、chown、chgrp 命令
- 1.chmod 命令:修改文件/目录权限
- (1)符号法:直观易懂,适合精细化调整
- (2)数字法:高效便捷,适合批量配置
- 2.chown 与 chgrp 命令:修改属主与属组
- (1)chown 命令:修改属主/同时修改属主和属组
- (2)chgrp 命令:专门修改属组
- 3.文件权限总结
- 三、默认权限管理:umask 命令
- 1.umask 核心规则
- 2.umask 实操案例
- 3.umask 持久化配置
- 四、高级权限管理:特殊权限(SUID、SGID、Sticky)
- 1.SUID:针对可执行文件,临时获取属主权限
- 2.SGID:针对目录,实现组内文件共享
- 3.Sticky:针对公共目录,防止文件被误删
- 4.查找系统中的特殊权限文件
- 五、总结
一、Linux 文件系统权限基础原理
Linux 采用灵活且严谨的权限模型,能够适配绝大多数场景下的权限管控需求。其核心逻辑围绕“权限主体”与“权限类型”展开,通过二者的组合,实现对文件操作的精准限制。
1.三类权限主体
Linux 将文件的访问主体划分为三类,分别对应不同的权限层级,优先级依次递减:
文件属主(User):通常是创建该文件的用户,对文件拥有最高级别的管控权限,权限优先级最高。
文件属组(Group):默认是文件属主所属的主组,组内所有成员共享该组对应的文件权限。
其他用户(Other):除文件属主和属组成员外,系统中所有其他用户,权限优先级最低。
2.权限字符串解析:10位字符的核心含义
通过ls -l命令可查看文件的详细权限信息,以示例-rw-r-----. 1 laoma wheel 2262 Dec 23 08:47 myfile为例,权限部分-rw-r-----.的10位字符可分为四部分,各部分含义如下:
| 字符位置 | 代表含义 | 示例解析(myfile) |
|---|---|---|
| 第1位 | 文件类型标识 | -:普通文件;d:目录;l:软链接;b/c:块/字符设备 |
| 第2-4位 | 文件属主(User)权限 | rw-:属主拥有读、写权限,无执行权限 |
| 第5-7位 | 文件属组(Group)权限 | r--:属组成员仅拥有读权限,无写、执行权限 |
| 第8-10位 | 其他用户(Other)权限 | ---:其他用户无任何权限 |
3.权限优先级规则
若某用户同时属于文件属主和属组成员(如示例中 laoma 用户既是属主,也是 wheel 组成员),系统将优先匹配**文件属主权限**,属组权限不再生效。这一规则确保了文件创建者的核心管控权,避免权限冲突。
4.rwx 权限的核心含义(文件 vs 目录)
需特别注意的是,r(读)、w(写)、x(执行)三种基础权限,在普通文件和目录上的含义截然不同,这是权限管理的易错点,也是核心考点。
二、文件权限管理实操:chmod、chown、chgrp 命令
掌握权限管理的核心命令,是实现精细化权限配置的关键。Linux 提供chmod(修改权限)、chown(修改属主)、chgrp(修改属组)三大命令,满足各类权限调整需求。
1.chmod 命令:修改文件/目录权限
chmod是权限管理最常用的命令,用于调整文件或目录的读、写、执行权限,支持两种语法格式:符号法和数字法,可根据场景灵活选择。
(1)符号法:直观易懂,适合精细化调整
语法格式:chmod WhoHowWhat /path/to/file
参数说明:
Who:指定权限主体,
u(属主)、g(属组)、o(其他)、a(所有用户)。How:指定权限操作,
+(添加权限)、-(移除权限)、=(精确设置权限)。What:指定权限类型,
r(读)、w(写)、x(执行)。
实操案例:以/lab/passwd文件为例,演示符号法权限调整:
# 1. 查看文件初始权限[root@centos7 lab]# ls -l passwd-rw-r--r--.1root root231211月814:17passwd# 2. 给属主添加执行权限[root@centos7 lab]# chmod u+x ./passwd[root@centos7 lab]# ls -l passwd-rwxr--r--.1root root231211月814:17passwd# 3. 一次性调整多主体权限:属主移除写、执行权限,属组添加写权限,其他用户移除所有权限[root@centos7 lab]# chmod u-wx,g+w,o=- passwd[root@centos7 lab]# ls -l passwd-r--rw----.1root root231211月814:17passwd# 4. 一次性设置所有用户权限为读、写、执行[root@centos7 lab]# chmod a=rwx passwd[root@centos7 lab]# ls -l passwd-rwxrwxrwx.1root root231211月814:17passwd(2)数字法:高效便捷,适合批量配置
语法格式:chmod ### /path/to/file
参数说明:三位数字分别对应属主、属组、其他用户的权限,每位数字取值为0-7,对应二进制权限组合(0代表无权限,7代表读、写、执行全权限),二进制与十进制、权限的对应关系如下:
| 二进制 | 十进制 | 对应权限 | 权限说明 |
|---|---|---|---|
| 000 | 0 | --- | 无任何权限 |
| 001 | 1 | --x | 仅执行权限 |
| 010 | 2 | -w- | 仅写权限 |
| 011 | 3 | -wx | 写+执行权限 |
| 100 | 4 | r-- | 仅读权限 |
| 101 | 5 | r-x | 读+执行权限 |
| 110 | 6 | rw- | 读+写权限 |
| 111 | 7 | rwx | 读+写+执行权限 |
实操案例:以/lab/passwd文件为例,演示数字法权限调整:
# 1. 设置权限为属主读、写,属组写、执行,其他用户读(对应二进制110 011 100,十进制634)[root@centos7 lab]# chmod 634 passwd[root@centos7 lab]# ls -l passwd-rw--wxr--.1root root231211月814:17passwd# 2. 设置权限为属主读、写、执行,属组读、执行,其他用户读、执行(常用的755权限,适合可执行程序)[root@centos7 lab]# chmod 755 passwd[root@centos7 lab]# ls -l passwd-rwxr-xr-x.1root root231211月814:17passwd# 3. 查看文件权限的数字形式和符号形式[root@centos7 lab]# stat -c %A passwd # 查看符号权限-rwxr-xr-x[root@centos7 lab]# stat -c %a passwd # 查看数字权限7552.chown 与 chgrp 命令:修改属主与属组
在实际运维中,经常需要调整文件的属主和属组,以适配团队协作、权限管控需求。chown用于修改文件属主(可同时修改属组),chgrp专门用于修改文件属组。
(1)chown 命令:修改属主/同时修改属主和属组
语法格式:
仅修改属主:
chown 新属主 /path/to/file同时修改属主和属组:
chown 新属主:新属组 /path/to/file递归修改目录及内部所有文件权限:
chown -R 新属主:新属组 /path/to/dir
实操案例:
# 1. 查看文件初始属主和属组[root@centos7 lab]# ls -l passwd-rwxr-xr-x.1root root231211月814:17passwd# 2. 修改文件属主为 laoma[root@centos7 lab]# chown laoma passwd[root@centos7 lab]# ls -l passwd-rwxr-xr-x.1csh root231211月814:17passwd# 3. 同时修改属主为 laowang、属组为 wheel[root@centos7 lab]# chown laowang:wheel passwd[root@centos7 lab]# ls -l passwd-rwxr-xr-x.1laowang wheel231211月814:17passwd# 4. 递归修改目录 dir01 及内部所有文件的属主和属组为 laowang:wheel[root@centos7 lab]# chown -R laowang:wheel dir01/[root@centos7 lab]# ls -R -ld dir01 dir01/*drwxrwx---.2laowang wheel2011月814:22 dir01 -rwxrwx---.1laowang wheel011月814:22 dir01/file01(2)chgrp 命令:专门修改属组
语法格式:chgrp 新属组 /path/to/file(支持-R递归参数,用法与chown一致)。
实操案例:将passwd文件的属组修改为 wheel:
[root@centos7 lab]# chgrp wheel passwd[root@centos7 lab]# ls -l passwd-rwxr-xr-x.1csh wheel231211月814:17passwd3.文件权限总结
三、默认权限管理:umask 命令
在 Linux 中,新建文件或目录时,其默认权限由umask(权限掩码)决定。umask的核心作用是“剔除权限”,即从默认最大权限中,剔除umask对应的权限,得到实际默认权限。
1.umask 核心规则
新建普通文件的最大默认权限为
666(读、写权限,无执行权限,避免安全风险)。新建目录的最大默认权限为
777(读、写、执行全权限)。实际默认权限 = 最大默认权限 - umask 值(数字法计算)。
2.umask 实操案例
# 1. 查看当前 umask 值(默认值为 0022)[csh@centos7 ~]$umask0022# 2. 新建文件和目录,查看默认权限(文件:666-022=644;目录:777-022=755)[csh@centos7 ~]$mkdirlab&&cdlab[csh@centos7 lab]$touchf1&&mkdird1[csh@centos7 lab]$ls-ltotal0drwxr-xr-x.2csh csh6Nov817:05 d1# 755权限-rw-r--r--.1csh csh0Nov817:05 f1# 644权限# 3. 修改 umask 值为 0000(不剔除任何权限),新建文件和目录[csh@centos7 lab]$umask0[csh@centos7 lab]$touchf2&&mkdird2[csh@centos7 lab]$ls-ld*2 drwxrwxrwx.2csh csh6Nov817:07 d2# 777权限-rw-rw-rw-.1csh csh0Nov817:07 f2# 666权限# 4. 修改 umask 值为 0077(剔除属组、其他用户所有权限),新建文件和目录[csh@centos7 lab]$umask077[csh@centos7 lab]$touchf3&&mkdird3[csh@centos7 lab]$ls-ld*3 drwx------.2csh csh6Nov817:10 d3# 700权限-rw-------.1csh csh0Nov817:10 f3# 600权限3.umask 持久化配置
临时修改的 umask 值仅在当前终端生效,若需永久生效,可将配置写入对应配置文件:
针对单个用户:将
umask 077写入用户家目录的~/.bashrc文件。针对所有用户:将
umask 077写入系统全局配置文件/etc/bashrc。
# 单个用户持久化配置[csh@centos7 lab]$echo'umask 077'>>~/.bashrc[csh@centos7 lab]$source~/.bashrc# 使配置立即生效# 所有用户持久化配置(需 root 权限)[root@centos7 ~]# echo 'umask 077' >> /etc/bashrc[root@centos7 ~]# source /etc/bashrc # 使配置立即生效四、高级权限管理:特殊权限(SUID、SGID、Sticky)
除基础的 rwx 权限外,Linux 还提供三种特殊权限:SUID、SGID、Sticky,用于解决特殊场景下的权限管控问题,进一步提升系统安全性和协作效率。
1.SUID:针对可执行文件,临时获取属主权限
核心作用:普通用户执行带有 SUID 权限的可执行文件时,会临时获取该文件属主的权限,执行结束后权限恢复。最典型的应用是passwd命令(普通用户可通过该命令修改自身密码,实际修改的是/etc/shadow文件,该文件默认仅 root 可修改)。
# 1. 查看 /etc/shadow 文件权限(仅 root 可修改)[csh@centos7 ~]$ls-l/etc/shadow ----------.1root root1264Nov816:38 /etc/shadow# 2. 查看 passwd 命令权限(带有 SUID 权限,权限位显示为 s)[csh@centos7 ~]$ls-l$(whichpasswd)-rwsr-xr-x.1root root27856Apr12020/usr/bin/passwd# 3. 给可执行文件添加 SUID 权限(以 vim 为例)[root@centos7 ~]# chmod u+s /usr/bin/vim[root@centos7 ~]# ls -l /usr/bin/vim-rwsr-xr-x.1root root233721610月142020/usr/bin/vim# 4. 删除 SUID 权限[root@centos7 ~]# chmod u-s /usr/bin/vim2.SGID:针对目录,实现组内文件共享
核心作用:针对目录设置 SGID 权限后,该目录内新建的所有文件和子目录,其属组会继承父目录的属组,而非创建者的主组,适用于团队协作场景(如开发组共享目录)。
# 1. 准备用户和组[root@centos7 lab]# groupadd devops # 创建开发组[root@centos7 lab]# useradd -G devops dev1 # 创建用户 dev1,加入 devops 组[root@centos7 lab]# useradd -G devops dev2 # 创建用户 dev2,加入 devops 组# 2. 准备共享目录,修改属组为 devops,添加属组读写执行权限[root@centos7 lab]# mkdir webapp[root@centos7 lab]# chgrp devops webapp[root@centos7 lab]# chmod g=rwx webapp# 3. 无 SGID 权限:用户 dev1 创建的文件,属组为自身主组[root@centos7 lab]# su dev1[dev1@centos7 lab]$touchwebapp/dev-f1[dev1@centos7 lab]$ ll webapp/dev-f1 -rw-rw-r--.1dev1 dev107月2215:12 webapp/dev-f1# 属组为 dev1# 4. 添加 SGID 权限:用户 dev1 创建的文件,属组继承父目录的 devops[root@centos7 lab]# chmod g+s webapp[root@centos7 lab]# su dev1[dev1@centos7 lab]$touchwebapp/dev-f2[dev1@centos7 lab]$ ll webapp/dev-f2 -rw-rw-r--.1dev1 devops07月2215:13 webapp/dev-f2# 属组为 devops# 5. 验证组内共享:用户 dev2 可修改该文件[root@centos7 lab]# su dev2[dev2@centos7 lab]$echohello world>>webapp/dev-f2[dev2@centos7 lab]$catwebapp/dev-f2 hello world3.Sticky:针对公共目录,防止文件被误删
核心作用:针对公共目录(如/tmp)设置 Sticky 权限后,目录内的文件仅能被其属主、目录属主或 root 用户删除,其他用户即使拥有目录写权限,也无法删除他人文件,避免公共目录文件被误删。
# 1. 查看 /tmp 目录权限(带有 Sticky 权限,权限位显示为 t,数字权限为 1777)[root@centos7 lab]# ls -ld /tmpdrwxrwxrwt.20root root409611月816:50 /tmp[root@centos7 lab]# stat -c %a /tmp1777# 2. 验证:普通用户无法删除他人文件[csh@centos7 ~]$rm/tmp/other-user-file# 尝试删除他人文件rm: cannot remove'/tmp/other-user-file':Operation not permitted# 3. 验证:普通用户可删除自己创建的文件[csh@centos7 ~]$touch/tmp/csh-f1[csh@centos7 ~]$rm/tmp/csh-f1# 可正常删除4.查找系统中的特殊权限文件
可通过find命令查找系统中带有特殊权限的文件,便于排查安全隐患:
# 查找系统中所有带有 SUID 权限的文件[root@centos7 ~]# find / -perm -4000 # 4000 对应 SUID 权限的数字标识[root@centos7 ~]# find / -perm -u+s # 符号法查找 SUID 文件# 查找系统中所有带有 SGID 权限的文件[root@centos7 ~]# find / -perm -2000[root@centos7 ~]# find / -perm -g+s# 查找系统中所有带有 Sticky 权限的目录[root@centos7 ~]# find / -perm -1000[root@centos7 ~]# find / -perm -o+t五、总结
Linux 文件权限管理围绕“主体(u/g/o)”和“权限(r/w/x)”展开,核心要点可概括为:
基础权限:rwx 权限在文件和目录上的含义截然不同,需重点区分。
权限配置:
chmod(修改权限)、chown(修改属主/属组)是核心命令,支持符号法和数字法。默认权限:由
umask决定,核心规则是“最大权限 - umask 值”。特殊权限:SUID(临时获取属主权限)、SGID(目录文件属组继承)、Sticky(公共目录防误删),解决特殊场景权限问题。
通过本文的学习与实操,相信你已掌握 Linux 文件权限管理的核心逻辑与实操技巧。在实际运维中,需结合场景合理配置权限,兼顾安全性与便捷性,避免因权限配置不当引发安全风险。
