文件和文件系统安全性

在将您的系统联线之前,几分种的准备和计划能帮助您保护它们和存储其中的数据。

umask 设定

umask 命令是用来决定您系统中文件建立的默认模式(权限)。它是期望模式(权限)的八进制补码。如果在建立文件时没有指定其权限,该文件可能不为建立它的用户所知地对其他人开放读或者写权限。常用的 umask 设定有 022027077 (最严格)。一般在 /etc/profile 中设置 umask,因此这一设置适用于系统上全部用户。文件建立掩码可以通过从 777 中减去期望的值计算得到。换句话说,掩码为 777 将导致新建立的文件对于任何人都不能够读、写及执行。掩码为 666 将导致新建立的文件具有 111 模式。例如:

# 设定用户默认 umask
umask 033

请确保将 root 的 umask 设为 077,以保证除非显式使用 chmod 改变,其他用户既不能读写也不能执行。在这种情况下,新建立的目录会有 744 权限(从 777 中减去 033 得到)。使用 033 umask 新建立的文件将拥有 644 权限。

[Note]

Mandrakelinux 中,只需要对 umask 使用 002。这是因为默认配置下,每个用户自成一组。

文件权限

确保您的系统文件不会被那些不作系统维护的用户意外修改是很重要的。

UNIX 将文件和目录的访问权限分为三组:所有者、所有者组、和其他人,分别由一个所有者、一些同组的成员、以及其余所有人组成。

UNIX 权限简介:

所有权 – 用户和组拥有的对该节点及其父节点权限的控制权。

权限 – 能够设置和清除以允许对文件的某一访问权限的二进制位。目录权限其含义可能不同于具有同一权限的文件。

读:

  • 能够查看文件内容。

  • 能够浏览目录内容。

写:

  • 能够添加或改变文件内容。

  • 能够在目录里删除或移动文件。

执行:

  • 能够运行二进制程序或 shell 脚本。

  • 同读权限结合能够在目录搜索。

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

当应用于目录以及文件时,"粘滞位(sticky bit)"分别具有不同含义。如果设定了某一目录的粘滞位,即使对该目录有写权限的用户,他也只能删除其中他拥有的并且被显式赋予写权限的文件。这是为诸如 /tmp 等目录而设计的。这些目录所有人都可以写,但是不允许任何用户删除文件。在详细目录列表中,粘滞位表示为 t

SUID 属性:(对于文件)

这表示文件具有“固定用户标识(set-user-id)”位。当在拥有权限中设定了固定用户 ID 访问权限,并且该文件是可执行的,那么运行它的进程就被赋予了该文件所有者的访问系统资源的权限(相对于建立该进程用户的权限)。这是许多"内存泄漏"安全漏洞的肇因。

SGID 属性:(对于文件)

通过在组权限中设定这一属性能够控制文件的 "set group id (固定组标识)" 状态。它的作用和 suid 一样,不过它是影响组的。

SGID 属性:(对于目录)

如果您对某个目录设置了 SGID 属性位(通过 chmod g+s 目录 命令),在该目录中建立的文件的组将会被设为该目录的组。

您 – 文件所有者。

组 – 您所隶属的(用户)组。

其他人 – 系统中所有者及其组成员以外的人。

文件举例:

-rw-r--r--  1 zhang  users         114 Aug 28  1997 .zlogin
1号位 - 是否为目录?     (不是)
 2号位 - 所有者可读?     (是的,zhang 用户)
  3号位 - 所有者可写?     (是的,zhang 用户)
   4号位 - 所有者可执行?   (不是)
    5号位 - 组可读?         (是的,users 组)
     6号位 - 组可写?         (不是)
      7号位 - 组可执行?       (不是)
       8号位 - 其他人可读?     (是的,所有人)
        9号位 - 其他人可写?     (不是)
         10号位 - 其他人可执行?  (不是)

以下几行列举了满足所需访问权限的最小权限集合。您可以给予更多的权限,但这里只描述这些最小权限对于文件的作用:

-r--------  允许文件所有者读取该文件
--w-------  允许文件所有者修改或删除该文件
                (注意:对该文件所在目录拥有写权限的任何人
                       都能通过覆盖该文件从而删除它)
---x------  允许所有者执行该程序,要执行 shell 脚本
                还需要读权限
