On Tue, 2007-11-06 at 06:41 -0500, Newman, Edward (GTI) wrote:
> Ian
>
> Thanks. I was going to send you the attached patch which gets SASL
> working again. I will apply your patch and retest.
>
> One thing I noticed in reviewing code is that three files have to be
> configured to set up LDAP - /etc/sysconfig/autofs,
> /etc/auto_ldap_auth.conf and /etc/openldap/ldap.conf. Is there a reason
> for this? Can I look at rationalising this? Not clear why there is made
> a dependency on XML libraries.
Not sure what to do about this fragmented configuration.
The dependency on /etc/openldap/ldap.conf was because we couldn't
specify servers to connect to or basedns to use for searching
in /etc/sysconfig/autofs but that has changed now with this problematic
enhancement (and another patch). I think allowing for the configuration
of the stuff needed from /etc/openldap/ldap.conf is the most important
thing to do and that's almost done. I guess there's the specification of
certificates as well but that's a fair bit of work and so it will have
to wait.
The /etc/auto_ldap_auth.conf being an XML file came along with the
Kerberos code that I merged from Jeff. I'm not sure why he wanted to use
XML and I wasn't really worried about it at the time. From memory it was
decided to put the authentication information in a separate, locked down
file, so it could be kept private while the general configuration could
still be read by anyone who may need to know about it.
Looks like there's a bit of line wrap in the attached patch, oops!
I think there's a memory leak as well calling parse_ldap_config multiple
times and I think calling autofs_sasl_init multiple times may be bad as
also. I think I dealt with that in my patch but I'll need to go over it
again before I commit it, if it actually works.
One little thing about patches, it's much easier for me to know what I'm
looking at if the -p option to diff is used when generating them.
>
> Edward
>
>
>
> diff -U 3 -r --exclude-from=exclude-files a/configure.in b/configure.in
> --- a/configure.in 2007-11-05 17:53:01.000000000 -0500
> +++ b/configure.in 2007-11-05 16:18:59.000000000 -0500
> @@ -234,7 +234,7 @@
> SASL_FLAGS="-I${withval}/include"
> fi
> )
> -if test -z "$HAVE_SASL" -a "$HAVE_LIBXML" == "1"
> +if test -n "$HAVE_SASL" -a "$HAVE_LIBXML" == "1"
> then
> HAVE_SASL=0
> AC_CHECK_LIB(sasl2, sasl_client_start, HAVE_SASL=1
> LIBSASL="$LIBSASL -lsasl2", , -lsasl2 $LIBS)
> diff -U 3 -r --exclude-from=exclude-files a/modules/cyrus-sasl.c
> b/modules/cyrus-sasl.c
> --- a/modules/cyrus-sasl.c 2007-11-05 17:53:01.000000000 -0500
> +++ b/modules/cyrus-sasl.c 2007-11-05 16:41:08.000000000 -0500
> @@ -386,7 +386,7 @@
>
> debug(logopt,
> "initializing kerberos ticket: client principal %s ",
> - ctxt->client_princ ? "" : "autofsclient");
> + ctxt->client_princ ? ctxt->client_princ : "autofsclient");
>
> ret = krb5_init_context(&ctxt->krb5ctxt);
> if (ret) {
> diff -U 3 -r --exclude-from=exclude-files a/modules/lookup_ldap.c
> b/modules/lookup_ldap.c
> --- a/modules/lookup_ldap.c 2007-11-05 17:53:01.000000000 -0500
> +++ b/modules/lookup_ldap.c 2007-11-05 16:28:04.000000000 -0500
> @@ -50,6 +50,7 @@
> static unsigned int common_schema_count =
> sizeof(common_schema)/sizeof(struct ldap_schema);
>
> static LDAP *auth_init(unsigned logopt, const char *, struct
> lookup_context *);
> +static int parse_ldap_config(unsigned logopt, struct lookup_context
> *ctxt);
>
> int bind_ldap_anonymous(unsigned logopt, LDAP *ldap, struct
> lookup_context *ctxt)
> {
> @@ -495,8 +496,35 @@
> * Determine which authentication mechanism to use if we require
> * authentication.
> */
> + int ret;
> +
> + ret = parse_ldap_config(logopt, ctxt);
> + if (ret)
> + return NULL;
> +
> if (ctxt->auth_required & LDAP_AUTH_REQUIRED) {
> - ldap = auth_init(logopt, uri, ctxt);
> + //ldap = auth_init(logopt, uri, ctxt);
> +
> + ldap = init_ldap_connection(logopt, uri, ctxt);
> + if (!ldap)
> + return NULL;
> +
> + /*
> + * Initialize the sasl library. It is okay if user and
> secret
> + * are NULL, here.
> + *
> + * The autofs_sasl_init routine will figure out which
> mechamism
> + * to use. If kerberos is used, it will also take care
> to initialize
> + * the credential cache and the client and service
> principals.
> + */
> + debug(logopt, "EN: Before autofs_sasl_init");
> + ret = autofs_sasl_init(logopt, ldap, ctxt);
> + debug(logopt, "EN: After autofs_sasl_init");
> + if (ret) {
> + ctxt->sasl_mech = NULL;
> + return NULL;
> + }
> +
> if (!ldap && ctxt->auth_required & LDAP_AUTH_AUTODETECT)
> info(logopt,
> "no authentication mechanisms auto
> detected.");
> @@ -514,6 +542,8 @@
>
> return ldap;
> }
> + else
> + {
> #endif
>
> ldap = do_connect(logopt, uri, ctxt);
> @@ -525,6 +555,11 @@
> }
>
> return ldap;
> +
> +#ifdef WITH_SASL
> + }
> +#endif
> +
> }
>
> static LDAP *find_server(unsigned logopt, struct lookup_context *ctxt)
>
>
> Edward
>
> ___________________________________
> Edward Newman
> GTI A&E Identity Services, Merrill Lynch & Co
> 9th Fl, 222 Broadway, NY, NY 10038, USA
> P: +1-212-670-1546 C: +1-917-975-2356
>
>
>
> -----Original Message-----
> From: Ian Kent [mailto:[EMAIL PROTECTED]
> Sent: 06 November 2007 01:21
> To: Newman, Edward (GTI)
> Cc: [email protected]
> Subject: Re: [autofs] AutoFS / SASL support
>
>
> On Fri, 2007-11-02 at 14:25 -0400, Newman, Edward (GTI) wrote:
> > Just wanted to confirm whether SASL support is currently broken in
> 5.0.2
> > with all outstanding patches applied.
> >
> > Debug of code suggests following issues:
> >
> > - Makefile has invalid test for HAVE_SASL in configure.in and thus
> > doesn't include correct libraries (-z instead of -n in test step)
>
> OK, so for now just don't use --with-sasl and it should build in SASL
> support.
>
> > - patched code in connect_to_server in lookup_ldap.c does not call
> > auth_init prior to testing for auth_required and thus fails SASL in
> all
> > cases
>
> Yes, please try patch below.
>
> > - order of code sequence currently fails to enable SASL correctly.
>
> As Jeff says, is this just restating the point above?
>
> >
> > I am also trying to use an existing keytab for Kerberos GSSAPI
> > authentication to directory and currently sasl_kinit code appears to
> > fail. Haven't worked out exact cause yet but appears to not passing a
> > keytab name and environment is not picking up location from krb5.conf.
>
> This is a bit more interesting.
> We need to be able to use alternate keytabs.
> I believe that the code, as it is, will use the Kerberos5 mechanisms to
> locate the keytab. Are you setting KRB5_KTNAME?
>
> Anyway, this patch should fix the second issue you mentioned above.
> Can you give it a try please?
>
> ---
> diff --git a/modules/cyrus-sasl.c b/modules/cyrus-sasl.c
> index 18733f3..75b8667 100644
> --- a/modules/cyrus-sasl.c
> +++ b/modules/cyrus-sasl.c
> @@ -75,6 +75,7 @@ static const char *krb5ccval = "MEMORY:_autofstkt";
> static pthread_mutex_t krb5cc_mutex = PTHREAD_MUTEX_INITIALIZER;
> static unsigned int krb5cc_in_use = 0;
>
> +static unsigned int init_callbacks = 1;
> static int sasl_log_func(void *, int, const char *);
> static int getpass_func(sasl_conn_t *, void *, int, sasl_secret_t **);
> static int getuser_func(void *, int, const char **, unsigned *);
> @@ -721,23 +722,30 @@ autofs_sasl_init(unsigned logopt, LDAP *ldap,
> struct lookup_context *ctxt)
> sasl_conn_t *conn;
>
> /* Start up Cyrus SASL--only needs to be done once. */
> - if (sasl_client_init(callbacks) != SASL_OK) {
> + if (init_callbacks && sasl_client_init(callbacks) != SASL_OK) {
> error(logopt, "sasl_client_init failed");
> return -1;
> }
> + init_callbacks = 0;
>
> sasl_auth_id = ctxt->user;
> sasl_auth_secret = ctxt->secret;
>
> /*
> - * If sasl_mech was not filled in, it means that there was no
> - * mechanism specified in the configuration file. Try to auto-
> - * select one.
> + * If LDAP_AUTH_AUTODETECT is set, it means that there was no
> + * mechanism specified in the configuration file or auto
> + * selection has been requested, so try to auto-select an
> + * auth mechanism.
> */
> - if (ctxt->sasl_mech)
> + if (!(ctxt->auth_required & LDAP_AUTH_AUTODETECT))
> conn = sasl_bind_mech(logopt, ldap, ctxt,
> ctxt->sasl_mech);
> - else
> + else {
> + if (ctxt->sasl_mech) {
> + free(ctxt->sasl_mech);
> + ctxt->sasl_mech = NULL;
> + }
> conn = sasl_choose_mech(logopt, ldap, ctxt);
> + }
>
> if (conn) {
> sasl_dispose(&conn);
> diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
> index dfb3054..fc2ed52 100644
> --- a/modules/lookup_ldap.c
> +++ b/modules/lookup_ldap.c
> @@ -400,8 +400,7 @@ static int do_bind(unsigned logopt, LDAP *ldap,
> struct lookup_context *ctxt)
> debug(logopt, MODPREFIX "auth_required: %d, sasl_mech %s",
> ctxt->auth_required, ctxt->sasl_mech);
>
> - if (ctxt->sasl_mech ||
> - (ctxt->auth_required &
> (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT))) {
> + if (ctxt->auth_required &
> (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT)) {
> rv = autofs_sasl_bind(logopt, ldap, ctxt);
> debug(logopt, MODPREFIX "autofs_sasl_bind returned %d",
> rv);
> } else {
> @@ -495,7 +494,7 @@ static LDAP *connect_to_server(unsigned logopt,
> const char *uri, struct lookup_c
> * Determine which authentication mechanism to use if we require
> * authentication.
> */
> - if (ctxt->auth_required & LDAP_AUTH_REQUIRED) {
> + if (ctxt->auth_required &
> (LDAP_AUTH_REQUIRED|LDAP_AUTH_AUTODETECT)) {
> ldap = auth_init(logopt, uri, ctxt);
> if (!ldap && ctxt->auth_required & LDAP_AUTH_AUTODETECT)
> info(logopt,
> @@ -577,7 +576,9 @@ static LDAP *do_reconnect(unsigned logopt, struct
> lookup_context *ctxt)
> list_add_tail(&this->list, ctxt->uri);
> }
>
> +#ifdef WITH_SASL
> autofs_sasl_done(ctxt);
> +#endif
>
> /* Current server failed connect, try the rest */
> ldap = find_server(logopt, ctxt);
> @@ -840,6 +841,8 @@ int parse_ldap_config(unsigned logopt, struct
> lookup_context *ctxt)
> ctxt->tls_required = tls_required;
> ctxt->auth_required = auth_required;
> ctxt->sasl_mech = authtype;
> + if (!authtype && (auth_required & LDAP_AUTH_REQUIRED))
> + ctxt->auth_required |= LDAP_AUTH_AUTODETECT;
> ctxt->user = user;
> ctxt->secret = secret;
> ctxt->client_princ = client_princ;
> @@ -882,16 +885,6 @@ static LDAP *auth_init(unsigned logopt, const char
> *uri, struct lookup_context *
> int ret;
> LDAP *ldap;
>
> - /*
> - * First, check to see if a preferred authentication method was
> - * specified by the user. parse_ldap_config will return error
> - * if the permissions on the file were incorrect, or if the
> - * specified authentication type is not valid.
> - */
> - ret = parse_ldap_config(logopt, ctxt);
> - if (ret)
> - return NULL;
> -
> ldap = init_ldap_connection(logopt, uri, ctxt);
> if (!ldap)
> return NULL;
> @@ -1180,6 +1173,7 @@ int lookup_init(const char *mapfmt, int argc,
> const char *const *argv, void **co
> struct lookup_context *ctxt;
> char buf[MAX_ERR_BUF];
> LDAP *ldap = NULL;
> + int ret;
>
> *context = NULL;
>
> @@ -1220,6 +1214,20 @@ int lookup_init(const char *mapfmt, int argc,
> const char *const *argv, void **co
> }
> }
>
> +#ifdef WITH_SASL
> + /*
> + * First, check to see if a preferred authentication method was
> + * specified by the user. parse_ldap_config will return error
> + * if the permissions on the file were incorrect, or if the
> + * specified authentication type is not valid.
> + */
> + ret = parse_ldap_config(LOGOPT_NONE, ctxt);
> + if (ret) {
> + free_context(ctxt);
> + return 1;
> + }
> +#endif
> +
> if (ctxt->server || !ctxt->uri) {
> ldap = connect_to_server(LOGOPT_NONE, ctxt->server,
> ctxt);
> if (!ldap) {
> --------------------------------------------------------
>
> This message w/attachments (message) may be privileged, confidential or
> proprietary, and if you are not an intended recipient, please notify the
> sender, do not use or share it and delete it. Unless specifically indicated,
> this message is not an offer to sell or a solicitation of any investment
> products or other financial product or service, an official confirmation of
> any transaction, or an official statement of Merrill Lynch. Subject to
> applicable law, Merrill Lynch may monitor, review and retain e-communications
> (EC) traveling through its networks/systems. The laws of the country of each
> sender/recipient may impact the handling of EC, and EC may be archived,
> supervised and produced in countries other than the country in which you are
> located. This message cannot be guaranteed to be secure or error-free. This
> message is subject to terms available at the following link:
> http://www.ml.com/e-communications_terms/. By messaging with Merrill Lynch
> you consent to the foregoing.
> --------------------------------------------------------
_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs