2015-02-23 166 views
2

我有一个外部web服务器,我正在迁移。我试图通过LDAP在内部服务器上对Active Directory进行身份验证。我能够使用相同的代码连接并从旧服务器(Ubuntu 8)进行身份验证,但无法在新服务器上进行身份验证(Redhat 7)。PHP LDAP连接无法联系LDAP服务器

外部服务器当前正在运行Redhat 7,运行PHP 5.4.16且启用了LDAP支持(php-ldap)。

内部服务器当前是具有LDAP和Active Directory的Windows Server 2008框。

下面的代码是我使用的当前PHP能够连接旧服务器,但在新服务器上有问题。它基本上使用PHP的LDAP连接字符串并尝试绑定。我用标识符替换了一些个人信息。 (用户名,子域名等)

<?php 

$adServer = "ldaps://subdomain.domain.edu"; 

$ldap = ldap_connect($adServer); 
$username = 'USERNAME'; 
$password = 'PASS'; 

$ldaprdn = 'DOMAIN' . "\\" . $username; 

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); 
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 

$bind = @ldap_bind($ldap, $ldaprdn, $password); 


if ($bind) { 
    $filter="(sAMAccountName=$username)"; 
    $result = ldap_search($ldap,"dc=subdomain,dc=domain,dc=edu",$filter); 
    ldap_sort($ldap,$result,"sn"); 
    $info = ldap_get_entries($ldap, $result); 
    for ($i=0; $i<$info["count"]; $i++) 
    { 
     if($info['count'] > 1) 
      break; 
     echo "<p>You are accessing <strong> ". $info[$i]["sn"][0] .", " . $info[$i]["givenname"][0] ."</strong><br /> (" . $info[$i]["samaccountname"][0] .")</p>\n"; 
     echo '<pre>'; 
     var_dump($info); 
     echo '</pre>'; 
     $userDn = $info[$i]["distinguishedname"][0]; 
    } 
    @ldap_close($ldap); 
} else { 
    $msg = "Invalid email address/password"; 
    echo $msg; 
} 

?> 

在新服务器上,我能够连接到LDAP服务器就好使用该ldapsearch命令:

ldapsearch -x -LLL -h sub-domain.domain.edu -D 'CN=DOMAIN\USERNAME' -w 'PASS' -b "dc=subdomain,dc=domain,dc=edu" -s sub "(objectClass=user)" givenName

这里是我的ldap.conf的文件(/etc/openldap/ldap.conf,新的服务器)

# 
# LDAP Defaults 
# 

# See ldap.conf(5) for details 
# This file should be world readable but not world writable. 

#BASE dc=example,dc=com 
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666 

#SIZELIMIT  12 
#TIMELIMIT  15 
#DEREF   never 

#TLS_CACERTDIR /etc/openldap/certs 

# Turning this off breaks GSSAPI used with krb5 when rdns = false 
SASL_NOCANON on 
TLS_REQCERT never 

这是我在错误日志(新服务器)获取:

ldap_create 
ldap_url_parse_ext(ldaps://subdomain.domain.edu) 
ldap_bind_s 
ldap_simple_bind_s 
ldap_sasl_bind_s 
ldap_sasl_bind 
ldap_send_initial_request 
ldap_new_connection 1 1 0 
ldap_int_open_connection 
ldap_connect_to_host: TCP subdomain.domain.edu:636 
ldap_new_socket: 10 
ldap_prepare_socket: 10 
ldap_connect_to_host: Trying XXX.18X.XX.19:636 
ldap_pvt_connect: fd: 10 tm: -1 async: 0 
attempting to connect: 
connect errno: 13 
ldap_close_socket: 10 
ldap_new_socket: 10 
ldap_prepare_socket: 10 
ldap_connect_to_host: Trying XXX.18X.XX.24:636 
ldap_pvt_connect: fd: 10 tm: -1 async: 0 
attempting to connect: 
connect errno: 13 
ldap_close_socket: 10 
ldap_new_socket: 10 
ldap_prepare_socket: 10 
ldap_connect_to_host: Trying XXX.18X.XX.41:636 
ldap_pvt_connect: fd: 10 tm: -1 async: 0 
attempting to connect: 
connect errno: 13 
ldap_close_socket: 10 
ldap_new_socket: 10 
ldap_prepare_socket: 10 
ldap_connect_to_host: Trying 2002:XXXX:XXXX::XXXX:XXXX 636 
ldap_pvt_connect: fd: 10 tm: -1 async: 0 
attempting to connect: 
connect errno: 13 
ldap_close_socket: 10 
ldap_err2string 
[Mon Feb 23 15:20:28.689775 2015] [:error] [pid 12299] [client 10.25.XX.XX:53630] PHP Warning: ldap_bind(): Unable to bind to server: Can't contact LDAP server in /var/www/html/index2.php on line 19 

回答

6

经过几天的搜索后,我想出了答案。 SELinux的。更具体地说,设置了SELinux Booleanshttpd_can_network_connect是我们正在寻找的一个:

httpd_can_network_connect (HTTPD Service):: Allow HTTPD scripts and modules to connect to the network.

此命令可以用来开启:

setsebool -P httpd_can_network_connect on

我解决了这个通过寻找这个答案:

LDAP works with PHP CLI but not through apache