---s------  以有效用户 ID = 所有者的执行
------s---  以有效组 ID = 组的执行
-rw------T  不能更新 "最新修改时间(last modified time)"。
                通常用于交换文件
---------t  无效。(前述“粘滞位”)

目录举例:

drwxr-xr-x  3 zhang  users         512 Sep 19 13:47 .public_html/
1号位 - 是否为目录?     (是的,它包含许多文件)
 2号位 - 所有者可读?     (是的,zhang 用户)
  3号位 - 所有者可写?     (是的,zhang 用户)
   4号位 - 所有者可执行?   (是的,zhang 用户)
    5号位 - 组可读?        (是的,users 组)
     6号位 - 组可写?        (不是)
      7号位 - 组可执行?      (是的,users 组)
       8号位 - 其他人可读?    (是的,所有人)
        9号位 - 其他人可写?    (不是)
         10号位 - 其他人可执行?  (是的,所有人)

以下几行列举了满足所需访问权限的最小权限集合。您可以给予更多的权限,但这里只描述这些最小权限对于目录的作用:

dr--------  能够浏览内容,但不能读取文件属性
d--x------  能够进入该目录,也可包含于完整执行路径中
dr-x------  文件属性能被其所有者读取
d-wx------  能够建立/删除文件,既使该目录不是当前目录
d-----x--t  防止拥有写权限的其他人删除文件。
                用于 /tmp 目录
d--s--s---  无效

系统配置文件(通常在 /etc 目录中)的模式通常为 640 (-rw-r-----),并由 root 所有。取决于您站点的安全性需求,您可能想要对其调整。决不要让系统文件对于某个组或是其他人可写。某些配置文件(包括 /etc/shadow)应该只能由 root 读取,并且 /etc 中的目录至少应该阻止其他人访问。

SUID Shell 脚本

suid shell 脚本是一个严重的安全隐患,因此内核不会信任它们。不论您认为 shell 如何地安全,它仍然可以被骇客利用来得到 root shell

完整性检查

检测您系统上本地(以及网络)攻击的另一个好方法是执行完整性检查程序,例如 TripwireAideOsiris。这些完整性检查程序对您所有重要的二进制代码和配置文件执行一系列校验,并将它们与先前已知完好的数据库进行比较以作为参考。因此,对这些文件任何的更改都会被标出。

请将这些类型的程序安装到软盘上,然后设置该软盘的物理写保护。这样一来,入侵者就不能篡改完整性检查程序本身或是数据库了。一旦您按照上述方法装备完毕,请将其作为您日常安全管理职责的一部分来执行它,以察看是否存在任何更改。

您甚至可以添加一条 crontab 条目以便每晚从软盘上执行该检查程序,并且将结果在早晨寄给您。例如:

# 设定收件人
MAILTO=zhang
# 运行 Tripwire
15 05 * * * root /usr/local/adm/tcheck/tripwire

将在每天早晨 5:15am 给您寄送一份报告。

完整性检查程序能在您察觉入侵者之前侦测到他们。因为在您的系统中可能有许许多多文件更改,您需要仔细确定什么是骇客行为,而什么是您自己的。

您能在 TripWire 网站上找到免费的但不提供支持的 Tripwire 版本。手册和技术支持需要购买。

可在 Sourceforge 上找到 Aide

可在 OSIRIS –– 主机完整性管理网站找到 OSIRIS

特洛伊木马

"特洛伊木马"因荷马史诗"伊利亚德(Iliad)"中虚构的战役命名。其思想是骇客发布某个听起来不错的程序或二进制代码,并鼓励人们下载并以 root 权限执行。随后,该程序会在他们不注意的时候破坏他们的系统。虽然他们认为他们下载的二进制代码做了某事(可能挺好),然而它同时也破坏了他们的安全性。

您应该注意在您的计算机上都安装了哪些程序。Mandrakesoft 在它提供的 RPM 文件上包含 MD5 校验及 PGP 签名,以便您可以验证您正在安装的确实是真实的东西。决不要以 root 身份运行任何不熟悉的,没有其源代码的程序!几乎没有骇客会愿意公布源代码让公众审查。

虽然可能挺复杂,但是请确定您从其真实的发布站点得到该程序的源代码。如果该程序要以 root 身份执行,请确定您或您所信任的某人已经查看并确认了其源代码。