The branch, master has been updated via 4926da69771 s4:kdc: split access check preparation from the actual check in samba_kdc_update_pac() via 4f67f1a6860 s4:kdc: let samba_kdc_get_claims_blob() check msDS-EgressClaimsTransformationPolicy via 2e00821766e s4:kdc: let samba_kdc_get_claims_data() check msDS-IngressClaimsTransformationPolicy via df30d95694e s4:kdc: also fetch msDS-[In|E]gressClaimsTransformationPolicy via 0da3bb7feb9 s4:dsdb/common: add dsdb_trust_get_claims_tf_policy() via a99ce6c560e s4:kdc: let samba_kdc_update_pac() always call samba_kdc_get_upn_info_blob() via a1a0609da25 s4:kdc: let samba_kdc_update_pac() always call samba_kdc_get_logon_info_blob() via c8b08ee5085 s4:kdc: also pass override_resource_groups to samba_kdc_get_logon_info_blob() via 6cd0297ffeb s4:kdc: move device_{info,claims}_blob generation in samba_kdc_update_pac() via 914533d38fc s4:kdc: regenerate the client claims blob in samba_kdc_update_pac() if needed via e5591fd0b90 s4:kdc: let samba_kdc_get_claims_data() indicate if regeneration is needed via ff5548e4e1b s4:kdc: rewrite the logic in samba_kdc_get_claims_data() via 93c69dfeb50 s4:kdc: let samba_kdc_get_claims_data_from_pac() return if a buffer was found via 3b6ffb47b42 s4:kdc: let samba_kdc_get_pac() use samba_kdc_get_claims_blob() via 72459f690e2 s4:kdc: let samba_kdc_get_claims_blob() take struct claims_data as input. via 5ada7c17b71 s4:kdc: let samba_kdc_update_pac() always fetch the user claims via 4f5be1cd78d s4:kdc: let samba_kdc_update_pac() use samba_kdc_entry_pac_valid_principal() to check delegated_proxy via 51d7db7e9f0 s4:kdc: remove useless samba_kdc_get_user_info_dc() from samba_kdc_get_device_info_blob() via 94e77288dc5 s4:kdc: move user_info_dc_shallow_copy variable in samba_kdc_update_pac() via 593b9c2e9c5 s4:kdc: move samba_kdc_get_user_info_dc() for the device in samba_kdc_update_pac() via 9fda646adbd s4:kdc: move samba_kdc_get_user_info_dc() up in samba_kdc_update_pac() via 8e0b132c080 s4:kdc: introduce need_device helper variable in samba_kdc_update_pac() via e55caa68a55 s4:kdc: make samba_kdc_get_{user_info_dc,claims_data} static via 55c47104c14 s4:kdc: pass samba_kdc_entry_pac to samba_kdc_check_s4u2proxy_rbcd() via 58df2bd733a s4:kdc: move samba_kdc_check_s4u2proxy_rbcd() from db-glue to pac-glue via 4f5946ca0ce s4:kdc: make a lot of pac-glue.c functions static via c004c32993c s4:kdc: let mit_samba_get_pac() use samba_kdc_get_pac() via b5628d0f4ac s4:kdc: split out samba_kdc_get_pac() from samba_wdc_get_pac() via ddeb85fd728 s4:kdc: don't return ENOENT from samba_kdc_get_claims_data[_from_pac] via 6e9d54a9eba s4:kdc: use better variable names in samba_wdc_check_client_access() via 4bc5b6f90f9 s4:auth: avoid talloc_reference in claims_data_encoded_claims_set() from 2cae470f236 winbindd: find_auth_domain() and find_lookup_domain_from_name() should handle namespaces
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 4926da697714c9cdb3ffcc471d6860635dfbfea4 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 21:42:53 2025 +0100 s4:kdc: split access check preparation from the actual check in samba_kdc_update_pac() This allows us to add more access checks later... Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Ralph Böhme <s...@samba.org> Autobuild-Date(master): Sat Feb 22 23:04:04 UTC 2025 on atb-devel-224 commit 4f67f1a6860d31bdccfd689046d9bda51dc76703 Author: Stefan Metzmacher <me...@samba.org> Date: Sat Feb 15 00:28:18 2025 +0100 s4:kdc: let samba_kdc_get_claims_blob() check msDS-EgressClaimsTransformationPolicy For now we only allow the implicit (default) or explicit allow all policy, as well as a deny all policy. For all others we return an error in order to indicate the non-supported configuration. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 2e00821766e27622fc7be99fa14ce71d9161500a Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 20:19:48 2025 +0100 s4:kdc: let samba_kdc_get_claims_data() check msDS-IngressClaimsTransformationPolicy For now we only allow the implicit (default) or explicit deny all policy. For all others we return an error in order to indicate the non-supported configuration. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit df30d95694e7556b6ec2cc567af5901931ebc3e2 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 23:52:57 2025 +0100 s4:kdc: also fetch msDS-[In|E]gressClaimsTransformationPolicy Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 0da3bb7feb977e3cf0cd9a83de74eb041e997e05 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 00:31:36 2025 +0100 s4:dsdb/common: add dsdb_trust_get_claims_tf_policy() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit a99ce6c560e24c3c6a87bb0d75a573edfe3ee065 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 17:28:42 2025 +0100 s4:kdc: let samba_kdc_update_pac() always call samba_kdc_get_upn_info_blob() There's no reason not to regenerate it, it makes the code more consistent. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit a1a0609da252bb483776ed060f536b9f8950c799 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 17:25:51 2025 +0100 s4:kdc: let samba_kdc_update_pac() always call samba_kdc_get_logon_info_blob() The logic in samba_kdc_get_logon_info_blob() also does talloc_zero(tmp_ctx, DATA_BLOB) followed by calling samba_get_logon_info_pac_blob(). So we can always just call samba_kdc_get_logon_info_blob(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit c8b08ee508565b930ca751c207792657869a992d Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 14:34:14 2025 +0100 s4:kdc: also pass override_resource_groups to samba_kdc_get_logon_info_blob() This will make the following changes easier... Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 6cd0297ffebb8ea19bc6de10cf5de57661876606 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 14:12:27 2025 +0100 s4:kdc: move device_{info,claims}_blob generation in samba_kdc_update_pac() We should generate the device blobs after generating the client blobs and also after all access checking. We also use the samba_kdc_get_claims_blob() helper, which is currently only a wrapper around claims_data_encoded_claims_set(), but that will change in future... Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 914533d38fcc3f923a9ccc98a5092854f782220a Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 14:05:51 2025 +0100 s4:kdc: regenerate the client claims blob in samba_kdc_update_pac() if needed Note that samba_kdc_get_claims_data() already handles the samba_kdc_entry_pac_issued_by_trust() case to clear the claims received from a trusted domain. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit e5591fd0b90ec5e338b62306f4fea78a7e1734bd Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 16:33:59 2025 +0100 s4:kdc: let samba_kdc_get_claims_data() indicate if regeneration is needed Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit ff5548e4e1bfc3c2936f8e2742822d32078af9f4 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 16:22:43 2025 +0100 s4:kdc: rewrite the logic in samba_kdc_get_claims_data() We should also go via samba_kdc_get_claims_data_from_pac() if the pack was issued by a trust. But for now we still clear the claims, which is the default if msDS-IngressClaimsTransformationPolicy is missing on the trustedDomain object. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 93c69dfeb5099b69f0483463b4a5e3fdd3cfc790 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 16:13:44 2025 +0100 s4:kdc: let samba_kdc_get_claims_data_from_pac() return if a buffer was found This will simplify further changes. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 3b6ffb47b42163f1274b7752b57ec353931ed16e Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 17:38:19 2025 +0100 s4:kdc: let samba_kdc_get_pac() use samba_kdc_get_claims_blob() We should avoid calling claims_data_encoded_claims_set() directly, we'll have to do more than claims_data_encoded_claims_set() in future, so make sure we always go via the common samba_kdc_get_claims_blob() helper. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 72459f690e283542b0e2acf7b62e48f2998d5b9d Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:55:22 2025 +0100 s4:kdc: let samba_kdc_get_claims_blob() take struct claims_data as input. It means samba_kdc_update_pac() does not call samba_kdc_get_claims_data_from_db() twice, as it's already called by samba_kdc_get_claims_data(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 5ada7c17b71fb60044e74d8773714f10c8a74c23 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:41:50 2025 +0100 s4:kdc: let samba_kdc_update_pac() always fetch the user claims Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 4f5be1cd78d97f5741360b9ce31f5d787a9ebb60 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:35:51 2025 +0100 s4:kdc: let samba_kdc_update_pac() use samba_kdc_entry_pac_valid_principal() to check delegated_proxy This might not be needed, but it's more consistent. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 51d7db7e9f06eea6711aba3091b87c7999049ec0 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:28:56 2025 +0100 s4:kdc: remove useless samba_kdc_get_user_info_dc() from samba_kdc_get_device_info_blob() There's no need to call it again if the caller already did. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 94e77288dc5ab83e38a71e7c26a3555724db4c6e Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:23:55 2025 +0100 s4:kdc: move user_info_dc_shallow_copy variable in samba_kdc_update_pac() This is only needed as tmp variable in the if block... Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 593b9c2e9c589b7853609eaddf57afdd01580e9d Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 13:21:47 2025 +0100 s4:kdc: move samba_kdc_get_user_info_dc() for the device in samba_kdc_update_pac() We should can already call this in the 'need_device' branch, then it can be reused later. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 9fda646adbd6e67374dd98e12842c17c4a7fbd8b Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 18 17:00:01 2025 +0100 s4:kdc: move samba_kdc_get_user_info_dc() up in samba_kdc_update_pac() This will make further changes easier. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 8e0b132c080e91f9a8b7b8a5160ab49acac2d50e Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 12:34:12 2025 +0100 s4:kdc: introduce need_device helper variable in samba_kdc_update_pac() Also use samba_kdc_entry_pac_valid_principal() in order to catch all conditions for a valid device. For principals issued by trusted domains there's no device.entry pointer! Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit e55caa68a5507b5ab6130bfafef4c0bd521144a7 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 16:00:23 2025 +0100 s4:kdc: make samba_kdc_get_{user_info_dc,claims_data} static Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 55c47104c1430a6feb1719949c0fad6a4a767b11 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 15:16:19 2025 +0100 s4:kdc: pass samba_kdc_entry_pac to samba_kdc_check_s4u2proxy_rbcd() This simplifies and unifies the callers. For the MIT kdc we avoid using via kerberos_pac_to_user_info_dc() directly. Now both go via samba_kdc_get_user_info_dc() and MIT also handles the samba_kdc_get_claims_data() path. For the MIT kdc it means kerberos_pac_to_user_info_dc() is now called via samba_kdc_get_user_info_dc() -> samba_kdc_get_user_info_from_pac() and it is followed by authsam_update_user_info_dc() consistently. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 58df2bd733a351a91ef840d100faec83a0068c25 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 15:04:08 2025 +0100 s4:kdc: move samba_kdc_check_s4u2proxy_rbcd() from db-glue to pac-glue This will allow us to make more functions static in the next steps. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 4f5946ca0cec32268be4613cd1fd587075f9091d Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 17:00:36 2025 +0100 s4:kdc: make a lot of pac-glue.c functions static This makes the code base less confusing (at least for me). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit c004c32993c452f6e97dc7b1b0093f5e98eaef01 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 16:32:33 2025 +0100 s4:kdc: let mit_samba_get_pac() use samba_kdc_get_pac() It means we port commit b42fbc78395870c3caa33aa1c9636a59fde9e867 also to the MIT kdc and enforce authentication policy service restrictions when getting a PAC We should have this logic only once in order to avoid getting out of sync between heimdal and MIT regarding the core logic. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit b5628d0f4ac245d91dd29f05f26433e3db7087a0 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 15:15:39 2025 +0100 s4:kdc: split out samba_kdc_get_pac() from samba_wdc_get_pac() samba_kdc_get_pac() will be re-used by mit_samba_get_pac() in the next step. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit ddeb85fd7285224a5b39ae2cfa40a750191ad84e Author: Stefan Metzmacher <me...@samba.org> Date: Thu Feb 20 14:23:05 2025 +0100 s4:kdc: don't return ENOENT from samba_kdc_get_claims_data[_from_pac] This will matter in the next commits. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 6e9d54a9eba9ca6d5fe830f8291111ae7925c416 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 11:48:55 2025 +0100 s4:kdc: use better variable names in samba_wdc_check_client_access() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> commit 4bc5b6f90f9bf4bba2a9d2d39c31ae9a0d34bf52 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Feb 19 15:25:50 2025 +0100 s4:auth: avoid talloc_reference in claims_data_encoded_claims_set() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> ----------------------------------------------------------------------- Summary of changes: selftest/knownfail_mit_kdc.d/authn-policy | 4 - source4/auth/session.c | 14 +- source4/dsdb/common/util_trusts.c | 110 +++ source4/dsdb/samdb/samdb.h | 1 + source4/kdc/db-glue.c | 177 +---- source4/kdc/db-glue.h | 10 - source4/kdc/hdb-samba4.c | 50 +- source4/kdc/mit_samba.c | 223 +----- source4/kdc/pac-glue.c | 1166 ++++++++++++++++++++++++----- source4/kdc/pac-glue.h | 106 +-- source4/kdc/wdc-samba4.c | 320 ++------ 11 files changed, 1230 insertions(+), 951 deletions(-) Changeset truncated at 500 lines: diff --git a/selftest/knownfail_mit_kdc.d/authn-policy b/selftest/knownfail_mit_kdc.d/authn-policy index 8ebc2e04dea..09988a79992 100644 --- a/selftest/knownfail_mit_kdc.d/authn-policy +++ b/selftest/knownfail_mit_kdc.d/authn-policy @@ -40,8 +40,6 @@ ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_allow_to_self_with_self.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_allow_user2user.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny.ad_dc -^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny_as_req.ad_dc -^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny_as_req_no_fast.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny_from_rodc.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny_to_self.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_computer_deny_to_self_with_self.ad_dc @@ -55,7 +53,6 @@ ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_allow.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_allow_from_rodc.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_deny.ad_dc -^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_deny_as_req.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_deny_from_rodc.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_service_derived_class_allow.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_allow.ad_dc @@ -75,7 +72,6 @@ ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_allow_s4u2self.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_allow_s4u2self_inner_fast.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_deny.ad_dc -^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_deny_as_req.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_deny_constrained_delegation.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_deny_constrained_delegation_to_self.ad_dc ^samba.tests.krb5.authn_policy_tests.samba.tests.krb5.authn_policy_tests.AuthnPolicyTests.test_authn_policy_allowed_to_user_deny_from_rodc.ad_dc diff --git a/source4/auth/session.c b/source4/auth/session.c index e169a52efda..806f6eab03f 100644 --- a/source4/auth/session.c +++ b/source4/auth/session.c @@ -707,9 +707,6 @@ NTSTATUS claims_data_encoded_claims_set(TALLOC_CTX *mem_ctx, struct claims_data *claims_data, DATA_BLOB *encoded_claims_set_out) { - uint8_t *data = NULL; - size_t len; - if (encoded_claims_set_out == NULL) { return NT_STATUS_INVALID_PARAMETER; } @@ -738,15 +735,16 @@ NTSTATUS claims_data_encoded_claims_set(TALLOC_CTX *mem_ctx, claims_data->flags |= CLAIMS_DATA_ENCODED_CLAIMS_PRESENT; } - if (claims_data->encoded_claims_set.data != NULL) { - data = talloc_reference(mem_ctx, claims_data->encoded_claims_set.data); - if (data == NULL) { + if (claims_data->encoded_claims_set.length != 0) { + *encoded_claims_set_out = data_blob_dup_talloc(mem_ctx, + claims_data->encoded_claims_set); + if (encoded_claims_set_out->length != + claims_data->encoded_claims_set.length) + { return NT_STATUS_NO_MEMORY; } } - len = claims_data->encoded_claims_set.length; - *encoded_claims_set_out = data_blob_const(data, len); return NT_STATUS_OK; } diff --git a/source4/dsdb/common/util_trusts.c b/source4/dsdb/common/util_trusts.c index a184ba6b934..34ad72f85f1 100644 --- a/source4/dsdb/common/util_trusts.c +++ b/source4/dsdb/common/util_trusts.c @@ -36,6 +36,7 @@ #include "../lib/util/dlinklist.h" #include "lib/crypto/md4.h" #include "libcli/ldap/ldap_ndr.h" +#include "libcli/security/claims_transformation.h" #undef strcasecmp @@ -3246,3 +3247,112 @@ const struct lsa_TrustDomainInfoInfoEx *dsdb_trust_domain_by_name( return NULL; } + +NTSTATUS dsdb_trust_get_claims_tf_policy(struct ldb_context *samldb, + const struct ldb_message *tdo_msg, + const char *tdo_attr, + TALLOC_CTX *mem_ctx, + struct claims_tf_rule_set **_rule_set) +{ + TALLOC_CTX *frame = talloc_stackframe(); + const struct ldb_val *tdo_link_val = NULL; + struct ldb_dn *config_dn = NULL; + struct ldb_dn *claims_tf_dn = NULL; + struct ldb_dn *policy_dn = NULL; + struct ldb_message *policy_msg = NULL; + static const char * const policy_attrs[] = { + "msDS-TransformationRules", + NULL + }; + const struct ldb_val *xml_blob = NULL; + DATA_BLOB rules_blob = { .length = 0, }; + struct claims_tf_rule_set *rule_set = NULL; + int cmp; + bool ok; + int ret; + + *_rule_set = NULL; + + tdo_link_val = ldb_msg_find_ldb_val(tdo_msg, tdo_attr); + if (tdo_link_val == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_DS_NO_ATTRIBUTE_OR_VALUE; + } + + config_dn = ldb_get_config_basedn(samldb); + if (config_dn == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_DS_INIT_FAILURE; + } + + claims_tf_dn = ldb_dn_copy(frame, config_dn); + if (claims_tf_dn == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_NO_MEMORY; + } + + ok = ldb_dn_add_child_fmt(claims_tf_dn, + "%s,%s,%s", + "CN=Claims Transformation Policies", + "CN=Claims Configuration", + "CN=Services"); + if (!ok) { + TALLOC_FREE(frame); + return NT_STATUS_NO_MEMORY; + } + + policy_dn = ldb_msg_find_attr_as_dn(samldb, frame, tdo_msg, tdo_attr); + if (policy_dn == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_NO_MEMORY; + } + + /* + * The policy dn needs to be a child of + * the CN=Claims Transformation Policies container + */ + cmp = ldb_dn_compare_base(claims_tf_dn, policy_dn); + if (cmp != 0) { + TALLOC_FREE(frame); + return NT_STATUS_DS_OBJ_CLASS_VIOLATION; + } + + ret = dsdb_search_one(samldb, + frame, + &policy_msg, + policy_dn, + LDB_SCOPE_BASE, + policy_attrs, + DSDB_SEARCH_ONE_ONLY, + "(objectClass=msDS-ClaimsTransformationPolicyType)"); + if (ret != LDB_SUCCESS) { + TALLOC_FREE(frame); + return NT_STATUS_POLICY_OBJECT_NOT_FOUND; + } + + xml_blob = ldb_msg_find_ldb_val(policy_msg, "msDS-TransformationRules"); + if (xml_blob == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_DS_NO_ATTRIBUTE_OR_VALUE; + } + + ok = claims_tf_policy_unwrap_xml(xml_blob, + &rules_blob); + if (!ok) { + TALLOC_FREE(frame); + return NT_STATUS_DS_INVALID_ATTRIBUTE_SYNTAX; + } + + ok = claims_tf_rule_set_parse_blob(&rules_blob, + frame, + &rule_set, + NULL); /* _error_string */ + if (!ok) { + TALLOC_FREE(frame); + return NT_STATUS_DS_INVALID_ATTRIBUTE_SYNTAX; + } + + *_rule_set = talloc_move(mem_ctx, &rule_set); + TALLOC_FREE(frame); + return NT_STATUS_OK; +} diff --git a/source4/dsdb/samdb/samdb.h b/source4/dsdb/samdb/samdb.h index ec07cae6ad3..dac80adc6b5 100644 --- a/source4/dsdb/samdb/samdb.h +++ b/source4/dsdb/samdb/samdb.h @@ -35,6 +35,7 @@ struct gmsa_update_pwd_part; struct gmsa_update; struct gmsa_return_pwd; struct KeyEnvelope; +struct claims_tf_rule_set; enum dsdb_password_checked { DSDB_PASSWORD_NOT_CHECKED = 0, /* unused */ diff --git a/source4/kdc/db-glue.c b/source4/kdc/db-glue.c index 71bb83e7398..1f8574e9ef5 100644 --- a/source4/kdc/db-glue.c +++ b/source4/kdc/db-glue.c @@ -68,7 +68,7 @@ enum trust_direction { OUTBOUND = LSA_TRUST_DIRECTION_OUTBOUND }; -static const char *trust_attrs[] = { +static const char * const trust_attrs[] = { "securityIdentifier", "flatName", "trustPartner", @@ -80,6 +80,8 @@ static const char *trust_attrs[] = { "trustAuthOutgoing", "whenCreated", "msDS-SupportedEncryptionTypes", + "msDS-IngressClaimsTransformationPolicy", + "msDS-EgressClaimsTransformationPolicy", NULL }; @@ -4072,179 +4074,6 @@ bad_option: return KRB5KDC_ERR_BADOPTION; } -/* - * This method is called for S4U2Proxy requests and implements the - * resource-based constrained delegation variant, which can support - * cross-realm delegation. - */ -krb5_error_code samba_kdc_check_s4u2proxy_rbcd( - krb5_context context, - struct samba_kdc_db_context *kdc_db_ctx, - krb5_const_principal client_principal, - krb5_const_principal server_principal, - const struct auth_user_info_dc *user_info_dc, - const struct auth_user_info_dc *device_info_dc, - const struct auth_claims auth_claims, - struct samba_kdc_entry *proxy_skdc_entry) -{ - krb5_error_code code; - enum ndr_err_code ndr_err; - char *client_name = NULL; - char *server_name = NULL; - const char *proxy_dn = NULL; - const DATA_BLOB *data = NULL; - struct security_descriptor *rbcd_security_descriptor = NULL; - struct security_token *security_token = NULL; - uint32_t session_info_flags = - AUTH_SESSION_INFO_DEFAULT_GROUPS | - AUTH_SESSION_INFO_DEVICE_DEFAULT_GROUPS | - AUTH_SESSION_INFO_SIMPLE_PRIVILEGES | - AUTH_SESSION_INFO_FORCE_COMPOUNDED_AUTHENTICATION; - /* - * Testing shows that although Windows grants SEC_ADS_GENERIC_ALL access - * in security descriptors it creates for RBCD, its KDC only requires - * SEC_ADS_CONTROL_ACCESS for the access check to succeed. - */ - uint32_t access_desired = SEC_ADS_CONTROL_ACCESS; - uint32_t access_granted = 0; - NTSTATUS nt_status; - TALLOC_CTX *mem_ctx = NULL; - - mem_ctx = talloc_named(kdc_db_ctx, - 0, - "samba_kdc_check_s4u2proxy_rbcd"); - if (mem_ctx == NULL) { - errno = ENOMEM; - code = errno; - - return code; - } - - proxy_dn = ldb_dn_get_linearized(proxy_skdc_entry->msg->dn); - if (proxy_dn == NULL) { - DBG_ERR("ldb_dn_get_linearized failed for proxy_dn!\n"); - if (errno == 0) { - errno = ENOMEM; - } - code = errno; - - goto out; - } - - rbcd_security_descriptor = talloc_zero(mem_ctx, - struct security_descriptor); - if (rbcd_security_descriptor == NULL) { - errno = ENOMEM; - code = errno; - - goto out; - } - - code = krb5_unparse_name_flags(context, - client_principal, - KRB5_PRINCIPAL_UNPARSE_DISPLAY, - &client_name); - if (code != 0) { - DBG_ERR("Unable to parse client_principal!\n"); - goto out; - } - - code = krb5_unparse_name_flags(context, - server_principal, - KRB5_PRINCIPAL_UNPARSE_DISPLAY, - &server_name); - if (code != 0) { - DBG_ERR("Unable to parse server_principal!\n"); - goto out; - } - - DBG_INFO("Check delegation from client[%s] to server[%s] via " - "proxy[%s]\n", - client_name, - server_name, - proxy_dn); - - if (!(user_info_dc->info->user_flags & NETLOGON_GUEST)) { - session_info_flags |= AUTH_SESSION_INFO_AUTHENTICATED; - } - - if (device_info_dc != NULL && !(device_info_dc->info->user_flags & NETLOGON_GUEST)) { - session_info_flags |= AUTH_SESSION_INFO_DEVICE_AUTHENTICATED; - } - - nt_status = auth_generate_security_token(mem_ctx, - kdc_db_ctx->lp_ctx, - kdc_db_ctx->samdb, - user_info_dc, - device_info_dc, - auth_claims, - session_info_flags, - &security_token); - if (!NT_STATUS_IS_OK(nt_status)) { - code = map_errno_from_nt_status(nt_status); - goto out; - } - - data = ldb_msg_find_ldb_val(proxy_skdc_entry->msg, - "msDS-AllowedToActOnBehalfOfOtherIdentity"); - if (data == NULL) { - DBG_WARNING("Could not find security descriptor " - "msDS-AllowedToActOnBehalfOfOtherIdentity in " - "proxy[%s]\n", - proxy_dn); - code = KRB5KDC_ERR_BADOPTION; - goto out; - } - - ndr_err = ndr_pull_struct_blob( - data, - mem_ctx, - rbcd_security_descriptor, - (ndr_pull_flags_fn_t)ndr_pull_security_descriptor); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - errno = ndr_map_error2errno(ndr_err); - DBG_ERR("Failed to unmarshall " - "msDS-AllowedToActOnBehalfOfOtherIdentity " - "security descriptor of proxy[%s]\n", - proxy_dn); - code = KRB5KDC_ERR_BADOPTION; - goto out; - } - - if (DEBUGLEVEL >= 10) { - NDR_PRINT_DEBUG(security_token, security_token); - NDR_PRINT_DEBUG(security_descriptor, rbcd_security_descriptor); - } - - nt_status = sec_access_check_ds(rbcd_security_descriptor, - security_token, - access_desired, - &access_granted, - NULL, - NULL); - - if (!NT_STATUS_IS_OK(nt_status)) { - DBG_WARNING("RBCD: sec_access_check_ds(access_desired=%#08x, " - "access_granted:%#08x) failed with: %s\n", - access_desired, - access_granted, - nt_errstr(nt_status)); - - code = KRB5KDC_ERR_BADOPTION; - goto out; - } - - DBG_NOTICE("RBCD: Access granted for client[%s]\n", client_name); - - code = 0; -out: - SAFE_FREE(client_name); - SAFE_FREE(server_name); - - TALLOC_FREE(mem_ctx); - return code; -} - NTSTATUS samba_kdc_setup_db_ctx(TALLOC_CTX *mem_ctx, struct samba_kdc_base_context *base_ctx, struct samba_kdc_db_context **kdc_db_ctx_out) { diff --git a/source4/kdc/db-glue.h b/source4/kdc/db-glue.h index f06cca4b42b..297916ed823 100644 --- a/source4/kdc/db-glue.h +++ b/source4/kdc/db-glue.h @@ -93,16 +93,6 @@ samba_kdc_check_s4u2proxy(krb5_context context, struct samba_kdc_entry *skdc_entry, krb5_const_principal target_principal); -krb5_error_code samba_kdc_check_s4u2proxy_rbcd( - krb5_context context, - struct samba_kdc_db_context *kdc_db_ctx, - krb5_const_principal client_principal, - krb5_const_principal server_principal, - const struct auth_user_info_dc *user_info_dc, - const struct auth_user_info_dc *device_info_dc, - const struct auth_claims auth_claims, - struct samba_kdc_entry *proxy_skdc_entry); - NTSTATUS samba_kdc_setup_db_ctx(TALLOC_CTX *mem_ctx, struct samba_kdc_base_context *base_ctx, struct samba_kdc_db_context **kdc_db_ctx_out); diff --git a/source4/kdc/hdb-samba4.c b/source4/kdc/hdb-samba4.c index eb8cd9686cd..f09333308c7 100644 --- a/source4/kdc/hdb-samba4.c +++ b/source4/kdc/hdb-samba4.c @@ -332,10 +332,8 @@ hdb_samba4_check_rbcd(krb5_context context, HDB *db, struct samba_kdc_entry *client_skdc_entry = NULL; const struct samba_kdc_entry *client_krbtgt_skdc_entry = NULL; struct samba_kdc_entry *proxy_skdc_entry = NULL; - const struct auth_user_info_dc *client_info = NULL; - const struct auth_user_info_dc *device_info = NULL; struct samba_kdc_entry_pac client_pac_entry = {}; - struct auth_claims auth_claims = {}; + struct samba_kdc_entry_pac device_pac_entry = {}; TALLOC_CTX *mem_ctx = NULL; krb5_error_code code; @@ -357,29 +355,9 @@ hdb_samba4_check_rbcd(krb5_context context, HDB *db, client_skdc_entry, client_krbtgt_skdc_entry); - code = samba_kdc_get_user_info_dc(mem_ctx, - context, - kdc_db_ctx, - client_pac_entry, - &client_info, - NULL /* resource_groups_out */); - if (code != 0) { - goto out; - } - - code = samba_kdc_get_claims_data(mem_ctx, - context, - kdc_db_ctx, - client_pac_entry, - &auth_claims.user_claims); - if (code) { - goto out; - } - if (device != NULL) { struct samba_kdc_entry *device_skdc_entry = NULL; const struct samba_kdc_entry *device_krbtgt_skdc_entry = NULL; - struct samba_kdc_entry_pac device_pac_entry = {}; device_skdc_entry = talloc_get_type_abort(device->context, struct samba_kdc_entry); @@ -392,36 +370,16 @@ hdb_samba4_check_rbcd(krb5_context context, HDB *db, device_pac_entry = samba_kdc_entry_pac(device_pac, device_skdc_entry, device_krbtgt_skdc_entry); - - code = samba_kdc_get_user_info_dc(mem_ctx, - context, - kdc_db_ctx, - device_pac_entry, - &device_info, - NULL /* resource_groups_out */); - if (code) { - goto out; - } - - code = samba_kdc_get_claims_data(mem_ctx, - context, - kdc_db_ctx, - device_pac_entry, - &auth_claims.device_claims); - if (code) { - goto out; - } } code = samba_kdc_check_s4u2proxy_rbcd(context, kdc_db_ctx, client->principal, server_principal, -- Samba Shared Repository