Skip to content

Commit 3f3f594

Browse files
committed
remove
1 parent 86572d8 commit 3f3f594

File tree

12 files changed

+133
-10
lines changed

12 files changed

+133
-10
lines changed

.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SENTRIUS_VERSION=1.0.4
1+
SENTRIUS_VERSION=1.0.5
22
SENTRIUS_SSH_VERSION=1.0.1
33
SENTRIUS_KEYCLOAK_VERSION=1.0.1
4-
SENTRIUS_AGENT_VERSION=1.0.8
4+
SENTRIUS_AGENT_VERSION=1.0.9

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ replay_pid*
3333
target/*
3434
api/target/**
3535
core/target/**
36+
analyagents/target/**
3637
core/target/
38+
analyagents/target/
3739
node/*
3840
node_modules/*
3941
api/node_modules/*
@@ -47,3 +49,4 @@ api/node_modules/*
4749
# Eclipse Project Setting #
4850

4951
.settings/*
52+
.env.bak

analyagents/src/main/java/io/sentrius/agent/analysis/agents/sessions/SessionAnalyticsAgent.java

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.sentrius.agent.analysis.agents.sessions;
22

3+
import java.sql.Timestamp;
4+
import java.util.Arrays;
35
import java.util.List;
46
import java.util.Set;
57
import java.util.stream.Collectors;
@@ -9,7 +11,9 @@
911
import io.sentrius.sso.core.model.metadata.TerminalRiskIndicator;
1012
import io.sentrius.sso.core.model.metadata.TerminalSessionMetadata;
1113
import io.sentrius.sso.core.model.metadata.UserExperienceMetrics;
14+
import io.sentrius.sso.core.model.sessions.TerminalLogs;
1215
import io.sentrius.sso.core.repository.AnalyticsTrackingRepository;
16+
import io.sentrius.sso.core.services.SessionService;
1317
import io.sentrius.sso.core.services.metadata.TerminalBehaviorMetricsService;
1418
import io.sentrius.sso.core.services.metadata.TerminalCommandService;
1519
import io.sentrius.sso.core.services.metadata.TerminalRiskIndicatorService;
@@ -28,12 +32,13 @@
2832
@ConditionalOnProperty(name = "agents.session-analytics.enabled", havingValue = "true", matchIfMissing = false)
2933
public class SessionAnalyticsAgent {
3034

31-
private final TerminalSessionMetadataService sessionService;
35+
private final TerminalSessionMetadataService sessionMetadataService;
3236
private final TerminalCommandService commandService;
3337
private final TerminalBehaviorMetricsService behaviorMetricsService;
3438
private final TerminalRiskIndicatorService riskIndicatorService;
3539
private final UserExperienceMetricsService experienceMetricsService;
3640
private final AnalyticsTrackingRepository trackingRepository;
41+
private final SessionService sessionService;
3742

3843
@Scheduled(fixedDelay = 60000) // Waits 60 seconds after the previous run completes
3944
@Transactional
@@ -42,23 +47,37 @@ public void processSessions() {
4247

4348
// Fetch already processed session IDs in bulk
4449
Set<Long> processedSessionIds = trackingRepository.findAllSessionIds();
45-
List<TerminalSessionMetadata> unprocessedSessions = sessionService.getAllSessions().stream()
50+
List<TerminalSessionMetadata> unprocessedSessions = sessionMetadataService.getSessionsByState("CLOSED").stream()
4651
.filter(session -> !processedSessionIds.contains(session.getId()))
4752
.collect(Collectors.toList());
4853

4954
for (TerminalSessionMetadata session : unprocessedSessions) {
5055
try {
5156
processSession(session);
57+
// ACTIVE -> INACTIVE -> CLOSED -> PROCESSED
5258
saveToTracking(session.getId(), "PROCESSED");
5359
} catch (Exception e) {
5460
log.error("Error processing session {}: {}", session.getId(), e.getMessage(), e);
5561
saveToTracking(session.getId(), "ERROR");
5662
}
63+
session.setSessionStatus("PROCESSED");
64+
sessionMetadataService.saveSession(session);
5765
}
5866
}
5967

6068
private void processSession(TerminalSessionMetadata session) {
69+
70+
var terminalLogs = sessionService.getTerminalsBySessionId(session.getSessionLog().getId());
71+
if (terminalLogs == null) {
72+
terminalLogs = List.of(); // Ensure it's not null
73+
}
74+
75+
for (TerminalLogs terminalLog : terminalLogs) {
76+
parseAndSaveCommands(terminalLog, session);
77+
}
78+
6179
List<TerminalCommand> commands = commandService.getCommandsBySessionId(session.getId());
80+
6281
if (commands == null) {
6382
commands = List.of(); // Ensure it's not null
6483
}
@@ -79,4 +98,44 @@ private void saveToTracking(Long sessionId, String status) {
7998
tracking.setStatus(status);
8099
trackingRepository.save(tracking);
81100
}
101+
102+
public List<TerminalCommand> parseAndSaveCommands(
103+
TerminalLogs terminalLog,
104+
TerminalSessionMetadata sessionMetadata) {
105+
// Split output into individual commands (Assume each command ends with a newline or specific delimiter)
106+
String[] commands = terminalLog.getOutput().split("\n");
107+
108+
// Parse each command
109+
List<TerminalCommand> terminalCommands = Arrays.stream(commands)
110+
.filter(command -> !command.trim().isEmpty()) // Skip empty lines
111+
.map(command -> createTerminalCommand(command, terminalLog, sessionMetadata))
112+
.collect(Collectors.toList());
113+
114+
// Save commands to the database
115+
return commandService.saveAll(terminalCommands);
116+
}
117+
118+
private TerminalCommand createTerminalCommand(String command, TerminalLogs terminalLog, TerminalSessionMetadata sessionMetadata) {
119+
TerminalCommand terminalCommand = new TerminalCommand();
120+
terminalCommand.setCommand(command.trim());
121+
terminalCommand.setSession(sessionMetadata);
122+
terminalCommand.setExecutionTime(new Timestamp(System.currentTimeMillis()));
123+
terminalCommand.setExecutionStatus("SUCCESS");
124+
terminalCommand.setOutput(""); // Assume no output initially
125+
terminalCommand.setCommandCategory(categorizeCommand(command));
126+
127+
return terminalCommand;
128+
}
129+
130+
private String categorizeCommand(String command) {
131+
// probably need to define externally
132+
if (command.startsWith("sudo")) {
133+
return "PRIVILEGED";
134+
} else if (command.contains("rm")) {
135+
return "DESTRUCTIVE";
136+
} else if (command.contains("ls") || command.contains("cat")) {
137+
return "INFORMATIONAL";
138+
}
139+
return "GENERAL";
140+
}
82141
}

analyagents/src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ spring.security.oauth2.client.registration.keycloak.redirect-uri=http://192.168.
5757
spring.security.oauth2.client.registration.keycloak.scope=openid,profile,email
5858

5959
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://192.168.1.162:8180/realms/sentrius
60-
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://192.168.1.162:8180/realms/sentrius
60+
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://192.168.1.162:8180/realms/sentrius

api/src/main/java/io/sentrius/sso/controllers/api/HostApiController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public ResponseEntity<ObjectNode> connectSSHServer(HttpServletRequest request, H
228228
hostSystem.get(),
229229
sessionRules);
230230

231-
/*
231+
232232
TerminalSessionMetadata sessionMetadata = TerminalSessionMetadata.builder().sessionStatus("ACTIVE")
233233
.hostSystem(hostSystem.get())
234234
.user(user)
@@ -237,7 +237,7 @@ public ResponseEntity<ObjectNode> connectSSHServer(HttpServletRequest request, H
237237
.build();
238238

239239
sessionMetadata = terminalSessionMetadataService.createSession(sessionMetadata);
240-
*/
240+
241241
var encryptedSessionId = cryptoService.encrypt(connectedSystem.getSession().getId().toString());
242242

