跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 安全和强化指南 / 本地安全性 / 文件管理
适用范围 SUSE Linux Enterprise Server 15 SP6

11 文件管理

11.1 磁盘分区

服务器应该至少为 //boot/var/tmp/home 提供独立的文件系统。如此可避免一些问题,例如,避免 /var/tmp 下的日志记录空间和临时空间填满根分区。第三方应用程序也应位于独立的文件系统,例如在 /opt 下。

独立文件系统的另一项优势是,可以选择适合文件系统层次结构中某些区域的特殊挂载选项。挂载选项为:

  • noexec:阻止文件执行。

  • nodev:阻止使用字符或块特殊设备。

  • nosuid:阻止 set-user-IDset-group-ID 位生效。

  • ro:挂载文件系统 read-only

在对分区挂载应用上述选项之前,需要仔细考虑每个选项。否则应用程序可能会停止工作,或者可能会违反支持状态。如果正确应用,挂载选项有助于抵御某些类型的安全攻击或避免错误配置。例如,无需将 set-user-ID 二进制文件置于 /tmp 中。

建议您查看第 27 章 “通用准则请务必了解是否需要将可能影响运行中系统的分区进行分隔(例如,日志文件会填满 /var/log,因此有必要将 /var/ 分区分隔出来)。另一个注意事项是需要使用 LVM 或其他卷管理器,或者至少是扩展分区类型,来解决 PC 类系统上的四个主分区的限制。

SUSE Linux Enterprise Server 中的另一项功能是将分区甚至是充当容器的单个目录或文件进行加密。有关详细信息,请参见第 12 章 “加密分区和文件

11.2 修改特定系统文件的权限

许多文件(尤其是 /etc 目录中的文件)是全局可读的,即,非特权用户也可以读取其内容。通常这不会造成问题,但要采取额外保护的话,可以去除敏感文件的全局可读或组可读位。

SUSE Linux Enterprise Server 提供了 permissions 软件包,可轻松应用文件权限。该软件包附带三个预定义的系统配置文件:

easy

该配置文件适用于需要用户友好的图形用户交互的系统。这是默认的配置文件。

secure

该配置文件适用于没有完全成熟的图形用户界面的服务器系统。

paranoid

该配置文件可以实现最高安全性。在 secure 配置文件的基础上,它还去除了所有特殊权限,例如 setuid/setgid 和功能位。

警告
警告:非特权用户无法使用的系统

除了更改口令等简单任务外,非特权用户可能无法使用没有特殊权限的系统。

请不要按原样使用 paranoid 配置文件,而是将它用作自定义权限的模板。可以在 permissions.paranoid 文件中找到详细信息。

要自定义文件权限,请编辑 /etc/permissions.local,或者在 /etc/permissions.d/ 目录中创建一个插入式文件。

# Additional custom hardening
/etc/security/access.conf       root:root       0400
/etc/sysctl.conf                root:root       0400
/root/                          root:root       0700

第一列指定文件名。目录名必须以斜杠结尾。第二列指定所有者和组,第三列指定模式。有关配置文件格式的详细信息,请参见 man permissions

选择 /etc/sysconfig/security 中的配置文件。要使用 /etc/permissions.local 中的 easy 配置文件和自定义权限,请设置:

PERMISSION_SECURITY="easy local"

要应用该设置,请运行 chkstat --system --set

也可以在软件包更新期间通过 zypper 应用这些权限。还可以通过 cronsystemd 计时器定期调用 chkstat

重要
重要:自定义文件权限

虽然系统配置文件已经过全面的测试,但自定义权限可能会中断标准应用程序。SUSE 无法为这种情况提供支持。

在应用自定义文件权限之前,请始终使用 chkstat 测试这些权限,以确保一切符合预期。

11.3 将主目录权限从 755 更改为 700

默认情况下,系统上的所有用户都可以访问(读取、执行)用户主目录。这可能会导致信息外泄,因此主目录应该只能由其所有者访问。

以下命令将 /home 中所有现有主目录的权限设置为 700(只有拥有者能够访问目录):

> sudo chmod 755 /home
> sudo bash -c 'for dir in /home/*; do \
echo "Changing permissions of directory $dir"; chmod 700 "$dir"; done'

为确保新建的主目录具有安全权限,请编辑 /etc/login.defs 并将 HOME_MODE 设置为 700

# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new
# home directories.
# If HOME_MODE is not set, the value of UMASK is used to create the mode.
HOME_MODE      0700

如果您未设置 HOME_MODE,则会根据默认 umask 计算权限。HOME_MODE 指定使用的权限,而不是像 umask 那样指定用于去除访问权限的掩码。有关 umask 的详细信息,请参见第 11.4 节 “默认的 umask”

可以使用 useradd -m testuser 创建一个新用户来校验配置更改。使用 ls -l /home 检查目录的权限。然后,去除为此测试创建的用户。

重要
重要:测试权限更改

不再允许用户访问其他用户的主目录。这可能不符合用户和软件的预期。

在生产环境中使用此项更改前对其进行测试,并通知受此更改影响的用户。

11.4 默认的 umask

