11 文件管理 #
11.1 磁盘分区 #
服务器应该至少为 /
、/boot
、/usr
、/var
、/tmp
和 /home
提供独立的文件系统。如此可避免一些问题,例如,避免 /var
和 /tmp
下的日志记录空间和临时空间填满根分区。第三方应用程序也应位于独立的文件系统,例如在 /opt
下。
独立文件系统的另一项优势是可以选择只适合文件系统层次结构中某些区域的特殊挂载选项。挂载选项为:
noexec
:阻止文件执行。nodev
:阻止使用字符或块特殊设备。nosuid
:阻止set-user-ID
或set-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 提供 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
应用这些权限。还可以通过 cron
或 systemd
计时器定期调用 chkstat
。
虽然系统配置文件已经过全面的测试,但自定义权限可能会中断标准应用程序。SUSE 无法为这种情况提供支持。
在应用自定义文件权限之前,请始终使用 chkstat
测试这些权限,以确保一切符合预期。
11.3 将主目录权限从 755 更改为 700 #
默认情况下,系统上的所有用户都可以访问(读取、执行)用户主目录。这可能会导致信息泄漏,因此主目录应该只能由其所有者访问。
以下命令将 /home
中所有现有主目录的权限设置为 700
(只有拥有者能够访问目录):
>
sudo
chmod 755 /home>
sudo
for a in /home/*; do \ echo "Changing rights for directory $a"; chmod 700 ”$a”; 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
,而不是其他 news
、lp
等类似用户时,这一条才适用。
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 {}" \;
因为经过设计的文件名可能会导致命令执行,会以不可信用户(例如“没有任何用户”)运行此命令。这不应成为一个问题,因为这些目录只能由 root
进行写入,但仍不失为一项良好的安全预防措施。
此命令会显示 /bin
、/lib
、/lib64
和 /usr
下的所有文件(/usr/local
中的文件除外),这些文件不受软件包管理器跟踪。这些文件不一定代表安全问题,但您应注意未跟踪的文件,并执行必要的预防措施确保这些文件是最新的。