[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Oct 1 18:17:01 MDT 2010


The branch, master has been updated
       via  87698dc s4-kerberos Don't regenerate key values for each alias in keytab
       via  7b9a664 s4-kdc Rework 'allowed encryption types' handling in the KDC
       via  a82e3ab s4-auth Add make_server_info_pac() to include 'resource domain' groups
       via  6488d5b s4-auth Allocate domain SIDs under the sids array, not server_info
       via  a68f447 heimdal use returned server entry from HDB to compare realms
      from  d17a6f0 s3-spoolss: Strip off ", DrvConvert" and ",LocalOnly" in OpenPrinterEx as seen from Win7 clients.

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


- Log -----------------------------------------------------------------
commit 87698dc2a1adb52c381b35f5cc80437f91e75798
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Oct 2 07:12:48 2010 +1000

    s4-kerberos Don't regenerate key values for each alias in keytab
    
    Instead, store the same key value under the multiple alias names.
    
    Andrew Bartlett
    
    Autobuild-User: Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date: Sat Oct  2 00:16:52 UTC 2010 on sn-devel-104

commit 7b9a6645b11dff64e04c2ddb0cabc9145c0f029f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Oct 2 05:25:26 2010 +1000

    s4-kdc Rework 'allowed encryption types' handling in the KDC
    
    All DCs and all krbtgt servers are forced to use AES, regardless
    of the msDS-SecondaryKrbTgtNumber value.
    
    Andrew Bartlett

commit a82e3abc707ecaf68ee26828f11987d621ec1bb5
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Oct 2 05:09:42 2010 +1000

    s4-auth Add make_server_info_pac() to include 'resource domain' groups
    
    Previously, our PAC code didn't include these groups into the
    server_info from which we would eventually calculate the full
    list of tokenGroups.
    
    Andrew Bartlett

commit 6488d5bc0b585d91b185ae37315293123c4b1001
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Oct 2 04:52:50 2010 +1000

    s4-auth Allocate domain SIDs under the sids array, not server_info
    
    Andrew Bartlett

commit a68f4476f780df4a87a99371b49c5e38b0fcb4d7
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Oct 1 13:58:36 2010 +1000

    heimdal use returned server entry from HDB to compare realms
    
    Some hdb modules (samba4) may change the case of the realm in
    a returned result.  Use that to determine if it matches the krbtgt
    realm also returned from the DB (the DB will return it in the 'right' case)
    
    Andrew Bartlett

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

Summary of changes:
 source4/auth/auth_sam_reply.c         |   39 ++++++++++++++++-
 source4/auth/kerberos/kerberos_pac.c  |    8 +--
 source4/auth/kerberos/kerberos_util.c |   78 +++++++++++++++------------------
 source4/heimdal/kdc/krb5tgs.c         |    2 +-
 source4/kdc/db-glue.c                 |   72 ++++++++++++++++++------------
 5 files changed, 121 insertions(+), 78 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/auth/auth_sam_reply.c b/source4/auth/auth_sam_reply.c
index d7792e5..0c03e78 100644
--- a/source4/auth/auth_sam_reply.c
+++ b/source4/auth/auth_sam_reply.c
@@ -208,7 +208,7 @@ NTSTATUS make_server_info_netlogon_validation(TALLOC_CTX *mem_ctx,
 	}
 
 	for (i = 0; i < base->groups.count; i++) {
-		server_info->domain_groups[i] = dom_sid_add_rid(server_info, base->domain_sid, base->groups.rids[i].rid);
+		server_info->domain_groups[i] = dom_sid_add_rid(server_info->domain_groups, base->domain_sid, base->groups.rids[i].rid);
 		NT_STATUS_HAVE_NO_MEMORY(server_info->domain_groups[i]);
 	}
 
@@ -287,3 +287,40 @@ NTSTATUS make_server_info_netlogon_validation(TALLOC_CTX *mem_ctx,
 	return NT_STATUS_OK;
 }
 
+/**
+ * Make a server_info struct from the PAC_LOGON_INFO supplied in the krb5 logon
+ */
+NTSTATUS make_server_info_pac(TALLOC_CTX *mem_ctx,
+			      struct PAC_LOGON_INFO *pac_logon_info,
+			      struct auth_serversupplied_info **_server_info)
+{
+	uint32_t i;
+	NTSTATUS nt_status;
+	union netr_Validation validation;
+	struct auth_serversupplied_info *server_info;
+
+	validation.sam3 = &pac_logon_info->info3;
+
+	nt_status = make_server_info_netlogon_validation(mem_ctx, "", 3, &validation, &server_info);
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		return nt_status;
+	}
+
+	if (pac_logon_info->res_groups.count > 0) {
+		struct dom_sid **rgrps;
+		size_t sidcount = server_info->n_domain_groups + pac_logon_info->res_groups.count;
+		server_info->domain_groups = rgrps
+			= talloc_realloc(server_info, server_info->domain_groups, struct dom_sid *, sidcount);
+		NT_STATUS_HAVE_NO_MEMORY(rgrps);
+
+		for (i = 0; pac_logon_info->res_group_dom_sid && i < pac_logon_info->res_groups.count; i++) {
+			size_t sid_idx = server_info->n_domain_groups + i;
+			rgrps[sid_idx]
+				= dom_sid_add_rid(rgrps, pac_logon_info->res_group_dom_sid,
+						  pac_logon_info->res_groups.rids[i].rid);
+			NT_STATUS_HAVE_NO_MEMORY(rgrps[server_info->n_domain_groups + sid_idx]);
+		}
+	}
+	*_server_info = server_info;
+	return NT_STATUS_OK;
+}
diff --git a/source4/auth/kerberos/kerberos_pac.c b/source4/auth/kerberos/kerberos_pac.c
index aca807e..40f0cf7 100644
--- a/source4/auth/kerberos/kerberos_pac.c
+++ b/source4/auth/kerberos/kerberos_pac.c
@@ -684,11 +684,9 @@ krb5_error_code kerberos_pac_to_server_info(TALLOC_CTX *mem_ctx,
 	}
 
 	/* Pull this right into the normal auth sysstem structures */
