第 11 章 配置 polyinstantiated 目录


默认情况下,所有程序、服务和用户都将 /tmp/var/tmp 以及主目录用作临时存储。这使得这些目录容易受到竞争条件攻击和基于文件名的信息泄漏的影响。您可以使 /tmp//var/tmp 和主目录实例化,以使它们不再在所有用户之间共享,并且每个用户的 /tmp-inst/var/tmp/tmp-inst 分别挂载到 /tmp/var/tmp 目录。

步骤

  1. 在 SELinux 中启用 polyinstantiation:

    # setsebool -P allow_polyinstantiation 1
    Copy to Clipboard

    您可以通过输入 getsebool allow_polyinstantiation 命令来验证 SELinux 中是否启用了 polyinstantiation。

  2. 创建具有必要权限的目录结构,以便数据在重启后保持不变:

    # mkdir /tmp-inst /var/tmp/tmp-inst --mode 000
    Copy to Clipboard
  3. 恢复整个安全上下文,包括 SELinux 用户部分:

    # restorecon -Fv /tmp-inst /var/tmp/tmp-inst
    Relabeled /tmp-inst from unconfined_u:object_r:default_t:s0 to system_u:object_r:tmp_t:s0
    Relabeled /var/tmp/tmp-inst from unconfined_u:object_r:tmp_t:s0 to system_u:object_r:tmp_t:s0
    Copy to Clipboard
  4. 如果您的系统使用 fapolicyd 应用程序控制框架,当通过启用 /etc/fapolicyd/fapolicyd.conf 配置文件中的allow_filesystem_mark 选项绑定挂载了文件系统时,允许 fapolicyd 监控底层文件系统上的文件访问事件。

    allow_filesystem_mark = 1
    Copy to Clipboard
  5. 启用 /tmp/var/tmp/ 和用户主目录的实例化:

    重要

    使用 /etc/security/namespace.conf 而不是 /etc/security/namespace.d/ 目录中单独的文件,因为 pam_namespace_helper 程序不会读取 /etc/security/namespace.d 中的其他文件。

    1. 在具有多级安全(MLS)的系统上,取消 /etc/security/namespace.conf 文件中最后三行的注释:

      /tmp     /tmp-inst/   		   level 	 root,adm
      /var/tmp /var/tmp/tmp-inst/    level 	 root,adm
      $HOME    $HOME/$USER.inst/     level
      Copy to Clipboard
    2. 在没有多级安全(MLS)的系统上,在 /etc/security/namespace.conf 文件中添加以下行:

      /tmp     /tmp-inst/            user 	 root,adm
      /var/tmp /var/tmp/tmp-inst/    user 	 root,adm
      $HOME    $HOME/$USER.inst/     user
      Copy to Clipboard
  6. 验证是否已为会话配置了 pam_namespace.so 模块:

    $ grep namespace /etc/pam.d/login
    session    required     pam_namespace.so
    Copy to Clipboard
  7. 可选:使云用户可以使用 SSH 密钥访问系统:

    1. 安装 openssh-keycat 软件包。
    2. /etc/ssh/sshd_config.d/ 目录中创建一个包含以下内容的文件:

      AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat
      AuthorizedKeysCommandRunAs root
      Copy to Clipboard
    3. 通过检查 sshd_config 中的 PubkeyAuthentication 变量是否设为了 yes 来验证是否启用了公钥身份验证。默认情况下,PubkeyAuthentication 被设置为 yes,即使 sshd_config 中的行被注释掉了。

      $ grep -r PubkeyAuthentication /etc/ssh/
      /etc/ssh/sshd_config:#PubkeyAuthentication yes
      Copy to Clipboard
  8. session required pam_namespace.so unmnt_remnt 条目添加到要为其应用 polyinstantiation 的每个服务的模块中,在 session include system-auth 行后。例如,在 /etc/pam.d/su/etc/pam.d/sudo/etc/pam.d/ssh/etc/pam.d/sshd 中:

    [...]
    session        include        system-auth
    session        required    pam_namespace.so unmnt_remnt
    [...]
    Copy to Clipboard

验证

  1. 以非 root 用户身份登录。在 polyinstantiation 配置之前登录的用户必须退出登录,并在其更改生效之前登录。
  2. 检查 /tmp/ 目录是否已挂载到 /tmp-inst/ 下:

    $ findmnt --mountpoint /tmp/
    TARGET SOURCE                 	FSTYPE OPTIONS
    /tmp   /dev/vda1[/tmp-inst/<user>] xfs	rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
    Copy to Clipboard

    SOURCE 输出会根据您的环境而有所不同。在虚拟系统上,它显示 /dev/vda_<number>_。在裸机系统上,它显示 /dev/sda_<number>_/dev/nvme*

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat