You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP执行systemctl重启WireGuard遇SELinux权限问题求助

问题解决:PHP脚本exec重启WireGuard时SELinux权限被拒

问题背景

尝试通过PHP脚本执行命令重启WireGuard服务,代码如下:

<?php
exec("sudo systemctl restart wg-quick@wg0", $output, $retval);
?>

执行失败,$output为空,$retval返回4。将httpd_t域设置为宽容模式(执行semanage permissive -a httpd_t)后,脚本可正常执行,WireGuard服务成功重启,$retval返回0。此时从audit.log中筛选出的拒绝日志行如下:

type=USER_AVC msg=audit(1729701110.392:226691): pid=1246 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc:  denied  { send_msg } for msgtype=method_return dest=:1.271885 spid=1258 tpid=115666 scontext=system_u:system_r:systemd_logind_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=dbus permissive=0  exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'UID="dbus" AUID="unset" SAUID="dbus"

此前已通过以下命令解决过其他SELinux权限问题,但无法解决本次dbus相关的拒绝:

setsebool -P httpd_mod_auth_pam 1
setsebool -P httpd_setrlimit 1

系统环境:AlmaLinux 8.1

原因分析

日志显示systemd_logind_t上下文的进程向httpd_t上下文的进程发送DBus返回消息时,被SELinux拒绝了send_msg权限。宽容模式下SELinux不强制执行规则,因此脚本能正常运行,说明核心问题是SELinux规则限制了httpd进程接收来自systemd_logind的DBus消息。

解决方案

方法1:用audit2allow生成自定义SELinux模块(推荐)

这是符合SELinux规范的解决方案,无需全局关闭SELinux或设置宽容域:

  1. 安装audit2allow工具(如果未安装):
sudo dnf install policycoreutils-python-utils
  1. 从audit日志提取相关拒绝记录并生成自定义模块:
sudo grep 'avc:  denied  { send_msg }.*httpd_t' /var/log/audit/audit.log | audit2allow -M httpd_dbus_send
  1. 加载生成的模块:
sudo semodule -i httpd_dbus_send.pp
  1. 取消httpd_t的宽容模式(若之前设置过):
sudo semanage permissive -d httpd_t

方法2:调整SELinux布尔值(仅当存在对应布尔值时可用)

先检查是否有相关的布尔值:

getsebool -a | grep httpd | grep dbus

如果输出中存在类似httpd_dbus_send的布尔值,执行以下命令开启:

setsebool -P httpd_dbus_send 1

若没有对应布尔值,优先使用方法1。

验证

重新运行PHP脚本,检查$retval是否为0,确认WireGuard服务正常重启,同时查看audit.log是否不再出现相关拒绝日志。

内容的提问来源于stack exchange,提问作者lktr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:47:14