// 安全研究 · 2025-02-17

区分 Linux 目录权限与文件权限:为什么你能删除或重命名 root 的文件

在 Linux 系统中,权限机制是安全管理的核心支柱,每个文件和目录都被赋予了特定的权限,决定用户可以执行的操作。然而,许多新手用户在操作文件时会遇到困惑:为什么我对某个文件没有读写权限,却依然能删除或重命名它?这看似矛盾的现象实际上源于 Linux 权限模型的设计,尤其是目录权限与文件权限的本质差异。更重要的是,普通用户在其 HOME 目录内通常享有近乎不受限的操作自由,这为用户提供了极大的便利,同时也带来了潜在的安全考量。

本文将从权限的基本概念入手,深入探讨目录权限如何影响文件操作。


1. Linux 权限模型的基础

1.1 文件权限:控制内容的访问

文件权限是 Linux 中最直观的安全机制,直接决定用户对文件内容的操作能力。每个文件的权限分为三类操作:

  • 读权限(r):允许查看文件内容,例如使用 cat 或 less。
  • 写权限(w):允许修改文件内容,例如使用 echo 重定向或编辑器写入。
  • 执行权限(x):允许将文件作为程序运行,例如 ./script.sh。

这些权限被分配给三类用户:

  • 属主(Owner):文件的创建者,默认拥有最大控制权。
  • 属组(Group):文件所属的用户组,通常用于团队协作。
  • 其他用户(Others):系统中未明确授权的所有用户。

示例:

ls -l testfile
-rw-r--r-- 1 alice users 0 Mar 1 14:30 testfile
  • -rw-:属主(alice)有读写权限。
  • r--:属组(users)只有读权限。
  • r--:其他用户也只有读权限。
  • 没有 x,表示不可执行。

作为普通用户 bob(非 alice 且不在 users 组),尝试修改 testfile 会失败:

echo "test" > testfile
# 输出:Permission denied

但 bob 是否能删除或重命名 testfile,取决于其所在目录的权限,而非文件本身。

1.2 目录权限:管理结构的钥匙

与文件权限不同,目录权限控制的是用户对目录本身的操作,而非其中文件的内容。目录的权限同样分为三类:

  • 读权限(r):允许列出目录内容,例如 ls -l。
  • 写权限(w):允许修改目录结构,包括创建、删除或重命名文件。
  • 执行权限(x):允许进入目录(cd)并访问其文件。

示例:

ls -ld /home/alice
drwxr-xr-x 2 alice users 4096 Mar 1 14:30 /home/alice
  • drwx:属主(alice)有读、写、执行权限。
  • r-x:属组和其他用户有读和进入权限,无写权限。

目录的写权限(w)尤为关键,因为它决定了用户能否改变目录中的文件条目,而这正是删除和重命名的核心。

1.3 普通用户在 HOME 目录的自由度

在 Linux 中,每个普通用户默认拥有一个 HOME 目录(如 /home/alice),其权限通常设置为 drwxr-xr-x,属主为用户自己。这意味着:

  • 完全控制权:alice 对 /home/alice 有读、写、执行权限,可以随意创建、修改、删除文件或子目录。
  • 隔离性:其他用户只能读取和进入,无法修改内容。

这种设计赋予了普通用户在 HOME 目录内的高度自由。例如:

su - alice
touch /home/alice/myfile
chmod 600 /home/alice/myfile
rm /home/alice/myfile

这些操作无需额外权限,体现了“普通用户在 HOME 目录内一般不受限”的特性。这种自由源于 HOME 目录的所有权和默认权限,是 Linux 用户自治理念的体现。


2. 删除与重命名:目录权限的主导作用

2.1 操作的本质:修改目录而非文件

新手常误以为删除或重命名文件是对文件本身的直接操作,但 Linux 的文件系统(例如 ext4)将这些操作定义为对目录的修改:

  • 删除文件:通过 rm 命令移除目录中文件的索引条目(inode 链接),而不是直接擦除文件数据。
  • 重命名文件:通过 mv 命令更新目录中的文件名条目,实质是目录结构的调整。

例如,删除文件的过程:

  1. 检查用户对目录的写权限。
  2. 若允许,从目录中移除文件的索引。
  3. 若文件无其他链接,释放其数据块。

因此,文件本身的权限(如 rw- 或 r--)并不决定能否删除或重命名,而是由包含它的目录权限决定。

2.2 目录写权限的决定性影响

目录的写权限(w)是删除和重命名的必要条件。假设场景:

ls -ld /testdir
drwxr-xr-x 2 root root 4096 Mar 1 14:30 /testdir
ls -l /testdir/testfile
-rw-r--r-- 1 root root 0 Mar 1 14:30 /testdir/testfile
  • 普通用户 bob 对 /testdir 有写权限(因 others 为 rwx)。
  • 但对 testfile 无写权限。

尝试操作:

su - bob
rm /testdir/testfile
# 成功删除
mv /testdir/testfile /testdir/newfile
# 成功重命名

尽管 bob 无法读取或修改 testfile 的内容(cat /testdir/testfile 会失败),但仍可删除或重命名,因为他拥有目录的写权限。

2.3 HOME 目录中的无限制操作

在普通用户的 HOME 目录(如 /home/bob),默认权限为 drwxr-xr-x,bob 作为属主拥有 rwx:

ls -ld /home/bob
drwxr-xr-x 2 bob bob 4096 Mar 1 14:30 /home/bob

bob 可以在其中执行任何操作:

touch /home/bob/secret.txt
chmod 000 /home/bob/secret.txt  # 无任何权限
rm /home/bob/secret.txt        # 依然可删除
mv /home/bob/secret.txt /home/bob/hidden.txt  # 依然可重命名

