5. 文件和文件系统安全

在您的系统上线之前,花几分钟时间进行准备和规划,可以帮助保护它们以及存储在它们上面的数据。

5.1. Umask 设置

Theumask命令可用于确定系统上的默认文件创建模式。它是所需文件模式的八进制补码。如果创建文件时未考虑其权限设置,则用户可能会无意中将读或写权限授予不应具有此权限的某人。典型的umask设置包括022, 027,和077(这是最严格的)。通常 umask 设置在/etc/profile中,因此它适用于系统上的所有用户。生成的权限计算如下:用户/组/其他人的默认权限(目录为 7,文件为 6)与反掩码 (NOT) 使用按位 AND 组合。

示例 1

文件,默认 6,二进制:110 掩码,例如 2:010,NOT:101

结果权限,AND:100(等于 4,r__)

示例 2

文件,默认 6,二进制:110 掩码,例如 6:110,NOT:001

结果权限,AND:000(等于 0,___)

示例 3

目录,默认 7,二进制:111 掩码,例如 2:010,NOT:101

结果权限,AND:101(等于 5,r_x)

示例 4

目录,默认 7,二进制:111 掩码,例如 6:110,NOT:001

结果权限,AND:001(等于 1,__x)

		# Set the user's default umask
		umask 033
务必使 root 的 umask 为077,这将禁用其他用户的读取、写入和执行权限,除非使用chmod显式更改。在这种情况下,新创建的目录将具有 744 权限,通过从 777 中减去 033 获得。使用 033 umask 新创建的文件将具有 644 权限。

如果您正在使用 Red Hat,并遵守他们的用户和组 ID 创建方案(用户私有组),则仅需要使用002用于umask。这是因为默认配置是每个组一个用户。

5.2. 文件权限

确保您的系统文件不会被不应进行此类系统维护的用户和组随意编辑,这一点很重要。

Unix 根据三个特征分隔文件和目录的访问控制:所有者、组和其他人。始终恰好有一个所有者,组的任意数量成员,以及其他所有人。

Unix 权限的快速解释

所有权 - 哪个用户和组保留对节点及其父节点的权限设置的控制

权限 - 能够设置或重置的位,以允许对其进行某些类型的访问。目录的权限可能与文件上相同权限集的含义不同。

读取

写入

执行

保存文本属性:(对于目录)

“粘滞位”在应用于目录时,其含义与应用于文件时不同。如果目录上设置了粘滞位,则用户只能删除他拥有的文件或他被授予显式写入权限的文件,即使他具有对目录的写入访问权限也是如此。这是为像/tmp这样的全局可写目录设计的,在这些目录中,可能不希望允许任何用户随意删除文件。粘滞位在长目录列表中显示为t

SUID 属性:(对于文件)

这描述了文件上的设置用户 ID 权限。当所有者权限中设置了设置用户 ID 访问模式,并且该文件是可执行文件时,运行它的进程将被授予基于拥有该文件的用户的系统资源访问权限,而不是创建该进程的用户。这是许多“缓冲区溢出”漏洞利用的原因。

SGID 属性:(对于文件)

如果在组权限中设置,则此位控制文件的“设置组 ID”状态。它的行为方式与 SUID 相同,只是影响的是组。该文件必须是可执行文件才能产生任何效果。

SGID 属性:(对于目录)

如果您在目录上设置 SGID 位(使用chmod g+s directory),则在该目录中创建的文件将将其组设置为目录的组。

您 - 文件的所有者

组 - 您所属的组

所有人 - 系统上不是所有者或组成员的任何人

文件示例

        -rw-r--r--  1 kevin  users         114 Aug 28  1997 .zlogin
        1st bit - directory?             (no)
         2nd bit - read by owner?         (yes, by kevin)
          3rd bit - write by owner?        (yes, by kevin)
           4th bit - execute by owner?      (no)
            5th bit - read by group?         (yes, by users)
             6th bit - write by group?        (no)
              7th bit - execute by group?      (no)
               8th bit - read by everyone?      (yes, by everyone)
                9th bit - write by everyone?     (no)
                 10th bit - execute by everyone?  (no)

以下行是执行描述的访问所需的最小权限集示例。您可能希望授予比此处列出的权限更多的权限,但这应该描述这些最小权限在文件上的作用

-r--------  Allow read access to the file by owner
--w-------  Allows the owner to modify or delete the file
            (Note that anyone with write permission to the directory
             the file is in can overwrite it and thus delete it)
