3.4. 文件安全性

3.4.1. 访问权限:Linux 的第一道防线

Linux 安全模型基于 UNIX 系统使用的模型,并且与 UNIX 安全模型一样严格(有时甚至更严格),而 UNIX 安全模型已经非常强大。在 Linux 系统上,每个文件都归一个用户和一个用户组所有。还有第三类用户,即非文件所有者用户且不属于拥有该文件的用户组的用户。对于每个用户类别,可以授予或拒绝读取、写入和执行权限。

我们已经使用 long 选项通过 ls -l 命令列出文件,尽管是出于其他原因。此命令还显示这三个用户类别的文件权限;它们由第一个字符后的九个字符指示,第一个字符是文件属性行开头的文件类型指示符。如下例所示,这九个字符系列中的前三个字符显示实际文件所有者的访问权限。接下来的三个字符是文件所属用户组的权限,最后三个字符是其他用户的权限。权限始终按相同顺序排列:用户、用户组和其他用户的读取、写入、执行权限。一些例子

marise:~> ls -l To_Do
-rw-rw-r--    1 marise  users      5 Jan 15 12:39 To_Do
marise:~> ls -l /bin/ls
-rwxr-xr-x    1 root    root   45948 Aug  9 15:01 /bin/ls*

第一个文件是普通文件(第一个破折号)。用户名为 marise 的用户或属于用户组 users 的用户可以读取和写入(更改/移动/删除)该文件,但他们不能执行它(第二个和第三个破折号)。所有其他用户只允许读取此文件,但他们不能写入或执行它(第四个和第五个破折号)。

第二个例子是可执行文件,区别在于:每个人都可以运行此程序,但您需要成为 root 才能更改它。

Info 页面详细解释了 ls 命令如何处理访问权限的显示,请参阅 列出的信息 部分。

为了方便与命令一起使用,访问权限或模式以及用户组都有一个代码。请参阅下表。

表 3-7. 访问模式代码

代码含义
0 或 -本应在此位置的访问权限未被授予。
4 或 r已授予在此位置定义的用户类别的读取权限
2 或 w已授予在此位置定义的用户类别的写入权限
1 或 x已授予在此位置定义的用户类别的执行权限

表 3-8. 用户组代码

代码含义
u用户权限
g用户组权限
o其他用户的权限

这种直接的方案应用非常严格,即使没有网络安全,也允许高水平的安全性。在其他功能中,安全方案负责用户对程序的访问,它可以按需提供文件,并保护敏感数据,例如主目录和系统配置文件。

您应该知道您的用户名是什么。如果您不知道,可以使用 id 命令显示,该命令还会显示您所属的默认用户组以及您最终成为成员的其他用户组

tilly:~> id
uid=504(tilly) gid=504(tilly) groups=504(tilly),100(users),2051(org)

您的用户名也存储在环境变量中USER:

tilly:~> echo $USER
tilly

3.4.2. 工具

3.4.2.1. chmod 命令

应用严格文件权限的一个正常结果,有时也是一个麻烦,是出于各种原因需要更改访问权限。我们使用 chmod 命令来执行此操作,最终 to chmod 几乎已成为可接受的英语动词,意思是更改文件的访问模式。chmod 命令可以与字母数字或数字选项一起使用,随您喜欢。

下面的示例使用字母数字选项,以便解决新用户经常出现的问题

asim:~> ./hello
bash: ./hello: bad interpreter: Permission denied

asim:~> cat hello
#!/bin/bash
echo "Hello, World"

asim:~> ls -l hello
-rw-rw-r--    1 asim    asim    32 Jan 15 16:29 hello

asim:~> chmod u+x hello

asim:~> ./hello
Hello, World

asim:~> ls -l hello
-rwxrw-r--   1 asim    asim    32 Jan 15 16:29 hello*

+- 运算符用于授予或拒绝给定组的给定权限。允许使用逗号分隔的组合。Info 和 man 页面包含有用的示例。这是另一个示例,它使上一个示例中的文件成为用户 asim 的私有文件

asim:~> chmod u+rwx,go-rwx hello

asim:~> ls -l hello
-rwx------    1 asim    asim    32 Jan 15 16:29 hello*

导致错误消息说某处权限被拒绝的那种问题通常是大多数情况下访问权限的问题。此外,诸如 “昨天还能用,”“当我以 root 身份运行时它就可以工作,” 之类的评论很可能是由错误的文件权限引起的。

当使用带有数字参数的 chmod 时,每个授予的访问权限的值必须按组一起计数。因此,我们得到一个 3 位数字,它是 chmod 必须进行的设置的符号值。下表列出了最常见的组合

表 3-9. 使用 chmod 进行文件保护

