a6e2d8
From a8b52eaf3cf56c90e3d94fdef0b9e426052634ea Mon Sep 17 00:00:00 2001
a6e2d8
From: Alexander Bokovoy <abokovoy@redhat.com>
a6e2d8
Date: Wed, 18 Dec 2019 12:08:59 +0200
a6e2d8
Subject: [PATCH] Reset per-indicator Kerberos policy
a6e2d8
a6e2d8
When 'ipa krbtpolicy-reset' is called, we need to reset all policy
a6e2d8
settings, including per-indicator ones. Per-indicator policy uses
a6e2d8
subtyped attributes (foo;bar), the current krbtpolicy-reset code does
a6e2d8
not deal with those.
a6e2d8
a6e2d8
Add support for per-indicator policy reset. It is a bit tricky, as we
a6e2d8
need to drop the values to defaults but avoid adding non-per-indicator
a6e2d8
variants of the same attributes.
a6e2d8
a6e2d8
Add test to check that policy has been resetted by observing a new
a6e2d8
Kerberos TGT for the user after its policy reset.
a6e2d8
a6e2d8
Fixes: https://pagure.io/freeipa/issue/8153
a6e2d8
a6e2d8
Signed-off-by: Alexander Bokovoy <abokovoy@redhat.com>
a6e2d8
---
a6e2d8
 ipaserver/plugins/krbtpolicy.py              | 21 +++++++++++++++++++-
a6e2d8
 ipatests/test_integration/test_krbtpolicy.py | 13 ++++++++++++
a6e2d8
 2 files changed, 33 insertions(+), 1 deletion(-)
a6e2d8
a6e2d8
diff --git a/ipaserver/plugins/krbtpolicy.py b/ipaserver/plugins/krbtpolicy.py
a6e2d8
index 997fe7e81..b01c44e93 100644
a6e2d8
--- a/ipaserver/plugins/krbtpolicy.py
a6e2d8
+++ b/ipaserver/plugins/krbtpolicy.py
a6e2d8
@@ -68,6 +68,8 @@ register = Registry()
a6e2d8
 _default_values = {
a6e2d8
     'krbmaxticketlife': 86400,
a6e2d8
     'krbmaxrenewableage': 604800,
a6e2d8
+    'krbauthindmaxticketlife': 86400,
a6e2d8
+    'krbauthindmaxrenewableage': 604800,
a6e2d8
 }
a6e2d8
 
a6e2d8
 # These attributes never have non-optional values, so they should be
a6e2d8
@@ -311,9 +313,26 @@ class krbtpolicy_reset(baseldap.LDAPQuery):
a6e2d8
                 def_values[a] = None
a6e2d8
         # if reseting global policy - set values to default
a6e2d8
         else:
a6e2d8
-            def_values = _default_values
a6e2d8
+            def_values = _default_values.copy()
a6e2d8
 
a6e2d8
         entry = ldap.get_entry(dn, list(def_values))
a6e2d8
+
a6e2d8
+        # For per-indicator policies, drop them to defaults
a6e2d8
+        for subtype in _supported_options:
a6e2d8
+            for attr in _option_based_attrs:
a6e2d8
+                name = '{};{}'.format(attr, subtype)
a6e2d8
+                if name in entry:
a6e2d8
+                    if uid is not None:
a6e2d8
+                        def_values[name] = None
a6e2d8
+                    else:
a6e2d8
+                        def_values[name] = _default_values[attr]
a6e2d8
+
a6e2d8
+        # Remove non-subtyped attrs variants,
a6e2d8
+        # they should never be used directly.
a6e2d8
+        for attr in _option_based_attrs:
a6e2d8
+            if attr in def_values:
a6e2d8
+                del def_values[attr]
a6e2d8
+
a6e2d8
         entry.update(def_values)
a6e2d8
         try:
a6e2d8
             ldap.update_entry(entry)
a6e2d8
diff --git a/ipatests/test_integration/test_krbtpolicy.py b/ipatests/test_integration/test_krbtpolicy.py
a6e2d8
index b2264de7a..08e332096 100644
a6e2d8
--- a/ipatests/test_integration/test_krbtpolicy.py
a6e2d8
+++ b/ipatests/test_integration/test_krbtpolicy.py
a6e2d8
@@ -112,3 +112,16 @@ class TestPWPolicy(IntegrationTest):
a6e2d8
         assert maxlife_within_policy(result.stdout_text, 1200) is True
a6e2d8
 
a6e2d8
         tasks.kdestroy_all(master)
a6e2d8
+
a6e2d8
+    def test_krbtpolicy_reset(self):
a6e2d8
+        """Test a hardened kerberos ticket policy reset"""
a6e2d8
+        master = self.master
a6e2d8
+
a6e2d8
+        tasks.kinit_admin(master)
a6e2d8
+        master.run_command(['ipa', 'krbtpolicy-reset', USER2])
a6e2d8
+        master.run_command(['kinit', USER2],
a6e2d8
+                           stdin_text=PASSWORD + '\n')
a6e2d8
+        result = master.run_command('klist | grep krbtgt')
a6e2d8
+        assert maxlife_within_policy(result.stdout_text, MAXLIFE) is True
a6e2d8
+
a6e2d8
+        tasks.kdestroy_all(master)
a6e2d8
-- 
a6e2d8
2.24.1
a6e2d8