The branch, master has been updated via 7751d03 s3-net: Fix DEBUG() location. via 0eded14 s3-net: give more control how to update/register DNS entries. via ec23d0a s3-net: pass down a flags field to DoDNSUpdate(). via 5d4247a s3-net: move out some prototypes to net_dns.h. via a2fec69 s3-net: pass down struct net_context to the dns update calls. via 06f3b1f s3-kerberos: add aes enctypes to generated krb5.conf. via eae33e9 s3-krb5: use and request AES keys in kerberos operations. from 4a21d2e Fix release script to build full set of documentation
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 7751d03a1e18a94de1f54f6ba4143b52d8c53180 Author: Günther Deschner <g...@samba.org> Date: Mon Oct 1 16:19:28 2012 +0200 s3-net: Fix DEBUG() location. Guenther Autobuild-User(master): Günther Deschner <g...@samba.org> Autobuild-Date(master): Tue Oct 2 18:06:17 CEST 2012 on sn-devel-104 commit 0eded14f19806e87b2205677064d1413bcb86d38 Author: Günther Deschner <g...@samba.org> Date: Tue Sep 25 11:09:45 2012 +0200 s3-net: give more control how to update/register DNS entries. Guenther commit ec23d0a3eeeeb2f3969d4d113d80bd82cb1dbbcd Author: Günther Deschner <g...@samba.org> Date: Tue Sep 25 11:08:48 2012 +0200 s3-net: pass down a flags field to DoDNSUpdate(). Guenther commit 5d4247ae7434adae87b265a362a9fa19b4ca557c Author: Günther Deschner <g...@samba.org> Date: Wed Sep 19 15:35:15 2012 +0200 s3-net: move out some prototypes to net_dns.h. Guenther commit a2fec69b0958f75e31c702e25017eeae6a92be0d Author: Günther Deschner <g...@samba.org> Date: Wed Sep 19 15:31:57 2012 +0200 s3-net: pass down struct net_context to the dns update calls. Guenther commit 06f3b1f0b0dcf9355a8d634cdb62f1f0a8ea4dbe Author: Günther Deschner <g...@samba.org> Date: Mon Dec 19 10:52:58 2011 +0100 s3-kerberos: add aes enctypes to generated krb5.conf. Guenther commit eae33e96fcaa456830862325b91579faf2a96213 Author: Günther Deschner <g...@samba.org> Date: Thu Dec 15 18:12:41 2011 +0100 s3-krb5: use and request AES keys in kerberos operations. Guenther ----------------------------------------------------------------------- Summary of changes: lib/krb5_wrap/krb5_samba.c | 6 ++ source3/libads/kerberos.c | 28 +++++++++-- source3/libads/kerberos_keytab.c | 8 +++- source3/utils/net_ads.c | 44 ++++++++++-------- source3/utils/net_dns.c | 96 +++++++++++++++++++++++--------------- source3/utils/net_dns.h | 43 +++++++++++++++++ 6 files changed, 163 insertions(+), 62 deletions(-) create mode 100644 source3/utils/net_dns.h Changeset truncated at 500 lines: diff --git a/lib/krb5_wrap/krb5_samba.c b/lib/krb5_wrap/krb5_samba.c index 1a5a710..8037337 100644 --- a/lib/krb5_wrap/krb5_samba.c +++ b/lib/krb5_wrap/krb5_samba.c @@ -688,6 +688,12 @@ int cli_krb5_get_ticket(TALLOC_CTX *mem_ctx, ENCTYPE_ARCFOUR_HMAC, ENCTYPE_DES_CBC_MD5, ENCTYPE_DES_CBC_CRC, +#ifdef HAVE_ENCTYPE_AES128_CTS_HMAC_SHA1_96 + ENCTYPE_AES128_CTS_HMAC_SHA1_96, +#endif +#ifdef HAVE_ENCTYPE_AES256_CTS_HMAC_SHA1_96 + ENCTYPE_AES256_CTS_HMAC_SHA1_96, +#endif ENCTYPE_NULL}; initialize_krb5_error_table(); diff --git a/source3/libads/kerberos.c b/source3/libads/kerberos.c index 1093d12..3183e26 100644 --- a/source3/libads/kerberos.c +++ b/source3/libads/kerberos.c @@ -831,6 +831,7 @@ bool create_local_private_krb5_conf_for_domain(const char *realm, int fd; char *realm_upper = NULL; bool result = false; + char *aes_enctypes = NULL; if (!lp_create_krb5_conf()) { return false; @@ -870,14 +871,33 @@ bool create_local_private_krb5_conf_for_domain(const char *realm, goto done; } + aes_enctypes = talloc_strdup(fname, ""); + if (aes_enctypes == NULL) { + goto done; + } + +#ifdef HAVE_ENCTYPE_AES256_CTS_HMAC_SHA1_96 + aes_enctypes = talloc_asprintf_append(aes_enctypes, "%s", "aes256-cts-hmac-sha1-96 "); + if (aes_enctypes == NULL) { + goto done; + } +#endif +#ifdef HAVE_ENCTYPE_AES128_CTS_HMAC_SHA1_96 + aes_enctypes = talloc_asprintf_append(aes_enctypes, "%s", "aes128-cts-hmac-sha1-96"); + if (aes_enctypes == NULL) { + goto done; + } +#endif + file_contents = talloc_asprintf(fname, "[libdefaults]\n\tdefault_realm = %s\n" - "\tdefault_tgs_enctypes = RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n" - "\tdefault_tkt_enctypes = RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n" - "\tpreferred_enctypes = RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n\n" + "\tdefault_tgs_enctypes = %s RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n" + "\tdefault_tkt_enctypes = %s RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n" + "\tpreferred_enctypes = %s RC4-HMAC DES-CBC-CRC DES-CBC-MD5\n\n" "[realms]\n\t%s = {\n" "\t%s\t}\n", - realm_upper, realm_upper, kdc_ip_string); + realm_upper, aes_enctypes, aes_enctypes, aes_enctypes, + realm_upper, kdc_ip_string); if (!file_contents) { goto done; diff --git a/source3/libads/kerberos_keytab.c b/source3/libads/kerberos_keytab.c index eb2603b..b7df50d 100644 --- a/source3/libads/kerberos_keytab.c +++ b/source3/libads/kerberos_keytab.c @@ -263,9 +263,15 @@ int ads_keytab_add_entry(ADS_STRUCT *ads, const char *srvPrinc) krb5_keytab keytab = NULL; krb5_data password; krb5_kvno kvno; - krb5_enctype enctypes[4] = { + krb5_enctype enctypes[6] = { ENCTYPE_DES_CBC_CRC, ENCTYPE_DES_CBC_MD5, +#ifdef HAVE_ENCTYPE_AES128_CTS_HMAC_SHA1_96 + ENCTYPE_AES128_CTS_HMAC_SHA1_96, +#endif +#ifdef HAVE_ENCTYPE_AES256_CTS_HMAC_SHA1_96 + ENCTYPE_AES256_CTS_HMAC_SHA1_96, +#endif ENCTYPE_ARCFOUR_HMAC, 0 }; diff --git a/source3/utils/net_ads.c b/source3/utils/net_ads.c index b1d55f1..c122251 100644 --- a/source3/utils/net_ads.c +++ b/source3/utils/net_ads.c @@ -38,6 +38,7 @@ #include "../libcli/security/security.h" #include "libsmb/libsmb.h" #include "lib/param/loadparm.h" +#include "utils/net_dns.h" #ifdef HAVE_ADS @@ -1126,12 +1127,9 @@ static WERROR check_ads_config( void ) #if defined(WITH_DNS_UPDATES) #include "../lib/addns/dns.h" -DNS_ERROR DoDNSUpdate(char *pszServerName, - const char *pszDomainName, const char *pszHostName, - const struct sockaddr_storage *sslist, - size_t num_addrs ); -static NTSTATUS net_update_dns_internal(TALLOC_CTX *ctx, ADS_STRUCT *ads, +static NTSTATUS net_update_dns_internal(struct net_context *c, + TALLOC_CTX *ctx, ADS_STRUCT *ads, const char *machine_name, const struct sockaddr_storage *addrs, int num_addrs) @@ -1197,7 +1195,7 @@ static NTSTATUS net_update_dns_internal(TALLOC_CTX *ctx, ADS_STRUCT *ads, &nameservers, &ns_count); if ( !NT_STATUS_IS_OK(status) || (ns_count == 0)) { - DEBUG(3,("net_ads_join: Failed to find name server for the %s " + DEBUG(3,("net_update_dns_internal: Failed to find name server for the %s " "realm\n", ads->config.realm)); goto done; } @@ -1208,6 +1206,17 @@ static NTSTATUS net_update_dns_internal(TALLOC_CTX *ctx, ADS_STRUCT *ads, for (i=0; i < ns_count; i++) { + uint32_t flags = DNS_UPDATE_SIGNED | + DNS_UPDATE_UNSIGNED | + DNS_UPDATE_UNSIGNED_SUFFICIENT | + DNS_UPDATE_PROBE | + DNS_UPDATE_PROBE_SUFFICIENT; + + if (c->opt_force) { + flags &= ~DNS_UPDATE_PROBE_SUFFICIENT; + flags &= ~DNS_UPDATE_UNSIGNED_SUFFICIENT; + } + status = NT_STATUS_UNSUCCESSFUL; /* Now perform the dns update - we'll try non-secure and if we fail, @@ -1215,7 +1224,7 @@ static NTSTATUS net_update_dns_internal(TALLOC_CTX *ctx, ADS_STRUCT *ads, fstrcpy( dns_server, nameservers[i].hostname ); - dns_err = DoDNSUpdate(dns_server, dnsdomain, machine_name, addrs, num_addrs); + dns_err = DoDNSUpdate(dns_server, dnsdomain, machine_name, addrs, num_addrs, flags); if (ERR_DNS_IS_OK(dns_err)) { status = NT_STATUS_OK; goto done; @@ -1242,7 +1251,8 @@ done: return status; } -static NTSTATUS net_update_dns_ext(TALLOC_CTX *mem_ctx, ADS_STRUCT *ads, +static NTSTATUS net_update_dns_ext(struct net_context *c, + TALLOC_CTX *mem_ctx, ADS_STRUCT *ads, const char *hostname, struct sockaddr_storage *iplist, int num_addrs) @@ -1274,18 +1284,18 @@ static NTSTATUS net_update_dns_ext(TALLOC_CTX *mem_ctx, ADS_STRUCT *ads, iplist = iplist_alloc; } - status = net_update_dns_internal(mem_ctx, ads, machine_name, + status = net_update_dns_internal(c, mem_ctx, ads, machine_name, iplist, num_addrs); SAFE_FREE(iplist_alloc); return status; } -static NTSTATUS net_update_dns(TALLOC_CTX *mem_ctx, ADS_STRUCT *ads, const char *hostname) +static NTSTATUS net_update_dns(struct net_context *c, TALLOC_CTX *mem_ctx, ADS_STRUCT *ads, const char *hostname) { NTSTATUS status; - status = net_update_dns_ext(mem_ctx, ads, hostname, NULL, 0); + status = net_update_dns_ext(c, mem_ctx, ads, hostname, NULL, 0); return status; } #endif @@ -1315,7 +1325,7 @@ static int net_ads_join_usage(struct net_context *c, int argc, const char **argv } -static void _net_ads_join_dns_updates(TALLOC_CTX *ctx, struct libnet_JoinCtx *r) +static void _net_ads_join_dns_updates(struct net_context *c, TALLOC_CTX *ctx, struct libnet_JoinCtx *r) { #if defined(WITH_DNS_UPDATES) ADS_STRUCT *ads_dns = NULL; @@ -1389,7 +1399,7 @@ static void _net_ads_join_dns_updates(TALLOC_CTX *ctx, struct libnet_JoinCtx *r) goto done; } - status = net_update_dns(ctx, ads_dns, NULL); + status = net_update_dns(c, ctx, ads_dns, NULL); if (!NT_STATUS_IS_OK(status)) { d_fprintf( stderr, _("DNS update failed: %s\n"), nt_errstr(status)); @@ -1545,7 +1555,7 @@ int net_ads_join(struct net_context *c, int argc, const char **argv) * If the dns update fails, we still consider the join * operation as succeeded if we came this far. */ - _net_ads_join_dns_updates(ctx, r); + _net_ads_join_dns_updates(c, ctx, r); TALLOC_FREE(r); TALLOC_FREE( ctx ); @@ -1641,7 +1651,7 @@ static int net_ads_dns_register(struct net_context *c, int argc, const char **ar return -1; } - ntstatus = net_update_dns_ext(ctx, ads, hostname, addrs, num_addrs); + ntstatus = net_update_dns_ext(c, ctx, ads, hostname, addrs, num_addrs); if (!NT_STATUS_IS_OK(ntstatus)) { d_fprintf( stderr, _("DNS update failed!\n") ); ads_destroy( &ads ); @@ -1662,10 +1672,6 @@ static int net_ads_dns_register(struct net_context *c, int argc, const char **ar #endif } -#if defined(WITH_DNS_UPDATES) -DNS_ERROR do_gethostbyname(const char *server, const char *host); -#endif - static int net_ads_dns_gethostbyname(struct net_context *c, int argc, const char **argv) { #if defined(WITH_DNS_UPDATES) diff --git a/source3/utils/net_dns.c b/source3/utils/net_dns.c index 559c14d..9bbefdb 100644 --- a/source3/utils/net_dns.c +++ b/source3/utils/net_dns.c @@ -22,23 +22,17 @@ #include "includes.h" #include "utils/net.h" #include "../lib/addns/dns.h" +#include "utils/net_dns.h" #if defined(WITH_DNS_UPDATES) -/* - * Silly prototype to get rid of a warning - */ - -DNS_ERROR DoDNSUpdate(char *pszServerName, - const char *pszDomainName, const char *pszHostName, - const struct sockaddr_storage *sslist, - size_t num_addrs ); /********************************************************************* *********************************************************************/ DNS_ERROR DoDNSUpdate(char *pszServerName, const char *pszDomainName, const char *pszHostName, - const struct sockaddr_storage *sslist, size_t num_addrs ) + const struct sockaddr_storage *sslist, size_t num_addrs, + uint32_t flags) { DNS_ERROR err; struct dns_connection *conn; @@ -46,6 +40,14 @@ DNS_ERROR DoDNSUpdate(char *pszServerName, OM_uint32 minor; struct dns_update_request *req, *resp; + DEBUG(10,("DoDNSUpdate called with flags: 0x%08x\n", flags)); + + if (!(flags & DNS_UPDATE_SIGNED) && + !(flags & DNS_UPDATE_UNSIGNED) && + !(flags & DNS_UPDATE_PROBE)) { + return ERROR_DNS_INVALID_PARAMETER; + } + if ( (num_addrs <= 0) || !sslist ) { return ERROR_DNS_INVALID_PARAMETER; } @@ -59,45 +61,65 @@ DNS_ERROR DoDNSUpdate(char *pszServerName, goto error; } - /* - * Probe if everything's fine - */ + if (flags & DNS_UPDATE_PROBE) { - err = dns_create_probe(mem_ctx, pszDomainName, pszHostName, - num_addrs, sslist, &req); - if (!ERR_DNS_IS_OK(err)) goto error; + /* + * Probe if everything's fine + */ - err = dns_update_transaction(mem_ctx, conn, req, &resp); - if (!ERR_DNS_IS_OK(err)) goto error; + err = dns_create_probe(mem_ctx, pszDomainName, pszHostName, + num_addrs, sslist, &req); + if (!ERR_DNS_IS_OK(err)) goto error; + + err = dns_update_transaction(mem_ctx, conn, req, &resp); + if (!ERR_DNS_IS_OK(err)) goto error; - if (dns_response_code(resp->flags) == DNS_NO_ERROR) { - TALLOC_FREE(mem_ctx); - return ERROR_DNS_SUCCESS; + if (!ERR_DNS_IS_OK(err)) { + DEBUG(3,("DoDNSUpdate: failed to probe DNS\n")); + } + + if ((dns_response_code(resp->flags) == DNS_NO_ERROR) && + (flags & DNS_UPDATE_PROBE_SUFFICIENT)) { + TALLOC_FREE(mem_ctx); + return ERROR_DNS_SUCCESS; + } } - /* - * First try without signing - */ + if (flags & DNS_UPDATE_UNSIGNED) { - err = dns_create_update_request(mem_ctx, pszDomainName, pszHostName, - sslist, num_addrs, &req); - if (!ERR_DNS_IS_OK(err)) goto error; + /* + * First try without signing + */ - err = dns_update_transaction(mem_ctx, conn, req, &resp); - if (!ERR_DNS_IS_OK(err)) goto error; + err = dns_create_update_request(mem_ctx, pszDomainName, pszHostName, + sslist, num_addrs, &req); + if (!ERR_DNS_IS_OK(err)) goto error; - if (dns_response_code(resp->flags) == DNS_NO_ERROR) { - TALLOC_FREE(mem_ctx); - return ERROR_DNS_SUCCESS; + err = dns_update_transaction(mem_ctx, conn, req, &resp); + if (!ERR_DNS_IS_OK(err)) goto error; + + if (!ERR_DNS_IS_OK(err)) { + DEBUG(3,("DoDNSUpdate: unsigned update failed\n")); + } + + if ((dns_response_code(resp->flags) == DNS_NO_ERROR) && + (flags & DNS_UPDATE_UNSIGNED_SUFFICIENT)) { + TALLOC_FREE(mem_ctx); + return ERROR_DNS_SUCCESS; + } } /* * Okay, we have to try with signing */ - { + if (flags & DNS_UPDATE_SIGNED) { gss_ctx_id_t gss_context; char *keyname; + err = dns_create_update_request(mem_ctx, pszDomainName, pszHostName, + sslist, num_addrs, &req); + if (!ERR_DNS_IS_OK(err)) goto error; + if (!(keyname = dns_generate_keyname( mem_ctx ))) { err = ERROR_DNS_NO_MEMORY; goto error; @@ -128,6 +150,10 @@ DNS_ERROR DoDNSUpdate(char *pszServerName, err = (dns_response_code(resp->flags) == DNS_NO_ERROR) ? ERROR_DNS_SUCCESS : ERROR_DNS_UPDATE_FAILED; + + if (!ERR_DNS_IS_OK(err)) { + DEBUG(3,("DoDNSUpdate: signed update failed\n")); + } } @@ -182,12 +208,6 @@ int get_my_ip_address( struct sockaddr_storage **pp_ss ) return count; } -/* - * Silly prototype to get rid of a warning - */ - -DNS_ERROR do_gethostbyname(const char *server, const char *host); - DNS_ERROR do_gethostbyname(const char *server, const char *host) { struct dns_connection *conn; diff --git a/source3/utils/net_dns.h b/source3/utils/net_dns.h new file mode 100644 index 0000000..31e541b --- /dev/null +++ b/source3/utils/net_dns.h @@ -0,0 +1,43 @@ +/* + Samba Unix/Linux Dynamic DNS Update + net ads commands + + Copyright (C) Krishna Ganugapati (krish...@centeris.com) 2006 + Copyright (C) Gerald Carter 2006 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +/* flags for DoDNSUpdate */ + +#define DNS_UPDATE_SIGNED 0x01 +#define DNS_UPDATE_SIGNED_SUFFICIENT 0x02 +#define DNS_UPDATE_UNSIGNED 0x04 +#define DNS_UPDATE_UNSIGNED_SUFFICIENT 0x08 +#define DNS_UPDATE_PROBE 0x10 +#define DNS_UPDATE_PROBE_SUFFICIENT 0x20 + +#if defined(WITH_DNS_UPDATES) + +#include "../lib/addns/dns.h" + +DNS_ERROR DoDNSUpdate(char *pszServerName, + const char *pszDomainName, const char *pszHostName, + const struct sockaddr_storage *sslist, + size_t num_addrs, + uint32_t flags); + +DNS_ERROR do_gethostbyname(const char *server, const char *host); + +#endif /* defined(WITH_DNS_UPDATES) */ -- Samba Shared Repository