命令含义
chmod400 文件防止文件被意外覆盖。
chmod500 目录保护您自己免受意外删除、重命名或移动此目录中的文件。
chmod600 文件只有输入此命令的用户才能更改的私有文件。
chmod644 文件公开可读的文件,只能由发出用户更改。
chmod660 文件属于您用户组的用户可以更改此文件,其他用户根本无法访问它。
chmod700 文件防止其他用户访问文件,同时发出用户仍然具有完全访问权限。
chmod755 目录对于应可由其他人读取和执行,但只能由发出用户更改的文件。
chmod775 文件用户组的标准文件共享模式。
chmod777 文件每个人都可以对此文件执行任何操作。

如果您输入少于三位数字作为 chmod 的参数,则省略的字符将从左侧开始替换为零。Linux 系统实际上有第四位数字,它位于前三位数字之前并设置特殊访问模式。有关这些以及更多内容的所有信息都位于 Info 页面中。

3.4.2.2. 登录到另一个用户组

当您在命令行中键入 id 时,您会获得您可以加入的所有用户组的列表,前面是您的用户名和 ID 以及您当前连接的用户组名称和 ID。但是,在许多 Linux 系统上,您一次只能主动登录到一个用户组。默认情况下,此活动或主用户组是您从/etc/passwd文件中分配到的用户组。此文件的第四个字段包含用户的主用户组 ID,该 ID 在/etc/group文件中查找。一个例子

asim:~> id
uid=501(asim) gid=501(asim) groups=100(users),501(asim),3400(web)

asim:~> grep asim /etc/passwd
asim:x:501:501:Asim El Baraka:/home/asim:/bin/bash

asim:~> grep 501 /etc/group
asim:x:501:

来自/etc/passwd行的第四个字段包含值 “501”,在上面的示例中,它代表用户组 asim。从/etc/group我们可以获得与此用户组 ID 匹配的名称。最初连接到系统时,这是 asim 将所属的用户组。

Note用户私有用户组方案
 

为了允许更大的灵活性,大多数 Linux 系统都遵循所谓的用户私有用户组方案,该方案将每个用户主要分配到他或她自己的用户组。此用户组是仅包含该特定用户的用户组,因此得名 “私有用户组”。通常,此用户组与用户登录名同名,这可能会有点令人困惑。

除了他自己的私有用户组外,用户 asim 也可以在用户组 usersweb 中。因为这些是该用户的辅助用户组,所以他需要使用 newgrp 登录到这些用户组中的任何一个(首先使用 gpasswd 设置用户组密码)。在示例中,asim 需要创建由用户组 web 拥有的文件。

asim:/var/www/html> newgrp web

asim:/var/www/html> id
uid=501(asim) gid=3400(web) groups=100(users),501(asim),3400(web)

asim 现在创建新文件时,它们将属于用户组 web 的所有权,而不是由用户组 asim 拥有

asim:/var/www/html> touch test

asim:/var/www/html> ls -l test
-rw-rw-r--  1 asim web   0 Jun 10 15:38 test

登录到新用户组可以避免您必须使用 chown(请参阅 3.4.2.4 节)或致电系统管理员为您更改所有权。

有关更多信息,请参阅 newgrp 的 man 页面。

3.4.2.3. 文件掩码

当新文件保存到某处时,它首先要经过标准安全程序。Linux 上不存在没有权限的文件。标准文件权限由用于创建新文件的掩码确定。可以使用 umask 命令显示此掩码的值

bert:~> umask
0002

chmod 一样,对于计算新文件的权限,它们需要从总的可能访问权限中减去,而不是将符号值彼此相加。但是,在上面的示例中,我们看到显示了 4 个值,但只有 3 个权限类别:用户用户组其他。第一个零是特殊文件属性设置的一部分,我们将在 3.4.2.4 节4.1.6 节 中讨论。当输入 umask 命令时,您的系统可能根本不显示第一个零,而您只看到 3 个数字,代表默认文件创建掩码。

每个类似 UNIX 的系统都有一个用于创建新文件的系统函数,每次用户使用创建新文件的程序时都会调用该函数,例如,从 Internet 下载文件、保存新文本文档等等。此函数创建新文件和新目录。创建新目录时,会向每个人授予完全的读取、写入和执行权限。创建新文件时,此函数将为每个人授予读取和写入权限,但将所有用户类别的执行权限设置为无。因此,在应用掩码之前,目录的权限为 777rwxrwxrwx,普通文件的权限为 666rw-rw-rw-

在函数创建新文件或目录后,umask 值将从这些默认权限中减去。因此,如果掩码值为 (0)002,则目录的默认权限为 775,文件的默认权限为 664。这在下面的示例中得到了演示

bert:~> mkdir newdir

bert:~> ls -ld newdir
drwxrwxr-x    2 bert    bert		4096 Feb 28 13:45 newdir/

bert:~> touch newfile

bert:~> ls -l newfile
-rw-rw-r--    1 bert    bert		   0 Feb 28 13:52 newfile

Note文件与目录
 

默认情况下,目录具有更多权限:它始终具有执行权限。如果它没有该权限,则将无法访问。通过 chmod 将目录设置为 644 来尝试一下!

