Linux 12位权限管理体系全攻略(从基础到实战)

Linux 12位权限管理体系全攻略(从基础到实战)

一、概述

Linux权限管理是系统安全的核心基石,通过精细化控制文件/目录的访问权限,实现用户、进程与资源的隔离防护。从基础的rwx三位权限,到扩展的9位标准权限,再到3位特殊权限,共同构成了Linux完整的12位权限体系。

二、核心知识点

2.1 权限管理基础认知

2.1.1 权限体系概述

Linux通过权限控制保护系统资源,核心分为三大类权限:

  • 基础权限(rwx):read(读)、write(写)、execute(执行),是权限控制的核心;
  • 标准权限(9位):基于“所有者→用户组→其他人”的三层关系,将rwx组合为9位权限,覆盖绝大多数日常场景;
  • 特殊权限(3位):setuid(suid)、setgid(sgid)、sticky(粘滞位),用于特殊场景的权限增强;
  • 12位权限:9位标准权限 + 3位特殊权限,构成Linux完整的权限控制体系。

2.1.2 权限与用户的三层关系

Linux中任何文件/目录与用户都存在以下三种关系,权限配置需基于关系生效:

关系类型 含义 通俗理解
所有者(user) 文件/目录的创建者或指定归属用户 “文件是谁的”
用户组(group) 文件/目录归属的用户组 “文件属于哪个家庭”
其他人(other) 既非所有者也不属于归属用户组的用户 “陌生人”

2.2 基础权限(rwx)核心说明

权限字符 含义 对应数字 核心作用
r(read) 读权限 4 文件:可读取内容;目录:可查看内容(需x配合)
w(write) 写权限 2 文件:可修改内容(需r配合);目录:可创建/删除/重命名文件(需x配合)
x(execute) 执行权限 1 文件:可运行(命令/脚本,需r配合);目录:可进入,可访问文件属性
- 无权限 0 无对应操作权限

2.3 9位标准权限计算

2.3.1 权限结构

9位权限按“所有者(u)→用户组(g)→其他人(o)”分为三组,每组3位(rwx/-),示例:-rwxr-xr--

  • 第一组(u):rwx → 所有者权限;
  • 第二组(g):r-x → 用户组权限;
  • 第三组(o):r-- → 其他人权限。

2.3.2 权限计算规则

  • 每组权限数值 = 对应r/w/x的数字之和(无权限记0);
  • 完整权限数值 = 所有者数值×100 + 用户组数值×10 + 其他人数值;
  • 示例:
    • rwxr-xr-- → 所有者(4+2+1=7)+ 用户组(4+0+1=5)+ 其他人(4+0+0=4)→ 754;
    • rw-r--r-- → 6(4+2)+4+4 → 644;
    • rwx------ → 7+0+0 → 700。

2.4 文件与目录的权限差异(核心难点)

权限对文件和目录的作用完全不同,需精准区分:

