]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Ignore password attributes for S4U2Self requests
authorIsaac Boukris <iboukris@gmail.com>
Mon, 3 Dec 2018 00:33:07 +0000 (02:33 +0200)
committerGreg Hudson <ghudson@mit.edu>
Mon, 7 Jan 2019 15:44:55 +0000 (10:44 -0500)
For consistency with Windows KDCs, allow protocol transition to work
even if the password has expired or needs changing.

Also, when looking up an enterprise principal with an AS request,
treat ERR_KEY_EXP as confirmation that the client is present in the
realm.

[ghudson@mit.edu: added comment in kdc_process_s4u2self_req(); edited
commit message]

(cherry picked from commit 5e6d1796106df8ba6bc1973ee0917c170d929086)

ticket: 8763
version_fixed: 1.17

src/kdc/kdc_util.c
src/lib/krb5/krb/s4u_creds.c
src/tests/gssapi/t_s4u.py

index dfeaf7ec642656b0313be13448fe1309249d3f26..0155c28c6337225b1bba04d8c0bccb99dfecca49 100644 (file)
@@ -1595,6 +1595,11 @@ kdc_process_s4u2self_req(kdc_realm_t *kdc_active_realm,
 
         memset(&no_server, 0, sizeof(no_server));
 
+        /* Ignore password expiration and needchange attributes (as Windows
+         * does), since S4U2Self is not password authentication. */
+        princ->pw_expiration = 0;
+        clear(princ->attributes, KRB5_KDB_REQUIRES_PWCHANGE);
+
         code = validate_as_request(kdc_active_realm, request, *princ,
                                    no_server, kdc_time, status, &e_data);
         if (code) {
index d2fdcb3f16a7c44cd733e0f768932ca892801443..614ed41908f2a3c059c3a0511f1ffa4919b5cd8e 100644 (file)
@@ -116,7 +116,7 @@ s4u_identify_user(krb5_context context,
     code = k5_get_init_creds(context, &creds, &client, NULL, NULL, 0, NULL,
                              opts, krb5_get_as_key_noop, &userid, &use_master,
                              NULL);
-    if (code == 0 || code == KRB5_PREAUTH_FAILED) {
+    if (!code || code == KRB5_PREAUTH_FAILED || code == KRB5KDC_ERR_KEY_EXP) {
         *canon_user = userid.user;
         userid.user = NULL;
         code = 0;
index fd29e1a270a763ec76776ec023854dd4829637ba..84f3fbd752b897e95580fe75cf49310a4b1c48f0 100755 (executable)
@@ -19,6 +19,14 @@ pservice2 = 'p:' + service2
 # Get forwardable creds for service1 in the default cache.
 realm.kinit(service1, None, ['-f', '-k'])
 
+# Try S4U2Self for user with a restricted password.
+realm.run([kadminl, 'modprinc', '+needchange', realm.user_princ])
+realm.run(['./t_s4u', 'e:user', '-'])
+realm.run([kadminl, 'modprinc', '-needchange',
+          '-pwexpire', '1/1/2000', realm.user_princ])
+realm.run(['./t_s4u', 'e:user', '-'])
+realm.run([kadminl, 'modprinc', '-pwexpire', 'never', realm.user_princ])
+
 # Try krb5 -> S4U2Proxy with forwardable user creds.  This should fail
 # at the S4U2Proxy step since the DB2 back end currently has no
 # support for allowing it.