summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Emery <Shawn.Emery@Sun.COM>2010-01-22 00:35:58 -0700
committerShawn Emery <Shawn.Emery@Sun.COM>2010-01-22 00:35:58 -0700
commit77191e8775ec29406dec7210fc064d8fd759dd24 (patch)
treee578cc3c3c3bb25c336e5d515369d473eb2ba253
parent986b458dd38036ac346e3cedf55812c5fad90cde (diff)
downloadillumos-joyent-77191e8775ec29406dec7210fc064d8fd759dd24.tar.gz
6913833 smbadm join should use /dev/random
-rw-r--r--usr/src/lib/Makefile2
-rw-r--r--usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c4
-rw-r--r--usr/src/lib/smbsrv/libsmbns/Makefile.com6
-rw-r--r--usr/src/lib/smbsrv/libsmbns/common/libsmbns.h5
-rw-r--r--usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c75
-rw-r--r--usr/src/uts/common/smbsrv/netrauth.h6
6 files changed, 58 insertions, 40 deletions
diff --git a/usr/src/lib/Makefile b/usr/src/lib/Makefile
index a4e59dbd14..d428767399 100644
--- a/usr/src/lib/Makefile
+++ b/usr/src/lib/Makefile
@@ -643,7 +643,7 @@ libshare: libscf libzfs libuuid libfsmgt libsecdb libumem libsmbfs
libexacct/demo: libexacct libproject libsocket libnsl
libtsalarm: libpcp
smbsrv: libsocket libnsl libmd libxnet libpthread librt \
- libshare libidmap pkcs11 libsqlite
+ libshare libidmap pkcs11 libsqlite libcryptoutil
libvrrpadm: libsocket libdladm libscf
libvscan: libscf
scsi: libnvpair
diff --git a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c
index 80f26918a4..e4e07a416c 100644
--- a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c
+++ b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -128,6 +128,7 @@ mlsvc_join(smb_domainex_t *dxi, char *user, char *plain_text)
if (erc != 0) {
syslog(LOG_NOTICE, "Failed to update CIFS "
"configuration");
+ bzero(machine_passwd, sizeof (machine_passwd));
return (NT_STATUS_UNSUCCESSFUL);
}
@@ -137,6 +138,7 @@ mlsvc_join(smb_domainex_t *dxi, char *user, char *plain_text)
status = NT_STATUS_LOGON_FAILURE;
}
+ bzero(machine_passwd, sizeof (machine_passwd));
return (status);
}
diff --git a/usr/src/lib/smbsrv/libsmbns/Makefile.com b/usr/src/lib/smbsrv/libsmbns/Makefile.com
index 16eaaeeec0..ebe8dd1be7 100644
--- a/usr/src/lib/smbsrv/libsmbns/Makefile.com
+++ b/usr/src/lib/smbsrv/libsmbns/Makefile.com
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
LIBRARY= libsmbns.a
VERS= .1
@@ -52,7 +50,7 @@ SRCS= $(OBJS_COMMON:%.o=$(SRCDIR)/%.c) \
$(OBJS_SHARED:%.o=$(SRC)/common/smbsrv/%.c)
LDLIBS += $(MACH_LDLIBS)
-LDLIBS += -lsmb -lgss -lldap -lresolv -lnsl -lsocket -lc
+LDLIBS += -lsmb -lgss -lldap -lresolv -lnsl -lsocket -lc -lcryptoutil
CPPFLAGS += -D_REENTRANT
# DYNLIB libraries do not have lint libs and are not linted
diff --git a/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h b/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h
index 2493700e17..ae50db535b 100644
--- a/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h
+++ b/usr/src/lib/smbsrv/libsmbns/common/libsmbns.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -59,6 +59,7 @@ typedef struct smb_ads_host_info {
typedef enum smb_adjoin_status {
SMB_ADJOIN_SUCCESS = 0,
SMB_ADJOIN_ERR_GET_HANDLE,
+ SMB_ADJOIN_ERR_GEN_PWD,
SMB_ADJOIN_ERR_GET_DCLEVEL,
SMB_ADJOIN_ERR_ADD_TRUST_ACCT,
SMB_ADJOIN_ERR_MOD_TRUST_ACCT,
@@ -89,7 +90,7 @@ extern int smb_ads_lookup_share(smb_ads_handle_t *, const char *, const char *,
char *);
extern int smb_ads_add_share(smb_ads_handle_t *, const char *, const char *,
const char *);
-extern smb_adjoin_status_t smb_ads_join(char *, char *, char *, char *, int);
+extern smb_adjoin_status_t smb_ads_join(char *, char *, char *, char *, size_t);
extern void smb_ads_join_errmsg(smb_adjoin_status_t);
extern boolean_t smb_ads_lookup_msdcs(char *, char *, char *, uint32_t);
extern smb_ads_host_info_t *smb_ads_find_host(char *, char *);
diff --git a/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c b/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c
index a54cf7123d..3c11363d44 100644
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -45,6 +45,8 @@
#include <assert.h>
#include <sasl/sasl.h>
#include <note.h>
+#include <errno.h>
+#include <cryptoutil.h>
#include <smbsrv/libsmbns.h>
#include <smbns_dyndns.h>
@@ -58,6 +60,13 @@
#define SMB_ADS_SHARE_NUM_ATTR 3
#define SMB_ADS_SITE_MAX MAXHOSTNAMELEN
+/*
+ * [MS-DISO] A machine password is an ASCII string of randomly chosen
+ * characters. Each character's ASCII code is between 32 and 122 inclusive.
+ */
+#define SMB_ADS_PWD_CHAR_NUM 91
+#define SMB_ADS_PWD_CHAR_START 32
+
#define SMB_ADS_MSDCS_SRV_DC_RR "_ldap._tcp.dc._msdcs"
#define SMB_ADS_MSDCS_SRV_SITE_RR "_ldap._tcp.%s._sites.dc._msdcs"
@@ -184,7 +193,7 @@ static smb_ads_qstat_t smb_ads_lookup_computer_n_attr(smb_ads_handle_t *,
smb_ads_avpair_t *, int, char *);
static int smb_ads_update_computer_cntrl_attr(smb_ads_handle_t *, int, char *);
static krb5_kvno smb_ads_lookup_computer_attr_kvno(smb_ads_handle_t *, char *);
-static void smb_ads_gen_machine_passwd(char *, int);
+static int smb_ads_gen_machine_passwd(char *, size_t);
static void smb_ads_free_cached_host(void);
static int smb_ads_get_spnset(char *, char **);
static void smb_ads_free_spnset(char **);
@@ -2120,36 +2129,37 @@ smb_ads_lookup_computer_attr_kvno(smb_ads_handle_t *ah, char *dn)
return (kvno);
}
-/*
- * smb_ads_gen_machine_passwd
- *
- * Returned a null-terminated machine password generated randomly
- * from [0-9a-zA-Z] character set. In order to pass the password
- * quality check (three character classes), an uppercase letter is
- * used as the first character of the machine password.
- */
-static void
-smb_ads_gen_machine_passwd(char *machine_passwd, int bufsz)
+static int
+smb_ads_gen_machine_passwd(char *machine_passwd, size_t bufsz)
{
- char *data = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJK"
- "LMNOPQRSTUVWXYZ";
- int datalen = strlen(data);
- int i, data_idx;
+ int i;
+ size_t pwdlen;
+ uint8_t *random_bytes;
- assert(machine_passwd);
- assert(bufsz > 0);
+ errno = 0;
+ if (machine_passwd == NULL || bufsz == 0) {
+ errno = EINVAL;
+ return (-1);
+ }
- /*
- * The decimal value of upper case 'A' is 65. Randomly pick
- * an upper-case letter from the ascii table.
- */
- machine_passwd[0] = (random() % 26) + 65;
- for (i = 1; i < bufsz - 1; i++) {
- data_idx = random() % datalen;
- machine_passwd[i] = data[data_idx];
+ pwdlen = bufsz - 1;
+ random_bytes = calloc(1, pwdlen);
+ if (random_bytes == NULL)
+ return (-1);
+
+ if (pkcs11_get_random(random_bytes, pwdlen) != 0) {
+ free(random_bytes);
+ return (-1);
}
- machine_passwd[bufsz - 1] = 0;
+ for (i = 0; i < pwdlen; i++)
+ machine_passwd[i] = (random_bytes[i] % SMB_ADS_PWD_CHAR_NUM) +
+ SMB_ADS_PWD_CHAR_START;
+
+ machine_passwd[pwdlen] = 0;
+ bzero(random_bytes, pwdlen);
+ free(random_bytes);
+ return (0);
}
/*
@@ -2179,7 +2189,7 @@ smb_ads_gen_machine_passwd(char *machine_passwd, int bufsz)
*/
smb_adjoin_status_t
smb_ads_join(char *domain, char *user, char *usr_passwd, char *machine_passwd,
- int len)
+ size_t len)
{
smb_ads_handle_t *ah = NULL;
krb5_context ctx = NULL;
@@ -2218,7 +2228,12 @@ smb_ads_join(char *domain, char *user, char *usr_passwd, char *machine_passwd,
return (SMB_ADJOIN_ERR_GET_HANDLE);
}
- smb_ads_gen_machine_passwd(machine_passwd, len);
+ if (smb_ads_gen_machine_passwd(machine_passwd, len) != 0) {
+ syslog(LOG_NOTICE, "machine password generation: %m");
+ smb_ads_close(ah);
+ smb_ccache_remove(SMB_CCACHE_PATH);
+ return (SMB_ADJOIN_ERR_GEN_PWD);
+ }
if ((dclevel = smb_ads_get_dc_level(ah)) == -1) {
smb_ads_close(ah);
@@ -2378,6 +2393,8 @@ smb_ads_join_errmsg(smb_adjoin_status_t status)
} adjoin_table[] = {
{ SMB_ADJOIN_ERR_GET_HANDLE, "Failed to connect to an "
"Active Directory server." },
+ { SMB_ADJOIN_ERR_GEN_PWD, "Failed to generate machine "
+ "password." },
{ SMB_ADJOIN_ERR_GET_DCLEVEL, "Unknown functional level of "
"the domain controller. The rootDSE attribute named "
"\"domainControllerFunctionality\" is missing from the "
diff --git a/usr/src/uts/common/smbsrv/netrauth.h b/usr/src/uts/common/smbsrv/netrauth.h
index fbfa7e9568..262be0f7c6 100644
--- a/usr/src/uts/common/smbsrv/netrauth.h
+++ b/usr/src/uts/common/smbsrv/netrauth.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -96,9 +96,9 @@ typedef struct netr_session_key {
#define NETR_FLG_INIT 0x00000002
/*
- * 32-byte machine account password (null-terminated)
+ * 120-byte machine account password (null-terminated)
*/
-#define NETR_MACHINE_ACCT_PASSWD_MAX 32 + 1
+#define NETR_MACHINE_ACCT_PASSWD_MAX 120 + 1
typedef struct netr_info {
DWORD flags;