Files
freeipa/ipatests/test_integration/test_mkey_upgrade.py
T
Julien Rische fb36633e69 Add test for master key upgrade
Since commit 4ed7da378940198cf4415f86d4eb013de6ac6455 in MIT krb5,
kdb5_util sets the required bits on the modification mask of updated
principal entries to enable ipa-kdb to switch the active master key.

This commit creates a "test_fedora_legacy" ipaplatform where the AES
HMAC-SHA2 encryption types are not enabled. "test_mkey_upgrade" uses
this platform to initialize a domain with an aes256-cts-hmac-sha1-96
master key, and test its upgrade to aes256-cts-hmac-sha384-192.

Some parts of the test infrastructure had to be made aware of this new
platform (e.g. firewall integration).

Reviewed-By: Rob Crittenden <rcritten@redhat.com>
2025-06-20 17:24:23 +02:00

136 lines
5.6 KiB
Python

#
# Copyright (C) 2015 FreeIPA Contributors see COPYING for license
#
import re
import textwrap
from ipatests.pytest_ipa.integration import tasks
from ipatests.test_integration.base import IntegrationTest
class TestMkeyUpgrade(IntegrationTest):
num_replicas = 1
topology = 'line'
@classmethod
def install(cls, mh):
cls.master.put_file_contents(
'/etc/profile.d/ipaplatform.sh',
'export IPAPLATFORM_OVERRIDE=test_fedora_legacy')
cls.master.run_command(['mkdir', '/etc/systemd/system/ipa.service.d'])
cls.master.put_file_contents(
'/etc/systemd/system/ipa.service.d/platform.conf',
'[Service]\n'
'Environment="IPAPLATFORM_OVERRIDE=test_fedora_legacy"')
cls.master.run_command(['systemctl', 'daemon-reload'])
tasks.install_master(cls.master, setup_dns=False)
tasks.install_replica(cls.master, cls.replicas[0], setup_dns=False)
def test_old_active_mkey(self):
p = re.compile('^KVNO: 1, Enctype: aes256-cts-hmac-sha1-96, .+ \\*$',
flags=re.MULTILINE)
result = self.master.run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
result = self.replicas[0].run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
def test_enable_new_entypes(self):
base_dn = "dc=%s" % (",dc=".join(self.master.domain.name.split(".")))
realm = self.master.domain.name.upper()
entry_ldif = textwrap.dedent("""
dn: cn={realm},cn=kerberos,{base_dn}
changetype: modify
replace: krbSupportedEncSaltTypes
krbSupportedEncSaltTypes: aes128-sha2:normal
krbSupportedEncSaltTypes: aes128-sha2:special
krbSupportedEncSaltTypes: aes256-sha2:normal
krbSupportedEncSaltTypes: aes256-sha2:special
krbSupportedEncSaltTypes: aes256-cts:normal
krbSupportedEncSaltTypes: aes256-cts:special
krbSupportedEncSaltTypes: aes128-cts:normal
krbSupportedEncSaltTypes: aes128-cts:special
krbSupportedEncSaltTypes: camellia128-cts-cmac:normal
krbSupportedEncSaltTypes: camellia128-cts-cmac:special
krbSupportedEncSaltTypes: camellia256-cts-cmac:normal
krbSupportedEncSaltTypes: camellia256-cts-cmac:special
-
replace: krbDefaultEncSaltTypes
krbDefaultEncSaltTypes: aes256-sha2:special
krbDefaultEncSaltTypes: aes128-sha2:special
krbDefaultEncSaltTypes: aes256-cts:special
krbDefaultEncSaltTypes: aes128-cts:special""").format(
base_dn=base_dn, realm=realm)
tasks.ldapmodify_dm(self.master, entry_ldif)
def test_add_new_mkey(self):
self.master.run_command('kdb5_util add_mkey -e aes256-sha2 -s',
stdin_text='Secret123\nSecret123')
def test_new_inactive_mkey(self):
p = re.compile('^KVNO: 2, Enctype: aes256-cts-hmac-sha384-192, ',
flags=re.MULTILINE)
result = self.master.run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
result = self.replicas[0].run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
def test_switch_mkey(self):
self.master.run_command(['kdb5_util', 'use_mkey', '2'])
def test_new_active_mkey(self):
p = re.compile('^KVNO: 2, Enctype: aes256-cts-hmac-sha384-192, .+ \\*$',
flags=re.MULTILINE)
result = self.master.run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
result = self.replicas[0].run_command(['kdb5_util', 'list_mkeys'])
assert p.search(result.stdout_text)
def test_used_old_mkey(self):
p = re.compile('^MKey: vno 1$', flags=re.MULTILINE)
result = self.master.run_command(['kadmin.local', 'getprinc',
f'ldap/{self.master.hostname}'])
assert p.search(result.stdout_text)
result = self.replicas[0].run_command(['kadmin.local', 'getprinc',
f'ldap/{self.master.hostname}'])
assert p.search(result.stdout_text)
def test_reencrypt_with_new_mkey(self):
self.master.run_command(['kdb5_util', '-x', 'unlockiter',
'update_princ_encryption', '-vf'])
def test_used_new_mkey(self):
p = re.compile('^MKey: vno 2$', flags=re.MULTILINE)
result = self.master.run_command(['kadmin.local', 'getprinc',
f'ldap/{self.master.hostname}'])
assert p.search(result.stdout_text)
result = self.replicas[0].run_command(['kadmin.local', 'getprinc',
f'ldap/{self.master.hostname}'])
assert p.search(result.stdout_text)
def test_purge_old_mkey(self):
self.master.run_command(['kdb5_util', 'purge_mkeys', '-vf'])
def test_only_new_mkey(self):
p = re.compile('^KVNO: 1,', flags=re.MULTILINE)
result = self.master.run_command(['kdb5_util', 'list_mkeys'])
assert not p.search(result.stdout_text)
result = self.replicas[0].run_command(['kdb5_util', 'list_mkeys'])
assert not p.search(result.stdout_text)
@classmethod
def uninstall(cls, mh):
cls.master.run_command([
'rm', '/etc/profile.d/ipaplatform.sh',
'/etc/systemd/system/ipa.service.d/platform.conf'])
cls.master.run_command(['rmdir', '/etc/systemd/system/ipa.service.d'])
super().uninstall(mh)