Linux 中的文件权限是什么,我如何确保我的文件权限是安全的?

在 Linux 中,文件权限决定了文件所有者和其他人的特权级别。确保任何面向 Web 的文件都正确设置了权限非常重要,这样受感染的进程就无法写入不应写入的位置。
什么是文件权限?
文件权限跟踪三个不同组的权限。每个组由三个位表示:
- r:“读取”权限允许进程将该文件的内容读入内存。
- w:“写入”权限授予进程覆盖磁盘上存储该文件的物理位置的权限。
- x:“执行”权限适用于程序并允许执行该文件。
在终端中,权限显示如下:

第一个“d”表示文件是否是目录。第一组三个是文件所有者。在这种情况下,文件所有者具有完整的读取、写入和执行访问权限。下一组三个是“组所有者”,表示文件所属组的访问权限,在本例中为只读。下一组是其他人,这是只读的。
通常,打开“所有人”权限的文件不是很安全。您需要确保最后一组设置为只读或大多数文件无访问权限。
在幕后,这些以二进制形式存储,每个权限代表一个位。例如,rw-
在二进制中是 110
,在十进制中是 6。所以,权限字符串:
rwxrw-r--
…可以存储为“764”。文件权限通常以这种方式提及; “777”表示完全访问,“700”是私有的,“644”是只读的。从技术上讲,这称为八进制,而不是十进制,因为每个数字有八个可能的值。
对于目录,权限使用相同的字符,但有一点不同:
- r: 列表权限。允许打开目录,并允许使用
ls
。需要设置 x 属性。 - w: 写权限。允许创建新文件、删除文件和重命名文件。不会阻止更改目录中现有的可写文件的内容。
- x:可进入性。允许使用
cd
。这在系统范围内得到尊重,并且会阻止文件夹在 GUI 文件资源管理器中打开。
在某些系统上,尤其是 macOS,文件权限字符串后可能有一个“@”。这意味着该文件具有扩展属性,您可以使用 ls -l@
检查这些属性。例如,com.apple.quarantine
属性被分配给尚未打开的可执行文件,这样 Gatekeeper 就可以阻止您双击它,强制您右键单击 > 打开,然后如果您真的确定要打开它,则不必要地提示您。
什么是文件所有者和组?
文件所有者只是一个特定的用户,但 Unix 系统中的用户不像在 Windows 中那样工作。 Unix 可以为单独的进程设置不同的用户,例如 mysql
和 nginx
。这可以使权限非常详细;例如,在 mysql
用户下运行的 MySQL 实例可以访问其自己的数据库,但 nginx
用户不能。
用户组以类似的方式工作,但支持具有相同权限的多个用户。可以在组中添加和删除用户,并且他们对于设置文件权限是可选的。
如何检查目录的文件权限
您可以通过在终端中运行 ls -l
查看文件和目录权限。文件权限显示在最右侧:

如果您想显示特定文件或目录的文件权限,您需要将 ls
输出通过管道传输到 grep
:
ls -la | grep filename
请注意,当使用 -a
标志时,当前文件夹和父文件夹的权限显示为 .
和 ..
。但是,即使这样也只显示两个级别的权限。要显示每个父文件夹的权限,您需要使用 namei
命令:
namei -l `pwd`
此命令可能不会安装在每个 Linux 发行版上。在 macOS 上,你必须从 brew 安装它。
要在这些文件夹中搜索可能具有错误权限的单个文件,您可以使用带有 -perm
标志的 find
命令:
find ~ -type f -perm 777
这会递归搜索,如果您在根目录上运行它可能需要一些时间。
如何更改文件权限和所有权
使用 chmod
命令更改文件权限很简单:
chmod 700 filename
您还可以在不指定完整权限字符串的情况下添加权限。这是一条捷径,但可以节省一些时间。例如,如果您无法打开脚本文件,您可以为所有者添加执行权限:
chmod u+x filename
这为当前所有者(u,表示“用户”)添加了执行 (x) 权限。
更改所有者的工作方式与 chown
命令类似:
chown owner:group filename
“:group” 是可选的。 chmod
和 chown
都可以在目录上递归运行,以更改这些目录中所有内容的文件权限。为此,请使用大写的 -R
标志:
chmod 700 -R directory
您还可以使用 chmod
作为 find
的 -exec
选项,这样您就可以更改整个系统的文件权限。例如,此命令将查找具有开放写入权限的文件,并将它们设置为只读:
find / -type f -perm 777 -print -exec chmod 744 {} ;