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