[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Oct 24 02:00:02 UTC 2023


The branch, master has been updated
       via  63aeb64504c s4:kdc: Add device to Authenticated Users for authentication policy evaluation
       via  eaffadb8286 s4:kdc: Add a flag indicating that the device should be added to Authenticated Users
       via  c91d1618e33 s4:kdc: Add device to default groups for authentication policy evaluation
       via  fc2f886441e s4:kdc: Add a flag indicating that the device should be added to the default groups
       via  7728a0622e0 s4:kdc: Make a copy of the device SIDs to be placed in the security token
       via  eb21ac87776 tests/krb5: Test whether the device belongs to some default groups
       via  0f5033a1e76 tests/krb5: Work around Samba’s incorrect krbtgt principal handling
       via  4e8fb9706e2 tests/krb5: Remove unnecessary target_creds variables
      from  4c291514a9e s4:kdc: Permit RODC‐issued evidence tickets for constrained delegation

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 63aeb64504cf6b9cbb52ac338129b9930d65f6b3
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Oct 20 15:01:30 2023 +1300

    s4:kdc: Add device to Authenticated Users for authentication policy evaluation
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Tue Oct 24 01:59:32 UTC 2023 on atb-devel-224

commit eaffadb8286ef6d68d433f8c8f244f20ad00e9d3
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Oct 20 15:00:12 2023 +1300

    s4:kdc: Add a flag indicating that the device should be added to Authenticated Users
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c91d1618e339da1c29b371866d5ab243e3d3fad6
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 20:02:43 2023 +1300

    s4:kdc: Add device to default groups for authentication policy evaluation
    
    This means that expressions like ‘Device_Member_of(WD)’ will now work,
    as they should.
    
    It *also* means that expressions like ‘Device_Member_of(NU)’ will work,
    even though they shouldn’t. This is because we consider SID_NT_NETWORK
    to be a default group.
    
    Our new behaviour may be wrong, but at least it’s now consistent with
    the behaviour of user‐relative expressions like ‘Member_of(WD)’ and
    ‘Member_of(NU)’.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit fc2f886441e2cd806c26712762a6813f6ce4f924
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 20:02:32 2023 +1300

    s4:kdc: Add a flag indicating that the device should be added to the default groups
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7728a0622e0f7a7bf672131b757799e03b99d2dd
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 20:02:13 2023 +1300

    s4:kdc: Make a copy of the device SIDs to be placed in the security token
    
    We shall need to add extra SIDs on the end.
    
    View with ‘git show -b’.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit eb21ac87776d113e40070babadcf104f087c0b1d
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 17:11:41 2023 +1300

    tests/krb5: Test whether the device belongs to some default groups
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0f5033a1e76a0e079b6dc1859f2cb2d9110e1b1f
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 16:23:32 2023 +1300

    tests/krb5: Work around Samba’s incorrect krbtgt principal handling
    
    These tests fail only because they are using the ‘krbtgt at REALM’ form of
    the krbtgt principal that Samba doesn’t handle correctly.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4e8fb9706e226fe4f44140c1df64c155c36f22f7
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Oct 19 16:22:28 2023 +1300

    tests/krb5: Remove unnecessary target_creds variables
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 auth/common_auth.h                               |   2 +
 python/samba/tests/krb5/conditional_ace_tests.py | 229 ++++++++++++++++++++---
 python/samba/tests/krb5/kdc_tgs_tests.py         |   8 +-
 selftest/knownfail_heimdal_kdc                   |   8 +-
 selftest/knownfail_mit_kdc                       |   9 +-
 source4/auth/session.c                           |  59 +++++-
 source4/kdc/authn_policy_util.c                  |   5 +
 7 files changed, 280 insertions(+), 40 deletions(-)


Changeset truncated at 500 lines:

diff --git a/auth/common_auth.h b/auth/common_auth.h
index 58fb2cd0b3d..1afb79eb5df 100644
--- a/auth/common_auth.h
+++ b/auth/common_auth.h
@@ -41,6 +41,8 @@ enum auth_password_state {
 #define AUTH_SESSION_INFO_UNIX_TOKEN         0x08 /* The returned token must have the unix_token and unix_info elements provided */
 #define AUTH_SESSION_INFO_NTLM               0x10 /* The returned token must have authenticated-with-NTLM flag set */
 #define AUTH_SESSION_INFO_FORCE_COMPOUNDED_AUTHENTICATION  0x20 /* The user authenticated with a device. */
+#define AUTH_SESSION_INFO_DEVICE_DEFAULT_GROUPS     0x40 /* Add the device to the default world and network groups */
+#define AUTH_SESSION_INFO_DEVICE_AUTHENTICATED      0x80 /* Add the device to the 'authenticated users' group */
 
 struct auth_usersupplied_info
 {
diff --git a/python/samba/tests/krb5/conditional_ace_tests.py b/python/samba/tests/krb5/conditional_ace_tests.py
index c478dfe00a8..89ea8d4432e 100755
--- a/python/samba/tests/krb5/conditional_ace_tests.py
+++ b/python/samba/tests/krb5/conditional_ace_tests.py
@@ -2924,11 +2924,9 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
-
         # Show that authentication fails.
         self._armored_as_req(client_creds,
-                             target_creds,
+                             self.get_krbtgt_creds(),
                              mach_tgt,
                              expected_error=KDC_ERR_POLICY)
 
@@ -2980,12 +2978,16 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
+        # FIXME: we need to pass this parameter only because Samba doesn’t
+        # handle ‘krbtgt at REALM’ principals correctly (see
+        # https://bugzilla.samba.org/show_bug.cgi?id=15482).
+        krbtgt_sname = self.get_krbtgt_sname()
 
         # Show that authentication succeeds.
         self._armored_as_req(client_creds,
-                             target_creds,
-                             mach_tgt)
+                             self.get_krbtgt_creds(),
+                             mach_tgt,
+                             target_sname=krbtgt_sname)
 
         self.check_as_log(client_creds,
                           armor_creds=mach_creds,
@@ -3031,11 +3033,9 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
-
         # Show that authentication fails.
         self._armored_as_req(client_creds,
-                             target_creds,
+                             self.get_krbtgt_creds(),
                              mach_tgt,
                              expected_error=KDC_ERR_POLICY)
 
@@ -3216,11 +3216,9 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
-
         # Show that authentication fails.
         self._armored_as_req(client_creds,
-                             target_creds,
+                             self.get_krbtgt_creds(),
                              mach_tgt,
                              expected_error=KDC_ERR_POLICY)
 
@@ -3315,11 +3313,9 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
-
         # Show that authentication fails.
         self._armored_as_req(client_creds,
-                             target_creds,
+                             self.get_krbtgt_creds(),
                              mach_tgt,
                              expected_error=KDC_ERR_POLICY)
 
@@ -3370,12 +3366,16 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
+        # FIXME: we need to pass this parameter only because Samba doesn’t
+        # handle ‘krbtgt at REALM’ principals correctly (see
+        # https://bugzilla.samba.org/show_bug.cgi?id=15482).
+        krbtgt_sname = self.get_krbtgt_sname()
 
         # Show that authentication succeeds.
         self._armored_as_req(client_creds,
-                             target_creds,
-                             mach_tgt)
+                             self.get_krbtgt_creds(),
+                             mach_tgt,
+                             target_sname=krbtgt_sname)
 
         self.check_as_log(client_creds,
                           armor_creds=mach_creds,
@@ -3426,11 +3426,9 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
         client_creds = self._get_creds(account_type=self.AccountType.USER,
                                        assigned_policy=client_policy)
 
-        target_creds = self.get_krbtgt_creds()
-
         # Show that authentication fails.
         self._armored_as_req(client_creds,
-                             target_creds,
+                             self.get_krbtgt_creds(),
                              mach_tgt,
                              expected_error=KDC_ERR_POLICY)
 
@@ -3443,6 +3441,95 @@ class DeviceRestrictionTests(ConditionalAceBaseTests):
             reason=AuditReason.ACCESS_DENIED,
             status=ntstatus.NT_STATUS_INVALID_WORKSTATION)
 
+    def test_device_in_world_group(self):
+        self._check_device_in_group(security.SID_WORLD)
+
+    def test_device_in_network_group(self):
+        self._check_device_not_in_group(security.SID_NT_NETWORK)
+
+    def test_device_in_authenticated_users(self):
+        self._check_device_in_group(security.SID_NT_AUTHENTICATED_USERS)
+
+    def _check_device_in_group(self, group):
+        self._check_device_membership(group, expect_in_group=True)
+
+    def _check_device_not_in_group(self, group):
+        self._check_device_membership(group, expect_in_group=False)
+
+    def _check_device_membership(self, group, *, expect_in_group):
+        """Test that authentication succeeds or fails when the device is
+        required to belong to a certain group.
+        """
+
+        # Create a machine account with which to perform FAST.
+        mach_creds = self.get_cached_creds(
+            account_type=self.AccountType.COMPUTER,
+            opts={'id': 'device'})
+        mach_tgt = self.get_tgt(mach_creds)
+
+        # Create an authentication policy that requires the device to belong to
+        # a certain group.
+        in_group_sddl = self.allow_if(f'Member_of {{SID({group})}}')
+        in_group_policy = self.create_authn_policy(
+            enforced=True, user_allowed_from=in_group_sddl)
+
+        # Create a user account with the assigned policy.
+        client_creds = self._get_creds(account_type=self.AccountType.USER,
+                                       assigned_policy=in_group_policy)
+
+        krbtgt_creds = self.get_krbtgt_creds()
+
+        # FIXME: we need to pass this parameter only because Samba doesn’t
+        # handle ‘krbtgt at REALM’ principals correctly (see
+        # https://bugzilla.samba.org/show_bug.cgi?id=15482).
+        krbtgt_sname = self.get_krbtgt_sname()
+
+        # Test whether authentication succeeds or fails.
+        self._armored_as_req(
+            client_creds,
+            krbtgt_creds,
+            mach_tgt,
+            target_sname=krbtgt_sname,
+            expected_error=0 if expect_in_group else KDC_ERR_POLICY)
+
+        policy_success_args = {}
+        policy_failure_args = {
+            'client_policy_status': ntstatus.NT_STATUS_AUTHENTICATION_FIREWALL_FAILED,
+            'event': AuditEvent.KERBEROS_DEVICE_RESTRICTION,
+            'reason': AuditReason.ACCESS_DENIED,
+            'status': ntstatus.NT_STATUS_INVALID_WORKSTATION,
+        }
+
+        self.check_as_log(client_creds,
+                          armor_creds=mach_creds,
+                          client_policy=in_group_policy,
+                          **(policy_success_args if expect_in_group
+                             else policy_failure_args))
+
+        # Create an authentication policy that requires the device not to belong
+        # to the group.
+        not_in_group_sddl = self.allow_if(f'Not_Member_of {{SID({group})}}')
+        not_in_group_policy = self.create_authn_policy(
+            enforced=True, user_allowed_from=not_in_group_sddl)
+
+        # Create a user account with the assigned policy.
+        client_creds = self._get_creds(account_type=self.AccountType.USER,
+                                       assigned_policy=not_in_group_policy)
+
+        # Test whether authentication succeeds or fails.
+        self._armored_as_req(
+            client_creds,
+            krbtgt_creds,
+            mach_tgt,
+            target_sname=krbtgt_sname,
+            expected_error=KDC_ERR_POLICY if expect_in_group else 0)
+
+        self.check_as_log(client_creds,
+                          armor_creds=mach_creds,
+                          client_policy=not_in_group_policy,
+                          **(policy_failure_args if expect_in_group
+                             else policy_success_args))
+
 
 class TgsReqServicePolicyTests(ConditionalAceBaseTests):
     def test_pac_groups_not_present(self):
@@ -4348,6 +4435,100 @@ class TgsReqServicePolicyTests(ConditionalAceBaseTests):
                           client_policy=client_policy,
                           server_policy=target_policy)
 
+    def test_device_in_world_group(self):
+        self._check_device_in_group(security.SID_WORLD)
+
+    def test_device_in_network_group(self):
+        self._check_device_not_in_group(security.SID_NT_NETWORK)
+
+    def test_device_in_authenticated_users(self):
+        self._check_device_in_group(security.SID_NT_AUTHENTICATED_USERS)
+
+    def _check_device_in_group(self, group):
+        self._check_device_membership(group, expect_in_group=True)
+
+    def _check_device_not_in_group(self, group):
+        self._check_device_membership(group, expect_in_group=False)
+
+    def _check_device_membership(self, group, *, expect_in_group):
+        """Test that authentication succeeds or fails when the device is
+        required to belong to a certain group.
+        """
+
+        # Create a machine account with which to perform FAST.
+        mach_creds = self.get_cached_creds(
+            account_type=self.AccountType.COMPUTER,
+            opts={'id': 'device'})
+        mach_tgt = self.get_tgt(mach_creds)
+
+        # Create an authentication policy that requires the device to belong to
+        # a certain group.
+        in_group_sddl = self.allow_if(f'Device_Member_of {{SID({group})}}')
+        in_group_policy = self.create_authn_policy(
+            enforced=True, computer_allowed_to=in_group_sddl)
+
+        # Create a user account.
+        client_creds = self._get_creds(account_type=self.AccountType.USER)
+        client_tgt = self.get_tgt(client_creds)
+
+        # Create a target account with the assigned policy.
+        target_creds = self._get_creds(account_type=self.AccountType.COMPUTER,
+                                       assigned_policy=in_group_policy)
+
+        tgs_success_args = {}
+        tgs_failure_args = {
+            'expect_edata': self.expect_padata_outer,
+            # We aren’t particular about whether or not we get an NTSTATUS.
+            'expect_status': None,
+            'expected_status': ntstatus.NT_STATUS_AUTHENTICATION_FIREWALL_FAILED,
+        }
+
+        # Test whether authorization succeeds or fails.
+        self._tgs_req(client_tgt,
+                      0 if expect_in_group else KDC_ERR_POLICY,
+                      client_creds,
+                      target_creds,
+                      armor_tgt=mach_tgt,
+                      **(tgs_success_args if expect_in_group
+                      else tgs_failure_args))
+
+        policy_success_args = {}
+        policy_failure_args = {
+            'status': ntstatus.NT_STATUS_AUTHENTICATION_FIREWALL_FAILED,
+            'event': AuditEvent.KERBEROS_SERVER_RESTRICTION,
+            'reason': AuditReason.ACCESS_DENIED,
+        }
+
+        self.check_tgs_log(client_creds, target_creds,
+                           policy=in_group_policy,
+                           **(policy_success_args if expect_in_group
+                           else policy_failure_args))
+
+        # Create an authentication policy that requires the device not to belong
+        # to the group.
+        not_in_group_sddl = self.allow_if(
+            f'Not_Device_Member_of {{SID({group})}}')
+        not_in_group_policy = self.create_authn_policy(
+            enforced=True, computer_allowed_to=not_in_group_sddl)
+
+        # Create a target account with the assigned policy.
+        target_creds = self._get_creds(account_type=self.AccountType.COMPUTER,
+                                       assigned_policy=not_in_group_policy)
+
+        # Test whether authorization succeeds or fails.
+        self._tgs_req(client_tgt,
+                      KDC_ERR_POLICY if expect_in_group else 0,
+                      client_creds,
+                      target_creds,
+                      armor_tgt=mach_tgt,
+                      **(tgs_failure_args if expect_in_group
+                      else tgs_success_args))
+
+        self.check_tgs_log(client_creds, target_creds,
+                           policy=not_in_group_policy,
+                           **(policy_failure_args if expect_in_group
+                              else policy_success_args))
+
     def test_simple_as_req_client_policy_only(self):
         # Create a machine account with which to perform FAST.
         mach_creds = self.get_cached_creds(
@@ -4371,10 +4552,16 @@ class TgsReqServicePolicyTests(ConditionalAceBaseTests):
             (security.SID_CLAIMS_VALID, SidType.EXTRA_SID, self.default_attrs),
         }
 
+        # FIXME: we need to pass this parameter only because Samba doesn’t
+        # handle ‘krbtgt at REALM’ principals correctly (see
+        # https://bugzilla.samba.org/show_bug.cgi?id=15482).
+        krbtgt_sname = self.get_krbtgt_sname()
+
         # Show that obtaining a service ticket with an AS‐REQ is allowed.
         self._armored_as_req(client_creds,
                           self.get_krbtgt_creds(),
                           mach_tgt,
+                          target_sname=krbtgt_sname,
                           expected_groups=expected_groups)
 
         self.check_as_log(client_creds,
diff --git a/python/samba/tests/krb5/kdc_tgs_tests.py b/python/samba/tests/krb5/kdc_tgs_tests.py
index 28654042f78..d1bed6fc74f 100755
--- a/python/samba/tests/krb5/kdc_tgs_tests.py
+++ b/python/samba/tests/krb5/kdc_tgs_tests.py
@@ -176,6 +176,7 @@ class KdcTgsBaseTests(KDCBaseTest):
                         target_creds,
                         armor_tgt,
                         *,
+                        target_sname=None,
                         expected_error=0,
                         expected_sname=None,
                         expect_edata=None,
@@ -191,9 +192,10 @@ class KdcTgsBaseTests(KDCBaseTest):
         client_cname = self.PrincipalName_create(name_type=NT_PRINCIPAL,
                                                  names=[client_username])
 
-        target_name = target_creds.get_username()
-        target_sname = self.PrincipalName_create(
-            name_type=NT_PRINCIPAL, names=[target_name])
+        if target_sname is None:
+            target_name = target_creds.get_username()
+            target_sname = self.PrincipalName_create(
+                name_type=NT_PRINCIPAL, names=[target_name])
         target_realm = target_creds.get_realm()
         target_decryption_key = self.TicketDecryptionKey_from_creds(
             target_creds)
diff --git a/selftest/knownfail_heimdal_kdc b/selftest/knownfail_heimdal_kdc
index 986c2e9cc24..3792f7ea5b9 100644
--- a/selftest/knownfail_heimdal_kdc
+++ b/selftest/knownfail_heimdal_kdc
@@ -131,9 +131,5 @@
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.ConditionalAceTests.test_tgs_with_service_asserted_identity_client_from_rodc\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.ConditionalAceTests.test_tgs_without_aa_asserted_identity_both_from_rodc\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.ConditionalAceTests.test_tgs_without_aa_asserted_identity_client_from_rodc\(ad_dc\)
-#
-# Conditional ACE device restrictions
-#
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_claims_present\(ad_dc\)
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_groups_present\(ad_dc\)
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_simple_as_req_client_policy_only\(ad_dc\)
+^samba\.tests\.krb5\.conditional_ace_tests\.samba\.tests\.krb5\.conditional_ace_tests\.DeviceRestrictionTests\.test_device_in_network_group\(ad_dc\)$
+^samba\.tests\.krb5\.conditional_ace_tests\.samba\.tests\.krb5\.conditional_ace_tests\.TgsReqServicePolicyTests\.test_device_in_network_group\(ad_dc\)$
diff --git a/selftest/knownfail_mit_kdc b/selftest/knownfail_mit_kdc
index 5f5a4fa45ec..5c051723914 100644
--- a/selftest/knownfail_mit_kdc
+++ b/selftest/knownfail_mit_kdc
@@ -4064,15 +4064,18 @@ samba.tests.krb5.as_canonicalization_tests.samba.tests.krb5.as_canonicalization_
 #
 # Conditional ACE device restrictions
 #
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_device_in_authenticated_users\(ad_dc\)$
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_device_in_network_group\(ad_dc\)$
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_device_in_world_group\(ad_dc\)$
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_claims_invalid\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_claims_not_present\(ad_dc\)
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_claims_present\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_device_info\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_groups_not_present\(ad_dc\)
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_groups_present\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_resource_groups_present\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_resource_groups_present_to_service_no_sid_compression\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_resource_groups_present_to_service_sid_compression\(ad_dc\)
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.DeviceRestrictionTests.test_pac_well_known_groups_not_present\(ad_dc\)
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_device_in_authenticated_users\(ad_dc\)$
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_device_in_network_group\(ad_dc\)$
+^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_device_in_world_group\(ad_dc\)$
 ^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_simple_as_req_client_and_target_policy\(ad_dc\)
-^samba.tests.krb5.conditional_ace_tests.samba.tests.krb5.conditional_ace_tests.TgsReqServicePolicyTests.test_simple_as_req_client_policy_only\(ad_dc\)
diff --git a/source4/auth/session.c b/source4/auth/session.c
index 46b833713ba..11cc287cd94 100644
--- a/source4/auth/session.c
+++ b/source4/auth/session.c
@@ -68,7 +68,7 @@ _PUBLIC_ NTSTATUS auth_generate_security_token(TALLOC_CTX *mem_ctx,
 	uint32_t num_device_sids = 0;
 	const char *filter = NULL;
 	struct auth_SidAttr *sids = NULL;
-	const struct auth_SidAttr *device_sids = NULL;
+	struct auth_SidAttr *device_sids = NULL;
 
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
 	if (tmp_ctx == NULL) {
@@ -177,14 +177,59 @@ _PUBLIC_ NTSTATUS auth_generate_security_token(TALLOC_CTX *mem_ctx,
 	}
 
 	if (device_info_dc != NULL) {
-		device_sids = device_info_dc->sids;
+		/*
+		 * Make a copy of the device SIDs in case we need to add extra SIDs on
+		 * the end. One can never have too much copying.
+		 */
 		num_device_sids = device_info_dc->num_sids;
-	}
+		device_sids = talloc_array(tmp_ctx,
+				    struct auth_SidAttr,
+				    num_device_sids);
+		if (device_sids == NULL) {
+			TALLOC_FREE(tmp_ctx);
+			return NT_STATUS_NO_MEMORY;
+		}
 
-	/*
-	 * TODO: if we find out that we need to add default SIDs to the device
-	 * SIDs, as well as to the client SIDs, we’ll do that here.
-	 */
+		for (i = 0; i < num_device_sids; i++) {
+			device_sids[i] = device_info_dc->sids[i];
+		}
+
+		if (session_info_flags & AUTH_SESSION_INFO_DEVICE_DEFAULT_GROUPS) {
+			device_sids = talloc_realloc(tmp_ctx,
+						     device_sids,
+						     struct auth_SidAttr,
+						     num_device_sids + 2);
+			if (device_sids == NULL) {
+				TALLOC_FREE(tmp_ctx);
+				return NT_STATUS_NO_MEMORY;
+			}
+
+			device_sids[num_device_sids++] = (struct auth_SidAttr) {
+				.sid = global_sid_World,
+				.attrs = SE_GROUP_DEFAULT_FLAGS,
+			};
+			device_sids[num_device_sids++] = (struct auth_SidAttr) {
+				.sid = global_sid_Network,
+				.attrs = SE_GROUP_DEFAULT_FLAGS,
+			};
+		}
+
+		if (session_info_flags & AUTH_SESSION_INFO_DEVICE_AUTHENTICATED) {
+			device_sids = talloc_realloc(tmp_ctx,
+						     device_sids,
+						     struct auth_SidAttr,
+						     num_device_sids + 1);
+			if (device_sids == NULL) {
+				TALLOC_FREE(tmp_ctx);
+				return NT_STATUS_NO_MEMORY;
+			}
+
+			device_sids[num_device_sids++] = (struct auth_SidAttr) {
+				.sid = global_sid_Authenticated_Users,
+				.attrs = SE_GROUP_DEFAULT_FLAGS,
+			};
+		}
+	}
 
 	nt_status = security_token_create(mem_ctx,
 					  lp_ctx,
diff --git a/source4/kdc/authn_policy_util.c b/source4/kdc/authn_policy_util.c
index a9f793889ef..60de61a27c2 100644
--- a/source4/kdc/authn_policy_util.c
+++ b/source4/kdc/authn_policy_util.c
@@ -574,6 +574,7 @@ static NTSTATUS _authn_policy_access_check(TALLOC_CTX *mem_ctx,
 	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;
 	const uint32_t access_desired = SEC_ADS_CONTROL_ACCESS;
 	uint32_t access_granted;
@@ -594,6 +595,10 @@ static NTSTATUS _authn_policy_access_check(TALLOC_CTX *mem_ctx,
 		session_info_flags |= AUTH_SESSION_INFO_AUTHENTICATED;
 	}
 
+	if (device_info != NULL && !(device_info->info->user_flags & NETLOGON_GUEST)) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list