243243
log.info("returning " + encryptedSessionId);

api/src/main/java/io/sentrius/sso/controllers/view/HostController.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.sentrius.sso.controllers.view;
22

33
import java.security.GeneralSecurityException;
4+
import java.sql.Timestamp;
45
import java.util.ArrayList;
56
import java.util.List;
67
import io.sentrius.sso.core.annotations.LimitAccess;
@@ -17,6 +18,7 @@
1718
import io.sentrius.sso.core.services.UserService;
1819
import io.sentrius.sso.core.config.SystemOptions;
1920
import io.sentrius.sso.core.services.UserCustomizationService;
21+
import io.sentrius.sso.core.services.metadata.TerminalSessionMetadataService;
2022
import io.sentrius.sso.core.services.terminal.SessionTrackingService;
2123
import jakarta.servlet.http.HttpServletRequest;
2224
import jakarta.servlet.http.HttpServletResponse;
@@ -38,6 +40,7 @@ public class HostController extends BaseController {
3840
final SessionTrackingService sessionTrackingService;
3941
final CryptoService cryptoService;
4042
final UserCustomizationService userThemeService;
43+
final TerminalSessionMetadataService terminalSessionMetadataService;
4144
private ConnectedSystem connectedSystem;
4245

4346

@@ -47,12 +50,14 @@ protected HostController(UserService userService,
4750
HostGroupService hostGroupService,
4851
SessionTrackingService sessionTrackingService,
4952
CryptoService cryptoService,
50-
UserCustomizationService userThemeService) {
53+
UserCustomizationService userThemeService,
54+
TerminalSessionMetadataService terminalSessionMetadataService) {
5155
super(userService, systemOptions, errorOutputService);
5256
this.hostGroupService = hostGroupService;
5357
this.sessionTrackingService = sessionTrackingService;
5458
this.cryptoService = cryptoService;
5559
this.userThemeService = userThemeService;
60+
this.terminalSessionMetadataService = terminalSessionMetadataService;
5661
}
5762

5863

@@ -222,6 +227,14 @@ public String attachSession(
222227

223228
this.connectedSystem = myConnectedSystem;
224229

230+
if (null != connectedSystem){
231+
terminalSessionMetadataService.getSessionBySessionLog(connectedSystem.getSession()).ifPresent(sessionMetadata -> {
232+
sessionMetadata.setEndTime(new Timestamp(System.currentTimeMillis()));
233+
sessionMetadata.setSessionStatus("ACTIVE");
234+
terminalSessionMetadataService.saveSession(sessionMetadata);
235+
});
236+
}
237+
225238
sessionTrackingService.flushSessionOutput(myConnectedSystem);
226239

227240
sessionTrackingService.refreshSession(myConnectedSystem);

api/src/main/java/io/sentrius/sso/websocket/TerminalWSHandler.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import io.sentrius.sso.automation.auditing.Trigger;
55
import io.sentrius.sso.automation.auditing.TriggerAction;
6+
import io.sentrius.sso.core.model.metadata.TerminalSessionMetadata;
7+
import io.sentrius.sso.core.services.metadata.TerminalSessionMetadataService;
68
import io.sentrius.sso.protobuf.Session;
79
import io.sentrius.sso.core.security.service.CryptoService;
810
import io.sentrius.sso.core.services.terminal.SessionTrackingService;
@@ -15,6 +17,7 @@
1517

1618
import java.io.IOException;
1719
import java.security.GeneralSecurityException;
20+
import java.sql.Timestamp;
1821
import java.util.Base64;
1922
import java.util.concurrent.ConcurrentHashMap;
2023

@@ -32,6 +35,7 @@ public class TerminalWSHandler extends TextWebSocketHandler {
3235
final SessionTrackingService sessionTrackingService;
3336
final SshListenerService sshListenerService;
3437
final CryptoService cryptoService;
38+
final TerminalSessionMetadataService terminalSessionMetadataService;
3539

3640

3741
// Store active sessions, using session ID or a custom identifier
@@ -143,9 +147,21 @@ public void afterConnectionClosed(WebSocketSession session, org.springframework.
143147

144148
if (sessionId != null) {
145149
// Remove the session when connection is closed
150+
var lookupId = sessionId + "==";
151+
var sys = sessionTrackingService.getEncryptedConnectedSession(lookupId);
152+
if (null != sys){
153+
log.info("**** Closing session for {}", sys.getSession());
154+
terminalSessionMetadataService.getSessionBySessionLog(sys.getSession()).ifPresent(sessionMetadata -> {
155+
sessionMetadata.setEndTime(new Timestamp(System.currentTimeMillis()));
156+
sessionMetadata.setSessionStatus("CLOSED");
157+
terminalSessionMetadataService.saveSession(sessionMetadata);
158+
});
159+
}
160+
146161
sessions.remove(sessionId);
147162
sshListenerService.removeSession(sessionId);
148-
log.trace("Connection closed, session ID: " + sessionId);
163+
164+
log.info("Connection closed, session ID: " + sessionId);
149165
}
150166
}
151167
}

core/src/main/java/io/sentrius/sso/core/model/metadata/TerminalCommand.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import jakarta.persistence.ManyToOne;
1414
import jakarta.persistence.Table;
1515
import lombok.Getter;
16+
import lombok.Setter;
1617

1718
@Entity
1819
@Getter
20+
@Setter
1921
@Table(name = "terminal_commands")
2022
public class TerminalCommand {
2123
@Id

core/src/main/java/io/sentrius/sso/core/model/metadata/TerminalSessionMetadata.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@ public class TerminalSessionMetadata {
5252
@Column(name = "ip_address", length = 45)
5353
private String ipAddress;
5454

55+
// ACTIVE -> (INACTIVE) -> (ACTIVE) -> CLOSED -> PROCESSED
5556
@Column(name = "session_status", nullable = false)
5657
private String sessionStatus = "ACTIVE";
5758

5859
@Column(name = "is_suspicious", nullable = false)
60+
@Builder.Default
5961
private Boolean isSuspicious = false;
6062

6163
// Getters and Setters
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
11
package io.sentrius.sso.core.repository;
22

3+
import java.util.List;
4+
import java.util.Optional;
35
import io.sentrius.sso.core.model.metadata.TerminalSessionMetadata;
46
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
59
import org.springframework.stereotype.Repository;
610

711
@Repository
8-
public interface TerminalSessionMetadataRepository extends JpaRepository<TerminalSessionMetadata, Long> {}
12+
public interface TerminalSessionMetadataRepository extends JpaRepository<TerminalSessionMetadata, Long> {
13+
14+
@Query("SELECT t FROM TerminalSessionMetadata t WHERE t.sessionLog.id = :sessionLogId")
15+
Optional<TerminalSessionMetadata> findMetadataBySessionLogId(@Param("sessionLogId") Long sessionLogId);
16+
17+
18+
List<TerminalSessionMetadata> findSessionsBySessionStatus(String state);
19+
}

0 commit comments

Comments
 (0)