在您的系统上线之前,花几分钟时间进行准备和规划,可以帮助保护它们以及存储在它们上面的数据。
用户的 home 目录绝不应该允许从那里运行 SUID/SGID 程序。在nosuid选项中,用于/etc/fstab对于可被 root 以外的用户写入的分区。您可能还希望在用户 home 分区以及nodev和noexec上使用/var,从而禁止程序的执行以及字符或块设备的创建,而这些设备无论如何都不应该是必要的。
如果您正在使用 NFS 导出文件系统,请务必使用尽可能严格的访问权限配置/etc/exports。这意味着不使用通配符,不允许 root 用户写入访问,并在可能的情况下导出为只读。
将用户的默认文件创建umask配置为尽可能严格。请参阅 第 5.1 节。
如果您正在使用网络文件系统(如 NFS)挂载文件系统,请务必使用适当的限制配置 /etc/exports。通常,使用 `nodev`、`nosuid`,或许还有 `noexec` 是可取的。
设置文件系统限制,而不是允许unlimited作为默认值。您可以使用 resource-limits PAM 模块和/etc/pam.d/limits.conf控制每个用户的限制。例如,组users的限制可能如下所示
@users hard core 0 @users hard nproc 50 @users hard rss 5000 |
这表示禁止创建 core 文件,将进程数限制为 50,并将每个用户的内存使用量限制为 5M。
您还可以使用 /etc/login.defs 配置文件来设置相同的限制。
The/var/log/wtmp和/var/run/utmp文件包含系统上所有用户的登录记录。必须维护它们的完整性,因为它们可以用于确定用户(或潜在的入侵者)何时以及从何处进入您的系统。这些文件也应该具有644权限,而不会影响正常的系统运行。
不可变位可以用于防止意外删除或覆盖必须保护的文件。它还可以防止某人创建指向该文件的硬链接。请参阅chattr(1) 手册页,了解有关不可变位的信息。
系统上的 SUID 和 SGID 文件是潜在的安全风险,应密切监控。由于这些程序授予执行它们的用户特殊权限,因此有必要确保未安装不安全的程序。攻击者最喜欢的伎俩是利用 SUID-root 程序,然后留下一个 SUID 程序作为后门,以便下次进入,即使原始漏洞已修复。
查找系统上所有 SUID/SGID 程序,并跟踪它们是什么,以便您了解任何可能表明潜在入侵者的更改。使用以下命令查找系统上所有 SUID/SGID 程序
root# find / -type f \( -perm -04000 -o -perm -02000 \) |
Debian 发行版每天晚上运行一个作业,以确定存在哪些 SUID 文件。然后,它将此与前一晚的运行进行比较。您可以查看/var/log/setuid*以获取此日志。
您可以使用chmod删除可疑程序上的 SUID 或 SGID 权限,然后在您绝对认为必要时将其恢复。
全局可写文件,尤其是系统文件,如果攻击者获得对您的系统的访问权限并修改它们,则可能成为安全漏洞。此外,全局可写目录也很危险,因为它们允许攻击者随意添加或删除文件。要定位系统上所有全局可写文件,请使用以下命令
root# find / -perm -2 ! -type l -ls |
未拥有的文件也可能表明入侵者已访问您的系统。您可以使用以下命令在您的系统上找到没有所有者或不属于任何组的文件
root# find / \( -nouser -o -nogroup \) -print |
查找.rhosts文件应该是您日常系统管理职责的一部分,因为这些文件不应在您的系统上被允许。请记住,攻击者只需要一个不安全的帐户就可能获得对您整个网络的访问权限。您可以使用以下命令在您的系统上找到所有.rhosts文件
root# find /home -name .rhosts -print |
最后,在更改任何系统文件的权限之前,请确保您了解自己在做什么。永远不要因为更改文件权限似乎是让事情正常运行的简单方法而更改它。在更改文件权限之前,始终要确定文件具有该权限的原因。
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 |
如果您正在使用 Red Hat,并遵守他们的用户和组 ID 创建方案(用户私有组),则仅需要使用002用于umask。这是因为默认配置是每个组一个用户。
确保您的系统文件不会被不应进行此类系统维护的用户和组随意编辑,这一点很重要。
Unix 根据三个特征分隔文件和目录的访问控制:所有者、组和其他人。始终恰好有一个所有者,组的任意数量成员,以及其他所有人。
Unix 权限的快速解释
所有权 - 哪个用户和组保留对节点及其父节点的权限设置的控制
权限 - 能够设置或重置的位,以允许对其进行某些类型的访问。目录的权限可能与文件上相同权限集的含义不同。
读取
能够查看文件内容
能够读取目录
写入
能够添加或更改文件
能够删除或移动目录中的文件
执行
能够运行二进制程序或 shell 脚本
能够搜索目录,与读取权限结合使用
“粘滞位”在应用于目录时,其含义与应用于文件时不同。如果目录上设置了粘滞位,则用户只能删除他拥有的文件或他被授予显式写入权限的文件,即使他具有对目录的写入访问权限也是如此。这是为像/tmp这样的全局可写目录设计的,在这些目录中,可能不希望允许任何用户随意删除文件。粘滞位在长目录列表中显示为t。
这描述了文件上的设置用户 ID 权限。当所有者权限中设置了设置用户 ID 访问模式,并且该文件是可执行文件时,运行它的进程将被授予基于拥有该文件的用户的系统资源访问权限,而不是创建该进程的用户。这是许多“缓冲区溢出”漏洞利用的原因。
如果在组权限中设置,则此位控制文件的“设置组 ID”状态。它的行为方式与 SUID 相同,只是影响的是组。该文件必须是可执行文件才能产生任何效果。
如果您在目录上设置 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 脚本是一个严重的安全风险,因此内核不会尊重它们。无论您认为 shell 脚本有多安全,它都可能被利用来为攻击者提供 root shell。
检测本地(以及网络)对您系统的攻击的另一种非常好的方法是运行完整性检查器,例如Tripwire, Aide或Osiris。这些完整性检查器对所有重要的二进制文件和配置文件运行多个校验和,并将它们与先前已知的良好值的数据库进行比较作为参考。因此,文件中的任何更改都将被标记。
最好将这些程序安装到软盘上,然后物理设置软盘的写保护。这样,入侵者就无法篡改完整性检查器本身或更改数据库。一旦您设置了类似这样的东西,最好将其作为您正常安全管理职责的一部分运行,以查看是否有任何更改。
您甚至可以添加一个crontab条目,以每天晚上从您的软盘运行检查器,并在早上将结果邮寄给您。类似
# set mailto MAILTO=kevin # run Tripwire 15 05 * * * root /usr/local/adm/tcheck/tripwire |
完整性检查器可能是检测入侵者的天赐之物,在您注意到他们之前。由于平均系统上会更改很多文件,因此您必须小心区分哪些是攻击者的活动,哪些是您自己的操作。
您可以在 http://www.tripwire.org 找到免费的、不受支持的Tripwire版本,免费。手册和支持可以购买。
Aide可以在 http://www.cs.tut.fi/~rammer/aide.html 找到。
Osiris可以在 http://www.shmoo.com/osiris/ 找到。
“特洛伊木马”以维吉尔《埃涅伊德》中的寓言诡计命名。其思想是,攻击者分发一个听起来很棒的程序或二进制文件,并鼓励其他人下载并以 root 身份运行它。然后,该程序可以在他们不注意的情况下危害他们的系统。虽然他们认为他们刚刚下载的二进制文件做一件事(并且它很可能确实如此),但它也会危害他们的安全。
您应该注意您在机器上安装的程序。RedHat 在其 RPM 文件上提供 MD5 校验和和 PGP 签名,以便您可以验证您正在安装真实的东西。其他发行版也有类似的方法。您永远不应该运行任何不熟悉的二进制文件,您没有其源代码,并且以 root 身份运行。很少有攻击者愿意发布源代码以供公众审查。
虽然它可能很复杂,但请确保您从其真正的发行站点获取程序的源代码。如果该程序将以 root 身份运行,请确保您或您信任的某人已查看过源代码并对其进行了验证。