正在加载,请稍候…

Linux 文件权限:chmod、chown 与访问控制详解

理解 Linux 文件权限——读/写/执行、所有者/组/其他人、数字和符号 chmod,以及 Web 服务器的常见权限模式。

Linux 文件权限:chmod、chown 与访问控制详解

Linux 权限如何工作

Linux 中的每个文件和目录都有三组权限,分别对应三种用户类型:

-rwxr-xr--  1  alice  developers  4096  May 26  script.sh
 ^^^  ^^^  ^^^
 |    |    └── 其他人(所有其他用户)
 |    └── 组("developers" 组的成员)
 └── 所有者(alice)

每组有三个位:读 (r)写 (w)执行 (x)

符号 文件 目录
r(读) 读取文件内容 列出目录内容(ls
w(写) 修改文件 在目录内创建/删除文件
x(执行) 作为程序运行 进入目录(cd)并访问内容

第一个字符表示类型:- = 普通文件,d = 目录,l = 符号链接。

Linux 文件权限:chmod、chown 与访问控制详解 插图

数字(八进制)表示法

每组权限映射为一个 3 位数字:

二进制 八进制 权限
000 0 ---(无)
001 1 --x
010 2 -w-
011 3 -wx
100 4 r--
101 5 r-x
110 6 rw-
111 7 rwx

chmod 755 script.sh 表示:

  • 所有者:7 = rwx(读、写、执行)
  • 组:5 = r-x(读、执行)
  • 其他人:5 = r-x(读、执行)

常见权限模式

chmod 644 file.txt     # -rw-r--r--  普通文件:所有者编辑,其他人只读
chmod 755 script.sh    # -rwxr-xr-x  脚本:所有者运行,其他人可执行
chmod 700 private.key  # -rwx------  敏感文件:仅所有者
chmod 664 shared.txt   # -rw-rw-r--  协作文件:组可编辑
chmod 775 shared-dir/  # drwxrwxr-x  共享目录:组可添加/删除
chmod 750 config/      # drwxr-x---  应用配置:组可读,其他人无权限

Web 服务器模式

# 静态 Web 文件——Web 服务器(www-data)可读
find /var/www/html -type f -exec chmod 644 {} \;  # 文件:所有者写,服务器读
find /var/www/html -type d -exec chmod 755 {} \;  # 目录:可遍历

# 上传目录——Web 服务器可写
chmod 755 /var/www/html/uploads
chown www-data:www-data /var/www/html/uploads

# 配置文件——Web 服务器不可读
chmod 600 .env
chmod 600 config/database.php

符号表示法

chmod u+x script.sh    # 为所有者添加执行权限(u = user/owner)
chmod g-w shared.txt   # 从组移除写权限(g = group)
chmod o-rwx private/   # 从其他人移除所有权限(o = others)
chmod a+r public.txt   # 为所有人添加读权限(a = all)
chmod u+x,g-w file     # 同时进行多项更改
chmod go=r file        # 将组和其他人的权限精确设置为只读

Linux 文件权限:chmod、chown 与访问控制详解 插图

更改所有权:chown 和 chgrp

chown alice file.txt              # 将所有者更改为 alice
chown alice:developers file.txt   # 更改所有者和组
chown :developers file.txt        # 仅更改组
chown -R alice:alice /home/alice/ # 递归(-R)

chgrp www-data /var/www/          # 将组更改为 www-data

特殊权限位

Setuid(4000)

当设置在可执行文件上时,它将以文件所有者的身份运行,而不是执行它的用户。passwdsudo 等系统工具使用此权限。

chmod 4755 /usr/bin/example   # -rwsr-xr-x  (所有者执行位置显示 's')
ls -la /usr/bin/passwd        # -rwsr-xr-x 1 root root ...

Setgid(2000)

在可执行文件上:以文件所属组运行。在目录上:新文件继承目录的组,而不是创建者的主组。

chmod 2755 /shared-dir/   # drwxr-sr-x  (新文件继承组)

适用于共享项目目录,其中所有文件应属于项目组。

Linux 文件权限:chmod、chown 与访问控制详解 插图

粘滞位(1000)

在目录上:用户只能删除自己拥有的文件,即使他们对目录有写权限。用于 /tmp

chmod 1777 /tmp              # drwxrwxrwt  (其他人执行位置显示 't')
ls -la /                     # /tmp 显示 'drwxrwxrwt'

完整特殊位示例

chmod 6755 file  # setuid + setgid + 755
chmod 7777 file  # setuid + setgid + sticky + 777(很少合适)

umask:默认权限掩码

新文件和目录不会获得完整权限——umask 从默认权限中减去权限。

umask        # 显示当前 umask(通常为 022 或 002)
umask 022    # 设置 umask

# 应用 umask 前的默认权限:
# 文件:666(rw-rw-rw-)
# 目录:777(rwxrwxrwx)

# 使用 umask 022:
# 文件:666 - 022 = 644(rw-r--r--)
# 目录:777 - 022 = 755(rwxr-xr-x)

# 使用 umask 002(常见于组协作):
# 文件:666 - 002 = 664(rw-rw-r--)
# 目录:777 - 002 = 775(rwxrwxr-x)

按权限查找文件

# 其他人可写的文件(潜在安全风险)
find /var/www -type f -perm -o+w

# 由 root 拥有且设置了 setuid 的可执行文件
find / -type f -perm -4000 2>/dev/null

# 没有所有者的文件
find / -nouser 2>/dev/null

# 全局可写的目录
find / -type d -perm -o+w 2>/dev/null

ACL:细粒度访问控制

对于比所有者/组/其他人更复杂的场景,使用 POSIX ACL:

# 授予特定用户读权限
setfacl -m u:bob:r-- file.txt

# 授予特定组写权限
setfacl -m g:contractors:rw- project/

# 查看 ACL
getfacl file.txt

# 移除所有 ACL 条目
setfacl -b file.txt

安全清单

# ✅ 敏感文件
chmod 600 ~/.ssh/id_rsa        # 私钥
chmod 644 ~/.ssh/id_rsa.pub    # 公钥
chmod 700 ~/.ssh/               # SSH 目录

# ✅ Web 应用
chmod 644 /var/www/html/*.php  # PHP 文件:Web 服务器不可执行
chmod 755 /var/www/html/       # Web 根目录:可遍历
chmod 600 /var/www/.env        # 环境变量

# ❌ 切勿在生产环境中执行以下操作
chmod 777 /var/www/html/       # 全局可写的 Web 根目录
chmod 777 uploads/             # 全局可写的上传目录

→ 使用 chmod 计算器 即时计算 chmod 权限值。