第 11 章 配置 polyinstantiated 目录
默认情况下,所有程序、服务和用户都将 /tmp
、/var/tmp
以及主目录用作临时存储。这使得这些目录容易受到竞争条件攻击和基于文件名的信息泄漏的影响。您可以使 /tmp/
、/var/tmp
和主目录实例化,以使它们不再在所有用户之间共享,并且每个用户的 /tmp-inst
和 /var/tmp/tmp-inst
分别挂载到 /tmp
和 /var/tmp
目录。
步骤
在 SELinux 中启用 polyinstantiation:
setsebool -P allow_polyinstantiation 1
# setsebool -P allow_polyinstantiation 1
Copy to Clipboard Copied! 您可以通过输入
getsebool allow_polyinstantiation
命令来验证 SELinux 中是否启用了 polyinstantiation。创建具有必要权限的目录结构,以便数据在重启后保持不变:
mkdir /tmp-inst /var/tmp/tmp-inst --mode 000
# mkdir /tmp-inst /var/tmp/tmp-inst --mode 000
Copy to Clipboard Copied! 恢复整个安全上下文,包括 SELinux 用户部分:
restorecon -Fv /tmp-inst /var/tmp/tmp-inst
# 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 Copied! 如果您的系统使用
fapolicyd
应用程序控制框架,当通过启用/etc/fapolicyd/fapolicyd.conf
配置文件中的allow_filesystem_mark
选项绑定挂载了文件系统时,允许fapolicyd
监控底层文件系统上的文件访问事件。allow_filesystem_mark = 1
allow_filesystem_mark = 1
Copy to Clipboard Copied! 启用
/tmp
、/var/tmp/
和用户主目录的实例化:重要使用
/etc/security/namespace.conf
而不是/etc/security/namespace.d/
目录中单独的文件,因为pam_namespace_helper
程序不会读取/etc/security/namespace.d
中的其他文件。在具有多级安全(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
/tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ level
Copy to Clipboard Copied! 在没有多级安全(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
/tmp /tmp-inst/ user root,adm /var/tmp /var/tmp/tmp-inst/ user root,adm $HOME $HOME/$USER.inst/ user
Copy to Clipboard Copied!
验证是否已为会话配置了
pam_namespace.so
模块:grep namespace /etc/pam.d/login
$ grep namespace /etc/pam.d/login session required pam_namespace.so
Copy to Clipboard Copied! 可选:使云用户可以使用 SSH 密钥访问系统:
-
安装
openssh-keycat
软件包。 在
/etc/ssh/sshd_config.d/
目录中创建一个包含以下内容的文件:AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat AuthorizedKeysCommandRunAs root
AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat AuthorizedKeysCommandRunAs root
Copy to Clipboard Copied! 通过检查
sshd_config
中的PubkeyAuthentication
变量是否设为了yes
来验证是否启用了公钥身份验证。默认情况下,PubkeyAuthentication
被设置为 yes,即使sshd_config
中的行被注释掉了。grep -r PubkeyAuthentication /etc/ssh/
$ grep -r PubkeyAuthentication /etc/ssh/ /etc/ssh/sshd_config:#PubkeyAuthentication yes
Copy to Clipboard Copied!
-
安装
将
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 [...]
[...] session include system-auth session required pam_namespace.so unmnt_remnt [...]
Copy to Clipboard Copied!
验证
- 以非 root 用户身份登录。在 polyinstantiation 配置之前登录的用户必须退出登录,并在其更改生效之前登录。
检查
/tmp/
目录是否已挂载到/tmp-inst/
下:findmnt --mountpoint /tmp/
$ 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 Copied! SOURCE
输出会根据您的环境而有所不同。在虚拟系统上,它显示/dev/vda_<number>_
。在裸机系统上,它显示/dev/sda_<number>_
或/dev/nvme*