![SELinux 不允许读取 ~/.cert 上的文件](https://linux22.com/image/84912/SELinux%20%E4%B8%8D%E5%85%81%E8%AE%B8%E8%AF%BB%E5%8F%96%20~%2F.cert%20%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6.png)
我是 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 策略中可能存在一些错误,导致错误的默认标签。