权限 文件 目录
r 可读取文件内容(如cathead 可查看目录下的文件列表(需x配合,如ls),无x则显示“?”无法查看属性
w 可修改文件内容(如echo追加、vim编辑),仅w无r时只能追加,无法查看原有内容 可创建(touch)、删除(rm)、重命名(mv)目录内文件(需x配合)
x 可执行文件(如命令、脚本),仅x无r时无法运行(需r配合) 可进入目录(cd),可访问目录内文件的属性(如ll 文件名

2.5 特殊权限(3位)

特殊权限是9位标准权限的补充,对应权限位最前方(第10-12位),核心作用是扩展权限控制场景:

特殊权限 字符标识 对应数字 核心作用 典型示例
setuid(suid) s(所有者x位) 4 运行命令时,获取命令所有者的权限(而非当前用户权限) /bin/passwd(所有者root,普通用户可修改自身密码)
setgid(sgid) s(用户组x位) 2 运行命令时,获取命令用户组的权限;目录:新建文件继承目录用户组 团队共享目录(确保组内用户可访问)
sticky(粘滞位) t(其他人x位) 1 目录:用户仅能管理自己创建的文件,无法删除他人文件 /tmp目录(所有用户可创建,仅自身可删除)

2.6 系统默认权限(umask)

2.6.1 核心规则

Linux通过umask控制文件/目录的默认权限,默认umask=022

  • 文件默认基准权限:666(无x权限,避免默认可执行);
  • 目录默认基准权限:777(需x权限,默认可进入);
  • 实际默认权限 = 基准权限 - umask(文件若某一位结果为奇数,需+1)。

2.6.2 计算示例

  • umask=022
    • 文件:666 - 022 = 644(rw-r--r--);
    • 目录:777 - 022 = 755(rwxr-xr-x);
  • umask=021
    • 文件:666 - 021 = 645(奇数+1)→ 646(rw-r--rw-);
    • 目录:777 - 021 = 756(rwxr-xrw-)。

2.7 特殊属性(文件保护)

通过chattr设置特殊属性,预防重要文件被修改/删除,优先级高于权限:

属性 含义 核心作用
a(append) 追加属性 仅可追加内容,无法修改/删除(echo >>可行,vim修改不可行)
i(immutable) 不可变属性 无法修改、删除、重命名,无法创建链接,root也受限制

2.8 Permission denied故障核心场景

日常操作 所需权限 故障原因
查看文件内容 文件r权限 缺少文件r权限
编辑文件内容 文件rw权限 缺少文件r或w权限
运行脚本/命令 文件rx权限 缺少文件r或x权限
查看目录内容 目录rx权限 缺少目录r或x权限
创建/删除文件 目录rwx权限 缺少目录w或x权限
重命名文件 目录rwx权限 缺少目录w或x权限

三、步骤/命令

3.1 权限查看命令

# 查看文件/目录权限(核心命令)
ls -l 文件名/目录名
# 示例:查看oldboy.sh权限
ls -l oldboy.sh

# 查看目录本身权限(不显示内部文件)
ls -d 目录名
# 示例:查看/oldboy-mode目录权限
ls -d /oldboy-mode

# 查看特殊属性
lsattr 文件名
# 示例:查看oldboy.txt的特殊属性
lsattr oldboy.txt

3.2 权限修改命令(chmod)

3.2.1 数字形式修改(推荐,简洁高效)

# 语法:chmod 权限数值 目标
chmod 755 oldboy.sh  # 所有者rwx,用户组r-x,其他人r--
chmod 644 /etc/passwd  # 文件默认权限
chmod 755 /oldboy-mode  # 目录默认权限
chmod 700 ~/.ssh  # 仅所有者可访问(安全配置)

3.2.2 字符形式修改(灵活,精准调整)

# 语法:chmod [u/g/o/a] [+/-/=] [r/w/x] 目标
# u:所有者,g:用户组,o:其他人,a:所有(u+g+o)
# +:添加权限,-:移除权限,=:覆盖权限

# 给所有者添加w权限
chmod u+w oldboy.txt

# 给用户组添加x权限,移除其他人r权限
chmod g+x,o-r oldboy.sh

# 给所有用户添加x权限(常用,如给脚本加执行权限)
chmod a+x /etc/rc.d/rc.local
# 简写(等价于a+x)
chmod +x /etc/rc.d/rc.local

# 覆盖所有者权限为rw-,用户组和其他人为r--
chmod u=rw,g=r,o=r oldboy.txt

3.3 所有者/用户组修改命令(chown)

# 语法:chown 所有者[:用户组] 目标
# 修改所有者为oldboy
chown oldboy oldboy.txt

# 修改所有者和用户组为oldboy(点分隔)
chown oldboy.oldboy oldboy.txt

# 修改目录及内部所有文件的所有者/用户组(-R递归)
chown -R oldboy.oldboy /oldboy-mode/oldboydir

# 仅修改用户组(也可用chgrp命令)
chown :oldboy oldboy.txt
chgrp oldboy oldboy.txt  # 等价命令

3.4 特殊权限设置

# 1. setuid(4):数字形式(4开头)
chmod 4755 /bin/rm  # 给rm添加suid权限(示例,生产环境慎用)
# 字符形式
chmod u+s /bin/rm

# 2. setgid(2):数字形式(2开头)
chmod 2755 /data/share  # 给共享目录添加sgid权限
# 字符形式
chmod g+s /data/share

# 3. sticky(1):数字形式(1开头)
chmod 1777 /tmp/test  # 给测试目录添加粘滞位
# 字符形式
chmod o+t /tmp/test

3.5 特殊属性设置(chattr)

# 添加a属性(仅可追加)
chattr +a oldboy.log

# 移除a属性
chattr -a oldboy.log

# 添加i属性(不可修改/删除)
chattr +i /etc/passwd  # 保护核心配置文件

# 移除i属性
chattr -i /etc/passwd

3.6 权限测试实操(文件+目录)

3.6.1 文件权限测试

# 1. 环境准备
mkdir -p /oldboy-mode
echo 'hostname' > /oldboy-mode/oldboy.sh
chown oldboy.oldboy /oldboy-mode/oldboy.sh

# 2. 测试r权限(仅读,无写/执行)
chmod u=r /oldboy-mode/oldboy.sh
su - oldboy -c "cat /oldboy-mode/oldboy.sh"  # 可读取
su - oldboy -c "echo 'test' >> /oldboy-mode/oldboy.sh"  # 无w权限,失败
su - oldboy -c "/oldboy-mode/oldboy.sh"  # 无x权限,失败

# 3. 测试w权限(仅写,无读/执行)
chmod u=w /oldboy-mode/oldboy.sh
su - oldboy -c "cat /oldboy-mode/oldboy.sh"  # 无r权限,失败
su - oldboy -c "echo 'test' >> /oldboy-mode/oldboy.sh"  # 可追加
su - oldboy -c "/oldboy-mode/oldboy.sh"  # 无x权限,失败

# 4. 测试x权限(需配合r)
chmod u=rx /oldboy-mode/oldboy.sh
su - oldboy -c "cat /oldboy-mode/oldboy.sh"  # 可读取
su - oldboy -c "/oldboy-mode/oldboy.sh"  # 可执行

3.6.2 目录权限测试

# 1. 环境准备
mkdir -p /oldboy-mode/oldboydir
touch /oldboy-mode/oldboydir/oldboy{10..20}.txt
chown -R oldboy.oldboy /oldboy-mode/oldboydir

# 2. 测试r权限(无x)
chmod u=r /oldboy-mode/oldboydir
su - oldboy -c "ls /oldboy-mode/oldboydir"  # 无x权限,显示"?",失败

# 3. 测试rx权限(可查看/进入)
chmod u=rx /oldboy-mode/oldboydir
su - oldboy -c "ls /oldboy-mode/oldboydir"  # 可查看
su - oldboy -c "cd /oldboy-mode/oldboydir"  # 可进入

# 4. 测试rwx权限(可创建/删除)
chmod u=rwx /oldboy-mode/oldboydir
su - oldboy -c "touch /oldboy-mode/oldboydir/test.txt"  # 可创建
su - oldboy -c "rm -f /oldboy-mode/oldboydir/oldboy10.txt"  # 可删除

3.7 删除文件的权限测试(关键知识点)

# 场景1:删除文件的权限取决于所在目录,与文件本身权限无关
mkdir -p /lidao-dir
chown oldboy.oldboy /lidao-dir  # 目录所有者为oldboy
touch /lidao-dir/root01.txt  # 文件所有者为root
su - oldboy -c "rm -f /lidao-dir/root01.txt"  # 目录有rwx,可删除root所有的文件

# 场景2:目录无w权限,无法删除文件
chmod u=rx /lidao-dir
su - oldboy -c "rm -f /lidao-dir/root01.txt"  # 无w权限,删除失败

3.8 Permission denied故障排查流程

故障现象

执行操作时提示“Permission denied”(权限拒绝)。

排查步骤

# 1. 确认当前用户
whoami

# 2. 查看目标文件/目录的权限和所有者
ls -l 目标路径  # 文件
ls -ld 目标路径  # 目录

# 3. 分析用户与目标的关系(u/g/o),判断应有权限
# 示例:oldboy用户无法读取/root/test.txt
whoami  # 输出oldboy
ls -l /root/test.txt  # -rw-r--r--. 1 root root 0 测试
# 分析:oldboy属于"其他人",有r权限,但/root目录权限为r-xr-x---(其他人无x)
ls -ld /root  # dr-xr-x---. 1 root root 4096 测试
# 结论:目录无x权限,导致无法访问文件

# 4. 解决方案:给目录添加其他人x权限(生产环境慎用,建议用sudo)
chmod o+x /root

四、原理说明

4.1 权限生效原理

  • Linux系统判断操作是否允许时,按以下顺序校验:
    1. 若为root用户,直接允许(忽略权限限制);
    2. 若为文件所有者,校验所有者权限;
    3. 若属于文件用户组,校验用户组权限;
    4. 校验其他人权限;
    5. 均无对应权限则提示“Permission denied”。

4.2 特殊权限生效原理

  • setuid:运行命令时,进程的有效UID变为命令所有者的UID,而非当前用户UID(如passwd命令所有者为root,普通用户运行时临时获得root权限修改/etc/shadow);
  • setgid:运行命令时,进程的有效GID变为命令用户组的GID;目录设置后,新建文件继承目录的用户组;
  • sticky:目录设置后,内核会检查文件所有者是否为当前用户,或用户是否为root,仅允许所有者/root删除文件。

4.3 umask默认权限原理

  • umask是系统环境变量,默认值存储在/etc/profile~/.bashrc中;
  • 新建文件/目录时,系统会根据基准权限减去umask值计算默认权限;
  • 文件默认无x权限是因为基准权限为666(无x),避免误创建可执行文件带来安全风险。

4.4 特殊属性生效原理

  • chattr设置的属性存储在文件的inode节点中,优先级高于标准权限;
  • i属性会禁止所有写操作(包括修改、删除、重命名、链接),即使root用户也需先移除i属性才能操作;
  • a属性仅允许追加操作,适合日志文件(避免误删或修改历史日志)。

五、注意事项

  1. 权限配置注意

    • 遵循“最小权限原则”:仅授予必要权限,避免过度开放(如777权限仅用于临时测试,生产环境禁用);
    • 目录若需“写”权限,必须同时授予x权限(否则w权限无效);
    • 文件的执行权限(x)需谨慎授予,避免恶意脚本被运行。
  2. 特殊权限注意

    • setuid权限不可随意给系统命令(如rmcp),可能导致权限泄露;
    • sticky权限仅对目录有效,对文件无效;
    • /tmp目录默认已设置sticky权限(1777),无需手动修改。
  3. 特殊属性注意

    • /etc/passwd/etc/shadow等核心文件添加i属性前,需确保配置正确,避免无法修改;
    • 移除i属性需root权限,普通用户无权限操作。
  4. 网站权限配置注意(生产环境实战):

    • 网站程序文件:所有者root,权限644;目录:所有者root,权限755;
    • 上传目录(如upload):所有者为网站运行用户(如www、nginx),权限755;
    • 禁止上传目录的执行权限,避免恶意脚本执行;
    • 核心配置文件(如数据库密码文件)添加i属性保护。

六、总结与避坑指南

6.1 总结

本文覆盖Linux 12位权限管理的完整体系,核心可概括为四大模块:

  1. 基础核心:rwx权限的含义、数字对应关系,9位权限的计算方法;
  2. 实操技能chmod/chown/chattr命令的使用,文件与目录的权限测试;
  3. 核心难点:文件与目录的权限差异,删除文件的权限逻辑;
  4. 安全配置:特殊权限、特殊属性的应用,网站权限的最佳实践。

核心原则:权限管理的核心是“隔离与最小授权”,既要保证业务正常运行,也要防范非法操作,是Linux系统安全的第一道防线。

6.2 避坑指南

  1. 权限计算坑:混淆文件与目录的权限作用,如认为目录r权限可直接查看内容(需x配合);
  2. 删除权限坑:误以为删除文件需要文件本身的w权限,实际取决于所在目录的w权限;
  3. 特殊权限坑:给rmbash等命令添加setuid权限,导致普通用户获得root权限;
  4. 默认权限坑:新建文件无执行权限是正常现象(基准权限666),无需手动添加x;
  5. 网站权限坑:上传目录设置为777权限,导致恶意用户上传恶意脚本并执行;
  6. 特殊属性坑:给文件添加i属性后忘记移除,导致无法修改配置(需用chattr -i);
  7. 递归权限坑:修改目录权限时忘记-R,导致内部文件权限未同步修改;
  8. 用户组坑:修改文件所有者后,未同步修改用户组,导致用户组权限失效。
posted @ 2026-03-10 21:33  gzjwo  阅读(7)  评论(0)    收藏  举报