From: William A. Rowe Jr Date: Wed, 26 Jun 2013 21:03:33 +0000 (+0000) Subject: mod_authnz_ldap: Allow using exec: callouts like SSLPassphraseDialog X-Git-Tag: 2.2.25~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c13fc4c6a48029709ee5d4c21bd561f9ef3ab2a;p=thirdparty%2Fapache%2Fhttpd.git mod_authnz_ldap: Allow using exec: callouts like SSLPassphraseDialog for AuthLDAPBindPassword. Backports: r1433478, r1467523, r1467792 Submitted by: druggeri Reviewed by: minfrin. wrowe git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1497095 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index da8578489e1..2be12e5b6c4 100644 --- a/CHANGES +++ b/CHANGES @@ -68,6 +68,9 @@ Changes with Apache 2.2.24 *) mod_ssl: Add new directive SSLCompression to disable TLS-level compression. PR 53219. [Björn Jacke , Stefan Fritsch] + *) mod_authnz_ldap: Allow using exec: calls to obtain LDAP bind + password. [Daniel Ruggeri] + Changes with Apache 2.2.23 *) SECURITY: CVE-2012-0883 (cve.mitre.org) diff --git a/STATUS b/STATUS index 71c6f8937a8..bef913714aa 100644 --- a/STATUS +++ b/STATUS @@ -114,17 +114,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - - * mod_authnz_ldap: Allow using exec: callouts like SSLPassphraseDialog - for AuthLDAPBindPassword. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1433478 - http://svn.apache.org/viewvc?view=revision&revision=1467523 - http://svn.apache.org/viewvc?view=revision&revision=1467792 - 2.2.x patch: http://people.apache.org/~druggeri/patches/AuthLDAPBindPasswordExec-2.2.patch - (20130119 - updated to include minor mmn bump) - (20130412 - updated to not use static var - thx, wrowe) - +1: druggeri, minfrin. wrowe - * mod_ssl: Catch missing, mismatched or encrypted client cert/key pairs with SSLProxyMachineCertificateFile/Path directives. PR 52212, PR 54698. (check at startup, to prevent segfaults at proxy request time) @@ -221,6 +210,12 @@ PATCHES PROPOSED TO BACKPORT FROM TRUNK: 2.2.x patch: trunk patch works modulo CHANGES +1: trawick, wrowe + * mod_authnz_ldap: Allow using exec: callouts like SSLPassphraseDialog + for AuthLDAPBindPassword. + trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1433478 + 2.4.x patch: http://people.apache.org/~druggeri/patches/AuthLDAPBindPasswordExec-2.4.patch + +1: druggeri + PATCHES/ISSUES THAT ARE STALLED * mod_cache: Realign the cache_quick_handler() to behave identically diff --git a/docs/manual/mod/mod_authnz_ldap.xml b/docs/manual/mod/mod_authnz_ldap.xml index 4a4196252f1..325e7f9d2b1 100644 --- a/docs/manual/mod/mod_authnz_ldap.xml +++ b/docs/manual/mod/mod_authnz_ldap.xml @@ -731,6 +731,21 @@ authenticating the user if this one fails module="mod_authnz_ldap">AuthLDAPBindDN and AuthLDAPBindPassword if you absolutely need them to search the directory.

+ +

If the value begins with exec: the resulting command will be + executed and the first line returned to standard output by the + program will be used as the password.

