From 718c1eb1eac4560efe623ef0350c25e304b852b1 Mon Sep 17 00:00:00 2001 From: Anso Date: Tue, 14 Apr 2026 10:06:59 -0400 Subject: [PATCH] fix(host-console): harden with security fixes, validation, and test coverage (#580) Security: - Enforce RBAC (system:console permission) on WebSocket upgrade - Validate token_version for user sessions on WS connections - Expand env var sanitization to cover additional secret patterns (PRIVATE, AUTH, PASSPHRASE, ENCRYPT, SIGNING) and connection strings (REDIS_URL, MONGO_URI, AMQP_URL, DSN) Reliability: - Add session tracking with max 5 concurrent console sessions - Add WebSocket heartbeat (30s ping, 60s pong timeout) to detect and clean up dead connections and orphaned PTY processes - Differentiate PTY spawn error messages (shell not found, permission denied, generic failure) - Guard against duplicate cleanup when both WS close and PTY exit fire Observability: - Add structured logging with [HostConsole] prefix for session lifecycle (open, close, duration, user, pid) - Add diagnostic logging behind developer_mode for terminal resize events and message parse errors Frontend: - Replace hardcoded hex colors with oklch CSS custom properties (--terminal-bg, --terminal-fg, --terminal-cursor, etc.) - Apply design system material tokens (shadow-card-bevel, recessed well shadow, card border hierarchy, strokeWidth 1.5) Tests: - Add 20 tests covering env sanitization patterns (10 keyword categories + safe vars + case insensitivity), session tracking, and console-token RBAC (admin, viewer, deployer, API tokens) Docs: - Document admin role requirement and session limits - Add troubleshooting section (session limits, shell not found, proxy timeouts, missing console tab) - Update security section with expanded env var coverage --- backend/src/__tests__/host-console.test.ts | 226 ++++++++++++++++++ backend/src/index.ts | 45 +++- backend/src/services/HostTerminalService.ts | 136 ++++++++--- docs/features/host-console.mdx | 32 ++- .../host-console/host-console-overview.png | Bin 57346 -> 57254 bytes frontend/src/components/HostConsole.tsx | 33 ++- frontend/src/index.css | 11 + 7 files changed, 436 insertions(+), 47 deletions(-) create mode 100644 backend/src/__tests__/host-console.test.ts diff --git a/backend/src/__tests__/host-console.test.ts b/backend/src/__tests__/host-console.test.ts new file mode 100644 index 00000000..49be429c --- /dev/null +++ b/backend/src/__tests__/host-console.test.ts @@ -0,0 +1,226 @@ +/** + * Tests for the Host Console feature: environment sanitization, session limits, + * and console-token RBAC enforcement. + */ +import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; +import request from 'supertest'; +import jwt from 'jsonwebtoken'; +import bcrypt from 'bcrypt'; +import { setupTestDb, cleanupTestDb, TEST_USERNAME, TEST_JWT_SECRET } from './helpers/setupTestDb'; + +let tmpDir: string; +let app: import('express').Express; + +beforeAll(async () => { + tmpDir = await setupTestDb(); + // Mock LicenseService so Admiral-gated endpoints accept requests + const { LicenseService } = await import('../services/LicenseService'); + vi.spyOn(LicenseService.getInstance(), 'getTier').mockReturnValue('paid'); + vi.spyOn(LicenseService.getInstance(), 'getVariant').mockReturnValue('admiral'); + ({ app } = await import('../index')); +}); + +afterAll(() => { + vi.restoreAllMocks(); + cleanupTestDb(tmpDir); +}); + +// ─── Environment Variable Sanitization ────────────────────────────────────── + +describe('HostTerminalService.sanitizeEnv', () => { + let sanitizeEnv: (env: Record) => Record; + + beforeAll(async () => { + const mod = await import('../services/HostTerminalService'); + sanitizeEnv = mod.HostTerminalService.sanitizeEnv; + }); + + it('strips DATABASE_URL (explicit blocklist)', () => { + const result = sanitizeEnv({ DATABASE_URL: 'postgres://...', PATH: '/usr/bin' }); + expect(result).not.toHaveProperty('DATABASE_URL'); + expect(result).toHaveProperty('PATH', '/usr/bin'); + }); + + it('strips REDIS_URL, MONGO_URI, AMQP_URL, DSN (explicit blocklist)', () => { + const result = sanitizeEnv({ + REDIS_URL: 'redis://localhost', + MONGO_URI: 'mongodb://localhost', + AMQP_URL: 'amqp://localhost', + DSN: 'sentry://...', + HOME: '/home/user', + }); + expect(result).not.toHaveProperty('REDIS_URL'); + expect(result).not.toHaveProperty('MONGO_URI'); + expect(result).not.toHaveProperty('AMQP_URL'); + expect(result).not.toHaveProperty('DSN'); + expect(result).toHaveProperty('HOME'); + }); + + it('strips vars matching SECRET pattern', () => { + const result = sanitizeEnv({ JWT_SECRET: 'abc', APP_SECRET_KEY: 'xyz', LANG: 'en' }); + expect(result).not.toHaveProperty('JWT_SECRET'); + expect(result).not.toHaveProperty('APP_SECRET_KEY'); + expect(result).toHaveProperty('LANG'); + }); + + it('strips vars matching PASSWORD pattern', () => { + const result = sanitizeEnv({ DB_PASSWORD: 'pass', SMTP_PASSWORD: 'pass', USER: 'me' }); + expect(result).not.toHaveProperty('DB_PASSWORD'); + expect(result).not.toHaveProperty('SMTP_PASSWORD'); + expect(result).toHaveProperty('USER'); + }); + + it('strips vars matching TOKEN pattern', () => { + const result = sanitizeEnv({ API_TOKEN: '123', GITHUB_TOKEN: 'ghp_...', TERM: 'xterm' }); + expect(result).not.toHaveProperty('API_TOKEN'); + expect(result).not.toHaveProperty('GITHUB_TOKEN'); + expect(result).toHaveProperty('TERM'); + }); + + it('strips vars matching KEY pattern', () => { + const result = sanitizeEnv({ AWS_ACCESS_KEY_ID: 'AKIA...', ENCRYPTION_KEY: 'k', SHELL: '/bin/bash' }); + expect(result).not.toHaveProperty('AWS_ACCESS_KEY_ID'); + expect(result).not.toHaveProperty('ENCRYPTION_KEY'); + expect(result).toHaveProperty('SHELL'); + }); + + it('strips vars matching CREDENTIAL pattern', () => { + const result = sanitizeEnv({ GCP_CREDENTIAL: 'json...', PATH: '/usr/bin' }); + expect(result).not.toHaveProperty('GCP_CREDENTIAL'); + expect(result).toHaveProperty('PATH'); + }); + + it('strips vars matching PRIVATE pattern', () => { + const result = sanitizeEnv({ SSH_PRIVATE_KEY: '-----BEGIN', PRIVATE_KEY_PEM: 'pem', HOSTNAME: 'box' }); + expect(result).not.toHaveProperty('SSH_PRIVATE_KEY'); + expect(result).not.toHaveProperty('PRIVATE_KEY_PEM'); + expect(result).toHaveProperty('HOSTNAME'); + }); + + it('strips vars matching AUTH pattern', () => { + const result = sanitizeEnv({ GITHUB_AUTH: 'token', OAUTH_CLIENT: 'id', COMPOSE_DIR: '/app' }); + expect(result).not.toHaveProperty('GITHUB_AUTH'); + expect(result).not.toHaveProperty('OAUTH_CLIENT'); + expect(result).toHaveProperty('COMPOSE_DIR'); + }); + + it('strips vars matching PASSPHRASE pattern', () => { + const result = sanitizeEnv({ GPG_PASSPHRASE: 'secret', PWD: '/home' }); + expect(result).not.toHaveProperty('GPG_PASSPHRASE'); + expect(result).toHaveProperty('PWD'); + }); + + it('strips vars matching ENCRYPT pattern', () => { + const result = sanitizeEnv({ ENCRYPT_KEY: 'abc', ENCRYPTION_ALGO: 'aes', NODE_ENV: 'prod' }); + expect(result).not.toHaveProperty('ENCRYPT_KEY'); + expect(result).not.toHaveProperty('ENCRYPTION_ALGO'); + expect(result).toHaveProperty('NODE_ENV'); + }); + + it('strips vars matching SIGNING pattern', () => { + const result = sanitizeEnv({ SIGNING_KEY: 'key', JWT_SIGNING_SECRET: 's', LC_ALL: 'C' }); + expect(result).not.toHaveProperty('SIGNING_KEY'); + expect(result).not.toHaveProperty('JWT_SIGNING_SECRET'); + expect(result).toHaveProperty('LC_ALL'); + }); + + it('preserves safe environment variables', () => { + const safe = { + PATH: '/usr/bin', + HOME: '/home/user', + COMPOSE_DIR: '/app/compose', + NODE_ENV: 'production', + TERM: 'xterm-256color', + SHELL: '/bin/bash', + LANG: 'en_US.UTF-8', + }; + const result = sanitizeEnv(safe); + expect(result).toEqual(safe); + }); + + it('pattern matching is case-insensitive', () => { + const result = sanitizeEnv({ my_secret: 'val', My_Password: 'val', PATH: '/usr/bin' }); + expect(result).not.toHaveProperty('my_secret'); + expect(result).not.toHaveProperty('My_Password'); + expect(result).toHaveProperty('PATH'); + }); +}); + +// ─── Session Limit ────────────────────────────────────────────────────────── + +describe('HostTerminalService session tracking', () => { + let HostTerminalService: typeof import('../services/HostTerminalService').HostTerminalService; + + beforeAll(async () => { + const mod = await import('../services/HostTerminalService'); + HostTerminalService = mod.HostTerminalService; + }); + + it('activeSessions map is accessible and starts empty', () => { + // Clear any leftover sessions + HostTerminalService.activeSessions.clear(); + expect(HostTerminalService.activeSessions.size).toBe(0); + }); +}); + +// ─── Console Token RBAC ───────────────────────────────────────────────────── + +describe('POST /api/system/console-token', () => { + it('returns 401 without authentication', async () => { + const res = await request(app).post('/api/system/console-token'); + expect(res.status).toBe(401); + }); + + it('returns 200 for admin user', async () => { + const token = jwt.sign({ username: TEST_USERNAME }, TEST_JWT_SECRET, { expiresIn: '1m' }); + const res = await request(app) + .post('/api/system/console-token') + .set('Authorization', `Bearer ${token}`); + expect(res.status).toBe(200); + expect(typeof res.body.token).toBe('string'); + }); + + it('returns 403 for non-admin user (viewer role)', async () => { + // Create a viewer user in the DB + const { DatabaseService } = await import('../services/DatabaseService'); + const db = DatabaseService.getInstance(); + const viewerHash = await bcrypt.hash('viewerpass', 1); + db.addUser({ username: 'viewer_test', password_hash: viewerHash, role: 'viewer' }); + + const token = jwt.sign({ username: 'viewer_test' }, TEST_JWT_SECRET, { expiresIn: '1m' }); + const res = await request(app) + .post('/api/system/console-token') + .set('Authorization', `Bearer ${token}`); + expect(res.status).toBe(403); + }); + + it('returns 403 for deployer role', async () => { + const { DatabaseService } = await import('../services/DatabaseService'); + const db = DatabaseService.getInstance(); + const deployerHash = await bcrypt.hash('deployerpass', 1); + db.addUser({ username: 'deployer_test', password_hash: deployerHash, role: 'deployer' }); + + const token = jwt.sign({ username: 'deployer_test' }, TEST_JWT_SECRET, { expiresIn: '1m' }); + const res = await request(app) + .post('/api/system/console-token') + .set('Authorization', `Bearer ${token}`); + expect(res.status).toBe(403); + }); + + it('returns 403 for API tokens', async () => { + // Create an API token via the admin endpoint first + const adminToken = jwt.sign({ username: TEST_USERNAME }, TEST_JWT_SECRET, { expiresIn: '1m' }); + const createRes = await request(app) + .post('/api/api-tokens') + .set('Authorization', `Bearer ${adminToken}`) + .send({ name: 'test-console-blocked', scope: 'full-admin' }); + expect(createRes.status).toBe(201); + const apiTokenValue = createRes.body.token; + + const res = await request(app) + .post('/api/system/console-token') + .set('Authorization', `Bearer ${apiTokenValue}`); + expect(res.status).toBe(403); + expect(res.body.code).toBe('SCOPE_DENIED'); + }); +}); diff --git a/backend/src/index.ts b/backend/src/index.ts index 85ff2104..49d0eda7 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -2887,6 +2887,27 @@ server.on('upgrade', async (req, socket, head) => { wsApiTokenScope = apiToken.scope; } + // For user session tokens (no scope), resolve against DB for up-to-date role and + // token_version checks. This mirrors what authMiddleware does for HTTP requests. + // Scoped tokens (api_token, node_proxy, console_session) skip this: they are + // validated by their own logic above or by the gateway that issued them. + let wsResolvedUser: { username: string; role: UserRole; token_version: number } | undefined; + if (!decoded.scope && decoded.username) { + const dbUser = DatabaseService.getInstance().getUserByUsername(decoded.username); + if (!dbUser) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + return; + } + if (decoded.tv !== undefined && dbUser.token_version !== decoded.tv) { + console.log('[Auth] WS session rejected: token version mismatch for:', decoded.username); + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + return; + } + wsResolvedUser = { username: dbUser.username, role: dbUser.role as UserRole, token_version: dbUser.token_version }; + } + const url = req.url || ''; const parsedUrl = new URL(url, `http://${req.headers.host || 'localhost'}`); const pathname = parsedUrl.pathname; @@ -3018,10 +3039,22 @@ server.on('upgrade', async (req, socket, head) => { socket.destroy(); return; } + // RBAC gate: only users with 'system:console' permission may access the host console. + // Console_session tokens are pre-validated by the gateway's requireAdmin() middleware, + // so they skip this check. API tokens are already blocked by the scope gate above. + const isConsoleSession = decoded.scope === 'console_session'; + if (!isConsoleSession) { + const userRole = wsResolvedUser?.role; + if (!userRole || !ROLE_PERMISSIONS[userRole]?.includes('system:console')) { + console.log('[HostConsole] Access denied: insufficient permissions', { username: wsResolvedUser?.username || decoded.username, role: userRole }); + socket.write('HTTP/1.1 403 Forbidden\r\n\r\n'); + socket.destroy(); + return; + } + } // Admiral license gate: host console requires Admiral (paid + team variant). // For proxied connections (console_session tokens), trust the tier headers sent by the gateway; // for direct connections, check the local LicenseService. - const isConsoleSession = decoded.scope === 'console_session'; const consoleTierHeader = req.headers[PROXY_TIER_HEADER] as string | undefined; const consoleVariantHeader = req.headers[PROXY_VARIANT_HEADER] as string | undefined; const ls = LicenseService.getInstance(); @@ -3036,13 +3069,15 @@ server.on('upgrade', async (req, socket, head) => { socket.destroy(); return; } + const consoleUsername = wsResolvedUser?.username || decoded.username || 'console_session'; + const stackParam = parsedUrl.searchParams.get('stack'); + console.log('[HostConsole] WebSocket upgrade accepted', { username: consoleUsername, nodeId, stack: stackParam || '(root)' }); const hostConsoleWss = new WebSocketServer({ noServer: true }); hostConsoleWss.handleUpgrade(req, socket, head, (ws) => { hostConsoleWss.close(); let targetDirectory = ''; try { const baseDir = FileSystemService.getInstance(nodeId).getBaseDir(); - const stackParam = parsedUrl.searchParams.get('stack'); if (stackParam) { const resolved = path.resolve(baseDir, stackParam); if (!resolved.startsWith(path.resolve(baseDir))) { @@ -3058,11 +3093,11 @@ server.on('upgrade', async (req, socket, head) => { targetDirectory = FileSystemService.getInstance(NodeRegistry.getInstance().getDefaultNodeId()).getBaseDir(); } try { - HostTerminalService.spawnTerminal(ws, targetDirectory); + HostTerminalService.spawnTerminal(ws, targetDirectory, consoleUsername); } catch (error) { - console.error('Failed to spawn host terminal:', error); + console.error('[HostConsole] Unhandled spawn error:', { user: consoleUsername, error: (error as Error).message }); if (ws.readyState === WebSocket.OPEN) { - ws.send(`Error spawning terminal: ${(error as Error).message}\r\n`); + ws.send('Error: Failed to start terminal session.\r\n'); ws.close(); } } diff --git a/backend/src/services/HostTerminalService.ts b/backend/src/services/HostTerminalService.ts index 4c8c2db8..476623fc 100644 --- a/backend/src/services/HostTerminalService.ts +++ b/backend/src/services/HostTerminalService.ts @@ -2,40 +2,122 @@ import * as os from 'os'; import * as pty from 'node-pty'; import { WebSocket } from 'ws'; import { execSync } from 'child_process'; +import { isDebugEnabled } from '../utils/debug'; -function getUnixShell() { +let cachedShell: string | null = null; +function getUnixShell(): string { + if (cachedShell) return cachedShell; try { execSync('which bash', { stdio: 'ignore' }); - return 'bash'; + cachedShell = 'bash'; } catch (e) { console.warn('[HostTerminalService] bash not found, falling back to sh:', (e as Error).message); - return 'sh'; + cachedShell = 'sh'; } + return cachedShell; } -export class HostTerminalService { - static spawnTerminal(ws: WebSocket, targetDirectory: string) { - const shell = os.platform() === 'win32' ? 'powershell.exe' : getUnixShell(); +// Pattern-based filtering: block any env var whose name contains sensitive keywords. +// Broad matching is intentional; false positives (stripping a benign var like COLORTERM) +// are safer than false negatives (leaking a secret through printenv). +const SENSITIVE_PATTERNS = /SECRET|PASSWORD|TOKEN|KEY|CREDENTIAL|PRIVATE|AUTH|PASSPHRASE|ENCRYPT|SIGNING/i; - // Strip sensitive backend secrets from the PTY environment so they are not - // visible to the console user via `env` / `printenv`. - // Pattern-based filtering: block any env var containing sensitive keywords. - // Explicit fallback set catches vars that don't match patterns (e.g. DATABASE_URL). - const SENSITIVE_PATTERNS = /SECRET|PASSWORD|TOKEN|KEY|CREDENTIAL/i; - const SENSITIVE_KEYS = new Set(['DATABASE_URL']); - const safeEnv = Object.fromEntries( - Object.entries(process.env as Record).filter( +// Explicit set catches well-known connection strings that may not match the pattern. +const SENSITIVE_KEYS = new Set(['DATABASE_URL', 'REDIS_URL', 'MONGO_URI', 'AMQP_URL', 'DSN']); + +const MAX_CONSOLE_SESSIONS = 5; +const PING_INTERVAL_MS = 30_000; +const PONG_TIMEOUT_MS = 60_000; + +// Cached sanitized environment; process.env does not change at runtime. +let cachedSafeEnv: Record | null = null; + +export class HostTerminalService { + static activeSessions = new Map(); + + /** + * Sanitize a set of environment variables by removing entries whose names + * match sensitive patterns or are in the explicit blocklist. + */ + static sanitizeEnv(env: Record): Record { + return Object.fromEntries( + Object.entries(env).filter( ([k]) => !SENSITIVE_PATTERNS.test(k) && !SENSITIVE_KEYS.has(k) ) ); + } - const ptyProcess = pty.spawn(shell, [], { - name: 'xterm-color', - cols: 80, - rows: 30, - cwd: targetDirectory, - env: safeEnv, - }); + static spawnTerminal(ws: WebSocket, targetDirectory: string, username: string) { + // Enforce concurrent session limit + if (HostTerminalService.activeSessions.size >= MAX_CONSOLE_SESSIONS) { + console.warn('[HostConsole] Session rejected: max concurrent sessions reached', { + current: HostTerminalService.activeSessions.size, + max: MAX_CONSOLE_SESSIONS, + user: username, + }); + ws.send('Error: Maximum console sessions reached. Close an existing session and try again.\r\n'); + ws.close(); + return; + } + + const shell = os.platform() === 'win32' ? 'powershell.exe' : getUnixShell(); + if (!cachedSafeEnv) { + cachedSafeEnv = HostTerminalService.sanitizeEnv(process.env as Record); + } + const startedAt = Date.now(); + + let ptyProcess: pty.IPty; + try { + ptyProcess = pty.spawn(shell, [], { + name: 'xterm-color', + cols: 80, + rows: 30, + cwd: targetDirectory, + env: cachedSafeEnv, + }); + } catch (e) { + const msg = (e as Error).message || ''; + console.error('[HostConsole] Failed to spawn PTY', { user: username, directory: targetDirectory, error: msg }); + if (/ENOENT|not found/i.test(msg)) { + ws.send('Error: Shell not found on this system. Ensure bash or sh is installed.\r\n'); + } else if (/EACCES|permission/i.test(msg)) { + ws.send('Error: Permission denied when spawning shell process.\r\n'); + } else { + ws.send('Error: Failed to start terminal session.\r\n'); + } + ws.close(); + return; + } + + const pid = ptyProcess.pid; + HostTerminalService.activeSessions.set(pid, { username, startedAt }); + console.log('[HostConsole] Session opened', { user: username, directory: targetDirectory, shell, pid }); + + // Guard against duplicate cleanup when both WS close and PTY exit fire + let cleaned = false; + const cleanup = (source: string, extra?: Record) => { + if (cleaned) return; + cleaned = true; + clearInterval(pingInterval); + HostTerminalService.activeSessions.delete(pid); + const durationMs = Date.now() - startedAt; + console.log(`[HostConsole] Session closed (${source})`, { user: username, pid, durationMs, ...extra }); + }; + + // Heartbeat: detect dead connections and clean up orphaned PTY processes + let lastPong = Date.now(); + const pingInterval = setInterval(() => { + if (ws.readyState === WebSocket.OPEN) { + ws.ping(); + if (Date.now() - lastPong > PONG_TIMEOUT_MS) { + console.warn('[HostConsole] Heartbeat timeout, terminating session', { user: username, pid }); + clearInterval(pingInterval); + ws.terminate(); + ptyProcess.kill(); + } + } + }, PING_INTERVAL_MS); + ws.on('pong', () => { lastPong = Date.now(); }); ptyProcess.onData((data) => { if (ws.readyState === WebSocket.OPEN) { @@ -43,27 +125,27 @@ export class HostTerminalService { } }); - ws.on('message', (message: string) => { + ws.on('message', (raw: Buffer | ArrayBuffer | Buffer[]) => { try { - const parsed = JSON.parse(message); // JSON-Up protocol + const parsed = JSON.parse(raw.toString()); // JSON-Up protocol if (parsed.type === 'input') { ptyProcess.write(parsed.payload); } else if (parsed.type === 'resize') { ptyProcess.resize(parsed.cols, parsed.rows); + if (isDebugEnabled()) console.debug('[HostConsole:diag] Terminal resized', { cols: parsed.cols, rows: parsed.rows, pid }); } } catch (e) { - console.error('Failed to parse Host terminal message:', e); + console.error('[HostConsole] Failed to parse terminal message:', { pid, error: (e as Error).message }); } }); ws.on('close', () => { - console.log('Host terminal WebSocket closed, cleaning up PTY process'); + cleanup('WS'); ptyProcess.kill(); }); - // Handle PTY process exit ptyProcess.onExit(({ exitCode, signal }) => { - console.log(`Host terminal PTY process exited with code ${exitCode} and signal ${signal}`); + cleanup('PTY exit', { exitCode, signal }); if (ws.readyState === WebSocket.OPEN) { ws.close(); } diff --git a/docs/features/host-console.mdx b/docs/features/host-console.mdx index 129aa9fc..943d22b1 100644 --- a/docs/features/host-console.mdx +++ b/docs/features/host-console.mdx @@ -48,15 +48,21 @@ In a typical Docker deployment, the Sencho container runs Linux, so the console ## Availability -The Host Console is available to **admin** users on the **Admiral** tier. If your instance is on the Community or Skipper tier, the Console tab does not appear in the navigation bar at all. Attempting to access the console endpoint directly without the correct license is rejected. +The Host Console is available exclusively to users with the **admin** role on the **Admiral** tier. Other roles (node-admin, deployer, viewer, auditor) cannot access the console, even on Admiral-licensed instances. If your instance is on the Community or Skipper tier, the Console tab does not appear in the navigation bar at all. Attempting to access the console endpoint directly without the correct license or role is rejected. + +## Session limits + +Sencho enforces a maximum of **5 concurrent console sessions** per instance. If you hit this limit, close an existing session before opening a new one. Each session also includes an automatic heartbeat; if the browser tab is closed or the network drops, the server detects the dead connection and cleans up the session within about a minute. ## Security considerations The Host Console has stricter access requirements than other features: -- **Browser sessions only.** API tokens used for multi-node communication cannot open a console session. +- **Admin role required.** Only users with the `admin` role can open a console session. Non-admin roles are blocked at both the UI and the API level. +- **Browser sessions only.** API tokens used for automation or multi-node communication cannot open a console session. - **Admiral license required.** The license check is enforced at every layer, not just in the UI. -- **Sensitive environment variables are stripped.** Environment variables whose names suggest secrets (passwords, tokens, keys, credentials) and certain well-known database connection strings are automatically removed from the console environment. Running `env` or `printenv` inside the console will not reveal them. +- **Session invalidation.** Changing a user's password or role immediately invalidates any active session tokens. A user who is downgraded from admin loses console access instantly. +- **Sensitive environment variables are stripped.** Environment variables whose names suggest secrets (passwords, tokens, keys, credentials, auth-related variables, private keys, passphrases, encryption and signing secrets) and certain well-known connection strings are automatically removed from the console environment. Running `env` or `printenv` inside the console will not reveal them. The Host Console provides unrestricted shell access to the machine running Sencho. Do not expose Sencho on a public network without HTTPS and strong authentication. @@ -68,3 +74,23 @@ The Host Console has stricter access requirements than other features: - Running `docker compose logs --follow` or `docker ps` directly - Editing files with `nano` or `vim` for quick fixes - Running maintenance scripts or one-off commands on the host + +## Troubleshooting + + + + Sencho limits concurrent console sessions to 5 per instance. Close one or more existing console sessions (either through the UI or by closing the browser tab) and try again. Stale sessions from disconnected browsers are cleaned up automatically within about a minute. + + + + This typically means the shell could not be found on the host. In a Docker deployment, ensure `bash` or `sh` is available inside the container. You can check by running `docker exec which bash` from the host. Also verify that your user has the `admin` role and your instance has an active Admiral license. + + + + If you are running Sencho behind a reverse proxy (e.g. Nginx, Caddy, Traefik), the proxy may be closing WebSocket connections after its default idle timeout. Increase the WebSocket timeout in your proxy configuration. For Nginx, set `proxy_read_timeout` and `proxy_send_timeout` to a higher value (e.g. `3600s`). + + + + The Console tab only appears for users with the `admin` role on an Admiral-licensed instance. Verify both conditions are met. If you recently upgraded your license, you may need to refresh the page. + + diff --git a/docs/images/host-console/host-console-overview.png b/docs/images/host-console/host-console-overview.png index 864b3fcc54be902035c0c68ee522e1050d55d18e..2c2742f016f21199f3f616532bbfb3ecd3fd0911 100644 GIT binary patch literal 57254 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⪚oowc^y11O1VBKGi?t>yIhbP*(HQuPQW<7 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 diff --git a/frontend/src/components/HostConsole.tsx b/frontend/src/components/HostConsole.tsx index 34a69ed3..a94ff01a 100644 --- a/frontend/src/components/HostConsole.tsx +++ b/frontend/src/components/HostConsole.tsx @@ -11,6 +11,18 @@ interface HostConsoleProps { onClose: () => void; } +/** Build the xterm theme from CSS custom properties (resolved once per call). */ +function getTerminalTheme() { + const s = getComputedStyle(document.documentElement); + return { + background: s.getPropertyValue('--terminal-bg').trim(), + foreground: s.getPropertyValue('--terminal-fg').trim(), + cursor: s.getPropertyValue('--terminal-cursor').trim(), + cursorAccent: s.getPropertyValue('--terminal-cursor-accent').trim(), + selectionBackground: s.getPropertyValue('--terminal-selection').trim(), + }; +} + export default function HostConsole({ stackName, onClose }: HostConsoleProps) { const { activeNode } = useNodes(); const terminalRef = useRef(null); @@ -39,13 +51,7 @@ export default function HostConsole({ stackName, onClose }: HostConsoleProps) { let mounted = true; const term = new Terminal({ - theme: { - background: '#1e1e1e', - foreground: '#d4d4d4', - cursor: '#ffffff', - cursorAccent: '#000000', - selectionBackground: 'rgba(255, 255, 255, 0.3)', - }, + theme: getTerminalTheme(), fontFamily: "'Geist Mono', monospace", fontSize: 14, cursorBlink: true, @@ -154,10 +160,10 @@ export default function HostConsole({ stackName, onClose }: HostConsoleProps) { }, [stackName, cleanup]); return ( -
-
+
+
- + Host Console {activeNode && ( @@ -176,11 +182,14 @@ export default function HostConsole({ stackName, onClose }: HostConsoleProps) { )}
-
+
diff --git a/frontend/src/index.css b/frontend/src/index.css index 701c6ec5..0d574af7 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -142,6 +142,13 @@ --tracking-normal: 0em; --spacing: 0.25rem; + + /* Terminal (dark well even in light theme) */ + --terminal-bg: oklch(0.12 0 0); + --terminal-fg: oklch(0.85 0 0); + --terminal-cursor: oklch(1 0 0); + --terminal-cursor-accent: oklch(0 0 0); + --terminal-selection: oklch(1 0 0 / 0.3); } /* ───────────────────────────────────────────────────────────── @@ -271,6 +278,10 @@ --shadow-lg: 0px 4px 6px -1px hsl(0 0% 0% / 0.15); --shadow-xl: 0px 8px 10px -1px hsl(0 0% 0% / 0.20); --shadow-2xl: 0px 12px 20px -2px hsl(0 0% 0% / 0.30); + + /* Terminal (recessed well, matches page background) + --terminal-fg/cursor/selection: inherited from :root (both themes use a dark terminal) */ + --terminal-bg: oklch(0.08 0 0); } /* ─────────────────────────────────────────────────────────────