From 5e052107dcb70630c1cccee191ae5317a43ec2cf Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Sun, 4 Jun 2017 22:49:13 +0300 Subject: [PATCH] ipa-kdb: add pkinit authentication indicator in case of a successful certauth We automatically add 'otp' and 'radius' authentication indicators when pre-authentication with OTP or RADIUS did succeed. Do the same for certauth-based pre-authentication (PKINIT). A default PKINIT configuration does not add any authentication indicators unless 'pkinit_indicator = pkinit' is set in kdc.conf. Unfortunately, modifying kdc.conf automatically is a bit more complicated than modifying krb5.conf. Given that we have 'otp' and 'radius' authentication indicators also defined in the code not in the kdc.conf, this change is following an established trend. SSSD certauth interface does not provide additional information about which rule(s) succeeded in matching the incoming certificate. Thus, there is not much information we can automatically provide in the indicator. It would be good to generate indicators that include some information from the certmapping rules in future but for now a single 'pkinit' indicator is enough. Fixes https://pagure.io/freeipa/issue/6736 Reviewed-By: Simo Sorce --- daemons/ipa-kdb/ipa_kdb_certauth.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/daemons/ipa-kdb/ipa_kdb_certauth.c b/daemons/ipa-kdb/ipa_kdb_certauth.c index dbe7a0443700784d2b8dbb1fb9196d6249e5522a..da9a9cb87feca68ee591da70a3239dc86749bae5 100644 --- a/daemons/ipa-kdb/ipa_kdb_certauth.c +++ b/daemons/ipa-kdb/ipa_kdb_certauth.c @@ -267,6 +267,7 @@ static krb5_error_code ipa_certauth_authorize(krb5_context context, int ret; size_t c; char *principal = NULL; + char **auth_inds = NULL; LDAPMessage *res = NULL; krb5_error_code kerr; LDAPMessage *lentry; @@ -350,6 +351,20 @@ static krb5_error_code ipa_certauth_authorize(krb5_context context, goto done; } + /* Associate authentication indicator "pkinit" with the successful match. + * SSSD interface doesn't give us a clue which rule did match + * so there is nothing more to add here. */ + auth_inds = calloc(2, sizeof(char *)); + if (auth_inds != NULL) { + ret = asprintf(&auth_inds[0], "pkinit"); + if (ret != -1) { + auth_inds[1] = NULL; + *authinds_out = auth_inds; + } else { + free(auth_inds); + } + } + /* TODO: add more tests ? */ ret = 0; @@ -384,6 +399,24 @@ static void ipa_certauth_fini(krb5_context context, return; } +static void ipa_certauth_free_indicator(krb5_context context, + krb5_certauth_moddata moddata, + char **authinds) +{ + size_t i = 0; + + if ((authinds == NULL) || (moddata == NULL)) { + return; + } + + for(i=0; authinds[i]; i++) { + free(authinds[i]); + authinds[i] = NULL; + } + + free(authinds); +} + krb5_error_code certauth_ipakdb_initvt(krb5_context context, int maj_ver, int min_ver, @@ -401,7 +434,6 @@ krb5_error_code certauth_ipakdb_initvt(krb5_context context, vt->authorize = ipa_certauth_authorize; vt->init = ipa_certauth_init; vt->fini = ipa_certauth_fini; - /* currently we do not return authentication indicators */ - vt->free_ind = NULL; + vt->free_ind = ipa_certauth_free_indicator; return 0; } -- 2.9.4