Blame SOURCES/0191-sudo-add-a-threshold-option-to-reduce-size-of-rules-.patch

ecf709
From 5c159808818fcea77822815b5f1131809c0e673c Mon Sep 17 00:00:00 2001
ecf709
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
ecf709
Date: Tue, 11 Jul 2017 12:41:57 +0200
ecf709
Subject: [PATCH 191/191] sudo: add a threshold option to reduce size of rules
ecf709
 refresh filter
ecf709
MIME-Version: 1.0
ecf709
Content-Type: text/plain; charset=UTF-8
ecf709
Content-Transfer-Encoding: 8bit
ecf709
ecf709
If a large number of rules is expired at one time the ldap filter may
ecf709
become too large to be processed by server. This commits adds a new
ecf709
option "sudo_threshold" to sudo responder. If the threshold is
ecf709
exceeded a full refreshed is done instead of rules refresh.
ecf709
ecf709
Resolves:
ecf709
https://pagure.io/SSSD/sssd/issue/3478
ecf709
ecf709
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
ecf709
Reviewed-by: Fabiano FidĂȘncio <fidencio@redhat.com>
ecf709
(cherry picked from commit a5f300adf19ec9c3087c62bd93a5175db799687a)
ecf709
---
ecf709
 src/confdb/confdb.h                        |  2 ++
ecf709
 src/config/SSSDConfig/__init__.py.in       |  1 +
ecf709
 src/config/cfg_rules.ini                   |  1 +
ecf709
 src/config/etc/sssd.api.conf               |  1 +
ecf709
 src/man/sssd.conf.5.xml                    | 19 +++++++++++++++++++
ecf709
 src/responder/sudo/sudosrv.c               | 11 +++++++++++
ecf709
 src/responder/sudo/sudosrv_get_sudorules.c | 25 ++++++++++++++++++++-----
ecf709
 src/responder/sudo/sudosrv_private.h       |  1 +
ecf709
 8 files changed, 56 insertions(+), 5 deletions(-)
ecf709
ecf709
diff --git a/src/confdb/confdb.h b/src/confdb/confdb.h
ecf709
index 2ba1bc47ee11f699726cefaf7c3335d2a8afee49..884b5bd1a493ca9a71654536524125eb8c7c4533 100644
ecf709
--- a/src/confdb/confdb.h
ecf709
+++ b/src/confdb/confdb.h
ecf709
@@ -139,6 +139,8 @@
ecf709
 #define CONFDB_DEFAULT_SUDO_TIMED false
ecf709
 #define CONFDB_SUDO_INVERSE_ORDER "sudo_inverse_order"
ecf709
 #define CONFDB_DEFAULT_SUDO_INVERSE_ORDER false
ecf709
+#define CONFDB_SUDO_THRESHOLD "sudo_threshold"
ecf709
+#define CONFDB_DEFAULT_SUDO_THRESHOLD 50
ecf709
 
ecf709
 /* autofs */
ecf709
 #define CONFDB_AUTOFS_CONF_ENTRY "config/autofs"