+
+#Password used as-is
+AuthLDAPBindPassword secret
+
+#Run /path/to/program to get my password
+AuthLDAPBindPassword exec:/path/to/program
+
+#Run /path/to/otherProgram and provide arguments
+AuthLDAPBindPassword "exec:/path/to/otherProgram argument1"
+
+ diff --git a/include/ap_mmn.h b/include/ap_mmn.h index f8ebeb7fae4..1b2cfa02a62 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -149,6 +149,7 @@ * 20051115.29 (2.2.21) add max_ranges to core_dir_config * 20051115.30 (2.2.21) add ap_set_accept_ranges() * 20051115.31 (2.2.23) Add forcerecovery to proxy_balancer_shared struct + # 20051115.32 (2.2.24) Add ap_get_exec_line */ #define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */ @@ -156,7 +157,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20051115 #endif -#define MODULE_MAGIC_NUMBER_MINOR 31 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 32 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/httpd.h b/include/httpd.h index f20c87332d8..5bf2cfe7135 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -1867,6 +1867,19 @@ extern int raise_sigstop_flags; */ AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r); + +/** + * Short function to execute a command and return the first line of + * output minus \r \n. Useful for "obscuring" passwords via exec calls + * @param p the pool to allocate from + * @param cmd the command to execute + * @param argv the arguments to pass to the cmd + * @return ptr to characters or NULL on any error + */ +AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p, + const char *cmd, + const char * const *argv); + /** strtoul does not exist on sunos4. */ #ifdef strtoul #undef strtoul diff --git a/modules/aaa/mod_authnz_ldap.c b/modules/aaa/mod_authnz_ldap.c index ce1af3db4de..630ca85da74 100644 --- a/modules/aaa/mod_authnz_ldap.c +++ b/modules/aaa/mod_authnz_ldap.c @@ -1075,6 +1075,43 @@ static const char *set_charset_config(cmd_parms *cmd, void *config, const char * return NULL; } +static const char *set_bind_password(cmd_parms *cmd, void *_cfg, const char *arg) +{ + authn_ldap_config_t *sec = _cfg; + int arglen = strlen(arg); + char **argv; + char *result; + + if ((arglen > 5) && strncmp(arg, "exec:", 5) == 0) { + if (apr_tokenize_to_argv(arg+5, &argv, cmd->temp_pool) != APR_SUCCESS) { + return apr_pstrcat(cmd->pool, + "Unable to parse exec arguments from ", + arg+5, NULL); + } + argv[0] = ap_server_root_relative(cmd->temp_pool, argv[0]); + + if (!argv[0]) { + return apr_pstrcat(cmd->pool, + "Invalid AuthLDAPBindPassword exec location:", + arg+5, NULL); + } + result = ap_get_exec_line(cmd->pool, + (const char*)argv[0], (const char * const *)argv); + + if(!result) { + return apr_pstrcat(cmd->pool, + "Unable to get bind password from exec of ", + arg+5, NULL); + } + sec->bindpw = result; + } + else { + sec->bindpw = (char *)arg; + } + + return NULL; +} + static const command_rec authnz_ldap_cmds[] = { AP_INIT_TAKE12("AuthLDAPURL", mod_auth_ldap_parse_url, NULL, OR_AUTHCFG, @@ -1105,8 +1142,7 @@ static const command_rec authnz_ldap_cmds[] = (void *)APR_OFFSETOF(authn_ldap_config_t, binddn), OR_AUTHCFG, "DN to use to bind to LDAP server. If not provided, will do an anonymous bind."), - AP_INIT_TAKE1("AuthLDAPBindPassword", ap_set_string_slot, - (void *)APR_OFFSETOF(authn_ldap_config_t, bindpw), OR_AUTHCFG, + AP_INIT_TAKE1("AuthLDAPBindPassword", set_bind_password, NULL, OR_AUTHCFG, "Password to use to bind to LDAP server. If not provided, will do an anonymous bind."), AP_INIT_FLAG("AuthLDAPBindAuthoritative", ap_set_flag_slot, diff --git a/server/util.c b/server/util.c index a50d0340e5a..b334c964537 100644 --- a/server/util.c +++ b/server/util.c @@ -2240,3 +2240,44 @@ AP_DECLARE(apr_status_t) ap_timeout_parameter_parse( return APR_SUCCESS; } +AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p, + const char *cmd, + const char * const * argv) +{ + char buf[MAX_STRING_LEN]; + apr_procattr_t *procattr; + apr_proc_t *proc; + apr_file_t *fp; + apr_size_t nbytes = 1; + char c; + int k; + + if (apr_procattr_create(&procattr, p) != APR_SUCCESS) + return NULL; + if (apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK, + APR_FULL_BLOCK) != APR_SUCCESS) + return NULL; + if (apr_procattr_dir_set(procattr, + ap_make_dirstr_parent(p, cmd)) != APR_SUCCESS) + return NULL; + if (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS) + return NULL; + proc = apr_pcalloc(p, sizeof(apr_proc_t)); + if (apr_proc_create(proc, cmd, argv, NULL, procattr, p) != APR_SUCCESS) + return NULL; + fp = proc->out; + + if (fp == NULL) + return NULL; + /* XXX: we are reading 1 byte at a time here */ + for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS + && nbytes == 1 && (k < MAX_STRING_LEN-1) ; ) { + if (c == '\n' || c == '\r') + break; + buf[k++] = c; + } + buf[k] = '\0'; + apr_file_close(fp); + + return apr_pstrndup(p, buf, k); +}