OpenVPN SELinux权限被拒绝

我正在运行CentOS 6.4。

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

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

 # service openvpn start Starting openvpn: [FAILED] 

/ var / log / messages在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 ,但没有成功。 我应该如何debugging/解决这个问题?

编辑:谢谢伊恩和Jiri Xichtkniha。 我改成了/etc/openvpn/server.conf中的日志文件的位置来读取

 status /var/log/openvpn-status.log 

这与当前的政策合作。

一个快速的解决办法是将日志文件更改为/var/log/openvpn-status.log因为openvpn进程是以openvpn_tforms运行的,并且在策略中有权限写入标记为var_log_t文件(如/ var / log should是)。

/var/log/openvpn的默认上下文是openvpn_var_log_t

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

需要稍微更多pipe理的较长进程是允许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未列出。

我不使用OpenVPN,但你有不同的准备OpenVPN策略使用的path。 这将使其工作。

 # 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。*',但是这不会recursion到subdir。