Ga naar inhoud

Noodconsole

Waarom een noodconsole

Wanneer een alert je vertelt “iets vreemds draait op host X”, wil je vaak direct kijken. SSH/RDP installeren overal is een grote attack surface, beheerlast, en geen forensische audit-log. De noodconsole geeft via de bestaande agent-WS-tunnel een kort levende, gerichte shell — zonder poorten open te zetten, zonder permanente credentials op de host, met een complete audit-trail server-side.

Auth-flow (identiek op alle OSes)

  1. Operator klikt Open noodconsole op een agent in het dashboard.
  2. Dashboard vraagt reden (≥20 tekens) + TOTP-code.
  3. Hub-API valideert role (admin/owner), TOTP, en rate-limit (3 sessies / uur / user).
  4. Hub signt een Ed25519 console-session-token (15 min TTL, nonce, agent-bound) en pusht een console_start frame naar de agent over de bestaande WebSocket.
  5. Agent verifieert signature + nonce + TTL, spawned een lokale shell, opent een keystroke-stream terug naar de hub.
  6. Browser opent wss://api.monsys.ai/ws/console/<session_id> — bidirectionele binary stream.

Elke I/O byte wordt naar console_audit_log op de hub geschreven (direction=‘I’ voor invoer, ‘O’ voor uitvoer) met sequence_num en agent_id. Bij sessie-einde wordt een SHA256 van het complete log op console_sessions.audit_hash gezet als forensisch proof.

Linux side — bash --restricted als monsys-console

Bij agent install:

  • useradd -r -s /bin/false -d /var/lib/monsys/console monsys-console
  • .bashrc schrijft een rode [MONSYS-CONSOLE] prompt + HISTTIMEFORMAT + audit log

Bij elke sessie:

Terminal window
setpriv --reuid=monsys-console --regid=monsys-console \
--init-groups --inh-caps=-all \
-- /bin/bash --restricted \
--rcfile /var/lib/monsys/console/.bashrc

Restricted-bash blokkeert cd, omleidingen met >, en PATH= zelf wijzigen. Caps zijn gestript. Sudoers fragment voor monsys-console user is leeg → geen privilege-escalatie mogelijk.

Windows side — ConPTY + PowerShell met JEA

Op Windows geeft je een pseudo-console (ConPTY, native API sinds Win10 1809) een echte terminal-ervaring (kleuren, resize, ctrl-c), en Just Enough Administration (JEA) enforce’t de cmdlet-whitelist server-side.

Bij agent install (install.ps1):

  • Maakt module MonsysJEA aan onder $Env:ProgramFiles\WindowsPowerShell\Modules\
  • Schrijft Role Capability File MonsysConsole.psrc met de whitelist (zie hieronder)
  • Schrijft Session Configuration File monsys-console-jea.pssc met RunAsVirtualAccount=$true, LanguageMode=NoLanguage, SessionType=RestrictedRemoteServer
  • Register-PSSessionConfiguration -Name monsys-console-jea

Bij elke sessie:

powershell.exe -NoLogo -NoProfile -NoExit \
-ConfigurationName monsys-console-jea

Stdin/stdout van het ConPTY-paar wordt gemapt op de WS-stream.

Wat de operator WEL mag (whitelist)

Forensische IR-set, ~60 cmdlets:

CategorieCmdlets
ProcessGet-Process, Stop-Process, Wait-Process, Debug-Process
ServiceGet/Stop/Start/Restart/Suspend/Resume-Service, Set-Service
Event logGet-EventLog, Get-WinEvent (geen Clear-EventLog)
NetwerkGet-NetTCPConnection, Get-NetUDPEndpoint, Get-NetAdapter, Get-NetIPAddress, Get-NetIPConfiguration, Get-NetRoute, Get-DnsClient*, Resolve-DnsName, Test-Connection, Test-NetConnection
ContainmentDisable/Enable-NetAdapter, New/Remove/Get-NetFirewallRule, Set-NetFirewallProfile
UsersGet-LocalUser, Get-LocalGroup, Get-LocalGroupMember (geen Add/Set/Remove)
FilesystemGet-ChildItem, Get-Item, Get-Content, Get-ItemProperty, Get-FileHash, Test-Path, Resolve-Path, Get-Acl, Get-AuthenticodeSignature
TasksGet-ScheduledTask, Disable-ScheduledTask
WMI/CIMGet-CimInstance, Get-CimClass (geen Invoke-CimMethod)
PerfGet-Counter, Get-ComputerInfo, Get-HotFix
PipelineForEach-Object, Where-Object, Select-Object, Sort-Object, Group-Object, Measure-Object, Compare-Object, Format-*, Out-*, Select-String
Emergency powerRestart-Computer, Stop-Computer

Wat de operator NIET kan (JEA blokkeert server-side)

  • Invoke-Expression, Invoke-Command — geen arbitrary code execution
  • New-LocalUser, Add-LocalGroupMember, Set-LocalUser — geen nieuwe privileged accounts
  • Remove-Item, Format-Volume — geen destructie
  • Clear-EventLog — geen forensic-evidence tampering
  • Set-Acl op kritieke paden — geen permissions-wijzigingen
  • .exe executables buiten de whitelist
  • New-PSSession — geen pivoting naar andere hosts
  • Scripts of variabele-expansion (LanguageMode=NoLanguage) — alleen losse cmdlet-invocations

Probeer je een geblokkeerde cmdlet, krijg je server-side een rode error:

The term 'Remove-Item' is not recognized as the name of a cmdlet, function, ...

JEA-transcripten worden óók lokaal weggeschreven naar $Env:ProgramData\monsys\console-transcripts\ als secundaire forensic trail (de primaire trail blijft hub-side console_audit_log).

Sessie-einde

Sessie eindigt op:

  • Browser disconnect (operator sluit tab)
  • 15 min TTL bereikt → automatisch dicht
  • Operator typt exit / Exit-PSSession
  • Tenant suspended → hub sluit alle open sessies onmiddellijk

Bij elke sluiting wordt een SHA256 van de hele console_audit_log (in sequence_num volgorde) berekend en gepind op de session-row. Dat hash kan je later vergelijken om aan te tonen dat de log niet werd gewijzigd.

Permissions samenvatting

LinuxWindows
Shellbash --restrictedpowershell (LanguageMode=NoLanguage)
User contextmonsys-console (low-priv)JEA RunAs virtual account (ephemeral)
Cmdlet/builtin whitelistPad-restricted bashJEA RoleCapability (~60 cmdlets)
Filesystem destructieGeen — restricted bash blokkeert redirectsGeen — Remove-Item niet in whitelist
Privilege escalationGeen sudoers entry voor monsys-consoleVirtual account, geen admin lid
Audit trail (hub)console_audit_log met SHA256 lockdownidem
Audit trail (host fallback)n/a$ProgramData\monsys\console-transcripts\