测试

测试

我为 Dokuwiki 运行 Apache2 (httpd) 服务器。 Dokuwiki 无法使用其升级或安装插件功能(请参阅问题在这里)。

似乎用户阿帕奇无法访问网络/互联网。

测试

作为 root 例如,curl 工作得很好:

root @alpha:~$ curl https://download.dokuwiki.org -L
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Download DokuWiki</title> ...

但是当我尝试与用户 apache 相同时:

root @alpha:~$ sudo -H -u apache bash -c 'curl https://download.dokuwiki.org -L'
curl: (7) Failed to connect to 2a01:4f8:172:3483::2: Network is unreachable

或以 wget 作为 root:

root @alpha:~$ wget https://download.dokuwiki.org
--2016-12-05 17:01:57--  https://download.dokuwiki.org/
Connecting to <proxy>:3128.... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

    [ <=>                    ] 25,350      --.-K/s   in 0.02s

2016-12-05 17:01:57 (1.40 MB/s) - ‘index.html’ saved [25350]

与 apache 用户对比:

root @alpha:~$ sudo -H -u apache bash -c 'wget https://download.dokuwiki.org'
--2016-12-05 17:02:26--  https://download.dokuwiki.org/
Resolving download.dokuwiki.org (download.dokuwiki.org)...    138.201.137.132, 2a01:4f8:172:3483::2
Connecting to download.dokuwiki.org (download.dokuwiki.org)|138.201.137.132|:443... failed: No route to host.
Connecting to download.dokuwiki.org (download.dokuwiki.org)|2a01:4f8:172:3483::2|:443... failed: Network is unreachable.

代理人

服务器位于代理后面。对于 root 来说似乎知道这一点,但对于用户 apache 来说则不然。

代理设置在/etc/profile.d/proxy.sh(代理人是占位符):

MY_PROXY_URL="http://<proxy>:3128"

HTTP_PROXY=$MY_PROXY_URL
HTTPS_PROXY=$MY_PROXY_URL
FTP_PROXY=$MY_PROXY_URL
http_proxy=$MY_PROXY_URL
https_proxy=$MY_PROXY_URL
ftp_proxy=$MY_PROXY_URL

export HTTP_PROXY HTTPS_PROXY FTP_PROXY
export http_proxy https_proxy ftp_proxy

我也尝试在中设置代理/etc/配置文件(使用与上面相同的代码)并重新启动服务器,但这没有帮助。

对于 root,设置变量: root @alpha:~$ echo $http_proxy http:// 但不适用于 apache: root @alpha:~$ sudo -H -u apache bash -c 'echo $http_proxy' /无输出/ (del,因为测试方法错误)

/root/.bash_profile 或 /root/.bashrc 中没有什么特别的。(不重要)

SELinux

看来 SELinux 是原因。当我尝试使用 Dokuwiki 中的“Wiki Upgrade”时,/var/log/audit/audit.log 中有两个新条目:

type=AVC msg=audit(1481032251.392:768): avc:  denied  { name_connect } for  pid=1368 comm="httpd" dest=3128 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:squid_port_t:s0 tclass=tcp_socket
type=AVC msg=audit(1481032251.394:769): avc:  denied  { name_connect } for  pid=1368 comm="httpd" dest=3128 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:squid_port_t:s0 tclass=tcp_socket

这里有什么问题? httpd 服务不允许连接到端口 3128?

答案1

修复方法

问题出在 SELinux 上。检查设置:

 getsebool -a | grep httpd_can_network_connect

我有:

 httpd_can_network_connect --> off
 httpd_can_network_connect_cobbler --> off
 httpd_can_network_connect_db --> off

和:

setsebool -P httpd_can_network_connect on

您切换网络访问httpd进程在。 (我必须安装策略coreutils-python首先,rpm -qa | grep selinux显示您是否已经拥有它。)

警告!

我还不熟悉 SELinux,此更改可能会产生副作用损害您系统的安全

边注

我很困惑如何以 apache 用户身份测试命令(请参阅问题中删除的内容),所以我将在这里展示一种方法:只需为用户 apache 启动一个新的 shell :) :

sudo -u apache /bin/bash

请注意:SELinux 更改后,curl 对于 apache 用户仍然不起作用,因为它只允许进程 httpd 访问网络。

答案2

Centos 默认使用 SElinux,您是否查看了 apache 的 IDS 的任何规则?

请原谅我的英语,这不是我的母语

相关内容