483b06
From 15da0d16e99f5c6956f1ed687cc3cffdade83cb5 Mon Sep 17 00:00:00 2001
483b06
From: Martin Babinsky <mbabinsk@redhat.com>
483b06
Date: Fri, 31 Mar 2017 14:14:11 +0200
483b06
Subject: [PATCH] Use only anonymous PKINIT to fetch armor ccache
483b06
483b06
Since the anonymous principal can only use PKINIT to fetch credential
483b06
cache it makes no sense to try and use its kerberos key to establish
483b06
FAST channel.
483b06
483b06
We should also be able to use custom PKINIT anchor for the armoring.
483b06
483b06
https://pagure.io/freeipa/issue/6830
483b06
483b06
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
483b06
Reviewed-By: Jan Cholasta <jcholast@redhat.com>
483b06
Reviewed-By: Martin Basti <mbasti@redhat.com>
483b06
Reviewed-By: Simo Sorce <ssorce@redhat.com>
483b06
---
483b06
 ipalib/install/kinit.py | 30 +++++++++++++-----------------
483b06
 1 file changed, 13 insertions(+), 17 deletions(-)
483b06
483b06
diff --git a/ipalib/install/kinit.py b/ipalib/install/kinit.py
483b06
index 1e4d1a82fdefe968db13c3847b9b37b3b3f75d6f..fb6caee4d6b5fef27b53753b21ad83572da31ac4 100644
483b06
--- a/ipalib/install/kinit.py
483b06
+++ b/ipalib/install/kinit.py
483b06
@@ -7,7 +7,6 @@ import time
483b06
 
483b06
 import gssapi
483b06
 
483b06
-from ipalib.constants import ANON_USER
483b06
 from ipaplatform.paths import paths
483b06
 from ipapython.ipa_log_manager import root_logger
483b06
 from ipapython.ipautil import run
483b06
@@ -97,29 +96,26 @@ def kinit_password(principal, password, ccache_name, config=None,
483b06
         raise RuntimeError(result.error_output)
483b06
 
483b06
 
483b06
-def kinit_armor(ccache_name):
483b06
+def kinit_armor(ccache_name, pkinit_anchor=None):
483b06
     """
483b06
-    perform kinit to obtain anonymous ticket to be used as armor for FAST.
483b06
+    perform anonymous pkinit to obtain anonymous ticket to be used as armor
483b06
+    for FAST.
483b06
+
483b06
+    :param ccache_name: location of the armor ccache
483b06
+    :param pkinit_anchor: if not None, the location of PKINIT anchor file to
483b06
+        use. Otherwise the value from Kerberos client library configuration is
483b06
+        used
483b06
+
483b06
+    :raises: CalledProcessError if the anonymous PKINIT fails
483b06
     """
483b06
     root_logger.debug("Initializing anonymous ccache")
483b06
 
483b06
     env = {'LC_ALL': 'C'}
483b06
-    # try with the keytab first and then again fallback to try with pkinit in
483b06
-    # case someone decided it is fun to remove Anonymous keys from the entry
483b06
-    # or in future pkinit enabled principal enforce the use of pkinit
483b06
-    try:
483b06
-        # Gssapi does not understand anonymous cred use kinit command instead
483b06
-        args = [paths.KINIT, '-k', '-t', paths.ANON_KEYTAB,
483b06
-                ANON_USER, '-c', ccache_name]
483b06
-        run(args, env=env, raiseonerr=True, capture_error=True)
483b06
-        return
483b06
-    except Exception as e:
483b06
-        root_logger.debug("Failed to init Anonymous keytab: %s", e,
483b06
-                          exc_info=True)
483b06
-
483b06
-    root_logger.debug("Fallback to slower Anonymous PKINIT")
483b06
     args = [paths.KINIT, '-n', '-c', ccache_name]
483b06
 
483b06
+    if pkinit_anchor is not None:
483b06
+        args.extend(['-X', 'X509_anchors=FILE:{}'.format(pkinit_anchor)])
483b06
+
483b06
     # this workaround enables us to capture stderr and put it
483b06
     # into the raised exception in case of unsuccessful authentication
483b06
     run(args, env=env, raiseonerr=True, capture_error=True)
483b06
-- 
483b06
2.12.2
483b06