Backport fix for GSSAPI fallback realm
This commit is contained in:
		
							parent
							
								
									0d08e37340
								
							
						
					
					
						commit
						beaf0637a0
					
				
							
								
								
									
										188
									
								
								Use-fallback-realm-for-GSSAPI-ccache-selection.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								Use-fallback-realm-for-GSSAPI-ccache-selection.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,188 @@ | |||||||
|  | From d903c706a378c521ae38d57d95e43fb10469b03f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Matt Rogers <mrogers@redhat.com> | ||||||
|  | Date: Fri, 10 Feb 2017 12:53:42 -0500 | ||||||
|  | Subject: [PATCH] Use fallback realm for GSSAPI ccache selection | ||||||
|  | 
 | ||||||
|  | In krb5_cc_select(), if the server principal has an empty realm, use | ||||||
|  | krb5_get_fallback_host_realm() and set the server realm to the first | ||||||
|  | fallback found.  This helps with the selection of a non-default ccache | ||||||
|  | when there is no [domain_realms] configuration for the server domain. | ||||||
|  | Modify t_ccselect.py tests to account for fallback behavior. | ||||||
|  | 
 | ||||||
|  | ticket: 8549 (new) | ||||||
|  | (cherry picked from commit 234b64bd6139d5b75dadd5abbd5bef5a162e298a) | ||||||
|  | [rharwood@redhat.com conflicts t_ccselect.py] | ||||||
|  | ---
 | ||||||
|  |  src/lib/krb5/ccache/ccselect.c | 37 +++++++++++++++++++++++++----- | ||||||
|  |  src/tests/gssapi/t_ccselect.py | 51 +++++++++++++++++++++++++++++++++--------- | ||||||
|  |  2 files changed, 73 insertions(+), 15 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/lib/krb5/ccache/ccselect.c b/src/lib/krb5/ccache/ccselect.c
 | ||||||
|  | index 2f3071a27..ee4b83a9b 100644
 | ||||||
|  | --- a/src/lib/krb5/ccache/ccselect.c
 | ||||||
|  | +++ b/src/lib/krb5/ccache/ccselect.c
 | ||||||
