跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

11 文件管理 编辑源文件

11.1 磁盘分区 编辑源文件

服务器应至少为 //boot/var/tmp/home 分配单独的文件系统。这可以防止例如 /var/tmp 下的日志空间和临时空间填满根分区。第三方应用程序也应放在单独的文件系统上,例如在 /opt 下。

分离文件系统的另一个优势是能够选择适合文件系统层次结构中某些区域的特殊挂载选项。挂载选项是

  • noexec:禁止执行文件。

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

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

  • ro:以 只读 方式挂载文件系统。

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

了解分离可能影响正在运行的系统(例如,日志文件填充 /var/log 是将 /var/ 分区分离的一个很好的理由)的必要性非常重要。 另外需要记住的是,您需要使用 LVM 或其他卷管理器,或者至少使用扩展分区类型来解决 PC 类系统上四个主分区的限制。

openSUSE Leap 中,还可以加密分区,甚至将单个目录或文件作为容器进行加密。有关详细信息,请参阅 第 12 章,加密分区和文件

11.2 修改某些系统文件的权限 编辑源文件

许多文件(尤其是在 /etc 目录中)都是世界可读的,这意味着非特权用户可以读取其内容。通常这没有问题,但为了格外小心,您可以删除敏感文件的世界可读或组可读权限。

openSUSE Leap 提供了 permissions 包,以便轻松应用文件权限。该软件包带有三个预定义的系统配置文件

easy

适用于需要用户友好图形用户交互系统的配置。

secure

适用于没有完整图形用户界面的服务器系统。

paranoid

适用于最大安全性的配置。除了 secure 配置之外,它还会删除 所有 特殊权限,例如 setuid/setgid 和 capability 位。

Warning
警告:非特权用户系统不可用

除了更改密码等简单任务外,没有特殊权限的系统对于非特权用户来说可能无法使用。

不要按原样使用 paranoid 配置,而是将其作为自定义权限的模板。有关更多信息,请参阅 permissions.paranoid 文件。

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

# 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 中选择配置文件。要使用 easy 配置和来自 /etc/permissions.local 的自定义权限,请设置

PERMISSION_SECURITY="easy local"

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

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

Important
重要:自定义文件权限

虽然系统配置文件经过了充分测试,但自定义权限可能会破坏标准应用程序。SUSE 无法为这种情况提供支持。

始终在使用 chkstat 应用之前测试自定义文件权限,以确保一切按预期工作。

11.3 将主目录权限从 755 更改为 700 编辑源文件

默认情况下,用户的主目录可供系统上的所有用户访问(读、执行)。由于这可能导致信息泄露,因此主目录应仅可供其所有者访问。

以下命令将权限设置为 700(目录仅可供所有者访问)用于 /home 中的所有现有主目录

> 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 检查目录的权限。之后,删除为本次测试创建的用户。

Important
重要:测试权限更改

用户不再允许访问其他用户的主目录。这对于用户和软件来说可能出乎意料。

在投入生产环境之前测试此更改,并通知受此更改影响的用户。

11.4 默认 umask 编辑源文件

umask(用户文件创建模式掩码)命令是一个 shell 内置命令,用于确定新创建的文件和目录的默认文件权限。这可以通过系统调用覆盖,但许多程序和实用程序都使用 umask

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

要确定活动的 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

根据您的威胁模型,您可以使用更严格的 umask,例如 037,以防止意外的数据泄露。

> 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
Tip
提示:最大安全性

为了获得最大安全性,请使用 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 添加到用户的 详细信息 › 其他用户信息 来执行此操作。

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

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

11.5 SUID/SGID 文件 编辑源文件

当在可执行文件上设置 SUID(设置用户 ID)或 SGID(设置组 ID)位时,它将以可执行文件所有者的 UID 或 GID 而不是执行者(用户)的 UID 或 GID 身份执行。这意味着,例如,所有设置了 SUID 位的可执行文件且由 root 拥有,都将以 root 的 UID 身份执行。一个很好的例子是 passwd 命令,它允许普通用户更新 /etc/shadow 文件中的密码字段,该文件由 root 拥有。

如果可执行文件存在安全漏洞,则 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 位。通常可以使用解决方法,例如删除世界/其他用户的可执行位。但是,更好的方法是更改软件设计或使用 capabilities。

openSUSE Leap 支持文件 capabilities,以便为程序提供比 root 的全部权限更细粒度的权限

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

前面的命令授予执行 ping 的人 CAP_NET_RAW capability。如果 ping 内部存在漏洞,则攻击者最多只能获得此 capability,而不是完整的 root 权限。在可能的情况下,应选择文件 capabilities 而不是 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 参数跳过所有符号链接,因为符号链接始终是世界可写的。但是,如果链接的目标不是世界可写的,则这不是问题,上述 find 命令会检查这一点。

带有粘滞位的世界可写目录,例如 /tmp 目录,不允许任何人删除或重命名该目录中的文件,除非是文件的所有者。粘滞位使文件“粘”在其创建者的用户处,并阻止其他用户删除或重命名这些文件。因此,根据目录的用途,带有粘滞位的世界可写目录不是问题。一个例子是 /tmp 目录

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

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

11.7 孤立或无主文件 编辑源文件

没有由任何用户或组拥有的文件本身不一定是一个安全问题。但是,无主文件将来可能会构成安全问题。例如,如果创建一个新用户,并且新用户恰好获得与无主文件相同的 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),因为精心设计的的文件名可能导致命令执行。这不应该成为问题,因为这些目录应该可写,但仍然是一个好的安全预防措施。

这将显示 /bin/lib/lib64/usr(不包括 /usr/local 中的文件)下所有未被软件包管理器跟踪的文件。这些文件可能不代表安全问题,但您应该了解哪些文件未被跟踪并采取必要的预防措施以使其保持最新。

打印此页面