如果您使用 newgrp 命令登录到另一个用户组,则掩码保持不变。因此,如果将其设置为 002,则您在新用户组中创建的文件和目录也可以供该用户组的其他成员访问;您不必使用 chmod

root 用户通常具有更严格的默认文件创建权限

[root@estoban root]# umask
022

这些默认值在 shell 资源配置文件中系统范围地设置,例如/etc/bashrc/etc/profile。您可以在自己的 shell 配置文件中更改它们,请参阅关于自定义 shell 环境的 第 7 章

3.4.2.4. 更改用户和用户组所有权

当文件由错误的用户或用户组拥有时,可以使用 chown(更改所有者)和 chgrp(更改用户组)命令修复错误。在需要在一个用户组中共享文件的环境中,更改文件所有权是一项常见的系统管理任务。这两个命令都非常灵活,您可以通过使用--help选项来了解。

chown 命令可用于更改文件的用户和用户组所有权,而 chgrp 仅更改用户组所有权。当然,系统将检查发出这些命令之一的用户是否对她要更改的文件具有足够的权限。

为了仅更改文件的用户所有权,请使用以下语法

chown新用户 文件

如果您在用户名后使用冒号(请参阅 Info 页面),用户组所有权也将更改为发出命令的用户的主用户组。在 Linux 系统上,每个用户都有自己的用户组,因此可以使用此形式来使文件成为私有的

jacky:~> id
uid=1304(jacky) gid=(1304) groups=1304(jacky),2034(pproject)

jacky:~> ls -l my_report
-rw-rw-r--  1 jacky   project       29387 Jan 15 09:34 my_report

jacky:~> chown jacky: my_report

jacky:~> chmod o-r my_report

jacky:~> ls -l my_report
-rw-rw----  1 jacky   jacky         29387 Jan 15 09:34 my_report

如果 jacky 想要共享此文件,而无需授予每个人写入权限,他可以使用 chgrp 命令

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   jacky   45635 Jan 15 09:35 report-20020115.xls

jacky:~> chgrp project report-20020115.xls

jacky:~> chmod o= report-20020115.xls

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   project 45635 Jan 15 09:35 report-20020115.xls

这样,用户组 project 中的用户将能够处理此文件。不在此用户组中的用户与此文件无关。

chownchgrp 都可以使用-R选项以递归方式更改所有权。在这种情况下,给定目录的所有底层文件和子目录都将属于给定的用户和/或用户组。

Note限制
 

在大多数系统上,对于非特权用户,chownchgrp 命令的使用受到限制。如果您不是系统的管理员,则出于安全原因,您无法更改用户或用户组所有权。如果不对这些命令的使用进行限制,恶意用户可能会将文件的所有权分配给其他用户和/或用户组,并更改这些用户的环境的行为,甚至对其他用户的文件造成损害。

3.4.2.5. 特殊模式

为了使系统管理员不必一直为解决权限问题而烦恼,可以为整个目录或单独的程序授予特殊访问权限。有三种特殊模式

  • 粘滞位模式:作业执行后,该命令保留在系统内存中。最初,这是一个经常使用的功能,用于节省内存:大型作业仅加载到内存一次。但是现在内存很便宜,并且有更好的技术来管理它,因此它不再用于其在单个文件上的优化功能。但是,当应用于整个目录时,粘滞位具有不同的含义。在这种情况下,用户只有在她是文件的所有者用户或文件具有适当权限时才能更改此目录中的文件。此功能用于诸如/var/tmp之类的目录,这些目录必须对每个人都可访问,但不适合用户更改或删除彼此的数据。粘滞位由文件权限字段末尾的 t 指示

    mark:~> ls -ld /var/tmp
    drwxrwxrwt   19 root     root         8192 Jan 16 10:37 /var/tmp/
    

    粘滞位使用命令 chmod o+t 目录 设置。 “t” 的历史渊源在于 UNIX 的 保存文本访问 功能。

  • SUID(设置用户 ID)和 SGID(设置用户组 ID):由用户或用户组权限字段中的字符 s 表示。当此模式在可执行文件上设置时,它将以文件上的用户和用户组权限而不是发出命令的用户的权限运行,从而提供对系统资源的访问。我们将在 第 4 章 中进一步讨论这一点。

  • 目录上的 SGID(设置用户组 ID):在这种特殊情况下,目录中创建的每个文件都将具有与目录本身相同的用户组所有者(而正常行为是新文件由创建它们的用户拥有)。这样,用户在共享目录时不必担心文件所有权

    mimi:~> ls -ld /opt/docs
    drwxrws---  4 root    users          4096 Jul 25 2001 docs/
    
    mimi:~> ls -l /opt/docs
    -rw-rw----  1 mimi    users        345672 Aug 30 2001-Council.doc
    

    这是 UNIX 中共享文件的标准方式。

    Note现有文件保持不变!
     

    移动到 SGID 目录但在其他位置创建的文件保留其原始用户和用户组所有者。这可能会令人困惑。