|  | @@ -132,6 +132,8 @@ krb5_cc_select(krb5_context context, krb5_principal server,
 | ||||||
|  |      struct ccselect_module_handle **hp, *h; | ||||||
|  |      krb5_ccache cache; | ||||||
|  |      krb5_principal princ; | ||||||
|  | +    krb5_principal srvcp = NULL;
 | ||||||
|  | +    char **fbrealms = NULL;
 | ||||||
|  |   | ||||||
|  |      *cache_out = NULL; | ||||||
|  |      *princ_out = NULL; | ||||||
|  | @@ -139,7 +141,27 @@ krb5_cc_select(krb5_context context, krb5_principal server,
 | ||||||
|  |      if (context->ccselect_handles == NULL) { | ||||||
|  |          ret = load_modules(context); | ||||||
|  |          if (ret) | ||||||
|  | -            return ret;
 | ||||||
|  | +            goto cleanup;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    /* Try to use the fallback host realm for the server if there is no
 | ||||||
|  | +     * authoritative realm. */
 | ||||||
|  | +    if (krb5_is_referral_realm(&server->realm) &&
 | ||||||
|  | +        server->type == KRB5_NT_SRV_HST && server->length == 2) {
 | ||||||
|  | +        ret = krb5_get_fallback_host_realm(context, &server->data[1],
 | ||||||
|  | +                                           &fbrealms);
 | ||||||
|  | +        if (ret)
 | ||||||
|  | +            goto cleanup;
 | ||||||
|  | +
 | ||||||
|  | +        /* Make a copy with the first fallback realm. */
 | ||||||
|  | +        ret = krb5_copy_principal(context, server, &srvcp);
 | ||||||
|  | +        if (ret)
 | ||||||
|  | +            goto cleanup;
 | ||||||
|  | +        ret = krb5_set_principal_realm(context, srvcp, fbrealms[0]);
 | ||||||
|  | +        if (ret)
 | ||||||
|  | +            goto cleanup;
 | ||||||
|  | +
 | ||||||
|  | +        server = srvcp;
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      /* Consult authoritative modules first, then heuristic ones. */ | ||||||
|  | @@ -155,20 +177,25 @@ krb5_cc_select(krb5_context context, krb5_principal server,
 | ||||||
|  |                                           princ); | ||||||
|  |                  *cache_out = cache; | ||||||
|  |                  *princ_out = princ; | ||||||
|  | -                return 0;
 | ||||||
|  | +                goto cleanup;
 | ||||||
|  |              } else if (ret == KRB5_CC_NOTFOUND) { | ||||||
|  |                  TRACE_CCSELECT_MODNOTFOUND(context, h->vt.name, server, princ); | ||||||
|  |                  *princ_out = princ; | ||||||
|  | -                return ret;
 | ||||||
|  | +                goto cleanup;
 | ||||||
|  |              } else if (ret != KRB5_PLUGIN_NO_HANDLE) { | ||||||
|  |                  TRACE_CCSELECT_MODFAIL(context, h->vt.name, ret, server); | ||||||
|  | -                return ret;
 | ||||||
|  | +                goto cleanup;
 | ||||||
|  |              } | ||||||
|  |          } | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      TRACE_CCSELECT_NOTFOUND(context, server); | ||||||
|  | -    return KRB5_CC_NOTFOUND;
 | ||||||
|  | +    ret = KRB5_CC_NOTFOUND;
 | ||||||
|  | +
 | ||||||
|  | +cleanup:
 | ||||||
|  | +    krb5_free_principal(context, srvcp);
 | ||||||
|  | +    krb5_free_host_realm(context, fbrealms);
 | ||||||
|  | +    return ret;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  void | ||||||
|  | diff --git a/src/tests/gssapi/t_ccselect.py b/src/tests/gssapi/t_ccselect.py
 | ||||||
|  | index 6be6b4ec0..c6201ca41 100755
 | ||||||
|  | --- a/src/tests/gssapi/t_ccselect.py
 | ||||||
|  | +++ b/src/tests/gssapi/t_ccselect.py
 | ||||||
|  | @@ -31,12 +31,18 @@ r2 = K5Realm(create_user=False, realm='KRBTEST2.COM', portbase=62000,
 | ||||||
|  |   | ||||||
|  |  host1 = 'p:' + r1.host_princ | ||||||
|  |  host2 = 'p:' + r2.host_princ | ||||||
|  | +foo = 'foo.krbtest.com'
 | ||||||
|  | +foo2 = 'foo.krbtest2.com'
 | ||||||
|  |   | ||||||
|  | -# gsserver specifies the target as a GSS name.  The resulting
 | ||||||
|  | -# principal will have the host-based type, but the realm won't be
 | ||||||
|  | -# known before the client cache is selected (since k5test realms have
 | ||||||
|  | -# no domain-realm mapping by default).
 | ||||||
|  | -gssserver = 'h:host@' + hostname
 | ||||||
|  | +# These strings specify the target as a GSS name.  The resulting
 | ||||||
|  | +# principal will have the host-based type, with the referral realm
 | ||||||
|  | +# (since k5test realms have no domain-realm mapping by default).
 | ||||||
|  | +# krb5_cc_select() will use the fallback realm, which is either the
 | ||||||
|  | +# uppercased parent domain, or the default realm if the hostname is a
 | ||||||
|  | +# single component.
 | ||||||
|  | +gssserver = 'h:host@' + foo
 | ||||||
|  | +gssserver2 = 'h:host@' + foo2
 | ||||||
|  | +gsslocal = 'h:host@localhost'
 | ||||||
|  |   | ||||||
|  |  # refserver specifies the target as a principal in the referral realm. | ||||||
|  |  # The principal won't be treated as a host principal by the | ||||||
|  | @@ -67,6 +73,16 @@ r1.addprinc(alice, password('alice'))
 | ||||||
|  |  r1.addprinc(bob, password('bob')) | ||||||
|  |  r2.addprinc(zaphod, password('zaphod')) | ||||||
|  |   | ||||||
|  | +# Create host principals and keytabs for fallback realm tests.
 | ||||||
|  | +r1.addprinc('host/localhost')
 | ||||||
|  | +r2.addprinc('host/localhost')
 | ||||||
|  | +r1.addprinc('host/' + foo)
 | ||||||
|  | +r2.addprinc('host/' + foo2)
 | ||||||
|  | +r1.extract_keytab('host/localhost', r1.keytab)
 | ||||||
|  | +r2.extract_keytab('host/localhost', r2.keytab)
 | ||||||
|  | +r1.extract_keytab('host/' + foo, r1.keytab)
 | ||||||
|  | +r2.extract_keytab('host/' + foo2, r2.keytab)
 | ||||||
|  | +
 | ||||||
|  |  # Get tickets for one user in each realm (zaphod will be primary). | ||||||
|  |  r1.kinit(alice, password('alice')) | ||||||
|  |  r2.kinit(zaphod, password('zaphod')) | ||||||
|  | @@ -94,10 +110,24 @@ if output != (zaphod + '\n'):
 | ||||||
|  |      fail('zaphod not chosen as default initiator name for server in r1') | ||||||
|  |   | ||||||
|  |  # Check that primary cache is used if server realm is unknown. | ||||||
|  | -output = r2.run(['./t_ccselect', gssserver])
 | ||||||
|  | +output = r2.run(['./t_ccselect', refserver])
 | ||||||
|  |  if output != (zaphod + '\n'): | ||||||
|  |      fail('zaphod not chosen via primary cache for unknown server realm') | ||||||
|  | -r1.run(['./t_ccselect', gssserver], expected_code=1)
 | ||||||
|  | +r1.run(['./t_ccselect', gssserver2], expected_code=1)
 | ||||||
|  | +# Check ccache selection using a fallback realm.
 | ||||||
|  | +output = r1.run(['./t_ccselect', gssserver])
 | ||||||
|  | +if output != (alice + '\n'):
 | ||||||
|  | +    fail('alice not chosen via parent domain fallback')
 | ||||||
|  | +output = r2.run(['./t_ccselect', gssserver2])
 | ||||||
|  | +if output != (zaphod + '\n'):
 | ||||||
|  | +    fail('zaphod not chosen via parent domain fallback')
 | ||||||
|  | +# Check ccache selection using a fallback realm (default realm).
 | ||||||
|  | +output = r1.run(['./t_ccselect', gsslocal])
 | ||||||
|  | +if output != (alice + '\n'):
 | ||||||
|  | +    fail('alice not chosen via default realm fallback')
 | ||||||
|  | +output = r2.run(['./t_ccselect', gsslocal])
 | ||||||
|  | +if output != (zaphod + '\n'):
 | ||||||
|  | +    fail('zaphod not chosen via default realm fallback')
 | ||||||
|  |   | ||||||
|  |  # Get a second cred in r1 (bob will be primary). | ||||||
|  |  r1.kinit(bob, password('bob')) | ||||||
|  | @@ -105,20 +135,21 @@ r1.kinit(bob, password('bob'))
 | ||||||
|  |  # Try some cache selections using .k5identity. | ||||||
|  |  k5id = open(os.path.join(r1.testdir, '.k5identity'), 'w') | ||||||
|  |  k5id.write('%s realm=%s\n' % (alice, r1.realm)) | ||||||
|  | -k5id.write('%s service=ho*t host=%s\n' % (zaphod, hostname))
 | ||||||
|  | +k5id.write('%s service=ho*t host=localhost\n' % zaphod)
 | ||||||
|  |  k5id.write('noprinc service=bogus') | ||||||
|  |  k5id.close() | ||||||
|  |  output = r1.run(['./t_ccselect', host1]) | ||||||
|  |  if output != (alice + '\n'): | ||||||
|  |      fail('alice not chosen via .k5identity realm line.') | ||||||
|  | -output = r2.run(['./t_ccselect', gssserver])
 | ||||||
|  | +output = r2.run(['./t_ccselect', gsslocal])
 | ||||||
|  |  if output != (zaphod + '\n'): | ||||||
|  |      fail('zaphod not chosen via .k5identity service/host line.') | ||||||
|  |  output = r1.run(['./t_ccselect', refserver]) | ||||||
|  |  if output != (bob + '\n'): | ||||||
|  |      fail('bob not chosen via primary cache when no .k5identity line matches.') | ||||||
|  | -output = r1.run(['./t_ccselect', 'h:bogus@' + hostname], expected_code=1)
 | ||||||
|  |  if 'Can\'t find client principal noprinc' not in output: | ||||||
|  |      fail('Expected error not seen when k5identity selects bad principal.') | ||||||
|  | +r1.run(['./t_ccselect', 'h:bogus@' + foo2], expected_code=1,
 | ||||||
|  | +       expected_msg="Can't find client principal noprinc")
 | ||||||
|  |   | ||||||
|  |  success('GSSAPI credential selection tests') | ||||||
| @ -18,7 +18,7 @@ Summary: The Kerberos network authentication system | |||||||
| Name: krb5 | Name: krb5 | ||||||
| Version: 1.15 | Version: 1.15 | ||||||
| # for prerelease, should be e.g., 0.3.beta2%{?dist} | # for prerelease, should be e.g., 0.3.beta2%{?dist} | ||||||
| Release: 6%{?dist} | Release: 7%{?dist} | ||||||
| # - Maybe we should explode from the now-available-to-everybody tarball instead? | # - Maybe we should explode from the now-available-to-everybody tarball instead? | ||||||
| # http://web.mit.edu/kerberos/dist/krb5/1.13/krb5-1.13.2-signed.tar | # http://web.mit.edu/kerberos/dist/krb5/1.13/krb5-1.13.2-signed.tar | ||||||
| # - The sources below are stored in a lookaside cache. Upload with | # - The sources below are stored in a lookaside cache. Upload with | ||||||
| @ -64,6 +64,7 @@ Patch11: krb5-1.11-kpasswdtest.patch | |||||||
| Patch12: Build-with-Werror-implicit-int-where-supported.patch | Patch12: Build-with-Werror-implicit-int-where-supported.patch | ||||||
| Patch13: Explicitly-copy-KDB-vtable-fields.patch | Patch13: Explicitly-copy-KDB-vtable-fields.patch | ||||||
| Patch14: Add-free_principal_e_data-KDB-method.patch | Patch14: Add-free_principal_e_data-KDB-method.patch | ||||||
|  | Patch15: Use-fallback-realm-for-GSSAPI-ccache-selection.patch | ||||||
| 
 | 
 | ||||||
| License: MIT | License: MIT | ||||||
| URL: http://web.mit.edu/kerberos/www/ | URL: http://web.mit.edu/kerberos/www/ | ||||||
| @ -718,6 +719,9 @@ exit 0 | |||||||
| %{_libdir}/libkadm5srv_mit.so.* | %{_libdir}/libkadm5srv_mit.so.* | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Fri Feb 17 2017 Robbie Harwood <rharwood@redhat.com> - 1.15-7 | ||||||
|  | - Backport fix for GSSAPI fallback realm | ||||||
|  | 
 | ||||||
| * Tue Feb 07 2017 Robbie Harwood <rharwood@redhat.com> - 1.15-6 | * Tue Feb 07 2017 Robbie Harwood <rharwood@redhat.com> - 1.15-6 | ||||||
| - Move krb5-kdb-version provides from -libs to -devel | - Move krb5-kdb-version provides from -libs to -devel | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user