jonathancammack / rpms / openssh

Forked from rpms/openssh 8 months ago
Clone
d1c05f
Index: b/sshd.c
d1c05f
===================================================================
d1c05f
--- b.orig/sshd.c
d1c05f
+++ b/sshd.c
d1c05f
@@ -1420,6 +1420,8 @@ server_accept_loop(struct ssh *ssh, int
d1c05f
 				    options.log_level,
d1c05f
 				    options.log_facility,
d1c05f
 				    log_stderr);
d1c05f
+
d1c05f
+				set_log_session_id();  // Set log session ID for this session
d1c05f
 				if (rexec_flag)
d1c05f
 					close(config_s[0]);
d1c05f
 				else {
d1c05f
Index: b/auth-pam.c
d1c05f
===================================================================
d1c05f
--- b.orig/auth-pam.c
d1c05f
+++ b/auth-pam.c
d1c05f
@@ -766,7 +766,20 @@ sshpam_init(struct ssh *ssh, Authctxt *a
d1c05f
 		return (-1);
d1c05f
 	}
d1c05f
 #endif
d1c05f
-	return (0);
d1c05f
+	debug("PAM: setting PAM LOG_SESSION_ID to \"%s\"", get_log_session_id());
d1c05f
+	{
d1c05f
+		char log_session_id_env[HOST_NAME_MAX + 50];
d1c05f
+		snprintf(log_session_id_env, sizeof(log_session_id_env),
d1c05f
+				"LOG_SESSION_ID=%s", get_log_session_id());
d1c05f
+		sshpam_err = pam_putenv(sshpam_handle, log_session_id_env);
d1c05f
+		if (sshpam_err != PAM_SUCCESS) {
d1c05f
+			pam_end(sshpam_handle, sshpam_err);
d1c05f
+			sshpam_handle = NULL;
d1c05f
+			return (-1);
d1c05f
+		}
d1c05f
+	}
d1c05f
+
d1c05f
+        return (0);
d1c05f
 }
d1c05f
 
d1c05f
 static void
d1c05f
Index: b/log.c
d1c05f
===================================================================
d1c05f
--- b.orig/log.c
d1c05f
+++ b/log.c
d1c05f
@@ -410,17 +410,17 @@ do_log(LogLevel level, int force, const
d1c05f
 		tmp_handler(level, force, fmtbuf, log_handler_ctx);
d1c05f
 		log_handler = tmp_handler;
d1c05f
 	} else if (log_on_stderr) {
d1c05f
-		snprintf(msgbuf, sizeof msgbuf, "%.*s\r\n",
d1c05f
-		    (int)sizeof msgbuf - 3, fmtbuf);
d1c05f
+		snprintf(msgbuf, sizeof msgbuf, "%.*s session=%s\r\n",
d1c05f
+		    (int)sizeof msgbuf - 3, fmtbuf, get_log_session_id());
d1c05f
 		(void)write(log_stderr_fd, msgbuf, strlen(msgbuf));
d1c05f
 	} else {
d1c05f
 #if defined(HAVE_OPENLOG_R) && defined(SYSLOG_DATA_INIT)
d1c05f
 		openlog_r(argv0 ? argv0 : __progname, LOG_PID, log_facility, &sdata);
d1c05f
-		syslog_r(pri, &sdata, "%.500s", fmtbuf);
d1c05f
+		syslog_r(pri, &sdata, "%.500s session=%s", fmtbuf, get_log_session_id());
d1c05f
 		closelog_r(&sdata);
d1c05f
 #else
d1c05f
 		openlog(argv0 ? argv0 : __progname, LOG_PID, log_facility);
d1c05f
-		syslog(pri, "%.500s", fmtbuf);
d1c05f
+		syslog(pri, "%.500s session=%s", fmtbuf, get_log_session_id());
d1c05f
 		closelog();
d1c05f
 #endif
d1c05f
 	}
d1c05f
@@ -452,6 +452,33 @@ sshlogdie(const char *file, const char *
d1c05f
 }
d1c05f
 
d1c05f
 void
d1c05f
+set_log_session_id()
d1c05f
+{
d1c05f
+        struct timeval tv;
d1c05f
+        char hostname[HOST_NAME_MAX + 1];
d1c05f
+        char session_id[HOST_NAME_MAX + 20];
d1c05f
+        char *s;
d1c05f
+        if (gethostname(hostname, sizeof(hostname)) != 0) {
d1c05f
+                *hostname = '\0';
d1c05f
+        }
d1c05f
+        gettimeofday(&tv, NULL);
d1c05f
+        snprintf(session_id, sizeof(session_id), "%s:%x.%x",
d1c05f
+                 hostname, tv.tv_sec, tv.tv_usec);
d1c05f
+        setenv("LOG_SESSION_ID", session_id, 1);
d1c05f
+}
d1c05f
+
d1c05f
+const char *
d1c05f
+get_log_session_id()
d1c05f
+{
d1c05f
+        const char *id = getenv("LOG_SESSION_ID");
d1c05f
+        if (!id) {
d1c05f
+                 set_log_session_id();
d1c05f
+                 id = getenv("LOG_SESSION_ID");
d1c05f
+        }
d1c05f
+        return id;
d1c05f
+}
d1c05f
+
d1c05f
+void
d1c05f
 sshsigdie(const char *file, const char *func, int line, int showfunc,
d1c05f
     LogLevel level, const char *suffix, const char *fmt, ...)
d1c05f
 {
d1c05f
Index: b/regress/session-id.sh
d1c05f
===================================================================
d1c05f
--- /dev/null
d1c05f
+++ b/regress/session-id.sh
d1c05f
@@ -0,0 +1,23 @@
d1c05f
+tid="session id"
d1c05f
+
d1c05f
+start_sshd
d1c05f
+
d1c05f
+${SSH} -F $OBJ/ssh_config somehost true
d1c05f
+if [ $? -ne 0 ]; then
d1c05f
+	fail "ssh connect with failed"
d1c05f
+fi
d1c05f
+
d1c05f
+expected="session=$(hostname)"
d1c05f
+
d1c05f
+# grab the first session ID which will be stable across session
d1c05f
+sessionid=$(grep -m1 $expected $TEST_SSHD_LOGFILE | sed -E 's/.*(session=.*)/\1/')
d1c05f
+
d1c05f
+line_count=$(grep -c $expected $TEST_SSHD_LOGFILE)
d1c05f
+if [ $line_count == "0" ]; then
d1c05f
+	fail "No session ID lines found"
d1c05f
+fi
d1c05f
+
d1c05f
+stable_id_count=$(grep -c $sessionid $TEST_SSHD_LOGFILE)
d1c05f
+if [ $line_count != $stable_id_count ]; then
d1c05f
+	fail 'Mismatching session ids found'
d1c05f
+fi
d1c05f
Index: b/log.h
d1c05f
===================================================================
d1c05f
--- b.orig/log.h
d1c05f
+++ b/log.h
d1c05f
@@ -68,6 +68,9 @@ const char *	log_level_name(LogLevel);
d1c05f
 void	 set_log_handler(log_handler_fn *, void *);
d1c05f
 void	 cleanup_exit(int) __attribute__((noreturn));
d1c05f
 
d1c05f
+void		set_log_session_id();
d1c05f
+const char *	get_log_session_id();
d1c05f
+
d1c05f
 void	 sshlog(const char *, const char *, int, int,
d1c05f
     LogLevel, const char *, const char *, ...)
d1c05f
     __attribute__((format(printf, 7, 8)));