5144c6
From be48983558a560dadad410a70a4a1684565ed481 Mon Sep 17 00:00:00 2001
5144c6
From: Alexander Scheel <ascheel@redhat.com>
5144c6
Date: Mon, 15 Jun 2020 18:38:35 -0400
5144c6
Subject: [PATCH] Clarify AJP connector creation process
5144c6
5144c6
We do two things:
5144c6
5144c6
 1. Fix the xpath for AJP connector verification. An AJP connector is
5144c6
    one which has protocol="AJP/1.3", NOT one that has port="8009". An
5144c6
    AJP connector can exist on any port and port 8009 can have any
5144c6
    protocol. Secrets only make sense on AJP connectors, so make the
5144c6
    xpath match the existing comment.
5144c6
5144c6
 2. Add some background in-line documentation about AJP secret
5144c6
    provisioning. This should help future developers understand why this
5144c6
    was added to IPA and what limitations there are in what PKI or IPA
5144c6
    can do. Most notably, explain why Dogtag can't upgrade the AJP
5144c6
    connector to have a secret in the general case.
5144c6
5144c6
Signed-off-by: Alexander Scheel <ascheel@redhat.com>
5144c6
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
5144c6
---
5144c6
 ipaserver/install/dogtaginstance.py | 20 +++++++++++++++++---
5144c6
 1 file changed, 17 insertions(+), 3 deletions(-)
5144c6
5144c6
diff --git a/ipaserver/install/dogtaginstance.py b/ipaserver/install/dogtaginstance.py
5144c6
index 42c9db3fb..aa3baeb7c 100644
5144c6
--- a/ipaserver/install/dogtaginstance.py
5144c6
+++ b/ipaserver/install/dogtaginstance.py
5144c6
@@ -308,11 +308,12 @@ class DogtagInstance(service.Service):
5144c6
         doc = server_xml.getroot()
5144c6
 
5144c6
         # no AJP connector means no need to update anything
5144c6
-        connectors = doc.xpath('//Connector[@port="8009"]')
5144c6
+        connectors = doc.xpath('//Connector[@protocol="AJP/1.3"]')
5144c6
         if len(connectors) == 0:
5144c6
             return
5144c6
 
5144c6
-        # AJP connector is set on port 8009. Use non-greedy search to find it
5144c6
+        # AJP protocol is at version 1.3. Assume there is only one as
5144c6
+        # Dogtag only provisions one.
5144c6
         connector = connectors[0]
5144c6
 
5144c6
         # Detect tomcat version and choose the right option name
5144c6
@@ -331,11 +332,24 @@ class DogtagInstance(service.Service):
5144c6
             rewrite = False
5144c6
         else:
5144c6
             if oldattr in connector.attrib:
5144c6
+                # Sufficiently new Dogtag versions (10.9.0-a2) handle the
5144c6
+                # upgrade for us; we need only to ensure that we're not both
5144c6
+                # attempting to upgrade server.xml at the same time.
5144c6
+                # Hopefully this is guaranteed for us.
5144c6
                 self.ajp_secret = connector.attrib[oldattr]
5144c6
                 connector.attrib[secretattr] = self.ajp_secret
5144c6
                 del connector.attrib[oldattr]
5144c6
             else:
5144c6
-                # Generate password, don't use special chars to not break XML
5144c6
+                # Generate password, don't use special chars to not break XML.
5144c6
+                #
5144c6
+                # If we hit this case, pkispawn was run on an older Dogtag
5144c6
+                # version and we're stuck migrating, choosing a password
5144c6
+                # ourselves. Dogtag can't generate one randomly because a
5144c6
+                # Dogtag administrator might've configured AJP and might
5144c6
+                # not be using IPA.
5144c6
+                #
5144c6
+                # Newer Dogtag versions will generate a random password
5144c6
+                # during pkispawn.
5144c6
                 self.ajp_secret = ipautil.ipa_generate_password(special=None)
5144c6
                 connector.attrib[secretattr] = self.ajp_secret
5144c6
 
