一个网格,四种表示法
复选框矩阵、三位八进制、四位八进制、符号字符串和 ls -l 行都是同样九个位的不同视图,每次按键都会同步重绘。
把读取、写入和执行复选框转换成八进制模式、符号字符串和 chmod 命令;也可以粘贴已有的模式,用通俗的语言看清它到底允许谁访问。
模式 755,符号 rwxr-xr-x,对象为文件。chmod 755 script.sh。没有警告。
每个类别对应一个八进制数字,每个数字就是勾选项相加的结果。
| 类别 | 读取r · 4 | 写入w · 2 | 执行x · 1 | 数字 |
|---|---|---|---|---|
| 所有者u · 用户 | 4 + 2 + 17 | |||
| 所属组g · 组 | 4 + 15 | |||
| 其他用户o · 其他 | 4 + 15 |
打开文件并读取其字节,或将其复制到别处。
修改或截断内容。删除文件则由其所在目录决定。
将其作为程序运行。脚本还需要读取权限,因为解释器必须打开它。
这三个位位于模式前面,处在大多数人从不书写的那一位数字中。每一个都会改变进程以谁的身份运行,或改变目录允许的操作;设置之前请先阅读说明。
所有者可以读取文件、修改文件和将其作为程序运行。
单个账户:inode 上记录的用户 ID,也就是 ls -l 行中两个名称里的第一个。root 几乎完全绕过这些检查,所以模式只能约束普通用户。
组成员可以读取文件和将其作为程序运行。
文件所属组中的每个账户,即 ls -l 行中的第二个名称。正是组成员身份让团队可以共享写入权限,而不必向整台机器开放。
其他所有人可以读取文件和将其作为程序运行。
前两个类别没有覆盖到的所有人:其他登录用户,以及 www-data、nobody 等所有守护进程账户。攻击者落脚的正是这个类别。
没有所有人可写的位,也没有无法生效的特殊权限位。但这并不等于正确:模式仍需符合这个文件的用途。
一条递归 chmod 会给目录和文档设置相同的模式:要么文件变成可执行,要么目录变得无法进入。把它拆成两条,每种类型都能得到所需的模式。
find script.sh -type d -exec chmod 755 {} +find script.sh -type f -exec chmod 644 {} +umask 做的是减法。内核为新文件提供 666,为新目录提供 777,然后清除掩码指定的每一位。
在常见的 022 下,这就是你刚创建的文件为什么是 644 而不是 666:在你看到它之前,掩码已经去掉了所属组和其他用户的写入位。这里不会改变你的 shell,只是对你输入的值做算术。
Unix 用九个位记录权限:读取、写入和执行,分别为所有者、所属组和其他所有人各重复一次。每三个位分为一组,每组正好对应一个 0 到 7 的八进制数字,这也是 chmod 接受 755 这样的数字而不是一句话的唯一原因。内核按顺序检查这些类别(先所有者,再所属组,最后其他用户),并在第一个与你匹配的类别处停下,因此即使模式对其他用户很宽松,也救不了被拒绝访问的所有者。
同样的三个位在两者上含义不同。先切换这个开关,页面上的所有解释都会随之改变:执行不再表示运行,而是表示进入。
为所有者、所属组和其他用户切换读取、写入和执行。手头已经有一个模式?把 0644 或 ls -l 列表中的十个字符粘贴到反向输入框,网格会自动填好。
填写真实目标,然后复制八进制命令、适合脚本使用的赋值形式,或者一次性为目录和文档设置不同模式的那对 find 命令。
复选框矩阵、三位八进制、四位八进制、符号字符串和 ls -l 行都是同样九个位的不同视图,每次按键都会同步重绘。
粘贴 700、0755、rwxrwxr-x 或 drwxr-xr-x 都可以。十个字符的列表形式甚至会根据首字母自动设置文件或目录开关;无法解析的输入会明确提示,而不是悄悄忽略你。
读取列出名称,写入添加和删除条目,执行让路径查找得以穿过。这些句子根据你当前的模式生成,而不是从固定表格里照搬。
setuid、setgid 和粘滞位各有独立的开关和说明,包括内核完全忽略的情况:shell 脚本上的 setuid,普通文件上的粘滞位。
所有人可写、无人能执行的文件却带着 setuid 位、脚本有执行权限却没有读取权限:每种情况都用各自的颜色标出,并说明原因,而不是一味说教。
八进制形式、u=rwx,g=rx,o=rx 赋值形式,以及用于混合目录树的两条 find 命令,你输入的目标路径已经填好。全部在你的浏览器中生成。
每一位数字对应一个类别:依次是所有者、所属组和其他用户。在一位数字中,读取为 4,写入为 2,执行为 1,所以 7 是 4+2+1(读取、写入、执行),5 是 4+1(读取和执行),0 表示没有任何权限。因此 755 允许所有者执行所有操作,而所属组和其他所有人可以读取和执行,但不能修改。这是程序以及系统中几乎所有目录的常用模式。
只差执行位。644 给所有者读取和写入权限,给其他所有人读取权限;755 为三个类别都加上执行权限。数据文件应使用 644;PDF 或照片上的执行位除了制造混乱毫无用处。程序、shell 脚本和所有目录应使用 755,因为没有执行权限的目录,即使能列出内容的人也无法进入。
它把写入权限授予机器上的每个账户,包括攻击者最先拿到的服务账户。以 www-data 身份运行、又能改写自己所提供应用的 Web 服务器,会把一个小小的文件上传漏洞变成任意代码执行。动用 777 还意味着真正的原因(通常是所有者或所属组不对)永远不会被找到,因此原始错误早已被遗忘,暴露却一直存在。请用 chown 修正所有权,并授予能正常工作的最小权限模式。
只有在设置 setuid(4000)、setgid(2000)或粘滞位(1000)时才需要。写 755 和 0755 效果相同,因为缺少的前导数字按零处理。意外出现在再次清除这些位的时候:GNU chmod 会刻意保留目录的 setuid 和 setgid,除非你明确指定,所以在 Linux 上,chmod 755 和 chmod 0755 都不会去掉目录的 setgid;这需要 chmod g-s、chmod =755 或五位数的 chmod 00755。BSD chmod(包括 macOS)则相反,普通的三位模式就会清除它们。对于普通文件,所有版本都会清除。
表示特殊权限位已设置,但对应的执行位没有设置,因此特殊权限位无法生效。rwSr--r-- 是所有者无法执行的 setuid 文件;drwxrwxrwT 是其他用户没有执行权限的粘滞目录。小写的 s 或 t 表示两个位都已设置,行为真正生效。大写字母通常意味着设置特殊权限位之后执行位又被清除了,或者输入四位模式时漏了对应的 x;无论哪种情况,这个模式都不像看上去那样起作用。
因为删除不是对文件本身的操作,而是对保存该名称的目录的操作。只要对目录有写入加执行权限,就足以解除其中任何条目的链接,不管文件本身的权限如何。这正是粘滞位要堵上的漏洞:在 /tmp 这样的 1777 目录中,只有条目的所有者、目录的所有者或 root 才能删除它。
它授予遍历权:解析目录内的名称并访问更深层内容的权利。读取和执行相互独立:有读取而无执行时,你能列出名称却无法使用它们,所以 ls 可以运行,但打开任何结果都会失败。有执行而无读取则正好相反,而且是一种实用技巧:给主目录设置 711 模式,Web 服务器就能访问 public_html,而任何人都无法列出里面还有什么。路径上的每个目录都需要执行权限,否则查找会在那一层失败。
chmod 直接设定模式;umask 只会去掉权限位,而且只在创建对象的那一刻起作用。内核为新文件提供 666,为新目录提供 777,然后清除掩码指定的每一位,所以常见的 umask 022 会生成 644 的文件和 755 的目录,这也是新文件永远不可执行的原因。它是按进程生效的设置,在某个 shell 中修改只影响该 shell 及其子进程,对已经存在的任何东西都没有影响。
探索不断扩充的工具合集,涵盖计算、文档、写作和日常工作。