diff options
| author | Greg Hudson <ghudson@mit.edu> | 2010-05-10 22:42:04 +0000 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2010-05-10 22:42:04 +0000 |
| commit | 6eacb6d5f29da306ea605a5efb00c0d01c3182b1 (patch) | |
| tree | 8b37e7da4e702e962560823515da5a744c5edf7c /src/plugins/kdb/ldap | |
| parent | f795c92a96a2a559fe01fc5906d488167ab6b4b9 (diff) | |
Add lockout-related performance tuning variables
The account lockout feature of krb5 1.8 came at a cost in database
accesses for principals requiring preauth, even if lockout is not
used. Add dbmodules variables disable_last_success and
disable_lockout for the DB2 and LDAP back ends, allowing the admin to
recover the lost performance at the cost of new functionality.
(Unrelated documentation fix: document database_name as a DB2-specific
dbmodules variable instead of the realm variable it used to be.)
ticket: 6719
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@24003 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/plugins/kdb/ldap')
| -rw-r--r-- | src/plugins/kdb/ldap/libkdb_ldap/kdb_ldap.h | 2 | ||||
| -rw-r--r-- | src/plugins/kdb/ldap/libkdb_ldap/ldap_misc.c | 41 | ||||
| -rw-r--r-- | src/plugins/kdb/ldap/libkdb_ldap/lockout.c | 47 |
3 files changed, 74 insertions, 16 deletions
diff --git a/src/plugins/kdb/ldap/libkdb_ldap/kdb_ldap.h b/src/plugins/kdb/ldap/libkdb_ldap/kdb_ldap.h index 2130f8bc0..95909f6be 100644 --- a/src/plugins/kdb/ldap/libkdb_ldap/kdb_ldap.h +++ b/src/plugins/kdb/ldap/libkdb_ldap/kdb_ldap.h @@ -223,6 +223,8 @@ typedef struct _krb5_ldap_context { k5_mutex_t hndl_lock; krb5_ldap_krbcontainer_params *krbcontainer; krb5_ldap_realm_params *lrparams; + krb5_boolean disable_last_success; + krb5_boolean disable_lockout; krb5_context kcontext; /* to set the error code and message */ } krb5_ldap_context; diff --git a/src/plugins/kdb/ldap/libkdb_ldap/ldap_misc.c b/src/plugins/kdb/ldap/libkdb_ldap/ldap_misc.c index 65ae88734..c3cb185d0 100644 --- a/src/plugins/kdb/ldap/libkdb_ldap/ldap_misc.c +++ b/src/plugins/kdb/ldap/libkdb_ldap/ldap_misc.c @@ -105,6 +105,37 @@ prof_get_integer_def(krb5_context ctx, const char *conf_section, return 0; } +/* Get integer or string values from the config section, falling back + to the default section, then to hard-coded values. */ +static errcode_t +prof_get_boolean_def(krb5_context ctx, const char *conf_section, + const char *name, krb5_boolean dfl, krb5_boolean *out) +{ + errcode_t err; + int out_temp = 0; + + err = profile_get_boolean(ctx->profile, KDB_MODULE_SECTION, conf_section, + name, -1, &out_temp); + if (err) { + krb5_set_error_message(ctx, err, "Error reading '%s' attribute: %s", + name, error_message(err)); + return err; + } + if (out_temp != -1) { + *out = out_temp; + return 0; + } + err = profile_get_boolean(ctx->profile, KDB_MODULE_DEF_SECTION, name, 0, + dfl, &out_temp); + if (err) { + krb5_set_error_message(ctx, err, "Error reading '%s' attribute: %s", + name, error_message(err)); + return err; + } + *out = out_temp; + return 0; +} + /* We don't have non-null defaults in any of our calls, so don't bother with the extra argument. */ static errcode_t @@ -309,6 +340,16 @@ krb5_ldap_read_server_params(krb5_context context, char *conf_section, } } + if ((st = prof_get_boolean_def(context, conf_section, + KRB5_CONF_DISABLE_LAST_SUCCESS, FALSE, + &ldap_context->disable_last_success))) + goto cleanup; + + if ((st = prof_get_boolean_def(context, conf_section, + KRB5_CONF_DISABLE_LOCKOUT, FALSE, + &ldap_context->disable_lockout))) + goto cleanup; + cleanup: return(st); } diff --git a/src/plugins/kdb/ldap/libkdb_ldap/lockout.c b/src/plugins/kdb/ldap/libkdb_ldap/lockout.c index 020c77a94..323963e8d 100644 --- a/src/plugins/kdb/ldap/libkdb_ldap/lockout.c +++ b/src/plugins/kdb/ldap/libkdb_ldap/lockout.c @@ -113,10 +113,16 @@ krb5_ldap_lockout_check_policy(krb5_context context, krb5_timestamp stamp) { krb5_error_code code; + kdb5_dal_handle *dal_handle; + krb5_ldap_context *ldap_context; krb5_kvno max_fail = 0; krb5_deltat failcnt_interval = 0; krb5_deltat lockout_duration = 0; + SETUP_CONTEXT(); + if (ldap_context->disable_lockout) + return 0; + code = lookup_lockout_policy(context, entry, &max_fail, &failcnt_interval, &lockout_duration); @@ -136,11 +142,15 @@ krb5_ldap_lockout_audit(krb5_context context, krb5_error_code status) { krb5_error_code code; + kdb5_dal_handle *dal_handle; + krb5_ldap_context *ldap_context; krb5_kvno max_fail = 0; krb5_deltat failcnt_interval = 0; krb5_deltat lockout_duration = 0; int nentries = 1; + SETUP_CONTEXT(); + switch (status) { case 0: case KRB5KDC_ERR_PREAUTH_FAILED: @@ -150,26 +160,32 @@ krb5_ldap_lockout_audit(krb5_context context, return 0; } - code = lookup_lockout_policy(context, entry, &max_fail, - &failcnt_interval, - &lockout_duration); - if (code != 0) - return code; + if (!ldap_context->disable_lockout) { + code = lookup_lockout_policy(context, entry, &max_fail, + &failcnt_interval, + &lockout_duration); + if (code != 0) + return code; + } entry->mask = 0; assert (!locked_check_p(context, stamp, max_fail, lockout_duration, entry)); + /* Only mark the authentication as successful if the entry + * required preauthentication, otherwise we have no idea. */ if (status == 0 && (entry->attributes & KRB5_KDB_REQUIRES_PRE_AUTH)) { - /* - * Only mark the authentication as successful if the entry - * required preauthentication, otherwise we have no idea. - */ - entry->fail_auth_count = 0; - entry->last_success = stamp; - entry->mask |= KADM5_FAIL_AUTH_COUNT | KADM5_LAST_SUCCESS; - } else if (status == KRB5KDC_ERR_PREAUTH_FAILED || - status == KRB5KRB_AP_ERR_BAD_INTEGRITY) { + if (!ldap_context->disable_lockout && entry->fail_auth_count != 0) { + entry->fail_auth_count = 0; + entry->mask |= KADM5_FAIL_AUTH_COUNT; + } + if (!ldap_context->disable_last_success) { + entry->last_success = stamp; + entry->mask |= KADM5_LAST_SUCCESS; + } + } else if (!ldap_context->disable_lockout && + (status == KRB5KDC_ERR_PREAUTH_FAILED || + status == KRB5KRB_AP_ERR_BAD_INTEGRITY)) { if (failcnt_interval != 0 && stamp > entry->last_failed + failcnt_interval) { /* Reset fail_auth_count after failcnt_interval */ @@ -182,8 +198,7 @@ krb5_ldap_lockout_audit(krb5_context context, } if (entry->mask) { - code = krb5_ldap_put_principal(context, entry, - &nentries, NULL); + code = krb5_ldap_put_principal(context, entry, &nentries, NULL); if (code != 0) return code; } |