umask(用户文件创建模式掩码)命令是一个外壳内置命令,决定了新建文件和目录的默认文件权限。它可被系统调用重写,但许多程序和实用程序都使用 umask

默认情况下,umask 设置为 022。如果至少设置了一个位,则会从访问模式 777 去除此 umask。

要确定活动的 umask,请使用 umask 命令:

> umask
022

使用默认的 umask,您将会看到大多数用户预期可在 Linux 系统上看到的行为。

> touch a
> mkdir b
> 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 值,具体取决于您的需求。

> umask 111
> touch c
> mkdir d
> 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,以防止意外的数据泄漏。

> umask 037
> touch e
> mkdir f
> ls -on
total 16
-rw-r-----. 1 17086    0 Nov 29 15:06 e
drwxr-----. 2 17086 4096 Nov 29 15:06 f
提示
提示:最高安全性

为获得最高安全性,请使用 umask 077。这会强制针对组和其他用户新建没有权限的文件和目录。

这可能不符合用户和软件的预期,并可能会给支持团队带来额外的负担。

11.4.1 调整默认的 umask

可以通过更改 /etc/login.defs 中的 UMASK 值来全局修改所有用户的 umask。

# Default initial "umask" value used by login(1) on non-PAM enabled systems.
# Default "umask" value for pam_umask(8) on PAM enabled systems.
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
# home directories.
# 022 is the default value, but 027, or even 077, could be considered
# for increased privacy. There is no One True Answer here: each sysadmin
# must make up their mind.
UMASK           022

对于单个用户,请将 umask 添加到 /etc/passwd 中的“gecos”字段,如下所示:

tux:x:1000:100:Tux Linux,UMASK=022:/home/tux:/bin/bash

对于 yast users,可以通过将 UMASK=022 添加到用户的细节 › 附加用户信息来实现相同的目的。

/etc/login.defs/etc/passwd 中所做的设置由 PAM 模块 pam_umask.so 应用。有关其他配置选项,请参见 man pam_umask

要使更改生效,用户需要注销并重新登录。然后,使用 umask 命令校验是否正确设置了 umask。

11.5 SUID/SGID 文件

如果在可执行文件上设置 SUID(设置用户 ID)位或 SGID(设置组 ID)位,它会以可执行文件拥有者的 UID 或 GID 来执行,而不是以执行人员的 UID 或 GID 来执行。举例来说,这意味着会以 root 的 UID 执行设置了 SUID 位且由 root 拥有的所有可执行文件。passwd 命令就是一个典型的示例,它允许普通用户更新由 root 拥有的 /etc/shadow 文件中的口令字段。

当可执行文件存在安全漏洞时,SUID/SGID 位可能会被滥用。因此,您应该搜索并记录整个系统中的 SUID/SGID 可执行文件。要搜索整个系统中的 SUID 或 SGID 文件,您可以运行以下命令:

# 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 的全部权限:

# getcap -v /usr/bin/ping
/usr/bin/ping = cap_new_raw+eip

以上命令向执行 ping 的用户授予 CAP_NET_RAW 功能。如果 ping 的内部存在漏洞,攻击者最多可以获得此权限,而不是 root 的全部权限。可能的情况下,应选择文件权限以支持 SUID 位。但当二进制文件的 SUID 设置为 root,而不是其他 newslp 等类似用户时,这一条才适用。

11.6 全局可写文件

全局可写文件存在安全风险,因为系统上的任何用户都可以对其进行修改。此外,全局可写目录允许任何人添加或删除文件。要查找全局可写文件和目录,您可以使用以下命令:

# 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 目录:

> ls -ld /tmp
drwxrwxrwt 18 root root 16384 Dec 23 22:20 /tmp

输出中的 t 模式位表示粘滞位。

11.7 孤立文件或无拥有者的文件

未被任何用户或组拥有的文件本身不一定会发生安全问题。但无拥有者的文件可能会在将来发生安全问题。例如,如果创建了新用户,并且该新用户获得的 UID 刚好与无拥有者文件的 UID 相同,则该新用户将自动成为这些文件的拥有者。

要查找未被任何用户或组拥有的文件,请使用以下命令:

# find /bin /boot /etc /home /lib /lib64 /opt /root /sbin /srv /tmp /usr /var -nouser -o -nogroup

如果您有其他文件系统结构,则可能需要扩展搜索的目录列表。

另一个问题是某些文件不是通过打包系统安装的,因而不会收到更新。您可以使用以下命令检查此类文件:

> find /bin /lib /lib64 /usr -path /usr/local -prune -o -type f -a -exec /bin/sh -c "rpm -qf {} &> /dev/null || echo {}" \;

请以不可信用户(例如“nobody”)的身份运行此命令,因为经过设计的文件名可能会导致命令执行。这应该不会产生问题,因为这些目录应由 root 写入,不过仍不失为一项比较好的安全预防措施。

此命令会显示 /bin/lib/lib64/usr 下的所有文件(/usr/local 中的文件除外),这些文件不受软件包管理器跟踪。这些文件不一定代表安全问题,但您应注意未跟踪的文件,并执行必要的预防措施确保这些文件是最新的。