13 文件管理 #
13.1 磁盘分区 #
服务器至少应该具有以下独立文件系统:/
、/boot
、/usr
、/var
、/tmp
和 /home
。如此可避免一些问题,例如,避免 /var
和 /tmp
下的日志记录空间和临时空间填满根分区。第三方应用程序也应位于独立的文件系统,例如在 /opt
下。
独立文件系统的另一项优势是可以选择只适合文件系统层次结构中某些区域的特殊挂载选项。一些相关的装入选项包括:
noexec
:阻止文件执行。nodev
:阻止使用字符或块特殊设备。nosuid
:阻止set-user-ID
或set-group-ID
位生效。ro
:以只读
方式装入文件系统。
在对分区装入应用上述选项之前,需要仔细考虑每个选项。否则应用程序可能会停止工作,或者可能会违反支持状态。如果正确应用,装入选项有助于抵御某些类型的安全攻击或避免错误配置。例如,无需将 set-user-ID
二进制文件置于 /tmp
中。
建议您查看第 2 章 “通用准则”。请务必了解是否需要将可能影响运行中系统的分区进行分隔(例如,日志文件会填满 /var/log
,因此有必要将 /var
从 /
分区分隔出来)。另一个注意事项是您可能需要利用 LVM 或其他卷管理器,或者至少是扩展分区类型,来解决 PC 类系统上的四个主分区的限制。
SUSE Linux Enterprise Server 中的另一项功能是将分区甚至是充当容器的单个目录或文件进行加密。有关详细信息,请参见第 14 章 “加密分区和文件”。
13.2 检查文件权限和所有权 #
以下几节介绍修改默认权限和文件设置以提高主机安全性的一些方法。请务必注意,虽然您可以运行 seccheck
等默认 SUSE Linux Enterprise Server 实用程序锁定系统并改进一般文件安全性和用户环境,但最好了解如何修改这些项目。
SUSE Linux Enterprise Server 主机包含以下三个默认文件权限设置:permissions.easy
、permissions.secure
和 permissions.paranoid
,这三者均位于 /etc
目录中。这些文件用于定义特殊权限(如全局可写目录),或为文件定义 setuser ID 位(设置了 setuser ID 位的程序未以启动该程序的用户权限运行,而是以文件拥有者权限运行,通常为 root
)。
管理员可以使用文件 /etc/permissions.local
添加自己的设置。实施上述其中一个默认权限规则集最简单的方法就是使用 YaST 中的 模块。
将由某个选定规则集修改以下每一个主题,但请务必了解其自身信息。
13.3 默认的 umask #
umask
(用户文件创建模式掩码)命令是一个外壳内置命令,决定了新建文件和目录的默认文件权限。它可被系统调用重写,但许多程序和实用程序都使用 umask
。默认情况下,umask
设置为 022
。您可以更改 /etc/profile
中的值以全局修改此设置,也可以分别针对外壳启动文件中的每个用户进行更改。
要确定活动的 umask,请使用 umask
命令:
tux >
umask
022
如果至少设置了一个位,则将从访问模式 777
去除 umask。
使用默认的 umask,您将会看到大多数用户预期可在 Linux 系统上看到的行为。
tux >
touch atux >
mkdir btux >
ls -on total 16 -rw-r--r--. 1 17086 0 Nov 29 15:05 a drwxr-xr-x. 2 17086 4096 Nov 29 15:05 b
您可以指定任意 umask 值,具体取决于您的需求。
tux >
umask 111tux >
touch ctux >
mkdir dtux >
ls -on total 16 -rw-rw-rw-. 1 17086 0 Nov 29 15:05 c drw-rw-rw-. 2 17086 4096 Nov 29 15:05 d
根据您的线程模型,您可以使用 037
等更严格的 umask,以防止意外的数据泄漏。
tux >
umask 037tux >
touch etux >
mkdir ftux >
ls -on total 16 -rw-r-----. 1 17086 0 Nov 29 15:06 e drwxr-----. 2 17086 4096 Nov 29 15:06 f
13.4 SUID/SGID 文件 #
如果在可执行文件上设置 SUID(设置用户 ID)位或 SGID(设置组 ID)位,它会以可执行文件拥有者的 UID 或 GID 来执行,而不是以执行人员的 UID 或 GID 来执行。举例来说,这意味着会以 root
的 UID 执行设置了 SUID 位且由 root
拥有的所有可执行文件。passwd
命令就是一个典型的示例,它允许普通用户更新由 root
拥有的 /etc/shadow
文件中的口令字段。
但当可执行文件存在安全漏洞时,SUID/SGID 位可能会被滥用。因此,您应该搜索并记录整个系统中的 SUID/SGID 可执行文件。要搜索整个系统中的 SUID 或 SGID 文件,您可以运行以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -type f -perm '/6000' -ls
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
SUSE 仅在确实需要时才会在二进制文件上设置 SUID/SGID 位。不是绝对必要的情况下,请确保代码开发人员未在其程序上设置 SUID/SGID 位。通常,您可以使用诸如去除世界/其他可执行文件位等解决方法。但更好的方法是更改软件设计或使用权限。
SUSE Linux Enterprise Server 支持文件权限,可授予程序更精细的特权,而不是 root
的全部权限:
root #
getcap -v /usr/bin/ping
/usr/bin/ping = cap_new_raw+eip
以上命令只会为执行 ping
的人员授予 CAP_NET_RAW
权限。如果 ping
的内部存在漏洞,攻击者最多可以获得此权限,而不是 root
的全部权限。可能的情况下,应选择文件权限以支持 SUID 位。但仅当二进制文件的 SUID 设置为 root
,而不是其他 news
、lp
等类似用户时,这一条才适用。
13.5 全局可写文件 #
全局可写文件存在安全风险,因为系统上的任何用户都可以对其进行修改。此外,全局可写目录允许任何人添加或删除文件。要查找全局可写文件和目录,您可以使用以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -type f -perm -2 ! -type l -ls
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
! -type l
参数可跳过所有符号链接,因为符号链接始终为全局可写。但只要链接的目标不是全局可写(由上述查找命令进行检查),就不会发生问题。
带有粘滞位的全局可写目录(例如 /tmp
目录)不允许任何人(文件拥有者除外)在此目录中执行文件删除或重命名操作。粘滞位使文件与其创建用户相关联,可防止其他用户删除或重命名这些文件。因此,带有粘滞位的全局可写目录通常都不会发生问题,具体视目录的用途而定。例如 /tmp
目录:
tux >
ls -ld /tmp
drwxrwxrwt 18 root root 16384 Dec 23 22:20 /tmp
输出中的 t
模式位表示粘滞位。
13.6 孤立文件或无拥有者的文件 #
未被任何用户或组拥有的文件本身不一定会发生安全问题。但无拥有者的文件可能会在将来发生安全问题。例如,如果创建了新用户,并且该新用户获得的 UID 刚好与无拥有者文件的 UID 相同,则该新用户将自动成为这些文件的拥有者。
要查找未被任何用户或组拥有的文件,请使用以下命令:
root #
find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -nouser -o -nogroup
如果您有其他文件系统结构,则需要扩展搜索的目录列表。
另一个问题是某些文件不是通过打包系统安装的,因而不会收到更新。您可以使用以下命令检查此类文件:
tux >
find /bin /lib /lib64 /usr -path /usr/local -prune -o -type f -a -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;
因为经过设计的文件名可能会导致命令执行,会以不可信用户(例如“没有任何用户”)运行此命令。这不应成为一个问题,因为这些目录只能由 root
进行写入,但仍不失为一项良好的安全预防措施。
这将会显示 /bin
、/lib
、/lib64
和 /usr
(/usr/local
中的文件除外)下软件包管理器未跟踪的所有文件。这些文件可能不代表安全问题,但您应注意未跟踪的文件,并执行必要的预防措施确保这些文件是最新的。