Linux 文件权限是系统安全的核心机制之一,通过控制 "谁能对文件 / 目录执行什么操作",防止未授权访问和误操作。

一、权限的基本构成

Linux 权限基于UGO 模型(User/Group/Others),即权限分别针对三类对象:


  • U(User):文件的所有者(创建者或被指定的用户)

  • G(Group):文件所属组的成员

  • O(Others):既不是所有者也不属于所属组的其他用户

每类对象拥有三种基本权限:

  • r(Read,读权限):对文件可查看内容;对目录可列出内容(ls

  • w(Write,写权限):对文件可修改内容;对目录可创建 / 删除文件(即使文件不属于自己)

  • x(Execute,执行权限):对文件可运行(如脚本、程序);对目录可进入(cd

二、查看文件权限

使用 ls -l 命令查看文件 / 目录的权限信息,示例输出如下:

bash

ls -l /etc/passwd
# 输出:-rw-r--r-- 1 root root 2652 8月  11 10:00 /etc/passwd

输出解析(以 -rw-r--r-- 为例):

  • 第 1 位:文件类型(- 表示普通文件,d 表示目录,l 表示软链接)

  • 第 2-4 位:所有者(U)权限 rw-(可读、可写、不可执行)

  • 第 5-7 位:所属组(G)权限 r--(可读、不可写、不可执行)

  • 第 8-10 位:其他用户(O)权限 r--(可读、不可写、不可执行)

三、权限的数字表示法

为了简化操作,权限可用数字表示(每类对象的权限为三个数字的和):

  • r = 4w = 2x = 1- = 0

常见权限组合:

  • 7(4+2+1):rwx(可读、可写、可执行)

  • 6(4+2):rw-(可读、可写)

  • 5(4+1):r-x(可读、可执行)

  • 4:r--(只读)

  • 0:无任何权限


例如:rw-r--r-- 对应数字 644(U=6,G=4,O=4)。

四、修改文件权限(chmod 命令)

chmod 用于修改权限,支持符号模式数字模式两种方式。

1. 符号模式(更直观,推荐新手)

格式:chmod [对象][操作][权限] 文件/目录

  • 对象u(所有者)、g(所属组)、o(其他用户)、a(所有对象,默认)

  • 操作+(添加权限)、-(移除权限)、=(设置为指定权限)

  • 权限rwx


示例:

bash

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

# 移除所属组的写权限
chmod g-w data.txt

# 给所有用户设置只读权限
chmod a=r config.ini

# 对目录及其下所有内容递归修改权限(加 -R 参数)
chmod -R u+rwx /data/project

2. 数字模式(更简洁,适合熟练用户)

格式:chmod [权限数字] 文件/目录

示例:

bash

# 设置所有者可读可写可执行,所属组可读可执行,其他用户无权限
chmod 750 app.py

# 设置所有用户只读(常用于配置文件)
chmod 644 /etc/hosts

# 目录通常需要执行权限(否则无法进入),设置为 755(常用目录权限)
chmod 755 /home/user/docs

五、修改所有者和所属组(chown/chgrp)

权限依赖于所有者和所属组,需用以下命令管理:

1. 修改所有者(chown)

格式:chown 用户名 文件/目录

bash

# 将 file.txt 的所有者改为 user1
chown user1 file.txt

# 同时修改所有者和所属组(格式:用户名:组名)
chown user1:group1 data/

2. 修改所属组(chgrp)

格式:chgrp 组名 文件/目录

bash

# 将 logs/ 目录的所属组改为 dev
chgrp dev logs/

六、特殊权限(SUID/SGID/ 粘滞位)

除基础权限外,还有三个特殊权限(用于特定场景,需谨慎使用):

1. SUID(Set User ID,4000)

  • 作用:用户执行文件时,临时获得文件所有者的权限(仅对可执行文件有效)

  • 典型场景:passwd 命令(普通用户可修改自己密码,临时获得 root 权限写入 /etc/shadow

  • 设置:chmod u+s 文件名 或 chmod 4755 文件名

  • 安全风险:若被滥用(如 /bin/bash 设置 SUID),可能导致权限提升攻击,非必要不设置

2. SGID(Set Group ID,2000)

  • 作用:对文件:执行时临时获得所属组权限;对目录:在目录中创建的新文件自动继承目录的所属组

  • 设置:chmod g+s 目录名 或 chmod 2755 目录名

  • 用途:团队共享目录(如 /var/www,确保新文件属于团队组)

3. 粘滞位(Sticky Bit,1000)

  • 作用:仅对目录有效,限制 "只有文件所有者或 root 可删除该目录下的文件"(防止他人删除自己的文件)

  • 典型场景:/tmp 目录(所有用户可写,但不能删除别人的文件)

  • 设置:chmod o+t 目录名 或 chmod 1777 目录名

七、权限设置最佳实践

  1. 最小权限原则:只给必要的权限(例如:普通文件通常设为 644,可执行脚本设为 755,敏感文件设为 600

  2. 系统关键文件保护

    • /etc/passwd644(所有人可读,root 可写)

    • /etc/shadow000(仅 root 可读写)

    • /root 目录:700(仅 root 可访问)

  3. 目录权限注意

    • 若需进入目录,必须有 x 权限

    • 若需在目录中创建文件,需要 w+x 权限

    • 共享目录建议设置 SGID(统一所属组)和粘滞位(防止误删)

  4. 定期检查异常权限

    bash

    # 查找所有权限为 777 的文件(危险权限,应避免)
    find / -perm 777 2>/dev/null
    
    # 查找设置了 SUID 的文件(检查是否有异常)
    find / -perm -4000 2>/dev/null