Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Jul 2001 15:39:46 -0500
From:      "Jacques A. Vidrine" <n@nectar.com>
To:        freebsd-audit@freebsd.org
Subject:   Add `ServerPrincipalFromSocket' option to sshd
Message-ID:  <20010713153946.G67153@madman.nectar.com>

next in thread | raw e-mail | index | archive | help
Our sshd  very annoyingly uses the  hostname to form the  principal it
uses for  Kerberos authentication.   This is  especially a  problem on
machines with multiple IP addresses.

The following  patch adds a `ServerPrincipalFromSocket'  option (which
defaults to `no').  When this option  is set, sshd will behave as most
other  Kerberized  daemons and  use  getsockname()  to determine  what
principal name to use.

Incidently, I also added a debug message which displays what principal
will be used.


Index: auth-krb5.c
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/auth-krb5.c,v
retrieving revision 1.8
diff -u -r1.8 auth-krb5.c
--- auth-krb5.c	2001/06/12 03:43:47	1.8
+++ auth-krb5.c	2001/07/13 20:26:24
@@ -11,7 +11,7 @@
 #include "xmalloc.h"
 
 #ifdef KRB5
-
+extern ServerOptions options;
 krb5_context ssh_context = NULL;
 krb5_auth_context auth_context;
 krb5_ccache mem_ccache = NULL; /* Credential cache for acquired ticket */
@@ -50,9 +50,14 @@
 	 ret = 0;
 	 goto err; 
        }
-	
+
+       if (options.server_principal_from_socket) {
+	 problem = krb5_sock_to_principal(ssh_context, fd, "host",
+					  KRB5_NT_SRV_HST, &server);
+       } else {
 	problem = krb5_sname_to_principal(ssh_context,  NULL, NULL ,
 	    KRB5_NT_SRV_HST, &server);
+       }
 	if (problem) {
 	    ret = 0;
 	    goto err;
Index: servconf.c
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/servconf.c,v
retrieving revision 1.22
diff -u -r1.22 servconf.c
--- servconf.c	2001/05/04 04:14:22	1.22
+++ servconf.c	2001/07/13 20:29:55
@@ -80,6 +80,7 @@
 #endif
 #ifdef KRB5
 	options->krb5_tgt_passing = -1;
+	options->server_principal_from_socket = -1;
 #endif /* KRB5 */
 #ifdef AFS
 	options->krb4_tgt_passing = -1;
@@ -195,6 +196,8 @@
 #ifdef KRB5
 	if (options->krb5_tgt_passing == -1)
 	  	options->krb5_tgt_passing = 1;
+	if (options->server_principal_from_socket == -1)
+		options->server_principal_from_socket = 0;
 #endif /* KRB5 */
 #ifdef AFS
 	if (options->krb4_tgt_passing == -1)
@@ -244,6 +247,7 @@
 #endif
 #ifdef KRB5
 	sKrb5TgtPassing,
+	sServerPrincipalFromSocket,
 #endif /* KRB5 */
 #ifdef AFS
 	sKrb4TgtPassing, sAFSTokenPassing,
@@ -293,6 +297,7 @@
 #endif
 #ifdef KRB5
 	{ "kerberos5tgtpassing", sKrb5TgtPassing },
+	{ "serverprincipalfromsocket", sServerPrincipalFromSocket },
 #endif /* KRB5 */
 #ifdef AFS
 	{ "kerberos4tgtpassing", sKrb4TgtPassing },
@@ -620,6 +625,10 @@
 #ifdef KRB5
 		case sKrb5TgtPassing:
 			intptr = &options->krb5_tgt_passing;
+			goto parse_flag;
+
+		case sServerPrincipalFromSocket:
+			intptr = &options->server_principal_from_socket;
 			goto parse_flag;
 #endif /* KRB5 */
 
Index: servconf.h
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/servconf.h,v
retrieving revision 1.9
diff -u -r1.9 servconf.h
--- servconf.h	2001/05/04 04:14:22	1.9
+++ servconf.h	2001/07/13 20:27:28
@@ -88,6 +88,10 @@
 #endif
 #ifdef KRB5
 	int     krb5_tgt_passing;
+	int     server_principal_from_socket;  /* If true, use the socket name
+						  instead of the hostname for
+						  the server principal. */
+
 
 #endif /* KRB5 */
 #ifdef AFS
Index: sshconnect.c
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/sshconnect.c,v
retrieving revision 1.17
diff -u -r1.17 sshconnect.c
--- sshconnect.c	2001/05/04 04:37:49	1.17
+++ sshconnect.c	2001/07/13 20:31:22
@@ -739,6 +739,10 @@
   int type, payload_len;
   krb5_ap_rep_enc_part *reply = NULL; 
   int ret;
+  char **realms;
+  char *real_hostname;
+  krb5_principal server;
+  char sname[128];
 
   memset(&ap, 0, sizeof(ap));
   
@@ -765,9 +769,29 @@
   }
   
   remotehost = get_canonical_hostname(1);
-  
-  problem = krb5_mk_req(*context, auth_context, AP_OPTS_MUTUAL_REQUIRED,
-			"host", remotehost, NULL, ccache, &ap);
+  problem = krb5_expand_hostname_realms(*context, remotehost, &real_hostname,
+                                      &realms);
+  if (problem) {
+    ret = 0;
+    goto out;
+  }
+  problem = krb5_build_principal(*context, &server, strlen(*realms), *realms,
+                               "host", real_hostname, NULL);
+  free(real_hostname);
+  krb5_free_host_realm(*context, realms);
+  if (problem) {
+    ret = 0;
+    goto out;
+  }
+  problem = krb5_unparse_name_fixed(*context, server, sname, sizeof(sname));
+  if (problem) {
+    fatal("krb5_unparse_name_fixed failed: %s",
+        krb5_get_err_text(*context, problem));
+  }
+  debug("Kerberos V5: trying %s.", sname);
+
+  problem = krb5_mk_req_exact(*context, auth_context, AP_OPTS_MUTUAL_REQUIRED,
+                            server, NULL, ccache, &ap);
   if (problem) { 
      ret = 0;
      goto out;
Index: sshd_config
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/sshd_config,v
retrieving revision 1.17
diff -u -r1.17 sshd_config
--- sshd_config	2001/05/18 18:10:02	1.17
+++ sshd_config	2001/07/13 20:26:24
@@ -56,6 +56,9 @@
 #KerberosOrLocalPasswd yes
 #AFSTokenPassing no
 #KerberosTicketCleanup no
+# Set the following in order to use the socket name rather than the hostname
+# for the Kerberos server principal.
+#ServerPrincipalFromSocket no
 
 # Kerberos TGT Passing does only work with the AFS kaserver
 #KerberosTgtPassing yes
-- 
Jacques Vidrine / n@nectar.com / jvidrine@verio.net / nectar@FreeBSD.org

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010713153946.G67153>