![apache 在访问 ldap 模块时出现内部错误](https://linux22.com/image/1415433/apache%20%E5%9C%A8%E8%AE%BF%E9%97%AE%20ldap%20%E6%A8%A1%E5%9D%97%E6%97%B6%E5%87%BA%E7%8E%B0%E5%86%85%E9%83%A8%E9%94%99%E8%AF%AF.png)
我安装了 httpd 2.4,并且 /etc/httpd/conf.d/ssl.conf 类似于
WSGIScriptAlias /wsgi_app /trac/cgi-bin/wsgi_app.py
<Directory /trac/cgi-bin>
Require all granted
</Directory>
WSGIScriptAlias /ldap_app /trac/cgi-bin/wsgi_app.py
<Location /ldap_app>
...
</Location>
在一台物理机上,它可以访问 http:///wsgi_app 和 http:///ldap_app。我想在我的小型虚拟机中克隆这样的环境(包括配置文件和包),但当我尝试访问 ldap_app URL 时出现错误。我将虚拟机的 RAM 从 512M 增加到 1024M,问题仍然存在。我为 httpd 打开了“调试”日志级别,但它没有帮助。有什么提示可以解决/跟踪此错误吗?(我检查了 /var/log/httpd/*.log,没有与此问题相关的内容)。
我发现唯一有用的区别是日志的最后一个数字。在物理机的 /var/log/httpd/ssl_request_log 上
[14/Jul/2014:17:26:38 +0800] 192.168.2.160 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET /ldap_app HTTP/1.1" 2088
在虚拟机的 /var/log/httpd/ssl_request_log 上
[14/Jul/2014:17:37:55 +0800] 192.168.2.160 TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 "GET /ldap_app HTTP/1.1" 527
/etc/httpd/conf.d/ssl.conf 是
<Location /ldap-status>
SetHandler ldap-status
AuthType Basic
AuthName "LDAP Protected"
AuthBasicProvider ldap
AuthLDAPBindDN "CN=foo,CN=Users,DC=bar,DC=com,DC=tw"
AuthLDAPBindPassword "pass"
AuthLDAPURL "ldap://192.168.1.1:389/CN=Users,DC=taifex,DC=com,DC=tw?sAMAccountName?sub?(objectClass=*)"
# Require valid-user
</Location>
如果我启用“需要有效用户”,则会出现以下错误消息:内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求。
Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
答案1
我今天在我的 RHEL 7 和 CentOS 7 服务器上遇到了这个问题。
这是 SELinux 的一个问题,已正确识别,可以在检查审计日志时发现(灵感来自这篇文章 -https://serverfault.com/questions/343850/apache-httpd-with-ldap-error-in-centos), 令人恼火的是,它不在任何 Apache 日志中!
grep -m 1 httpd /var/log/audit/audit.log | audit2why
返回
type=AVC msg=audit(1447030307.379:374): avc: denied { name_connect } for pid=1132 comm="httpd" dest=389 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1447030307.379:374): arch=c000003e syscall=42 success=no exit=-13 a0=18 a1=7f0e86f6aa30 a2=10 a3=0 items=0 ppid=1029 pid=1132 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
然而,关闭 SELinux 并不是解决办法。
SELinux 有许多适用于 httpd 进程的配置选项,可以通过运行以下命令找到完整列表:
getsebool -a | grep httpd
其中一个配置选项是 httpd_can_connect_ldap,其默认为关闭。以 root 身份运行以下命令
setsebool -P httpd_can_connect_ldap on
允许 httpd 进程访问标准端口上的 LDAP 服务器。
答案2
禁用 SELinux 即可让它工作。(这是一个糟糕的方法,但它有效。在我的问题中,可工作的机器打开了 SELinux)
编辑 /etc/selinux/config 并重新启动
SELINUX=didsabled