View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
1475 | RackTables | default | public | 2015-05-18 01:39 | 2015-05-18 01:46 |
Reporter | simon2 | Assigned To | |||
Priority | low | Severity | feature | Reproducibility | N/A |
Status | new | Resolution | open | ||
Product Version | 0.20.8 | ||||
Summary | 1475: Combined HTTPD trust for username, with LDAP search for group membership | ||||
Description | Regarding user authorization in secret.php: $user_auth_src = 'ldap' queries a directory service. $user_auth_src = 'httpd' takes the username from the webserver. The wiki page on LDAP says "The drawback of [using httpd] is that group membership information wouldn't be available at RackTables level". This means there's no way to use Kerberos to the webserver to authorise the user without a password prompt, and also use LDAP to query for group membership. I added code for a new source called 'httpdldap', in auth.php. This takes the username from the webserver like httpd, and the group membership from the configured LDAP server, connecting with the search_bind_rdn and search_bind_password. In auth.php: function authorize() phase 2 the 'httpd' case is used for 'httpdldap' as well. function authorize() phase 4 the 'ldap' case is used for 'httpdldap', passing no password for ldap auth. (real 'ldap' connections should still work because phase 2 mandates a password before we get here). function QueryLDAP() gets a new global, so it can check $auth_usr_src. function QueryLDAP() gets a change so after deciding on a username, if it's using 'httpdldap' for auth then it rebinds with the given search_bind_rdn details instead of the user supplied details, or throws an error if they aren't set. I'm attaching a patch (auth.php.patch) which is a diff of the original RackTables 0.20.8 auth.php and my edited one. It's not thoroughly tested. | ||||
Steps To Reproduce | Apache/Kerberos SSO/'httpd' -> seamless login, but no groups. Apache/Kerberos SSO/'ldap' -> login prompt, groups. Apache/Kerberos SSO/patched 'httpdldap' -> seamless login and groups. | ||||
Tags | No tags attached. | ||||
Attached Files | auth.php.patch (2,772 bytes)
--- auth.php.orig 2015-05-18 00:16:05.298179556 +0100 +++ auth.php 2015-05-18 00:33:34.622177357 +0100 @@ -52,7 +52,7 @@ throw new RackTablesError ('', RackTablesError::NOT_AUTHENTICATED); $remote_username = $_SERVER['PHP_AUTH_USER']; break; - case 'httpd' == $user_auth_src: + case ('httpd' == $user_auth_src) or ('httpdldap' == $user_auth_src): if ( ! isset ($_SERVER['REMOTE_USER']) or @@ -97,9 +97,9 @@ if (authenticated_via_database ($userinfo, $_SERVER['PHP_AUTH_PW'])) return; // success break; // failure - case 'ldap' == $user_auth_src: + case ('ldap' == $user_auth_src) or ('httpdldap' == $user_auth_src): $ldap_dispname = ''; - if (! authenticated_via_ldap ($remote_username, $_SERVER['PHP_AUTH_PW'], $ldap_dispname)) + if (! authenticated_via_ldap ($remote_username, (isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''), $ldap_dispname)) break; // failure $remote_displayname = strlen ($userinfo['user_realname']) ? // local value is most preferred $userinfo['user_realname'] : @@ -465,7 +465,7 @@ // function queryLDAPServer ($username, $password) { - global $LDAP_options; + global $LDAP_options, $user_auth_src; if(extension_loaded('ldap') === FALSE) throw new RackTablesError ('LDAP misconfiguration. LDAP PHP Module is not installed.', RackTablesError::MISCONFIGURED); @@ -531,7 +531,23 @@ } else throw new RackTablesError ('LDAP misconfiguration. Cannon build username for authentication.', RackTablesError::MISCONFIGURED); - $bind = @ldap_bind ($connect, $auth_user_name, $password); + + // With httpdldap, we took the username from the webserver, but we have no password + // so reconnect with the search_bind_* details to find the user's group membership + if ('httpdldap' == $user_auth_src) { + if ( + !isset ($LDAP_options['search_bind_rdn']) or + !strlen ($LDAP_options['search_bind_rdn']) or + !isset ($LDAP_options['search_bind_password']) or + !strlen ($LDAP_options['search_bind_password']) + ) { + throw new RackTablesError ('To use httpdldap auth, you must specify search_bind_rdn and search_bind_password.', RackTablesError::MISCONFIGURED); + } + $bind = @ldap_bind ($connect, $LDAP_options['search_bind_rdn'], $LDAP_options['search_bind_password']); + } else { + $bind = @ldap_bind ($connect, $auth_user_name, $password); + } + if ($bind === FALSE) switch (ldap_errno ($connect)) { | ||||