5144c6
-- 
5144c6
2.26.2
5144c6
5144c6
From 1e804bf19da4ee274e735fd49452d4df5d73a002 Mon Sep 17 00:00:00 2001
5144c6
From: Alexander Scheel <ascheel@redhat.com>
5144c6
Date: Wed, 17 Jun 2020 16:00:25 -0400
5144c6
Subject: [PATCH] Configure PKI AJP Secret with 256-bit secret
5144c6
5144c6
By default, PKI's AJP secret is generated as a 75-bit password. By
5144c6
generating it in IPA, we can guarantee the strength of the AJP secret.
5144c6
It makes sense to use a stronger AJP secret because it typically
5144c6
isn't rotated; access to AJP allows an attacker to impersonate an admin
5144c6
while talking to PKI.
5144c6
5144c6
Fixes: https://pagure.io/freeipa/issue/8372
5144c6
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1849146
5144c6
Related: https://bugzilla.redhat.com/show_bug.cgi?id=1845447
5144c6
Related: https://github.com/dogtagpki/pki/pull/437
5144c6
5144c6
Signed-off-by: Alexander Scheel <ascheel@redhat.com>
5144c6
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
5144c6
---
5144c6
 install/share/ipaca_customize.ini   | 1 +
5144c6
 install/share/ipaca_default.ini     | 2 ++
5144c6
 ipaserver/install/dogtaginstance.py | 4 +++-
5144c6
 3 files changed, 6 insertions(+), 1 deletion(-)
5144c6
5144c6
diff --git a/install/share/ipaca_customize.ini b/install/share/ipaca_customize.ini
5144c6
index 6d58579af..948734241 100644
5144c6
--- a/install/share/ipaca_customize.ini
5144c6
+++ b/install/share/ipaca_customize.ini
5144c6
@@ -12,6 +12,7 @@
5144c6
 #
5144c6
 # Predefined variables
5144c6
 #  - ipa_ca_subject
5144c6
+#  - ipa_ajp_secret
5144c6
 #  - ipa_fqdn
5144c6
 #  - ipa_subject_base
5144c6
 #  - pki_admin_password
5144c6
diff --git a/install/share/ipaca_default.ini b/install/share/ipaca_default.ini
5144c6
index 2b9900286..a51256116 100644
5144c6
--- a/install/share/ipaca_default.ini
5144c6
+++ b/install/share/ipaca_default.ini
5144c6
@@ -12,6 +12,7 @@ ipa_ca_pem_file=/etc/ipa/ca.crt
5144c6
 
5144c6
 ## dynamic values
5144c6
 # ipa_ca_subject=
5144c6
+# ipa_ajp_secret=
5144c6
 # ipa_subject_base=
5144c6
 # ipa_fqdn=
5144c6
 # ipa_ocsp_uri=
5144c6
@@ -66,6 +67,7 @@ pki_issuing_ca=%(pki_issuing_ca_uri)s
5144c6
 pki_replication_password=
5144c6
 
5144c6
 pki_enable_proxy=True
5144c6
+pki_ajp_secret=%(ipa_ajp_secret)s
5144c6
 pki_restart_configured_instance=False
5144c6
 pki_security_domain_hostname=%(ipa_fqdn)s
5144c6
 pki_security_domain_https_port=443
5144c6
diff --git a/ipaserver/install/dogtaginstance.py b/ipaserver/install/dogtaginstance.py
5144c6
index aa3baeb7c..361d80a8c 100644
5144c6
--- a/ipaserver/install/dogtaginstance.py
5144c6
+++ b/ipaserver/install/dogtaginstance.py
5144c6
@@ -840,7 +840,9 @@ class PKIIniLoader:
5144c6
             pki_subsystem_type=subsystem.lower(),
5144c6
             home_dir=os.path.expanduser("~"),
5144c6
             # for softhsm2 testing
5144c6
-            softhsm2_so=paths.LIBSOFTHSM2_SO
5144c6
+            softhsm2_so=paths.LIBSOFTHSM2_SO,
5144c6
+            # Configure a more secure AJP password by default
5144c6
+            ipa_ajp_secret=ipautil.ipa_generate_password(special=None)
5144c6
         )
5144c6
 
5144c6
     @classmethod
5144c6
-- 
5144c6
2.26.2
5144c6