即使将文件权限设为 000,bob 仍能删除或重命名,因为这些操作依赖于 /home/bob 的写权限。这种自由度在 HOME 目录内几乎无限制,除非系统施加额外约束。


3. 目录权限与文件权限的本质区别

3.1 权限作用对象的不同

  • 文件权限:直接作用于文件内容,控制读写执行。
  • 目录权限:作用于目录结构,控制文件条目的管理。

例如:

ls -l /home/bob/data.txt
-rw------- 1 bob bob 0 Mar 1 14:30 /home/bob/data.txt
  • bob 可读写 data.txt,其他用户无权限。
  • 但若 bob 对 /home/bob 有写权限,他可删除或重命名 data.txt,而不依赖文件本身的权限。

3.2 操作权限的依赖关系

操作类型 依赖权限 具体权限需求 示例命令
读取文件内容 文件权限 文件的 r cat file.txt
修改文件内容 文件权限 文件的 w echo > file.txt
执行文件 文件权限 文件的 x ./script.sh
删除文件 目录权限 目录的 w rm file.txt
重命名文件 目录权限 目录的 w mv file.txt new.txt
列出目录内容 目录权限 目录的 r ls -l dir
进入目录 目录权限 目录的 x cd dir

从表格可见,文件内容的访问依赖文件权限,而文件的管理(删除、重命名)依赖目录权限。这种分离设计增强了灵活性。

3.3 HOME 目录的特殊性

普通用户的 HOME 目录默认由用户拥有,权限为 drwxr-xr-x,确保用户对其内部结构有完全控制权:

  • 创建自由:touch /home/bob/newfile。
  • 删除自由:rm /home/bob/oldfile。
  • 重命名自由:mv /home/bob/file1 /home/bob/file2。

这种“一般不受限”的特性源于 HOME 目录的所有权和默认设置,其他用户无法干预(除非权限被调整)。


4. 为什么目录权限如此关键?

4.1 目录权限的控制力

目录的写权限赋予用户对文件生命周期的管理能力:

  • 创建:在目录中添加新文件。
  • 删除:移除文件条目。
  • 重命名:调整文件名称。

例如,在 /tmp(通常权限为 drwxrwxrwt)中,所有用户都有写权限:

ls -ld /tmp
drwxrwxrwt 10 root root 4096 Mar 1 14:30 /tmp

用户 alice 创建文件:

touch /tmp/alicefile
chmod 600 /tmp/alicefile

用户 bob 仍可删除:

rm /tmp/alicefile  # 成功

这是因为 /tmp 的 w 权限对所有用户开放。

4.2 HOME 目录的自由度保障

普通用户的 HOME 目录通常不共享写权限:

ls -ld /home/alice
drwxr-xr-x 2 alice alice 4096 Mar 1 14:30 /home/alice

只有 alice 能修改目录结构,其他用户无法删除或重命名其文件。这种隔离性保障了 HOME 目录内的不受限操作。

4.3 案例分析:权限误解的后果

假设管理员创建共享目录:

mkdir /shared
chmod 777 /shared
touch /shared/important.txt
chmod 600 /shared/important.txt
  • /shared:drwxrwxrwx,所有人有写权限。
  • important.txt:-rw-------,仅属主可读写。

普通用户 bob 可删除:

rm /shared/important.txt  # 成功

这揭示了目录权限凌驾于文件权限的特性。若要保护文件,需限制目录权限:

chmod 755 /shared

5. “能重命名但不能删除”的异常情况

尽管普通用户在 HOME 目录内一般不受限,但在特定条件下,删除或重命名可能受阻。以下是常见场景及其解决方法。

5.1 文件属性限制

Linux 支持扩展属性(如 immutable),可阻止文件删除:

sudo chattr +i /home/bob/protected.txt
lsattr /home/bob/protected.txt
----i----------- /home/bob/protected.txt
rm /home/bob/protected.txt
# 输出:rm: cannot remove: Operation not permitted

即使 bob 是属主,也无法删除。移除属性:

sudo chattr -i /home/bob/protected.txt

5.2 进程占用

文件被进程占用时,删除可能失败:

sleep 1000 > /home/bob/locked.txt &
rm /home/bob/locked.txt
# 可能成功,但文件仍占用空间

检查占用:

lsof /home/bob/locked.txt
# 输出进程 PID
kill -9 <PID>

5.3 文件系统限制

  • 只读挂载:
    sudo mount -o remount,ro /home
    rm /home/bob/test.txt
    # 输出:Read-only file system
    恢复写权限:
    sudo mount -o remount,rw /home
  • SELinux:策略可能限制操作:
    setenforce 1
    rm /home/bob/test.txt
    # 输出:Permission denied
    检查上下文:
    ls -Z /home/bob/test.txt

5.4 HOME 目录外的受限场景

若文件位于非 HOME 目录(如 /var),用户可能因目录权限不足而受限:

ls -ld /var/data
drwxr-x--- 2 root root 4096 Mar 1 14:30 /var/data
rm /var/data/file.txt
# 输出:Permission denied

6. 总结

普通用户在 HOME 目录内“一般不受限”的特性源于其所有权和默认权限(drwxr-xr-x),允许用户自由管理文件结构。目录权限与文件权限的区别在于:文件权限控制内容访问,目录权限控制结构管理。删除和重命名依赖目录的写权限,而非文件本身权限。

通过深入掌握这些机制,你可以在 Linux 系统中灵活管理权限,同时防范潜在风险。

原文 https://blog.csdn.net/2301_79518550/article/details/145641352