-	validation.sam3 = &info.logon_info.info->info3;
-	nt_status = make_server_info_netlogon_validation(mem_ctx,
-							 "",
-							 3, &validation,
-							 &server_info_out);
+	nt_status = make_server_info_pac(mem_ctx,
+					 info.logon_info.info,
+					 &server_info_out);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		talloc_free(tmp_ctx);
 		return EINVAL;
diff --git a/source4/auth/kerberos/kerberos_util.c b/source4/auth/kerberos/kerberos_util.c
index f83fd78..27cbeb0 100644
--- a/source4/auth/kerberos/kerberos_util.c
+++ b/source4/auth/kerberos/kerberos_util.c
@@ -507,8 +507,7 @@ krb5_error_code smb_krb5_open_keytab(TALLOC_CTX *mem_ctx,
 }
 
 static krb5_error_code keytab_add_keys(TALLOC_CTX *parent_ctx,
-				       const char *princ_string,
-				       krb5_principal princ,
+				       struct principal_container **principals,
 				       krb5_principal salt_princ,
 				       int kvno,
 				       const char *password_s,
@@ -517,13 +516,9 @@ static krb5_error_code keytab_add_keys(TALLOC_CTX *parent_ctx,
 				       krb5_keytab keytab,
 				       const char **error_string)
 {
-	int i;
+	unsigned int i, p;
 	krb5_error_code ret;
 	krb5_data password;
-	TALLOC_CTX *mem_ctx = talloc_new(parent_ctx);
-	if (!mem_ctx) {
-		return ENOMEM;
-	}
 
 	password.data = discard_const_p(char *, password_s);
 	password.length = strlen(password_s);
@@ -536,32 +531,33 @@ static krb5_error_code keytab_add_keys(TALLOC_CTX *parent_ctx,
 		ret = create_kerberos_key_from_string(smb_krb5_context->krb5_context, 
 						      salt_princ, &password, &entry.keyblock, enctypes[i]);
 		if (ret != 0) {
-			talloc_free(mem_ctx);
 			return ret;
 		}
 
-                entry.principal = princ;
-                entry.vno       = kvno;
-		ret = krb5_kt_add_entry(smb_krb5_context->krb5_context, keytab, &entry);
-		if (ret != 0) {
-			*error_string = talloc_asprintf(parent_ctx, "Failed to add enctype %d entry for %s(kvno %d) to keytab: %s\n",
-							(int)enctypes[i],
-							princ_string,
-							kvno,
-							smb_get_krb5_error_message(smb_krb5_context->krb5_context,
-										   ret, mem_ctx));
-			talloc_free(mem_ctx);
-			krb5_free_keyblock_contents(smb_krb5_context->krb5_context, &entry.keyblock);
-			return ret;
-		}
+                entry.vno = kvno;
+
+		for (p=0; principals[p]; p++) {
+			entry.principal = principals[p]->principal;
+			ret = krb5_kt_add_entry(smb_krb5_context->krb5_context, keytab, &entry);
+			if (ret != 0) {
+				char *k5_error_string = smb_get_krb5_error_message(smb_krb5_context->krb5_context,
+										   ret, NULL);
+				*error_string = talloc_asprintf(parent_ctx, "Failed to add enctype %d entry for %s(kvno %d) to keytab: %s\n",
+								(int)enctypes[i],
+								principals[p]->string_form,
+								kvno,
+								k5_error_string);
+				talloc_free(k5_error_string);
+				krb5_free_keyblock_contents(smb_krb5_context->krb5_context, &entry.keyblock);
+				return ret;
+			}
 
-		DEBUG(5, ("Added %s(kvno %d) to keytab (enctype %d)\n", 
-			  princ_string, kvno,
-			  (int)enctypes[i]));
-		
+			DEBUG(5, ("Added %s(kvno %d) to keytab (enctype %d)\n", 
+				  principals[p]->string_form, kvno,
+				  (int)enctypes[i]));
+		}
 		krb5_free_keyblock_contents(smb_krb5_context->krb5_context, &entry.keyblock);
 	}
-	talloc_free(mem_ctx);
 	return 0;
 }
 
@@ -573,7 +569,6 @@ static krb5_error_code create_keytab(TALLOC_CTX *parent_ctx,
 				     bool add_old,
 				     const char **error_string)
 {
-	unsigned int i;
 	krb5_error_code ret;
 	const char *password_s;
 	const char *old_secret;
@@ -624,27 +619,24 @@ static krb5_error_code create_keytab(TALLOC_CTX *parent_ctx,
 		return ret;
 	}
 
-	/* Walk over the principals */
-	for (i=0; principals[i]; i++) {
-		ret = keytab_add_keys(mem_ctx, principals[i]->string_form, principals[i]->principal,
+	ret = keytab_add_keys(mem_ctx, principals,
+			      salt_princ,
+			      kvno, password_s, smb_krb5_context,
+			      enctypes, keytab, error_string);
+	if (ret) {
+		talloc_free(mem_ctx);
+		return ret;
+	}
+	
+	if (old_secret) {
+		ret = keytab_add_keys(mem_ctx, principals,
 				      salt_princ,
-				      kvno, password_s, smb_krb5_context,
+				      kvno - 1, old_secret, smb_krb5_context,
 				      enctypes, keytab, error_string);
 		if (ret) {
 			talloc_free(mem_ctx);
 			return ret;
 		}
-
-		if (old_secret) {
-			ret = keytab_add_keys(mem_ctx, principals[i]->string_form, principals[i]->principal,
-					      salt_princ,
-					      kvno - 1, old_secret, smb_krb5_context,
-					      enctypes, keytab, error_string);
-			if (ret) {
-				talloc_free(mem_ctx);
-				return ret;
-			}
-		}
 	}
 
 	talloc_free(mem_ctx);
diff --git a/source4/heimdal/kdc/krb5tgs.c b/source4/heimdal/kdc/krb5tgs.c
index 3560a0d..06a535d 100644
--- a/source4/heimdal/kdc/krb5tgs.c
+++ b/source4/heimdal/kdc/krb5tgs.c
@@ -1689,7 +1689,7 @@ server_lookup:
      * backward.
      */
 
-    if (strcmp(krb5_principal_get_realm(context, sp),
+    if (strcmp(krb5_principal_get_realm(context, server->entry.principal),
 	       krb5_principal_get_comp_string(context,
 					      krbtgt->entry.principal,
 					      1)) != 0) {
diff --git a/source4/kdc/db-glue.c b/source4/kdc/db-glue.c
index 2f416c9..581328d 100644
--- a/source4/kdc/db-glue.c
+++ b/source4/kdc/db-glue.c
@@ -214,21 +214,38 @@ static krb5_error_code samba_kdc_message2entry_keys(krb5_context context,
 	uint16_t i;
 	uint16_t allocated_keys = 0;
 	int rodc_krbtgt_number = 0;
+	uint32_t supported_enctypes;
 
-	/* Supported Enc for this entry */
-	uint32_t supported_enctypes = ENC_ALL_TYPES; /* by default, we support all enc types */
-
-	/* However, if this is a TGS-REQ, then lock it down to a
-	 * reasonable guess as to what the server can decode.  The
-	 * krbtgt is special - default to use what is stored for the KDC */
-	if (rid != DOMAIN_RID_KRBTGT && ent_type == SAMBA_KDC_ENT_TYPE_SERVER) {
-		/* This is the standard set for a server that has not declared a msDS-SupportedEncryptionTypes */
-		supported_enctypes = ENC_CRC32 | ENC_RSA_MD5 | ENC_RC4_HMAC_MD5;
+	if (rid == DOMAIN_RID_KRBTGT || is_rodc) {
+		/* KDCs (and KDCs on RODCs) use AES, but not DES */
+		supported_enctypes = ENC_ALL_TYPES;
+		supported_enctypes &= ~(ENC_CRC32|ENC_RSA_MD5);
+	} else if (userAccountControl & (UF_PARTIAL_SECRETS_ACCOUNT|UF_SERVER_TRUST_ACCOUNT)) {
+		/* DCs and RODCs comptuer accounts use AES */
+		supported_enctypes = ENC_ALL_TYPES;
+	} else if (ent_type == SAMBA_KDC_ENT_TYPE_CLIENT ||
+		   (ent_type == SAMBA_KDC_ENT_TYPE_ANY)) {
+		/* for AS-REQ the client chooses the enc types it
+		 * supports, and this will vary between computers a
+		 * user logs in from.  However, some accounts may be
+		 * banned from using DES, so allow the default to be
+		 * overridden
+		 *
+		 * likewise for 'any' return as much as is supported,
+		 * to export into a keytab */
+		supported_enctypes = ldb_msg_find_attr_as_uint(msg, "msDS-SupportedEncryptionTypes",
+							       ENC_ALL_TYPES);
+	} else {
+		/* However, if this is a TGS-REQ, then lock it down to
+		 * a reasonable guess as to what the server can decode
+		 * - we must use whatever is in
+		 * "msDS-SupportedEncryptionTypes", or the 'old' set
+		 * of keys (ie, what Windows 2000 supported) */
+		supported_enctypes = ldb_msg_find_attr_as_uint(msg, "msDS-SupportedEncryptionTypes",
+							       ENC_CRC32 | ENC_RSA_MD5 | ENC_RC4_HMAC_MD5);
 	}
-	supported_enctypes = ldb_msg_find_attr_as_uint(msg, "msDS-SupportedEncryptionTypes",
-							supported_enctypes);
-	/* Is this the krbtgt or a RODC */
 
+	/* Is this the krbtgt or a RODC krbtgt */
 	if (is_rodc) {
 		rodc_krbtgt_number = ldb_msg_find_attr_as_int(msg, "msDS-SecondaryKrbTgtNumber", -1);
 
@@ -237,26 +254,25 @@ static krb5_error_code samba_kdc_message2entry_keys(krb5_context context,
 		}
 	}
 
-	if (rid == DOMAIN_RID_KRBTGT || is_rodc) {
-		/* Be double-sure never to use DES here */
-		supported_enctypes &= ~(ENC_CRC32|ENC_RSA_MD5);
-	}
-
-	switch (ent_type) {
-	case SAMBA_KDC_ENT_TYPE_KRBTGT:
-	case SAMBA_KDC_ENT_TYPE_TRUST:
-		/* Disallow krbtgt and trust tickets to be DES encrypted, it's just too dangerous */
-		supported_enctypes &= ~(ENC_CRC32|ENC_RSA_MD5);
-		break;
-	default:
-		break;
-		/* No further restrictions */
-	}
 
 	/* If UF_USE_DES_KEY_ONLY has been set, then don't allow use of the newer enc types */
 	if (userAccountControl & UF_USE_DES_KEY_ONLY) {
-		/* However, don't allow use of DES, if we were told not to by msDS-SupportedEncTypes */
+		/* However, this still won't allow use of DES, if we
+		 * were told not to by msDS-SupportedEncTypes */
 		supported_enctypes &= ENC_CRC32|ENC_RSA_MD5;
+	} else {
+		switch (ent_type) {
+		case SAMBA_KDC_ENT_TYPE_KRBTGT:
+		case SAMBA_KDC_ENT_TYPE_TRUST:
+			/* Unless a very special effort it made,
+			 * disallow trust tickets to be DES encrypted,
+			 * it's just too dangerous */
+			supported_enctypes &= ~(ENC_CRC32|ENC_RSA_MD5);
+			break;
+		default:
+			break;
+			/* No further restrictions */
+		}
 	}
 
 	entry_ex->entry.keys.val = NULL;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list