背景
公司内部的一些工具系统越来越多,需要一套统一的账户管理,便搭建LDAP服务进行解决,集成几个服务之后,在集成svn时,却出现了问题。
问题现象
- 错误信息
界面报错为"internal server error 500"
后台调整日志级别之后错误如下:
[Tue Aug 24 21:14:11.163950 2021] [authnz_ldap:debug] [pid 19373:tid 139955747571456] mod_authnz_ldap.c(523): [client 192.168.60.7:56086] AH01691: auth_ldap authenticate: using URL ldap://xxxx:389/ou=People,dc=cqmaple,dc=com?uid?sub?(objectClass=*), referer: http://xxxx/
[Tue Aug 24 21:14:11.168307 2021] [authnz_ldap:info] [pid 19373:tid 139955747571456] [client 192.168.1.7:56086] AH01695: auth_ldap authenticate: user rancw authentication failed; URI /svn/ [LDAP: ldap_simple_bind() failed][Can't contact LDAP server], referer: http://xxxx/
配置文件如下:
<Location /svn>
DAV svn
SVNParentPath /home/svn
AuthName "SVN Repos"
AuthType Basic
AuthzSVNAccessFile /home/svn/conf/authz
AuthBasicProvider ldap
AuthLDAPURL "ldap://xxxx:389/ou=People,dc=cqmaple,dc=com?uid?sub?(objectClass=*)" NONE
AuthLDAPBindDN "cn=admin,dc=cqmaple,dc=com"
AuthLDAPBindPassword "123456"
Require valid-user
LogLevel debug
</Location>
问题分析
根据后台日志,开始定位是配置问题,在网上找了一些配置信息,发现并没有不同。
最后注意到Can't contact LDAP server
,分析为注意到访问问题,根据日志auth_ldap authenticate: using URL ldap://xxxx:389/ou=People,dc=cqmaple,dc=com?uid?sub?(objectClass=*),
发现链接信息是无误的,又通过ldapsearch
命令进行检查,确认服务可用.
在查询一些资料之后,可能是SELinux安全配置导致的。
于是检查 SELinux logs are at /var/log/audit/audit.log,如下信息
type=SYSCALL msg=audit(1629853069.396:767970): arch=c000003e syscall=42 success=no exit=-13 a0=18 a1=7faf1800a710 a2=10 a3=0 items=0 ppid=15372 pid=15378 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)ARCH=x86_64 SYSCALL=connect AUID="unset" UID="apache" GID="apache" EUID="apache" SUID="apache" FSUID="apache" EGID="apache" SGID="apache" FSGID="apache"
type=PROCTITLE msg=audit(1629853069.396:767970): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
type=AVC msg=audit(1629853069.396:767971): avc: denied { name_connect } for pid=15378 comm="httpd" dest=389 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ldap_port_t:s0 tclass=tcp_socket permissive=0
日志中avc:denied { name_connect } for pid=15378 comm="httpd" dest=389
,可以理解为SELinux不允许httpd访问ldap服务。
解决问题
- 通过命令检查
# getsebool -a | grep ldap authlogin_nsswitch_use_ldap --> off dhcpd_use_ldap --> off httpd_can_connect_ldap --> off
发现httpd_can_connect_ldap为off。
- 修改配置
setsebool httpd_can_connect_ldap 1 # 确认是否修改成功 # getsebool -a | grep ldap authlogin_nsswitch_use_ldap --> off dhcpd_use_ldap --> off httpd_can_connect_ldap --> on
最后重启一下服务即可。