ipa-4.12.0-6
- Resolves: RHEL-47292 Include latest fixes in python3-ipatests packages - Resolves: RHEL-47146 Syntax error uninstalling the selinux-luna subpackage - Resolves: RHEL-46009 ipa-migrate with -Z option fails with ValueError: option error - Resolves: RHEL-46003 ipa-migrate -V options fails to display version - Resolves: RHEL-45463 ipa-migrate stage-mode is failing with error: Modifying a mapped attribute in a managed entry is not allowed - Resolves: RHEL-40890 ipa-server-install: token_password_file read in kra.install_check after calling hsm_validator in ca.install_check - Resolves: RHEL-40661 Adjust "ipa config-mod --addattr ipaconfigstring=EnforceLDAPOTP" to allow for non OTP users in some cases Signed-off-by: Florence Blanc-Renaud <flo@redhat.com>
This commit is contained in:
parent
d0ca280108
commit
8b6d847e67
@ -0,0 +1,45 @@
|
|||||||
|
From 4521fe5f9125c74b4ad6e4e51f8c66c009079281 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florence Blanc-Renaud <flo@redhat.com>
|
||||||
|
Date: Thu, 13 Jun 2024 10:39:54 +0200
|
||||||
|
Subject: [PATCH] ipatests: mark test_ca_show_error_handling as xfail
|
||||||
|
|
||||||
|
With PKI 11.5.0, the test
|
||||||
|
test_cert.py::TestCAShowErrorHandling::test_ca_show_error_handling
|
||||||
|
is failing with an exception and a different error message.
|
||||||
|
Mark as xfail until PKI provides a fix
|
||||||
|
|
||||||
|
Related: https://pagure.io/freeipa/issue/9606
|
||||||
|
Signed-off-by: Florence Blanc-Renaud <flo@redhat.com>
|
||||||
|
Reviewed-By: Francisco Trivino <ftrivino@redhat.com>
|
||||||
|
---
|
||||||
|
ipatests/test_integration/test_cert.py | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/ipatests/test_integration/test_cert.py b/ipatests/test_integration/test_cert.py
|
||||||
|
index 4dd1254a2d16420bb70686f9715497dfb9048ecf..91598b655a8cd6ff92c1a0cf2166c6548a7af758 100644
|
||||||
|
--- a/ipatests/test_integration/test_cert.py
|
||||||
|
+++ b/ipatests/test_integration/test_cert.py
|
||||||
|
@@ -25,6 +25,7 @@ from pkg_resources import parse_version
|
||||||
|
|
||||||
|
from ipatests.pytest_ipa.integration import tasks
|
||||||
|
from ipatests.test_integration.base import IntegrationTest
|
||||||
|
+from ipatests.util import xfail_context
|
||||||
|
|
||||||
|
DEFAULT_RA_AGENT_SUBMITTED_VAL = '19700101000000'
|
||||||
|
|
||||||
|
@@ -555,7 +556,11 @@ class TestCAShowErrorHandling(IntegrationTest):
|
||||||
|
)
|
||||||
|
error_msg = 'ipa: ERROR: The certificate for ' \
|
||||||
|
'{} is not available on this server.'.format(lwca)
|
||||||
|
- assert error_msg in result.stderr_text
|
||||||
|
+ bad_version = (tasks.get_pki_version(self.master)
|
||||||
|
+ >= tasks.parse_version('11.5.0'))
|
||||||
|
+ with xfail_context(bad_version,
|
||||||
|
+ reason="https://pagure.io/freeipa/issue/9606"):
|
||||||
|
+ assert error_msg in result.stderr_text
|
||||||
|
|
||||||
|
def test_certmonger_empty_cert_not_segfault(self):
|
||||||
|
"""Test empty cert request doesn't force certmonger to segfault
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
47
0014-ipa-migrate-remove-V-option.patch
Normal file
47
0014-ipa-migrate-remove-V-option.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From efa57193630f244185b3f295ed0de17c6d08f75a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Date: Mon, 8 Jul 2024 10:49:49 -0400
|
||||||
|
Subject: [PATCH] ipa-migrate - remove -V option
|
||||||
|
|
||||||
|
The versioning in ipa-migrate was removed, but the "-V" option to display the version was not removed.
|
||||||
|
|
||||||
|
Fixes: https://pagure.io/freeipa/issue/9620
|
||||||
|
|
||||||
|
Signed-off-by: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
---
|
||||||
|
install/tools/man/ipa-migrate.1 | 3 ---
|
||||||
|
ipaserver/install/ipa_migrate.py | 3 ---
|
||||||
|
2 files changed, 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/install/tools/man/ipa-migrate.1 b/install/tools/man/ipa-migrate.1
|
||||||
|
index 78881d1f8a9ea91d7824e5f8b13f50aecf5ebd16..2d9d2c650a4c44a2f397d1c2ccb42fb95eea2bae 100644
|
||||||
|
--- a/install/tools/man/ipa-migrate.1
|
||||||
|
+++ b/install/tools/man/ipa-migrate.1
|
||||||
|
@@ -67,9 +67,6 @@ Reset the ID range for migrated users/groups. In "stage-mode" this is done autom
|
||||||
|
\fB\-F\fR, \fB\-\-force\fR
|
||||||
|
Ignore any errors and continue to proceed with migration effort.
|
||||||
|
.TP
|
||||||
|
-\fB\-V\fR, \fB\-\-version\fR
|
||||||
|
-Display the version of the migration tool.
|
||||||
|
-.TP
|
||||||
|
\fB\-q\fR, \fB\-\-quiet\fR
|
||||||
|
Only log errors during the migration process.
|
||||||
|
.TP
|
||||||
|
diff --git a/ipaserver/install/ipa_migrate.py b/ipaserver/install/ipa_migrate.py
|
||||||
|
index 58351af604b8d6f4ac31432a425718a4d45e0178..6be8d9ba23b36779bf6296df757c1aca551968c0 100644
|
||||||
|
--- a/ipaserver/install/ipa_migrate.py
|
||||||
|
+++ b/ipaserver/install/ipa_migrate.py
|
||||||
|
@@ -389,9 +389,6 @@ class IPAMigrate():
|
||||||
|
parser.add_argument('-F', '--force',
|
||||||
|
help='Ignore errors and continue with migration',
|
||||||
|
action='store_true', default=False)
|
||||||
|
- parser.add_argument('-V', '--version',
|
||||||
|
- help='Display verison of the migration tool',
|
||||||
|
- action='store_true', default=False)
|
||||||
|
parser.add_argument('-q', '--quiet',
|
||||||
|
help='Only display errors during the migration',
|
||||||
|
action='store_true', default=False)
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
From 1b278de4ab9c5e00fb48dc2de1ea31d9bdfc94bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Date: Tue, 9 Jul 2024 14:35:25 -0400
|
||||||
|
Subject: [PATCH] Fix syntax error in the selinux-luna %postun script
|
||||||
|
|
||||||
|
It was missing a trailing fi.
|
||||||
|
|
||||||
|
This bad syntax was preventing cleanup of the
|
||||||
|
{free}ipa-selinux-luna SELinux module:
|
||||||
|
|
||||||
|
Running scriptlet: freeipa-selinux-luna-4.12.0.dev202402211727+git0ee 34/44
|
||||||
|
/var/tmp/rpm-tmp.qoCDFi: line 16: syntax error: unexpected end of file
|
||||||
|
warning: %postun(freeipa-selinux-luna-4.12.0.dev202402211727+git0eeecdcec-0.fc37.noarch) scriptlet failed, exit status
|
||||||
|
|
||||||
|
Fixes: https://pagure.io/freeipa/issue/9629
|
||||||
|
|
||||||
|
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <flo@redhat.com>
|
||||||
|
---
|
||||||
|
freeipa.spec.in | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/freeipa.spec.in b/freeipa.spec.in
|
||||||
|
index 1e1a0c04728972c6c53beb47dafb25d7898ab0ea..b3b19cf8881db97307836513ff2263dc4fe4ca03 100755
|
||||||
|
--- a/freeipa.spec.in
|
||||||
|
+++ b/freeipa.spec.in
|
||||||
|
@@ -1367,6 +1367,7 @@ fi
|
||||||
|
%postun selinux-luna
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
%selinux_modules_uninstall -s %{selinuxtype} %{modulename}-luna
|
||||||
|
+fi
|
||||||
|
|
||||||
|
%posttrans selinux
|
||||||
|
%selinux_relabel_post -s %{selinuxtype}
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
231
0016-Re-organize-HSM-validation-to-be-more-consistent-les.patch
Normal file
231
0016-Re-organize-HSM-validation-to-be-more-consistent-les.patch
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
From 7ab1bcb2d364c26024db4ec99c707ebefffcd3e7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Date: Fri, 5 Jul 2024 15:00:59 -0400
|
||||||
|
Subject: [PATCH] Re-organize HSM validation to be more consistent/less
|
||||||
|
duplication
|
||||||
|
|
||||||
|
hsm_validator() was more or less bolted in place late in the
|
||||||
|
development cycle in in order to catch some of the more common
|
||||||
|
problems: bad token name, bad password, etc.
|
||||||
|
|
||||||
|
There was a fair bit of duplication and had the side-effect of not
|
||||||
|
reading in the token password from the --token-password-file option
|
||||||
|
in some cases.
|
||||||
|
|
||||||
|
This patch also re-adds a lost feature where an exception is raised if
|
||||||
|
both the --token-password and --token-password-file options are passed
|
||||||
|
in.
|
||||||
|
|
||||||
|
This also needs to be enforced on initial server, replica and when
|
||||||
|
called by ipa-kra-install. Given that each has a unique subject of
|
||||||
|
options some duplication remains.
|
||||||
|
|
||||||
|
Fixes: https://pagure.io/freeipa/issue/9603
|
||||||
|
|
||||||
|
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
|
||||||
|
---
|
||||||
|
ipaserver/install/ca.py | 72 +++++++++++++++--------------
|
||||||
|
ipaserver/install/kra.py | 56 ++++++++++++++++++++--
|
||||||
|
ipaserver/install/server/install.py | 2 +
|
||||||
|
3 files changed, 93 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ipaserver/install/ca.py b/ipaserver/install/ca.py
|
||||||
|
index dc4b47056f0e327d120ab6dad238deae3c26bbcd..b8155d9965712dbce4076e9d73d6712135309ce2 100644
|
||||||
|
--- a/ipaserver/install/ca.py
|
||||||
|
+++ b/ipaserver/install/ca.py
|
||||||
|
@@ -193,6 +193,8 @@ def hsm_validator(token_name, token_library, token_password):
|
||||||
|
if not token_name:
|
||||||
|
logger.debug("No token name, assuming not an HSM install")
|
||||||
|
return
|
||||||
|
+ if not token_password:
|
||||||
|
+ raise ValueError("No token password provided")
|
||||||
|
val, pki_version = hsm_version()
|
||||||
|
if val is False:
|
||||||
|
raise ValueError(
|
||||||
|
@@ -361,17 +363,16 @@ def install_check(standalone, replica_config, options):
|
||||||
|
host_name = options.host_name
|
||||||
|
|
||||||
|
if replica_config is None:
|
||||||
|
- if options.token_name:
|
||||||
|
- try:
|
||||||
|
- hsm_validator(
|
||||||
|
- options.token_name, options.token_library_path,
|
||||||
|
- options.token_password)
|
||||||
|
- except ValueError as e:
|
||||||
|
- raise ScriptError(str(e))
|
||||||
|
options._subject_base = options.subject_base
|
||||||
|
options._ca_subject = options.ca_subject
|
||||||
|
options._random_serial_numbers = options.random_serial_numbers
|
||||||
|
token_name = options.token_name
|
||||||
|
+ token_library_path = options.token_library_path
|
||||||
|
+ if "setup_ca" in options.__dict__:
|
||||||
|
+ setup_ca = options.setup_ca
|
||||||
|
+ else:
|
||||||
|
+ # We got here through ipa-ca-install
|
||||||
|
+ setup_ca = True
|
||||||
|
else:
|
||||||
|
# during replica install, this gets invoked before local DS is
|
||||||
|
# available, so use the remote api.
|
||||||
|
@@ -399,33 +400,36 @@ def install_check(standalone, replica_config, options):
|
||||||
|
if replica_config.setup_ca and token_name:
|
||||||
|
if not options.token_library_path:
|
||||||
|
options.token_library_path = token_library_path
|
||||||
|
- if (
|
||||||
|
- not options.token_password_file
|
||||||
|
- and not options.token_password
|
||||||
|
- ):
|
||||||
|
- if options.unattended:
|
||||||
|
- raise ScriptError("HSM token password required")
|
||||||
|
- token_password = installutils.read_password(
|
||||||
|
- f"HSM token '{token_name}'", confirm=False
|
||||||
|
- )
|
||||||
|
- if token_password is None:
|
||||||
|
- raise ScriptError("HSM token password required")
|
||||||
|
- else:
|
||||||
|
- options.token_password = token_password
|
||||||
|
-
|
||||||
|
- if options.token_password_file:
|
||||||
|
- with open(options.token_password_file, "r") as fd:
|
||||||
|
- options.token_password = fd.readline().strip()
|
||||||
|
- try:
|
||||||
|
- hsm_validator(
|
||||||
|
- token_name,
|
||||||
|
- options.token_library_path
|
||||||
|
- if options.token_library_path
|
||||||
|
- else token_library_path,
|
||||||
|
- options.token_password,
|
||||||
|
- )
|
||||||
|
- except ValueError as e:
|
||||||
|
- raise ScriptError(str(e))
|
||||||
|
+ setup_ca = replica_config.setup_ca
|
||||||
|
+
|
||||||
|
+ if setup_ca and token_name:
|
||||||
|
+ if (options.token_password_file and options.token_password):
|
||||||
|
+ raise ScriptError(
|
||||||
|
+ "token-password and token-password-file are mutually exclusive"
|
||||||
|
+ )
|
||||||
|
+ if options.token_password_file:
|
||||||
|
+ with open(options.token_password_file, "r") as fd:
|
||||||
|
+ options.token_password = fd.readline().strip()
|
||||||
|
+ if (
|
||||||
|
+ not options.token_password_file
|
||||||
|
+ and not options.token_password
|
||||||
|
+ ):
|
||||||
|
+ if options.unattended:
|
||||||
|
+ raise ScriptError("HSM token password required")
|
||||||
|
+ token_password = installutils.read_password(
|
||||||
|
+ f"HSM token '{token_name}'", confirm=False
|
||||||
|
+ )
|
||||||
|
+ if token_password is None:
|
||||||
|
+ raise ScriptError("HSM token password required")
|
||||||
|
+ else:
|
||||||
|
+ options.token_password = token_password
|
||||||
|
+
|
||||||
|
+ try:
|
||||||
|
+ hsm_validator(
|
||||||
|
+ token_name, token_library_path,
|
||||||
|
+ options.token_password)
|
||||||
|
+ except ValueError as e:
|
||||||
|
+ raise ScriptError(str(e))
|
||||||
|
|
||||||
|
if replica_config is not None and not replica_config.setup_ca:
|
||||||
|
return
|
||||||
|
diff --git a/ipaserver/install/kra.py b/ipaserver/install/kra.py
|
||||||
|
index 2c5b47590c26e37818f055cfd218c85d74e9b46c..dc3bc7c204394187bb7a5c4cc1b863a2091bdc49 100644
|
||||||
|
--- a/ipaserver/install/kra.py
|
||||||
|
+++ b/ipaserver/install/kra.py
|
||||||
|
@@ -16,10 +16,12 @@ from ipalib.kinit import kinit_keytab
|
||||||
|
from ipaplatform import services
|
||||||
|
from ipaplatform.paths import paths
|
||||||
|
from ipapython import ipautil
|
||||||
|
+from ipapython.admintool import ScriptError
|
||||||
|
from ipapython.install.core import group
|
||||||
|
from ipaserver.install import ca, cainstance
|
||||||
|
from ipaserver.install import krainstance
|
||||||
|
from ipaserver.install import dsinstance
|
||||||
|
+from ipaserver.install import installutils
|
||||||
|
from ipaserver.install import service as _service
|
||||||
|
|
||||||
|
from . import dogtag
|
||||||
|
@@ -58,13 +60,61 @@ def install_check(api, replica_config, options):
|
||||||
|
"KRA can not be installed when 'ca_host' is overriden in "
|
||||||
|
"IPA configuration file.")
|
||||||
|
|
||||||
|
+ # There are three scenarios for installing a KRA
|
||||||
|
+ # 1. At install time of the initial server
|
||||||
|
+ # 2. Using ipa-kra-install
|
||||||
|
+ # 3. At install time of a replica
|
||||||
|
+ #
|
||||||
|
+ # These tests are done in reverse order. If we are doing a
|
||||||
|
+ # replica install we can check the remote CA.
|
||||||
|
+ #
|
||||||
|
+ # If we are running ipa-kra-install then there must be a CA
|
||||||
|
+ # use that.
|
||||||
|
+ #
|
||||||
|
+ # If initial install we either have the token options or we don't.
|
||||||
|
+
|
||||||
|
+ cai = cainstance.CAInstance()
|
||||||
|
+ if replica_config is not None:
|
||||||
|
+ (token_name, token_library_path) = ca.lookup_hsm_configuration(api)
|
||||||
|
+ elif cai.is_configured() and cai.hsm_enabled:
|
||||||
|
+ (token_name, token_library_path) = ca.lookup_hsm_configuration(api)
|
||||||
|
+ elif 'token_name' in options.__dict__:
|
||||||
|
+ token_name = options.token_name
|
||||||
|
+ token_library_path = options.token_library_path
|
||||||
|
+ else:
|
||||||
|
+ token_name = None
|
||||||
|
+
|
||||||
|
+ if replica_config is not None:
|
||||||
|
+ if (
|
||||||
|
+ token_name
|
||||||
|
+ and options.token_password_file
|
||||||
|
+ and options.token_password
|
||||||
|
+ ):
|
||||||
|
+ raise ScriptError(
|
||||||
|
+ "token-password and token-password-file are mutually exclusive"
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
if options.token_password_file:
|
||||||
|
with open(options.token_password_file, "r") as fd:
|
||||||
|
options.token_password = fd.readline().strip()
|
||||||
|
|
||||||
|
- if replica_config is not None:
|
||||||
|
- (token_name, token_library) = ca.lookup_hsm_configuration(api)
|
||||||
|
- ca.hsm_validator(token_name, token_library, options.token_password)
|
||||||
|
+ if (
|
||||||
|
+ token_name
|
||||||
|
+ and not options.token_password_file
|
||||||
|
+ and not options.token_password
|
||||||
|
+ ):
|
||||||
|
+ if options.unattended:
|
||||||
|
+ raise ScriptError("HSM token password required")
|
||||||
|
+ token_password = installutils.read_password(
|
||||||
|
+ f"HSM token '{token_name}'", confirm=False
|
||||||
|
+ )
|
||||||
|
+ if token_password is None:
|
||||||
|
+ raise ScriptError("HSM token password required")
|
||||||
|
+ else:
|
||||||
|
+ options.token_password = token_password
|
||||||
|
+
|
||||||
|
+ if token_name:
|
||||||
|
+ ca.hsm_validator(token_name, token_library_path, options.token_password)
|
||||||
|
|
||||||
|
|
||||||
|
def install(api, replica_config, options, custodia):
|
||||||
|
diff --git a/ipaserver/install/server/install.py b/ipaserver/install/server/install.py
|
||||||
|
index 1b18873363cece5e187a7c772acfcbc6c565ee97..47db1314239906a10bb77e5fc0d4c1eddc02e2da 100644
|
||||||
|
--- a/ipaserver/install/server/install.py
|
||||||
|
+++ b/ipaserver/install/server/install.py
|
||||||
|
@@ -663,6 +663,8 @@ def install_check(installer):
|
||||||
|
options.token_name is not None
|
||||||
|
)
|
||||||
|
):
|
||||||
|
+ if options.unattended:
|
||||||
|
+ raise ScriptError("HSM token password required")
|
||||||
|
token_password = read_password(
|
||||||
|
f"HSM token '{options.token_name}'" , confirm=False)
|
||||||
|
if token_password is None:
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
192
0017-ipatests-tests-related-to-token-password-file.patch
Normal file
192
0017-ipatests-tests-related-to-token-password-file.patch
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
From 4ea1ad6acae910574a524403bc82c80d24b525d6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mohammad Rizwan <myusuf@redhat.com>
|
||||||
|
Date: Thu, 13 Jun 2024 14:07:57 +0530
|
||||||
|
Subject: [PATCH] ipatests: tests related to --token-password-file
|
||||||
|
|
||||||
|
Test automation added around the --token-password-file
|
||||||
|
option for server/replica/kra install.
|
||||||
|
|
||||||
|
Related: https://pagure.io/freeipa/issue/9603
|
||||||
|
|
||||||
|
Signed-off-by: Mohammad Rizwan <myusuf@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
|
||||||
|
---
|
||||||
|
ipatests/test_integration/test_hsm.py | 85 ++++++++++++++++++++++++---
|
||||||
|
1 file changed, 77 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ipatests/test_integration/test_hsm.py b/ipatests/test_integration/test_hsm.py
|
||||||
|
index b49af12492f7dce4bd41836b220d75d9fc99b5c2..3a33c3bda6d072aa16e361b04ac2d668902bb0e9 100644
|
||||||
|
--- a/ipatests/test_integration/test_hsm.py
|
||||||
|
+++ b/ipatests/test_integration/test_hsm.py
|
||||||
|
@@ -163,6 +163,7 @@ class BaseHSMTest(IntegrationTest):
|
||||||
|
master_extra_args = []
|
||||||
|
token_password = None
|
||||||
|
token_name = None
|
||||||
|
+ token_password_file = '/tmp/token_password'
|
||||||
|
random_serial = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@@ -191,7 +192,7 @@ class BaseHSMTest(IntegrationTest):
|
||||||
|
delete_hsm_token([cls.master] + cls.replicas, cls.token_name)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
- def sync_tokens(cls, source):
|
||||||
|
+ def sync_tokens(cls, source, token_name=None):
|
||||||
|
"""Synchronize non-networked HSM tokens between machines
|
||||||
|
source: source host for the token data
|
||||||
|
"""
|
||||||
|
@@ -207,7 +208,8 @@ class BaseHSMTest(IntegrationTest):
|
||||||
|
for host in [cls.master] + cls.replicas:
|
||||||
|
if host == source:
|
||||||
|
continue
|
||||||
|
- copy_token_files(source, [host], cls.token_name)
|
||||||
|
+ copy_token_files(source, [host],
|
||||||
|
+ token_name if token_name else cls.token_name)
|
||||||
|
|
||||||
|
|
||||||
|
class TestHSMInstall(BaseHSMTest):
|
||||||
|
@@ -218,6 +220,10 @@ class TestHSMInstall(BaseHSMTest):
|
||||||
|
|
||||||
|
def test_hsm_install_replica0_ca_less_install(self):
|
||||||
|
check_version(self.master)
|
||||||
|
+
|
||||||
|
+ self.master.put_file_contents(
|
||||||
|
+ self.token_password_file, self.token_password
|
||||||
|
+ )
|
||||||
|
tasks.install_replica(
|
||||||
|
self.master, self.replicas[0], setup_ca=False,
|
||||||
|
setup_dns=True,
|
||||||
|
@@ -307,6 +313,50 @@ class TestHSMInstall(BaseHSMTest):
|
||||||
|
assert returncode == 0
|
||||||
|
assert output == "No issues found."
|
||||||
|
|
||||||
|
+ def test_hsm_install_server_password_file(self):
|
||||||
|
+ check_version(self.master)
|
||||||
|
+ # cleanup before fresh install with password file
|
||||||
|
+ for client in self.clients:
|
||||||
|
+ tasks.uninstall_client(client)
|
||||||
|
+
|
||||||
|
+ for replica in self.replicas:
|
||||||
|
+ tasks.uninstall_master(replica)
|
||||||
|
+
|
||||||
|
+ tasks.uninstall_master(self.master)
|
||||||
|
+
|
||||||
|
+ delete_hsm_token([self.master] + self.replicas, self.token_name)
|
||||||
|
+ self.token_name, self.token_password = get_hsm_token(self.master)
|
||||||
|
+ self.master.put_file_contents(self.token_password_file,
|
||||||
|
+ self.token_password)
|
||||||
|
+ self.replicas[0].put_file_contents(self.token_password_file,
|
||||||
|
+ self.token_password)
|
||||||
|
+
|
||||||
|
+ tasks.install_master(
|
||||||
|
+ self.master, setup_dns=self.master_with_dns,
|
||||||
|
+ setup_kra=self.master_with_kra,
|
||||||
|
+ setup_adtrust=self.master_with_ad,
|
||||||
|
+ extra_args=(
|
||||||
|
+ '--token-name', self.token_name,
|
||||||
|
+ '--token-library-path', hsm_lib_path,
|
||||||
|
+ '--token-password-file', self.token_password_file
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
+ self.sync_tokens(self.master, token_name=self.token_name)
|
||||||
|
+
|
||||||
|
+ def test_hsm_install_replica0_password_file(self):
|
||||||
|
+ check_version(self.master)
|
||||||
|
+ tasks.install_replica(
|
||||||
|
+ self.master, self.replicas[0], setup_ca=True,
|
||||||
|
+ extra_args=('--token-password-file', self.token_password_file,)
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
+ def test_hsm_install_replica0_kra_password_file(self):
|
||||||
|
+ check_version(self.master)
|
||||||
|
+ tasks.install_kra(
|
||||||
|
+ self.replicas[0],
|
||||||
|
+ extra_args=('--token-password-file', self.token_password_file,)
|
||||||
|
+ )
|
||||||
|
+
|
||||||
|
|
||||||
|
class TestHSMInstallADTrustBase(BaseHSMTest):
|
||||||
|
"""
|
||||||
|
@@ -321,7 +371,7 @@ class TestHSMInstallADTrustBase(BaseHSMTest):
|
||||||
|
check_version(self.master)
|
||||||
|
tasks.install_replica(
|
||||||
|
self.master, self.replicas[0], setup_ca=True,
|
||||||
|
- setup_adtrust=True, setup_kra=True, setup_dns=True,
|
||||||
|
+ setup_adtrust=False, setup_kra=True, setup_dns=True,
|
||||||
|
nameservers='master' if self.master_with_dns else None,
|
||||||
|
extra_args=('--token-password', self.token_password,)
|
||||||
|
)
|
||||||
|
@@ -356,7 +406,8 @@ class TestHSMcertRenewal(BaseHSMTest):
|
||||||
|
'auditSigningCert cert-pki-ca': 'caauditSigningCert'
|
||||||
|
}
|
||||||
|
CA_TRACKING_REQS.update(KRA_TRACKING_REQS)
|
||||||
|
- self.master.put_file_contents('/tmp/token_passwd', self.token_password)
|
||||||
|
+ self.master.put_file_contents(self.token_password_file,
|
||||||
|
+ self.token_password)
|
||||||
|
for nickname in CA_TRACKING_REQS:
|
||||||
|
cert = tasks.certutil_fetch_cert(
|
||||||
|
self.master,
|
||||||
|
@@ -772,6 +823,7 @@ class TestHSMcertFixReplica(BaseHSMTest):
|
||||||
|
class TestHSMNegative(IntegrationTest):
|
||||||
|
|
||||||
|
master_with_dns = False
|
||||||
|
+ token_password_file = '/tmp/token_password'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def install(cls, mh):
|
||||||
|
@@ -792,7 +844,6 @@ class TestHSMNegative(IntegrationTest):
|
||||||
|
'--token-password', self.token_password
|
||||||
|
)
|
||||||
|
)
|
||||||
|
- # assert 'error message non existing token name' in result.stderr_text
|
||||||
|
assert result.returncode != 0
|
||||||
|
|
||||||
|
# wrong token password
|
||||||
|
@@ -804,7 +855,6 @@ class TestHSMNegative(IntegrationTest):
|
||||||
|
'--token-password', 'token_passwd'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
- # assert 'error message wrong passwd' in result.stderr_text
|
||||||
|
assert result.returncode != 0
|
||||||
|
|
||||||
|
# wrong token lib
|
||||||
|
@@ -816,7 +866,6 @@ class TestHSMNegative(IntegrationTest):
|
||||||
|
'--token-password', self.token_password
|
||||||
|
)
|
||||||
|
)
|
||||||
|
- # assert 'error message non existing token lib' in result.stderr_text
|
||||||
|
assert result.returncode != 0
|
||||||
|
|
||||||
|
def test_hsm_negative_special_char_token_name(self):
|
||||||
|
@@ -842,7 +891,27 @@ class TestHSMNegative(IntegrationTest):
|
||||||
|
'--token-password', token_passwd
|
||||||
|
)
|
||||||
|
)
|
||||||
|
- # assert 'error message non existing token lib' in result.stderr_text
|
||||||
|
+ assert result.returncode != 0
|
||||||
|
+
|
||||||
|
+ def test_hsm_negative_token_password_and_file(self):
|
||||||
|
+ """Test token-password and token-password-file at same time
|
||||||
|
+
|
||||||
|
+ Test if command fails when --token-password and --token-password-file
|
||||||
|
+ provided at the same time results into command failure.
|
||||||
|
+ """
|
||||||
|
+ check_version(self.master)
|
||||||
|
+ self.master.put_file_contents(
|
||||||
|
+ self.token_password_file, self.token_password
|
||||||
|
+ )
|
||||||
|
+ result = tasks.install_master(
|
||||||
|
+ self.master, raiseonerr=False,
|
||||||
|
+ extra_args=(
|
||||||
|
+ '--token-name', self.token_name,
|
||||||
|
+ '--token-library-path', hsm_lib_path,
|
||||||
|
+ '--token-password', self.token_password,
|
||||||
|
+ '--token-password-file', self.token_password_file
|
||||||
|
+ )
|
||||||
|
+ )
|
||||||
|
assert result.returncode != 0
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
@ -0,0 +1,36 @@
|
|||||||
|
From 6c53a22a2cacf7807df11e51492d1a2c42aeeda1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Date: Tue, 18 Jun 2024 11:16:07 -0400
|
||||||
|
Subject: [PATCH] Include token password options in ipa-kra-install man page
|
||||||
|
|
||||||
|
Related: https://pagure.io/freeipa/issue/9603
|
||||||
|
|
||||||
|
Signed-off-by: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
|
||||||
|
---
|
||||||
|
install/tools/man/ipa-kra-install.1 | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/install/tools/man/ipa-kra-install.1 b/install/tools/man/ipa-kra-install.1
|
||||||
|
index 5476a4e717584cd7c6f823e3c3cb4e4948f14875..955085bf7162863a0567356417a0886e733c0b42 100644
|
||||||
|
--- a/install/tools/man/ipa-kra-install.1
|
||||||
|
+++ b/install/tools/man/ipa-kra-install.1
|
||||||
|
@@ -54,6 +54,15 @@ Log to the given file
|
||||||
|
.TP
|
||||||
|
\fB\-\-pki\-config\-override\fR=\fIFILE\fR
|
||||||
|
File containing overrides for KRA installation.
|
||||||
|
+.SS "HSM OPTIONS"
|
||||||
|
+The token name and library path are retrieved from the existing
|
||||||
|
+installation.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-token\-password\fR=\fITOKEN_PASSWORD\fR
|
||||||
|
+The PKCS#11 token password for the HSM.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-token\-password\-file\fR=\fITOKEN_PASSWORD_FILE\fR
|
||||||
|
+The full path to a file containing the PKCS#11 token password.
|
||||||
|
.SH "EXIT STATUS"
|
||||||
|
0 if the command was successful
|
||||||
|
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
86
0019-ipa-migrate-starttls-does-not-work.patch
Normal file
86
0019-ipa-migrate-starttls-does-not-work.patch
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
From eeade50933cb2251b43ee34c642bcae69a216655 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Date: Mon, 8 Jul 2024 10:20:47 -0400
|
||||||
|
Subject: [PATCH] ipa-migrate - starttls does not work
|
||||||
|
|
||||||
|
We were previousily taking the provided ca cert and creating a temporary
|
||||||
|
file from it. This was incorrect and caused the secure connection to
|
||||||
|
fail. Instead just use the file path provided.
|
||||||
|
|
||||||
|
Fixes: https://pagure.io/freeipa/issue/9619
|
||||||
|
|
||||||
|
Signed-off-by: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
|
||||||
|
---
|
||||||
|
install/tools/man/ipa-migrate.1 | 2 +-
|
||||||
|
ipaserver/install/ipa_migrate.py | 25 +++++++++++++++++--------
|
||||||
|
2 files changed, 18 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/install/tools/man/ipa-migrate.1 b/install/tools/man/ipa-migrate.1
|
||||||
|
index 2d9d2c650a4c44a2f397d1c2ccb42fb95eea2bae..47ae47ea4afa3a5a6fe25dd9bbd14c27ab5f1fdb 100644
|
||||||
|
--- a/install/tools/man/ipa-migrate.1
|
||||||
|
+++ b/install/tools/man/ipa-migrate.1
|
||||||
|
@@ -25,7 +25,7 @@ network interruptions)
|
||||||
|
In this mode everything will be migrated including the current user SIDs and
|
||||||
|
DNA ranges
|
||||||
|
.TP
|
||||||
|
-\fBstage\-mod\fR
|
||||||
|
+\fBstage\-mode\fR
|
||||||
|
In this mode, SIDs & DNA ranges are not migrated, and DNA attributes are reset
|
||||||
|
|
||||||
|
.SH "COMMANDS"
|
||||||
|
diff --git a/ipaserver/install/ipa_migrate.py b/ipaserver/install/ipa_migrate.py
|
||||||
|
index 6be8d9ba23b36779bf6296df757c1aca551968c0..0e19b98b5be532c513876e165561f0af176baa27 100644
|
||||||
|
--- a/ipaserver/install/ipa_migrate.py
|
||||||
|
+++ b/ipaserver/install/ipa_migrate.py
|
||||||
|
@@ -27,7 +27,6 @@ from ipalib.x509 import IPACertificate
|
||||||
|
from ipaplatform.paths import paths
|
||||||
|
from ipapython.dn import DN
|
||||||
|
from ipapython.ipaldap import LDAPClient, LDAPEntry, realm_to_ldapi_uri
|
||||||
|
-from ipapython.ipautil import write_tmp_file
|
||||||
|
from ipapython.ipa_log_manager import standard_logging_setup
|
||||||
|
from ipaserver.install.ipa_migrate_constants import (
|
||||||
|
DS_CONFIG, DB_OBJECTS, DS_INDEXES, BIND_DN, LOG_FILE_NAME,
|
||||||
|
@@ -758,13 +757,19 @@ class IPAMigrate():
|
||||||
|
insecure_bind = False
|
||||||
|
|
||||||
|
if self.args.cacertfile is not None:
|
||||||
|
- # Store CA cert into file
|
||||||
|
- tmp_ca_cert_f = write_tmp_file(self.args.cacertfile)
|
||||||
|
- cacert = tmp_ca_cert_f.name
|
||||||
|
-
|
||||||
|
# Start TLS connection (START_TLS)
|
||||||
|
- ds_conn = LDAPClient(ldapuri, cacert=cacert, start_tls=True)
|
||||||
|
- tmp_ca_cert_f.close()
|
||||||
|
+ try:
|
||||||
|
+ ds_conn = LDAPClient(ldapuri, cacert=self.args.cacertfile,
|
||||||
|
+ start_tls=True)
|
||||||
|
+ except (
|
||||||
|
+ ldap.LDAPError,
|
||||||
|
+ errors.NetworkError,
|
||||||
|
+ errors.DatabaseError,
|
||||||
|
+ IOError
|
||||||
|
+ ) as e:
|
||||||
|
+ self.handle_error(
|
||||||
|
+ f"Failed to connect to remote server: {str(e)}"
|
||||||
|
+ )
|
||||||
|
else:
|
||||||
|
# LDAP (insecure)
|
||||||
|
ds_conn = LDAPClient(ldapuri)
|
||||||
|
@@ -773,7 +778,11 @@ class IPAMigrate():
|
||||||
|
try:
|
||||||
|
ds_conn.simple_bind(DN(self.args.bind_dn), self.bindpw,
|
||||||
|
insecure_bind=insecure_bind)
|
||||||
|
- except (errors.NetworkError, errors.ACIError) as e:
|
||||||
|
+ except (
|
||||||
|
+ errors.NetworkError,
|
||||||
|
+ errors.ACIError,
|
||||||
|
+ errors.DatabaseError
|
||||||
|
+ ) as e:
|
||||||
|
self.handle_error(f"Failed to bind to remote server: {str(e)}")
|
||||||
|
|
||||||
|
# All set, stash the remote connection
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
232
0020-ipa-pwd-extop-differentiate-OTP-requirements-in-LDAP.patch
Normal file
232
0020-ipa-pwd-extop-differentiate-OTP-requirements-in-LDAP.patch
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
From 051d61fdc301f2768ac78c45e93a5f9eeff8aa28 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alexander Bokovoy <abokovoy@redhat.com>
|
||||||
|
Date: Tue, 25 Jun 2024 14:27:24 +0300
|
||||||
|
Subject: [PATCH] ipa-pwd-extop: differentiate OTP requirements in LDAP binds
|
||||||
|
|
||||||
|
For users who has no OTP tokens defined (yet), a missing token should
|
||||||
|
not be seen as a failure. This is needed to allow a basic password
|
||||||
|
change.
|
||||||
|
|
||||||
|
The logic around enforcement of OTP over LDAP bind is the following:
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
- when LDAP OTP control is requested by the LDAP client, OTP is
|
||||||
|
explicitly required
|
||||||
|
- when EnforceLDAPOTP is set in the IPA configuration, OTP is implicitly
|
||||||
|
required, regardless of the state of LDAP client
|
||||||
|
|
||||||
|
In either case, only users with 'user-auth-type: otp' are allowed to
|
||||||
|
authenticate.
|
||||||
|
|
||||||
|
If these users have no OTP token associated yet, they will be allowed to
|
||||||
|
authenticate with their password. This is to allow initial password
|
||||||
|
change and adding an OTP token.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Implement test that simulates lifecycle for new user who get to change
|
||||||
|
their password before adding an OTP token.
|
||||||
|
|
||||||
|
Related: https://pagure.io/freeipa/issue/5169
|
||||||
|
|
||||||
|
Signed-off-by: Alexander Bokovoy <abokovoy@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
|
||||||
|
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
---
|
||||||
|
.../ipa-slapi-plugins/ipa-pwd-extop/prepost.c | 39 ++++++++++----
|
||||||
|
ipatests/test_integration/test_otp.py | 52 ++++++++++++++++---
|
||||||
|
2 files changed, 76 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/ipa-slapi-plugins/ipa-pwd-extop/prepost.c b/daemons/ipa-slapi-plugins/ipa-pwd-extop/prepost.c
|
||||||
|
index cc170fc4b81f8ecad88f4ff4401b5651c43aaf55..c967e2cfffbd920280639f3188783ec150523b47 100644
|
||||||
|
--- a/daemons/ipa-slapi-plugins/ipa-pwd-extop/prepost.c
|
||||||
|
+++ b/daemons/ipa-slapi-plugins/ipa-pwd-extop/prepost.c
|
||||||
|
@@ -1212,13 +1212,20 @@ done:
|
||||||
|
* value at the end. This leaves only the password in creds for later
|
||||||
|
* validation.
|
||||||
|
*/
|
||||||
|
+typedef enum {
|
||||||
|
+ OTP_IS_NOT_REQUIRED = 0,
|
||||||
|
+ OTP_IS_REQUIRED_EXPLICITLY,
|
||||||
|
+ OTP_IS_REQUIRED_IMPLICITLY
|
||||||
|
+} otp_req_enum;
|
||||||
|
static bool ipapwd_pre_bind_otp(const char *bind_dn, Slapi_Entry *entry,
|
||||||
|
- struct berval *creds, bool otpreq)
|
||||||
|
+ struct berval *creds, otp_req_enum otpreq,
|
||||||
|
+ bool *notokens)
|
||||||
|
{
|
||||||
|
uint32_t auth_types;
|
||||||
|
|
||||||
|
/* Get the configured authentication types. */
|
||||||
|
auth_types = otp_config_auth_types(otp_config, entry);
|
||||||
|
+ *notokens = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMPORTANT SECTION!
|
||||||
|
@@ -1248,7 +1255,11 @@ static bool ipapwd_pre_bind_otp(const char *bind_dn, Slapi_Entry *entry,
|
||||||
|
/* With no tokens, succeed if tokens aren't required. */
|
||||||
|
if (tokens[0] == NULL) {
|
||||||
|
otp_token_free_array(tokens);
|
||||||
|
- return !otpreq;
|
||||||
|
+ *notokens = true;
|
||||||
|
+ if (otpreq != OTP_IS_NOT_REQUIRED)
|
||||||
|
+ /* DENY: OTP is required, either explicitly or implicitly */
|
||||||
|
+ return false;
|
||||||
|
+ return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otp_token_validate_berval(tokens, creds, NULL)) {
|
||||||
|
@@ -1259,7 +1270,8 @@ static bool ipapwd_pre_bind_otp(const char *bind_dn, Slapi_Entry *entry,
|
||||||
|
otp_token_free_array(tokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
- return (auth_types & OTP_CONFIG_AUTH_TYPE_PASSWORD) && !otpreq;
|
||||||
|
+ return (auth_types & OTP_CONFIG_AUTH_TYPE_PASSWORD) &&
|
||||||
|
+ (otpreq == OTP_IS_NOT_REQUIRED);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ipapwd_authenticate(const char *dn, Slapi_Entry *entry,
|
||||||
|
@@ -1452,6 +1464,7 @@ static int ipapwd_pre_bind(Slapi_PBlock *pb)
|
||||||
|
struct tm expire_tm;
|
||||||
|
int rc = LDAP_INVALID_CREDENTIALS;
|
||||||
|
char *errMesg = NULL;
|
||||||
|
+ bool notokens = false;
|
||||||
|
|
||||||
|
/* get BIND parameters */
|
||||||
|
ret |= slapi_pblock_get(pb, SLAPI_BIND_TARGET_SDN, &target_sdn);
|
||||||
|
@@ -1510,8 +1523,9 @@ static int ipapwd_pre_bind(Slapi_PBlock *pb)
|
||||||
|
|
||||||
|
/* Try to do OTP first. */
|
||||||
|
syncreq = otpctrl_present(pb, OTP_SYNC_REQUEST_OID);
|
||||||
|
- otpreq = otpctrl_present(pb, OTP_REQUIRED_OID);
|
||||||
|
- if (!syncreq && !otpreq) {
|
||||||
|
+ otpreq = otpctrl_present(pb, OTP_REQUIRED_OID) ?
|
||||||
|
+ OTP_IS_REQUIRED_EXPLICITLY : OTP_IS_NOT_REQUIRED;
|
||||||
|
+ if (!syncreq && (otpreq == OTP_IS_NOT_REQUIRED)) {
|
||||||
|
ret = ipapwd_gen_checks(pb, &errMesg, &krbcfg, IPAPWD_CHECK_ONLY_CONFIG);
|
||||||
|
if (ret != 0) {
|
||||||
|
LOG_FATAL("ipapwd_gen_checks failed!?\n");
|
||||||
|
@@ -1520,11 +1534,17 @@ static int ipapwd_pre_bind(Slapi_PBlock *pb)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (krbcfg->enforce_ldap_otp) {
|
||||||
|
- otpreq = true;
|
||||||
|
+ otpreq = OTP_IS_REQUIRED_IMPLICITLY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- if (!syncreq && !ipapwd_pre_bind_otp(dn, entry, credentials, otpreq))
|
||||||
|
- goto invalid_creds;
|
||||||
|
+ if (!syncreq && !ipapwd_pre_bind_otp(dn, entry,
|
||||||
|
+ credentials, otpreq, ¬okens)) {
|
||||||
|
+ /* We got here because ipapwd_pre_bind_otp() returned false,
|
||||||
|
+ * it means that either token verification failed or
|
||||||
|
+ * a rule for empty tokens failed current policy. */
|
||||||
|
+ if (!(notokens || (otpreq == OTP_IS_NOT_REQUIRED)))
|
||||||
|
+ goto invalid_creds;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Ensure that there is a password. */
|
||||||
|
if (credentials->bv_len == 0) {
|
||||||
|
@@ -1561,7 +1581,8 @@ static int ipapwd_pre_bind(Slapi_PBlock *pb)
|
||||||
|
* for access log to notice multi-factor authentication has happened
|
||||||
|
* https://www.port389.org/docs/389ds/design/mfa-operation-note-design.html
|
||||||
|
*/
|
||||||
|
- if (!syncreq && otpreq) {
|
||||||
|
+ if (!syncreq &&
|
||||||
|
+ ((otpreq != OTP_IS_NOT_REQUIRED) && !notokens)) {
|
||||||
|
slapi_pblock_set_flag_operation_notes(pb, SLAPI_OP_NOTE_MFA_AUTH);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
diff --git a/ipatests/test_integration/test_otp.py b/ipatests/test_integration/test_otp.py
|
||||||
|
index d2dfca4cbf8c60955e888b6f92bd88a2608bb265..350371bfe1e4c1cc6dcc89f6584f813fcb0d32a0 100644
|
||||||
|
--- a/ipatests/test_integration/test_otp.py
|
||||||
|
+++ b/ipatests/test_integration/test_otp.py
|
||||||
|
@@ -458,41 +458,81 @@ class TestOTPToken(IntegrationTest):
|
||||||
|
master = self.master
|
||||||
|
basedn = master.domain.basedn
|
||||||
|
USER1 = 'user-forced-otp'
|
||||||
|
+ TMP_PASSWORD = 'Secret1234509'
|
||||||
|
binddn = DN(f"uid={USER1},cn=users,cn=accounts,{basedn}")
|
||||||
|
|
||||||
|
- tasks.create_active_user(master, USER1, PASSWORD)
|
||||||
|
tasks.kinit_admin(master)
|
||||||
|
+ master.run_command(['ipa', 'pwpolicy-mod', '--minlife', '0'])
|
||||||
|
+ tasks.user_add(master, USER1, password=TMP_PASSWORD)
|
||||||
|
# Enforce use of OTP token for this user
|
||||||
|
master.run_command(['ipa', 'user-mod', USER1,
|
||||||
|
'--user-auth-type=otp'])
|
||||||
|
try:
|
||||||
|
+ # Change initial password through the IPA endpoint
|
||||||
|
+ url = f'https://{master.hostname}/ipa/session/change_password'
|
||||||
|
+ master.run_command(['curl', '-d', f'user={USER1}',
|
||||||
|
+ '-d', f'old_password={TMP_PASSWORD}',
|
||||||
|
+ '-d', f'new_password={PASSWORD}',
|
||||||
|
+ '--referer', f'https://{master.hostname}/ipa',
|
||||||
|
+ url])
|
||||||
|
conn = master.ldap_connect()
|
||||||
|
# First, attempt authenticating with a password but without LDAP
|
||||||
|
# control to enforce OTP presence and without server-side
|
||||||
|
# enforcement of the OTP presence check.
|
||||||
|
conn.simple_bind(binddn, f"{PASSWORD}")
|
||||||
|
- # Add an OTP token now
|
||||||
|
- otpuid, totp = add_otptoken(master, USER1, otptype="totp")
|
||||||
|
# Next, enforce Password+OTP for a user with OTP token
|
||||||
|
master.run_command(['ipa', 'config-mod', '--addattr',
|
||||||
|
'ipaconfigstring=EnforceLDAPOTP'])
|
||||||
|
+ # Try to bind without OTP because there is no OTP token yet,
|
||||||
|
+ # the operation should succeed because OTP enforcement is implicit
|
||||||
|
+ # and there is no token yet, so it is allowed.
|
||||||
|
+ conn.simple_bind(binddn, f"{PASSWORD}")
|
||||||
|
+ conn.unbind()
|
||||||
|
+ # Add an OTP token now
|
||||||
|
+ otpuid, totp = add_otptoken(master, USER1, otptype="totp")
|
||||||
|
# Next, authenticate with Password+OTP and with the LDAP control
|
||||||
|
# this operation should succeed
|
||||||
|
otpvalue = totp.generate(int(time.time())).decode("ascii")
|
||||||
|
+ conn = master.ldap_connect()
|
||||||
|
conn.simple_bind(binddn, f"{PASSWORD}{otpvalue}",
|
||||||
|
client_controls=[
|
||||||
|
BooleanControl(
|
||||||
|
controlType="2.16.840.1.113730.3.8.10.7",
|
||||||
|
booleanValue=True)])
|
||||||
|
- # Remove token
|
||||||
|
- del_otptoken(self.master, otpuid)
|
||||||
|
+ conn.unbind()
|
||||||
|
+ # Sleep to make sure we are going to use a different token value
|
||||||
|
+ time.sleep(45)
|
||||||
|
+ # Use OTP token again, without LDAP control, should succeed
|
||||||
|
+ # because OTP enforcement is implicit
|
||||||
|
+ otpvalue = totp.generate(int(time.time())).decode("ascii")
|
||||||
|
+ conn = master.ldap_connect()
|
||||||
|
+ conn.simple_bind(binddn, f"{PASSWORD}{otpvalue}")
|
||||||
|
+ conn.unbind()
|
||||||
|
# Now, try to authenticate without otp and without control
|
||||||
|
- # this operation should fail
|
||||||
|
+ # this operation should fail because we have OTP token associated
|
||||||
|
+ # with the user account
|
||||||
|
try:
|
||||||
|
+ conn = master.ldap_connect()
|
||||||
|
conn.simple_bind(binddn, f"{PASSWORD}")
|
||||||
|
+ conn.unbind()
|
||||||
|
except errors.ACIError:
|
||||||
|
pass
|
||||||
|
+ # Sleep to make sure we are going to use a different token value
|
||||||
|
+ time.sleep(45)
|
||||||
|
+ # Use OTP token again, without LDAP control, should succeed
|
||||||
|
+ # because OTP enforcement is implicit
|
||||||
|
+ otpvalue = totp.generate(int(time.time())).decode("ascii")
|
||||||
|
+ # Finally, change password again, now that otp is present
|
||||||
|
+ master.run_command(['curl', '-d', f'user={USER1}',
|
||||||
|
+ '-d', f'old_password={PASSWORD}',
|
||||||
|
+ '-d', f'new_password={TMP_PASSWORD}0',
|
||||||
|
+ '-d', f'otp={otpvalue}',
|
||||||
|
+ '--referer', f'https://{master.hostname}/ipa',
|
||||||
|
+ url])
|
||||||
|
+ # Remove token
|
||||||
|
+ del_otptoken(self.master, otpuid)
|
||||||
|
master.run_command(['ipa', 'config-mod', '--delattr',
|
||||||
|
'ipaconfigstring=EnforceLDAPOTP'])
|
||||||
|
finally:
|
||||||
|
+ master.run_command(['ipa', 'pwpolicy-mod', '--minlife', '1'])
|
||||||
|
master.run_command(['ipa', 'user-del', USER1])
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
74
0021-ipatests-Test-replica-installation-using-AD-admin.patch
Normal file
74
0021-ipatests-Test-replica-installation-using-AD-admin.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
From 8b703150a47bf509f37856bdc27cfa99e85e5e6b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anuja More <amore@redhat.com>
|
||||||
|
Date: Mon, 24 Jun 2024 13:48:24 +0530
|
||||||
|
Subject: [PATCH] ipatests: Test replica installation using AD admin.
|
||||||
|
|
||||||
|
Test to verify that replica connection check is not failing when
|
||||||
|
the AD administrator Administrator@AD.EXAMPLE.COM is
|
||||||
|
used for the deployment or promotion of a replica
|
||||||
|
|
||||||
|
Related: https://pagure.io/freeipa/issue/9542
|
||||||
|
|
||||||
|
Signed-off-by: Anuja More <amore@redhat.com>
|
||||||
|
Reviewed-By: Florence Blanc-Renaud <flo@redhat.com>
|
||||||
|
---
|
||||||
|
.../test_replica_promotion.py | 46 +++++++++++++++++++
|
||||||
|
1 files changed, 46 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ipatests/test_integration/test_replica_promotion.py b/ipatests/test_integration/test_replica_promotion.py
|
||||||
|
index 7ef44c571c8a4106577d27f4712f661be873dacc..c754cef88cb275987f5afdaad43f2ea07e3b7476 100644
|
||||||
|
--- a/ipatests/test_integration/test_replica_promotion.py
|
||||||
|
+++ b/ipatests/test_integration/test_replica_promotion.py
|
||||||
|
@@ -1318,3 +1318,49 @@ class TestHiddenReplicaKRA(IntegrationTest):
|
||||||
|
self.replicas[0].hostname, '--state=hidden'
|
||||||
|
])
|
||||||
|
assert result.returncode == 0
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class TestReplicaConn(IntegrationTest):
|
||||||
|
+ num_replicas = 1
|
||||||
|
+ num_ad_domains = 1
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def install(cls, mh):
|
||||||
|
+ cls.replica = cls.replicas[0]
|
||||||
|
+ cls.ad = cls.ads[0]
|
||||||
|
+ ad_domain = cls.ad.domain.name
|
||||||
|
+ cls.ad_admin = 'Administrator@{}'.format(ad_domain.upper())
|
||||||
|
+ cls.adview = 'Default Trust View'
|
||||||
|
+ tasks.install_master(cls.master, setup_adtrust=True)
|
||||||
|
+ tasks.configure_dns_for_trust(cls.master, cls.ad)
|
||||||
|
+ tasks.establish_trust_with_ad(cls.master, cls.ad.domain.name)
|
||||||
|
+ tasks.install_client(cls.master, cls.replica)
|
||||||
|
+
|
||||||
|
+ def test_replica_conncheck_ad_admin(self):
|
||||||
|
+ """
|
||||||
|
+ Test to verify that replica installation is not failing for
|
||||||
|
+ replica connection check when AD administrator
|
||||||
|
+ Administrator@AD.EXAMPLE.COM is used for the deployment
|
||||||
|
+ or promotion of a replica.
|
||||||
|
+
|
||||||
|
+ Related : https://pagure.io/freeipa/issue/9542
|
||||||
|
+ """
|
||||||
|
+ self.master.run_command(
|
||||||
|
+ ['ipa', 'idoverrideuser-add', self.adview, self.ad_admin]
|
||||||
|
+ )
|
||||||
|
+ self.master.run_command(
|
||||||
|
+ ["ipa", "group-add-member", "admins", "--idoverrideusers",
|
||||||
|
+ self.ad_admin]
|
||||||
|
+ )
|
||||||
|
+ tasks.clear_sssd_cache(self.master)
|
||||||
|
+
|
||||||
|
+ self.replica.run_command(
|
||||||
|
+ ["ipa-replica-install", "--setup-ca", "-U", "--ip-address",
|
||||||
|
+ self.replica.ip, "--realm", self.replica.domain.realm,
|
||||||
|
+ "--domain", self.replica.domain.name,
|
||||||
|
+ "--principal={0}".format(self.ad_admin),
|
||||||
|
+ "--password", self.master.config.ad_admin_password]
|
||||||
|
+ )
|
||||||
|
+ logs = self.replica.get_file_contents(paths.IPAREPLICA_CONNCHECK_LOG)
|
||||||
|
+ error = "not allowed to perform server connection check"
|
||||||
|
+ assert error.encode() not in logs
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
From 85a853ba93c1d23d5bad13a1ae2bee802dc90131 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Date: Mon, 8 Jul 2024 11:25:53 -0400
|
||||||
|
Subject: [PATCH] Issue 9621 - ipa-migrate - should not update mapped
|
||||||
|
attributes in managed entries
|
||||||
|
|
||||||
|
We should not migrate mmapped attributes (uidNumber, gidNumber) from
|
||||||
|
managed entries
|
||||||
|
|
||||||
|
We should also not migrate DNA ranges in staging mode
|
||||||
|
|
||||||
|
Fixes: https://pagure.io/freeipa/issue/9621
|
||||||
|
|
||||||
|
Signed-off-by: Mark Reynolds <mreynolds@redhat.com>
|
||||||
|
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
|
||||||
|
---
|
||||||
|
ipaserver/install/ipa_migrate.py | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/ipaserver/install/ipa_migrate.py b/ipaserver/install/ipa_migrate.py
|
||||||
|
index 0e19b98b5be532c513876e165561f0af176baa27..20f59f84db21022b66c0aa1ffd696d99aef85a44 100644
|
||||||
|
--- a/ipaserver/install/ipa_migrate.py
|
||||||
|
+++ b/ipaserver/install/ipa_migrate.py
|
||||||
|
@@ -1322,6 +1322,9 @@ class IPAMigrate():
|
||||||
|
self.args.reset_range
|
||||||
|
or self.mode == "stage-mode"
|
||||||
|
) and attr.lower() in DNA_REGEN_ATTRS:
|
||||||
|
+ # Skip dna attributes from managed entries
|
||||||
|
+ if 'mepManagedBy' in local_entry:
|
||||||
|
+ break
|
||||||
|
# Ok, set the magic regen value
|
||||||
|
local_entry[attr] = [DNA_REGEN_VAL]
|
||||||
|
self.log_debug("Resetting the DNA range for: "
|
||||||
|
@@ -1816,6 +1819,9 @@ class IPAMigrate():
|
||||||
|
# processing the entries
|
||||||
|
for entry in remote_dse:
|
||||||
|
for dse_item in DS_CONFIG.items():
|
||||||
|
+ if dse_item[0] == "dna" and self.mode == "stage-mode":
|
||||||
|
+ # Do not migrate DNA ranges in staging mode
|
||||||
|
+ continue
|
||||||
|
dse = dse_item[1]
|
||||||
|
for dn in dse['dn']:
|
||||||
|
if DN(dn) == DN(entry['dn']):
|
||||||
|
--
|
||||||
|
2.45.2
|
||||||
|
|
22
freeipa.spec
22
freeipa.spec
@ -224,7 +224,7 @@
|
|||||||
|
|
||||||
Name: %{package_name}
|
Name: %{package_name}
|
||||||
Version: %{IPA_VERSION}
|
Version: %{IPA_VERSION}
|
||||||
Release: 5%{?rc_version:.%rc_version}%{?dist}
|
Release: 6%{?rc_version:.%rc_version}%{?dist}
|
||||||
Summary: The Identity, Policy and Audit system
|
Summary: The Identity, Policy and Audit system
|
||||||
|
|
||||||
License: GPL-3.0-or-later
|
License: GPL-3.0-or-later
|
||||||
@ -260,6 +260,16 @@ Patch0009: 0009-PKINIT-certificate-fix-renewal-on-hidden-replica.patch
|
|||||||
Patch0010: 0010-ipatests-add-test-for-PKINIT-renewal-on-hidden-repli.patch
|
Patch0010: 0010-ipatests-add-test-for-PKINIT-renewal-on-hidden-repli.patch
|
||||||
Patch0011: 0011-ipatests-Tests-for-ipa-ipa-migration-tool.patch
|
Patch0011: 0011-ipatests-Tests-for-ipa-ipa-migration-tool.patch
|
||||||
Patch0012: 0012-ipa_sidgen-Allow-sidgen_task-to-continue-after-findi.patch
|
Patch0012: 0012-ipa_sidgen-Allow-sidgen_task-to-continue-after-findi.patch
|
||||||
|
Patch0013: 0013-ipatests-mark-test_ca_show_error_handling-as-xfail.patch
|
||||||
|
Patch0014: 0014-ipa-migrate-remove-V-option.patch
|
||||||
|
Patch0015: 0015-Fix-syntax-error-in-the-selinux-luna-postun-script.patch
|
||||||
|
Patch0016: 0016-Re-organize-HSM-validation-to-be-more-consistent-les.patch
|
||||||
|
Patch0017: 0017-ipatests-tests-related-to-token-password-file.patch
|
||||||
|
Patch0018: 0018-Include-token-password-options-in-ipa-kra-install-ma.patch
|
||||||
|
Patch0019: 0019-ipa-migrate-starttls-does-not-work.patch
|
||||||
|
Patch0020: 0020-ipa-pwd-extop-differentiate-OTP-requirements-in-LDAP.patch
|
||||||
|
Patch0021: 0021-ipatests-Test-replica-installation-using-AD-admin.patch
|
||||||
|
Patch0022: 0022-Issue-9621-ipa-migrate-should-not-update-mapped-attr.patch
|
||||||
Patch1001: 1001-Change-branding-to-IPA-and-Identity-Management.patch
|
Patch1001: 1001-Change-branding-to-IPA-and-Identity-Management.patch
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
@ -1359,6 +1369,7 @@ fi
|
|||||||
%postun selinux-luna
|
%postun selinux-luna
|
||||||
if [ $1 -eq 0 ]; then
|
if [ $1 -eq 0 ]; then
|
||||||
%selinux_modules_uninstall -s %{selinuxtype} %{modulename}-luna
|
%selinux_modules_uninstall -s %{selinuxtype} %{modulename}-luna
|
||||||
|
fi
|
||||||
|
|
||||||
%posttrans selinux
|
%posttrans selinux
|
||||||
%selinux_relabel_post -s %{selinuxtype}
|
%selinux_relabel_post -s %{selinuxtype}
|
||||||
@ -1872,6 +1883,15 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jul 18 2024 Florence Blanc-Renaud <flo@redhat.com> - 4.12.0-6
|
||||||
|
- Resolves: RHEL-47292 Include latest fixes in python3-ipatests packages
|
||||||
|
- Resolves: RHEL-47146 Syntax error uninstalling the selinux-luna subpackage
|
||||||
|
- Resolves: RHEL-46009 ipa-migrate with -Z option fails with ValueError: option error
|
||||||
|
- Resolves: RHEL-46003 ipa-migrate -V options fails to display version
|
||||||
|
- Resolves: RHEL-45463 ipa-migrate stage-mode is failing with error: Modifying a mapped attribute in a managed entry is not allowed
|
||||||
|
- Resolves: RHEL-40890 ipa-server-install: token_password_file read in kra.install_check after calling hsm_validator in ca.install_check
|
||||||
|
- Resolves: RHEL-40661 Adjust "ipa config-mod --addattr ipaconfigstring=EnforceLDAPOTP" to allow for non OTP users in some cases
|
||||||
|
|
||||||
* Mon Jul 08 2024 Florence Blanc-Renaud <flo@redhat.com> - 4.12.0-5
|
* Mon Jul 08 2024 Florence Blanc-Renaud <flo@redhat.com> - 4.12.0-5
|
||||||
- Resolves: RHEL-37285 IPA Web UI not showing replication agreement for non-admin users
|
- Resolves: RHEL-37285 IPA Web UI not showing replication agreement for non-admin users
|
||||||
- Resolves: RHEL-42703 PSKC.xml issues with ipa_otptoken_import.py
|
- Resolves: RHEL-42703 PSKC.xml issues with ipa_otptoken_import.py
|
||||||
|
Loading…
Reference in New Issue
Block a user