ecf709
diff --git a/src/config/SSSDConfig/__init__.py.in b/src/config/SSSDConfig/__init__.py.in
ecf709
index 75515ab5c68822538728900482296b9159e1547e..137a8fa4d526cb10f3136c62f3c7104d9ecb7599 100644
ecf709
--- a/src/config/SSSDConfig/__init__.py.in
ecf709
+++ b/src/config/SSSDConfig/__init__.py.in
ecf709
@@ -107,6 +107,7 @@ option_strings = {
ecf709
     # [sudo]
ecf709
     'sudo_timed' : _('Whether to evaluate the time-based attributes in sudo rules'),
ecf709
     'sudo_inverse_order' : _('If true, SSSD will switch back to lower-wins ordering logic'),
ecf709
+    'sudo_threshold' : _('Maximum number of rules that can be refreshed at once. If this is exceeded, full refresh is performed.'),
ecf709
 
ecf709
     # [autofs]
ecf709
     'autofs_negative_timeout' : _('Negative cache timeout length (seconds)'),
ecf709
diff --git a/src/config/cfg_rules.ini b/src/config/cfg_rules.ini
ecf709
index d6506b7c3cee13f7c5400a546deb787e755abc8b..0bdcfdfbefd6cb24e0c01cb9746dbb98c63a31d2 100644
ecf709
--- a/src/config/cfg_rules.ini
ecf709
+++ b/src/config/cfg_rules.ini
ecf709
@@ -144,6 +144,7 @@ option = cache_first
ecf709
 # sudo service
ecf709
 option = sudo_timed
ecf709
 option = sudo_inverse_order
ecf709
+option = sudo_threshold
ecf709
 
ecf709
 [rule/allowed_autofs_options]
ecf709
 validator = ini_allowed_options
ecf709
diff --git a/src/config/etc/sssd.api.conf b/src/config/etc/sssd.api.conf
ecf709
index f86589ecefa0b9e046aba781ded107f8e94395d6..9d5eaaaa23c4c5395b155563de1cdf7752aa3dde 100644
ecf709
--- a/src/config/etc/sssd.api.conf
ecf709
+++ b/src/config/etc/sssd.api.conf
ecf709
@@ -79,6 +79,7 @@ pam_app_services = str, None, false
ecf709
 # sudo service
ecf709
 sudo_timed = bool, None, false
ecf709
 sudo_inverse_order = bool, None, false
ecf709
+sudo_threshold = int, None, false
ecf709
 
ecf709
 [autofs]
ecf709
 # autofs service
ecf709
diff --git a/src/man/sssd.conf.5.xml b/src/man/sssd.conf.5.xml
ecf709
index 89729575c724622af817f1c05a94d4ae8f1ece2d..d508df82d1d99af7835079c928839dc3cc7c28cb 100644
ecf709
--- a/src/man/sssd.conf.5.xml
ecf709
+++ b/src/man/sssd.conf.5.xml
ecf709
@@ -1376,6 +1376,25 @@ pam_account_locked_message = Account locked, please contact help desk.
ecf709
                     </listitem>
ecf709
                 </varlistentry>
ecf709
             </variablelist>
ecf709
+            <variablelist>
ecf709
+                <varlistentry>
ecf709
+                    <term>sudo_threshold (integer)</term>
ecf709
+                    <listitem>
ecf709
+                        <para>
ecf709
+                            Maximum number of expired rules that can be
ecf709
+                            refreshed at once. If number of expired rules
ecf709
+                            is below threshold, those rules are refreshed
ecf709
+                            with <quote>rules refresh</quote> mechanism. If
ecf709
+                            the threshold is exceeded a
ecf709
+                            <quote>full refresh</quote> of sudo rules is
ecf709
+                            triggered instead.
ecf709
+                        </para>
ecf709
+                        <para>
ecf709
+                            Default: 50
ecf709
+                        </para>
ecf709
+                    </listitem>
ecf709
+                </varlistentry>
ecf709
+            </variablelist>
ecf709
         </refsect2>
ecf709
 
ecf709
         <refsect2 id='AUTOFS' condition="with_autofs">
ecf709
diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c
ecf709
index b427878d4dbe9090824a01386a7475be88b699c0..dca70ea4afc0e6df6d1b1864338c7b1091a98fee 100644
ecf709
--- a/src/responder/sudo/sudosrv.c
ecf709
+++ b/src/responder/sudo/sudosrv.c
ecf709
@@ -148,6 +148,17 @@ int sudo_process_init(TALLOC_CTX *mem_ctx,
ecf709
         goto fail;
ecf709
     }
ecf709
 
ecf709
+    /* Get sudo_inverse_order option */
ecf709
+    ret = confdb_get_int(sudo_ctx->rctx->cdb,
ecf709
+                         CONFDB_SUDO_CONF_ENTRY, CONFDB_SUDO_THRESHOLD,
ecf709
+                         CONFDB_DEFAULT_SUDO_THRESHOLD,
ecf709
+                         &sudo_ctx->threshold);
ecf709
+    if (ret != EOK) {
ecf709
+        DEBUG(SSSDBG_FATAL_FAILURE, "Error reading from confdb (%d) [%s]\n",
ecf709
+              ret, strerror(ret));
ecf709
+        goto fail;
ecf709
+    }
ecf709
+
ecf709
     ret = schedule_get_domains_task(rctx, rctx->ev, rctx, NULL);
ecf709
     if (ret != EOK) {
ecf709
         DEBUG(SSSDBG_FATAL_FAILURE, "schedule_get_domains_tasks failed.\n");
ecf709
diff --git a/src/responder/sudo/sudosrv_get_sudorules.c b/src/responder/sudo/sudosrv_get_sudorules.c
ecf709
index cfdbfc9c9c66d96f774822d6a4d4aaaf1327abe3..3272e634d895acf4854309371779a00cf1525126 100644
ecf709
--- a/src/responder/sudo/sudosrv_get_sudorules.c
ecf709
+++ b/src/responder/sudo/sudosrv_get_sudorules.c
ecf709
@@ -479,6 +479,7 @@ sudosrv_refresh_rules_send(TALLOC_CTX *mem_ctx,
ecf709
                            struct tevent_context *ev,
ecf709
                            struct resp_ctx *rctx,
ecf709
                            struct sss_domain_info *domain,
ecf709
+                           int threshold,
ecf709
                            uid_t uid,
ecf709
                            const char *username,
ecf709
                            char **groups)
ecf709
@@ -520,9 +521,20 @@ sudosrv_refresh_rules_send(TALLOC_CTX *mem_ctx,
ecf709
     DEBUG(SSSDBG_TRACE_INTERNAL, "Refreshing %d expired rules of [%s@%s]\n",
ecf709
           num_rules, username, domain->name);
ecf709
 
ecf709
-    subreq = sss_dp_get_sudoers_send(state, rctx, domain, false,
ecf709
-                                     SSS_DP_SUDO_REFRESH_RULES,
ecf709
-                                     username, num_rules, rules);
ecf709
+    if (num_rules > threshold) {
ecf709
+        DEBUG(SSSDBG_TRACE_INTERNAL,
ecf709
+              "Rules threshold [%d] is reached, performing full refresh "
ecf709
+              "instead.\n", threshold);
ecf709
+
ecf709
+        subreq = sss_dp_get_sudoers_send(state, rctx, domain, false,
ecf709
+                                         SSS_DP_SUDO_FULL_REFRESH,
ecf709
+                                         username, 0, NULL);
ecf709
+    } else {
ecf709
+        subreq = sss_dp_get_sudoers_send(state, rctx, domain, false,
ecf709
+                                         SSS_DP_SUDO_REFRESH_RULES,
ecf709
+                                         username, num_rules, rules);
ecf709
+    }
ecf709
+
ecf709
     if (subreq == NULL) {
ecf709
         ret = ENOMEM;
ecf709
         goto immediately;
ecf709
@@ -609,6 +621,7 @@ struct sudosrv_get_rules_state {
ecf709
     struct sss_domain_info *domain;
ecf709
     char **groups;
ecf709
     bool inverse_order;
ecf709
+    int threshold;
ecf709
 
ecf709
     struct sysdb_attrs **rules;
ecf709
     uint32_t num_rules;
ecf709
@@ -640,6 +653,7 @@ struct tevent_req *sudosrv_get_rules_send(TALLOC_CTX *mem_ctx,
ecf709
     state->type = type;
ecf709
     state->uid = uid;
ecf709
     state->inverse_order = sudo_ctx->inverse_order;
ecf709
+    state->threshold = sudo_ctx->threshold;
ecf709
 
ecf709
     DEBUG(SSSDBG_TRACE_FUNC, "Running initgroups for [%s]\n", username);
ecf709
 
ecf709
@@ -696,8 +710,9 @@ static void sudosrv_get_rules_initgr_done(struct tevent_req *subreq)
ecf709
     }
ecf709
 
ecf709
     subreq = sudosrv_refresh_rules_send(state, state->ev, state->rctx,
ecf709
-                                        state->domain, state->uid,
ecf709
-                                        state->username, state->groups);
ecf709
+                                        state->domain, state->threshold,
ecf709
+                                        state->uid, state->username,
ecf709
+                                        state->groups);
ecf709
     if (subreq == NULL) {
ecf709
         ret = ENOMEM;
ecf709
         goto done;
ecf709
diff --git a/src/responder/sudo/sudosrv_private.h b/src/responder/sudo/sudosrv_private.h
ecf709
index 94f3c4458ab20e64db3e0bfce726d5d30a70a202..c76bdd3955bc29b7ba2cda58c503a4c616d7e63a 100644
ecf709
--- a/src/responder/sudo/sudosrv_private.h
ecf709
+++ b/src/responder/sudo/sudosrv_private.h
ecf709
@@ -48,6 +48,7 @@ struct sudo_ctx {
ecf709
      */
ecf709
     bool timed;
ecf709
     bool inverse_order;
ecf709
+    int threshold;
ecf709
 };
ecf709
 
ecf709
 struct sudo_cmd_ctx {
ecf709
-- 
ecf709
2.13.5
ecf709