OpenVPN SELinux 权限被拒绝

OpenVPN SELinux 权限被拒绝

我正在运行 CentOS 6.4。

# cat /etc/centos-release
CentOS release 6.4 (Final)

经过一些更新并重新启动后,OpenVPN 无法启动。

# service openvpn start
Starting openvpn:                                          [FAILED]

/var/log/消息在 openvpn 上显示以下输出:

Nov 13 14:09:58 host kernel: type=1400 audit(1384344598.334:39761): avc:  denied  { read write } for  pid=5777 comm="openvpn" name="openvpn" dev=dm-0 ino=54527865 scontext=unconfined_u:system_r:openvpn_t:s0 tcontext=unconfined_u:object_r:openvpn_var_log_t:s0 tclass=dir
Nov 13 14:09:58 host openvpn[5777]: Options error: --status fails with '/var/log/openvpn/openvpn-status.log': Permission denied

因此显然这是一个 SELinux 问题。

我尝试更新到openvpn-2.3.2-2.el6.x86_64按照此错误报告但没有成功。我该如何调试/修复这个问题?

编辑:感谢 Iain 和 Jiri Xichtkniha。我将日志文件的位置更改为/etc/openvpn/server.conf读书

status /var/log/openvpn-status.log

与当前政策相符。

答案1

一个快速的解决方法是将日志文件更改为/var/log/openvpn-status.logopenvpn 进程正在运行的状态,openvpn_t并且它在策略中具有写入标记文件的权限var_log_t(如 /var/log 所示)。

的默认上下文/var/log/openvpnopenvpn_var_log_t

matchpathcon /var/log/openvpn
/var/log/openvpn        system_u:object_r:openvpn_var_log_t:s0

需要稍微多一点管理的更长的过程是允许openvpn_t写入openvpn_var_log_t/var/log/openvpn 获取的上下文,例如

echo "host kernel: type=1400 audit(1384344598.334:39761): avc:  denied  { read write } for  pid=5777 comm="openvpn" name="openvpn" dev=dm-0 ino=54527865 scontext=unconfined_u:system_r:openvpn_t:s0 tcontext=unconfined_u:object_r:openvpn_var_log_t:s0 tclass=dir" | audit2allow -M localOpenVpn

这将生成一个可以安装的 .pp 文件

semodule -i localOpenVpn.pp

不要忘记将 localOpenVpn.te 和 localOpenVpn.pp 存储在安全的地方。


对于 Jiri Xichtkniha

如果你看一下生成的 .te 文件,你会发现它说

#============= openvpn_t ==============  
#!!!! The source type 'openvpn_t' can write to a 'dir' of the following types:
# net_conf_t, pcscd_var_run_t, openvpn_etc_t, openvpn_tmp_t, openvpn_var_run_t, 
  tmp_t, etc_t, var_run_t, var_log_t, krb5_host_rcache_t, tmp_t, cluster_var_lib_t,
  cluster_var_run_t, root_t, cluster_conf_t

请注意openvpn_var_log_t未列出。

答案2

我不使用 OpenVPN,但您使用的日志路径与准备好的 OpenVPN 策略使用的路径不同。这样就可以了。

# semanage fcontext -a -t openvpn_var_log_t '/var/log/openvpn(/.*)?'
# semanage fcontext -l | grep openvpn_var_log_t
/var/log/openvpn(/.*)?                             all files          system_u:object_r:openvpn_var_log_t:s0 
/var/log/openvpn.*                                 all files          system_u:object_r:openvpn_var_log_t:s0

原始策略是最后一行。如您所见,它只会接受“openvpn.*”,但不会递归到子目录。

相关内容