Security: Pro-Geräte Agent-Keys statt geteiltem AGENT_API_KEY (v2.8.0)

Agent v2.8.0 tauscht beim Start automatisch den geteilten Bootstrap-Key
gegen einen individuellen Per-Device-Key (POST /api/monitoring/enroll,
idempotent). Checkin/Announcements-Poll/Setup-Download/WS-Agent-Verbindungen
validieren den Key jetzt gegen den jeweiligen Hostname — ein gestohlener
Key kann sich nicht mehr als anderer Agent ausgeben (manuell verifiziert).

Alte Agents mit dem geteilten Key funktionieren während der Übergangsphase
weiter (validateAgentKey() akzeptiert beides), damit der Rollout die Fleet
nicht abrupt bricht — Migration läuft über den bestehenden Staged-Rollout
(Test → Pilot → Produktion).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 13:50:02 +02:00
parent d513992de7
commit f3bd8d0910
11 changed files with 110 additions and 21 deletions

View File

@@ -6,7 +6,7 @@ namespace ITNexusAgent;
public class AgentWorker
{
private const string Version = "2.7.0";
private const string Version = "2.8.0";
private const string DataDir = @"C:\ProgramData\IT Nexus Agent";
private const string ConfigPath = @"C:\ProgramData\IT Nexus Agent\config.json";
private const string StatusPath = @"C:\ProgramData\IT Nexus Agent\status.json";
@@ -40,12 +40,24 @@ public class AgentWorker
Log($"Agent v{Version} gestartet");
// Security-Migration: geteilten Bootstrap-Key gegen individuellen Per-Device-Key tauschen.
// Idempotent (Server liefert bestehenden Key erneut) — daher bei jedem Start sicher aufrufbar.
var hostname = SystemInfoService.GetHostname();
var enrolledKey = await _api.EnrollAsync(hostname);
if (!string.IsNullOrEmpty(enrolledKey) && enrolledKey != _config.AgentKey)
{
_config.AgentKey = enrolledKey;
_config.Save(ConfigPath);
_api.UpdateKey(enrolledKey);
Log("ENROLL: Per-Device-Key erhalten und gespeichert");
}
// WebSocket Shell-Service im Hintergrund starten
var shellService = new ShellService(_config.ServerUrl, _config.AgentKey, SystemInfoService.GetHostname());
var shellService = new ShellService(_config.ServerUrl, _config.AgentKey, hostname);
_ = shellService.RunAsync(_ct);
// WebRTC Remote Desktop Service im Hintergrund starten
var rtcService = new RtcService(_config.ServerUrl, _config.AgentKey, SystemInfoService.GetHostname());
var rtcService = new RtcService(_config.ServerUrl, _config.AgentKey, hostname);
_ = rtcService.RunAsync(_ct);
while (!_ct.IsCancellationRequested)