---x------  The owner can execute this program, but not shell scripts, 
	     which still need read permission
---s------  Will execute with effective User ID = to owner
--------s-  Will execute with effective Group ID = to group
-rw------T  No update of "last modified time".  Usually used for swap
	     files
---t------  No effect.  (formerly sticky bit)

目录示例
        drwxr-xr-x  3 kevin  users         512 Sep 19 13:47 .public_html/
        1st bit - directory?             (yes, it contains many files)
         2nd bit - read by owner?         (yes, by kevin)
          3rd bit - write by owner?        (yes, by kevin)
           4th bit - execute by owner?      (yes, by kevin)
            5th bit - read by group?         (yes, by users
             6th bit - write by group?        (no)
              7th bit - execute by group?      (yes, by users)
               8th bit - read by everyone?      (yes, by everyone)
                9th bit - write by everyone?     (no)
                 10th bit - execute by everyone?  (yes, by everyone)

以下行是执行描述的访问所需的最小权限集示例。您可能希望授予比列出的权限更多的权限,但这应该描述这些最小权限在目录上的作用

dr--------  The contents can be listed, but file attributes can't be read
d--x------  The directory can be entered, and used in full execution paths
dr-x------  File attributes can be read by owner
d-wx------  Files can be created/deleted, even if the directory
	     isn't the current one
d------x-t  Prevents files from deletion by others with write
	     access. Used on /tmp
d---s--s--  No effect

系统配置文件(通常在/etc中)通常是模式640 (-rw-r-----),并且由 root 拥有。根据您站点的安全要求,您可能会调整此设置。永远不要让任何系统文件可由组或所有人写入。某些配置文件,包括/etc/shadow,应该只能由 root 读取,并且/etc中的目录至少不应可被其他人访问。

SUID Shell 脚本

SUID shell 脚本是一个严重的安全风险,因此内核不会尊重它们。无论您认为 shell 脚本有多安全,它都可能被利用来为攻击者提供 root shell。

5.3. 完整性检查

检测本地(以及网络)对您系统的攻击的另一种非常好的方法是运行完整性检查器,例如Tripwire, AideOsiris。这些完整性检查器对所有重要的二进制文件和配置文件运行多个校验和,并将它们与先前已知的良好值的数据库进行比较作为参考。因此,文件中的任何更改都将被标记。

最好将这些程序安装到软盘上,然后物理设置软盘的写保护。这样,入侵者就无法篡改完整性检查器本身或更改数据库。一旦您设置了类似这样的东西,最好将其作为您正常安全管理职责的一部分运行,以查看是否有任何更改。

您甚至可以添加一个crontab条目,以每天晚上从您的软盘运行检查器,并在早上将结果邮寄给您。类似
		# set mailto
		MAILTO=kevin
		# run Tripwire
		15 05 * * * root /usr/local/adm/tcheck/tripwire 
这样的内容将在每天早上 5:15am 向您发送报告。

完整性检查器可能是检测入侵者的天赐之物,在您注意到他们之前。由于平均系统上会更改很多文件,因此您必须小心区分哪些是攻击者的活动,哪些是您自己的操作。

您可以在 http://www.tripwire.org 找到免费的、不受支持的Tripwire版本,免费。手册和支持可以购买。

Aide可以在 http://www.cs.tut.fi/~rammer/aide.html 找到。

Osiris可以在 http://www.shmoo.com/osiris/ 找到。

5.4. 特洛伊木马

“特洛伊木马”以维吉尔《埃涅伊德》中的寓言诡计命名。其思想是,攻击者分发一个听起来很棒的程序或二进制文件,并鼓励其他人下载并以 root 身份运行它。然后,该程序可以在他们不注意的情况下危害他们的系统。虽然他们认为他们刚刚下载的二进制文件做一件事(并且它很可能确实如此),但它也会危害他们的安全。

您应该注意您在机器上安装的程序。RedHat 在其 RPM 文件上提供 MD5 校验和和 PGP 签名,以便您可以验证您正在安装真实的东西。其他发行版也有类似的方法。您永远不应该运行任何不熟悉的二进制文件,您没有其源代码,并且以 root 身份运行。很少有攻击者愿意发布源代码以供公众审查。

虽然它可能很复杂,但请确保您从其真正的发行站点获取程序的源代码。如果该程序将以 root 身份运行,请确保您或您信任的某人已查看过源代码并对其进行了验证。