11 文件管理 #
11.1 磁盘分区 #
服务器应该至少为 /
、/boot
、/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 Desktop 中的另一项功能是将分区甚至是充当容器的单个目录或文件加密。有关细节,请参考第 12 章 “加密分区和文件”。
11.2 修改特定系统文件的权限 #
许多文件(尤其是 /etc
目录中的文件)是全局可读的,即,非特权用户也可以读取其内容。通常这不会造成问题,但要采取额外保护的话,可以去除敏感文件的全局可读或组可读位。
SUSE Linux Enterprise Desktop 提供了 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
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 Desktop 支持文件权限,可授予程序更精细的特权,而不是 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 {}" \;
请以不可信用户(例如“nobody”)的身份运行此命令,因为经过设计的文件名可能会导致命令执行。这应该不会产生问题,因为这些目录应由 root
写入,不过仍不失为一项比较好的安全预防措施。
此命令会显示 /bin
、/lib
、/lib64
和 /usr
下的所有文件(/usr/local
中的文件除外),这些文件不受软件包管理器跟踪。这些文件不一定代表安全问题,但您应注意未跟踪的文件,并执行必要的预防措施确保这些文件是最新的。