Browse Source

Log duplicate active authorization IDs as irregular tunnel events

Rod Hynes 6 years ago
parent
commit
2c54187708
2 changed files with 20 additions and 7 deletions
  1. 9 5
      psiphon/server/geoip.go
  2. 11 2
      psiphon/server/tunnelServer.go

+ 9 - 5
psiphon/server/geoip.go

@@ -72,15 +72,19 @@ func NewGeoIPData() GeoIPData {
 // SetLogFields adds the GeoIPData fields to LogFields, following Psiphon
 // metric field name and format conventions.
 func (g GeoIPData) SetLogFields(logFields LogFields) {
+	g.SetLogFieldsWithPrefix("", logFields)
+}
+
+func (g GeoIPData) SetLogFieldsWithPrefix(prefix string, logFields LogFields) {
 
 	// In psi_web, the space replacement was done to accommodate space
 	// delimited logging, which is no longer required; we retain the
 	// transformation so that stats aggregation isn't impacted.
-	logFields["client_region"] = strings.Replace(g.Country, " ", "_", -1)
-	logFields["client_city"] = strings.Replace(g.City, " ", "_", -1)
-	logFields["client_isp"] = strings.Replace(g.ISP, " ", "_", -1)
-	logFields["client_asn"] = strings.Replace(g.ASN, " ", "_", -1)
-	logFields["client_aso"] = strings.Replace(g.ASO, " ", "_", -1)
+	logFields[prefix+"client_region"] = strings.Replace(g.Country, " ", "_", -1)
+	logFields[prefix+"client_city"] = strings.Replace(g.City, " ", "_", -1)
+	logFields[prefix+"client_isp"] = strings.Replace(g.ISP, " ", "_", -1)
+	logFields[prefix+"client_asn"] = strings.Replace(g.ASN, " ", "_", -1)
+	logFields[prefix+"client_aso"] = strings.Replace(g.ASO, " ", "_", -1)
 }
 
 // GeoIPService implements GeoIP lookup and session/GeoIP caching.

+ 11 - 2
psiphon/server/tunnelServer.go

@@ -2596,8 +2596,17 @@ func (sshClient *sshClient) setHandshakeState(
 		sessionID, ok := sshClient.sshServer.authorizationSessionIDs[authorizationID]
 		if ok && sessionID != sshClient.sessionID {
 
-			log.WithTraceFields(
-				LogFields{"authorizationID": authorizationID}).Warning("duplicate active authorization")
+			logFields := LogFields{
+				"event_name":                 "irregular_tunnel",
+				"tunnel_error":               "duplicate active authorization",
+				"duplicate_authorization_id": authorizationID,
+			}
+			sshClient.geoIPData.SetLogFields(logFields)
+			duplicateGeoIPData := sshClient.sshServer.support.GeoIPService.GetSessionCache(sessionID)
+			if duplicateGeoIPData != sshClient.geoIPData {
+				duplicateGeoIPData.SetLogFieldsWithPrefix("duplicate_authentication_", logFields)
+			}
+			log.LogRawFieldsWithTimestamp(logFields)
 
 			// Invoke asynchronously to avoid deadlocks.
 			// TODO: invoke only once for each distinct sessionID?