SELinux 不允许读取 ~/.cert 上的文件

SELinux 不允许读取 ~/.cert 上的文件

我是 Fedora 23 和 SELinux 的新手。我通过 NetworkManager 使用 OpenVPN 客户端。我将 OpenVPN 访问所需的所有文件(证书、CA 和私钥)存储在内部~/.cert并运行updatecon -R -v ~/.cert.但是,我仍然收到来自 SELinux 的 AVC 错误,SELinux 不允许 OpenVPN 访问此类文件。这是输出的相关部分grep AVC /var/log/audit/audit.log | less

type=AVC msg=audit(1457179403.296:364): avc:  denied  { open } for  pid=2608 comm="nm-openvpn-serv" path="/home/ggoncalves/.cert/ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.296:365): avc:  denied  { open } for  pid=2608 comm="nm-openvpn-serv" path="/home/ggoncalves/.cert/ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.330:366): avc:  denied  { read } for  pid=2611 comm="openvpn" name="lastline-ca.crt" dev="dm-2" ino=2888749 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.332:367): avc:  denied  { read } for  pid=2611 comm="openvpn" name="ggoncalves.crt" dev="dm-2" ino=2888751 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.332:368): avc:  denied  { read } for  pid=2611 comm="openvpn" name="ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0

由于我只使用 SELinux 几天,所以我不知道从哪里开始寻找它。有什么提示吗?

编辑:在我看来,问题出在svirt_sandbox_file_t标签上。我相信这些文件应该被标记为home_cert_t

编辑2:事实上,svirt_sandbox_file_t由于某种原因,我的整个主目录都被标记了。这是 Docker 策略的一个特性还是一个错误?

更新

好吧,这花了一些时间。让我进一步描述这个问题,以防有人最终经历同样的情况。事实证明,svirt_sandbox_file_t当我将我的主目录安装为带有标志的卷时,Docker 已将其归因于:Z(如所述)这里)。然后,Docker 递归地将该标签应用到我的整个主目录,但不知何故,重新配置 FS 标签和应用都不起作用restorecon

为了将我的主目录恢复到原始权限,我rsync将其保存到一个临时文件夹,删除了其中的所有内容,然后rsync再恢复。这不是最聪明的主意,但它确实有效。

答案1

文件的目标上下文类型仍然错误:

svirt_sandbox_file_t

中的文件~/.cert应标记为home_cert_t.再试一次

restorecon -Rf ~/.cert

或者尝试强制类型:

chcon -t home_cert_t ~/.cert/*

selinux-policy 或 docker selinux 策略中可能存在一些错误,导致错误的默认标签。

相关内容