CIMBORA

CIMBORA

🔓 LUKS: Ej monterat
🔑 SSH: Stängd

Totalt antal företag

-

Händelser idag 📋

-

Klicka för att visa logg

Väntande ansökningar 📝

-

Klicka för att visa ansökningar

🏥 Server Hälsa

Laddar...

💾 Lagringsutrymme

Laddar...

📝 Nya Ansökningar

Granska och hantera inkommande ansökningar

Laddar...

🔄 Applikationer & Tjänster

Laddar...

ℹ️ Server Hälsa och Lagringsutrymme har flyttats till Översikt-fliken för snabbare åtkomst.

👥 Kunder

Laddar...

🔐 USB-säkerhet

RSA-2048 Challenge-Response Authentication

📟 Server USB Status

Real-time monitoring • Auto-refresh: 5s

Kontrollerar...
-
Mount Status
⏳ Laddar...
Aktiva Sessioner
0
Mount Path
-
💡 Kitchen Security v1 - Security Through Obscurity:
  1. Välj kund från dropdown
  2. Välj 2 olika recept (ACCESS och UNLOCK)
  3. Klicka "🔑 Generera Customer USB"
  4. 2 keypairs genereras på servern
  5. ~50,000 fake receptfiler genereras
  6. 2 riktiga USB-nycklar gömms bland fake-recepten
  7. Allt packas i en ZIP (~150-200 MB)
  8. Kunden packar upp ZIP:en på sitt USB-minne
  9. Endast kunden vet vilka 2 av 50,000 filer som är riktiga nycklar!

🔒 Security: En angripare som stjäl USB:et måste söka igenom 50,000 filer för att hitta nycklarna

Registrerade enheter

Laddar...

📚 Systemdokumentation

Komplett dokumentation för Cimbora Admin-systemet

📖

Systemdokumentation

Alla markdown-dokument från /docs/-mappen

Laddar dokumentation...

📋 Session 2025-11-30: Emergency Recovery LOCKOUT FIX

🚨 Vad som hände

SuperAdmin låstes ute från admin-panelen. Gamla USB-nyckeln fungerade inte längre. Ingen inloggning, ingen SSH-åtkomst. Total lockout i ~2 timmar.

Root cause: USB-nycklarna hade genererats men filformateringen blev korrupt vid nedladdning.

✅ Vad som faktiskt byggdes

🖥️ CLI Generator för SuperAdmin USB

node generate-superadmin-usb.js 31 32 33
Genererar 3 RSA-2048 keypairs (LOGIN, MOUNT, SUPPORT) och sparar till /tmp/superadmin-usb/

🔑 LOGIN-nyckel fungerar

Fil: Chilimarinerade_Tiger_Rakor.txt
Användning: Logga in på admin-panelen (2FA)
Status: ✅ TESTAD & FUNGERAR

🗝️ Backend-kod för keypair validation

Device type validation implementerad (SuperAdmin Login, Mount, Support)
Endpoints skapade men inte fullständigt testade

🔥 Emergency Recovery System

Backend emergency download-endpoints + troubleshooting-dokumentation
Räddade situationen när user var utlåst

❌ Vad som INTE är klart

  • Support Panel UI: Finns inte i admin-panelen (planerad imorgon)
  • LUKS Support DB: Backend-kod finns men ej testad med faktisk LUKS mount
  • MOUNT-nyckel: Genererad men aldrig testad för SSH/Server USB mount
  • SUPPORT-nyckel: Genererad men ingen UI att använda den i
  • USB Downloads UI: Endpoints finns men inte komplett UI i Documentation

🎯 Nästa steg (imorgon)

1. Bygga Support-sektionen

UI för att se alla användares receptval med Keypair #3-autentisering

2. Testa MOUNT & SUPPORT-nycklar

Verifiera att alla 3 keypairs fungerar som planerat

3. Integrera recept-systemet

Kitchen Security v1 - verifiera att kunder kan generera USB-nycklar

🔥 Troubleshooting Debakel 2025-11-30 POST-MORTEM

🚨 INCIDENT SUMMARY

Problem: SuperAdmin utlåst från admin-panelen efter generering av nya USB-nycklar.
Impact: Total access lockout - ingen inloggning, ingen SSH.
Duration: ~2 timmar troubleshooting.
Root Cause: Claude Chat lade till extra whitespace i PEM-nycklar vid artifact-generering.

📖 KRONOLOGI

00:00 - Problem upptäckt

User rapporterar: "i cant get into cimbora admin whit OG stick!"
Gamla USB-nyckeln fungerar inte längre efter systemuppdatering.

00:15 - Försök 1: Nginx Emergency Route

Plan: Lägg USB-nycklar på cimbora.se/emergency
Blocker: Kan inte editera /var/www/cimbora.se/index.html (EACCES permission denied)
Status: ❌ FAILED

00:30 - Försök 2: Backend Emergency Endpoint

Plan: Skapa /emergency route i backend + HTML download-sida
Implementation: emergency-download.html + /api/usb/download-temp/:filename
Blocker: User saknar sudo för nginx-reload (twilight zone)
Status: ❌ FAILED (route ej tillgänglig utan nginx-config)

00:45 - Försök 3: Manual Copy-Paste

Plan: Read filerna och ge innehållet direkt i chat
Implementation: Läste alla 3 USB-filer (86 lines each)
Result: User fick alla 3 nycklar via copy-paste
Status: ✅ FILES DELIVERED

01:00 - Försök 4: Claude Chat Artifacts

Plan: Skapa prompt för Claude Chat att generera nedladdningsbara artifacts
Implementation: User pastade innehållet i Claude Chat
Result: Artifacts skapade, men... "dem funka inte"
Status: ❌ FAILED

01:15 - ROOT CAUSE IDENTIFIED

Console logs revealed:
• LOGIN key: PEM length 2008 bytes → Binary 1506 bytes ❌
• MOUNT key: PEM length 2082 bytes → Binary 1561 bytes ❌
• SUPPORT key: PEM length 1624 bytes → Binary 1218 bytes ✅

SUPPORT-nyckeln fungerade! Men den var fel typ (Support, inte Login).
Detta bevisade att filformatet var korrekt när det laddades rätt.

01:30 - LÖSNING: Direct Backend Download

Plan: Skippa Claude Chat - serve originalfilerna direkt från backend
Implementation:
1. Skapade download-usb-keys.html (snygg UI med grönt tema)
2. Lade till /download-keys route i backend
3. Länkade direkt till /api/usb/download-temp/:filename
4. User gick till https://admin.cimbora.se/download-keys
5. Laddade ner ORIGINALNYCKLARNA från /tmp/superadmin-usb/

✅ SUCCESS! User loggade in!

🔬 TEKNISK ANALYS

Problem med Claude Chat Artifacts:

  • Claude Chat lägger till extra whitespace vid artifact-generering
  • PEM-nycklar får inkonsistent line-wrapping
  • Base64-decoding fungerar men resulterar i korrupt binary data
  • Web Crypto API:s importKey() får DataError vid import

Varför originalfilerna fungerade:

  • Genererade server-side med Node.js crypto module
  • Korrekt PKCS#8 format med standard 64-char line wrapping
  • Ingen mellanhands-formatering (direct binary → base64 → PEM)
  • RSA-2048 privata nycklar = exakt 1218 bytes i binary

🐛 DEBUGGINGVERKTYG SOM HJÄLPTE

// parseUSBPackage - Enhanced with logging
console.log('Parsed USB Package:', { serialNumber, privateKeyLength });

// signChallengeWithPrivateKey - Step-by-step debugging
console.log('PEM contents length after cleanup:', pemContents.length);
console.log('Binary key length:', binaryKey.length);
console.log('Key imported successfully');

Key insight: Logging binary key length avslöjade att LOGIN/MOUNT hade ~300 extra bytes jämfört med SUPPORT.

📚 LESSONS LEARNED

1. Trust the originals

När debugging kryptografiska nycklar - gå alltid tillbaka till originalfilerna. Varje mellanhand (copy-paste, artifacts, formatering) kan introducera corruption.

2. Binary length är diagnostiskt guld

RSA-2048 PKCS#8 nycklar har förutsägbar binary-storlek (~1218 bytes). Om storleken är off = något är korrupt.

3. Emergency access is critical

Ha alltid en backup-plan för lockout scenarios. Backend emergency-endpoints räddade situationen trots nginx-begränsningar.

4. Log everything during auth failures

Detaljerad logging i varje steg av RSA-signaturen (PEM parse → base64 decode → binary import → sign) gjorde root cause-analysen möjlig.

5. Test one key type at a time

Att SUPPORT-nyckeln fungerade (men LOGIN/MOUNT inte) bevisade att problemet var file-specifikt, inte systemiskt.

✅ RESOLUTION

Åtgärd: Serverade originalnycklar direkt från backend via /download-keys endpoint
Verifiering: User loggade in med LOGIN-nyckel (Chilimarinerade_Tiger_Rakor.txt)
SSH Access: Återställd ✅
Cleanup: Raderade /tmp/superadmin-usb/ + emergency endpoints
Status: RESOLVED

"we have a problem! i cant get into cimbora admin whit OG stick!" → "nu är jag inne i admin igen!" 🎉

Total troubleshooting time: ~2 hours | Solutions attempted: 5 | Success rate: 100% (eventually)

📅 Session-historik

⚡ Snabbnavigering

📋 Session Summary (NYA!) 🔐 USB Security System 🔐 2FA & Tiered Security 🏗️ Arkitektur ⚡ Quick Create Guide 🔓 Remote Mount 🛡️ Säkerhetsfunktioner ⚙️ API Reference 📊 Systemhändelser 🔧 Felsökning
📅 Senast uppdaterad: 2025-11-26 | Version: 1.1.0

🔐 USB Security System

Översikt

Cimbora Admin använder ett tvåskiktat USB-säkerhetssystem som kombinerar fysisk hårdvara med RSA-2048 kryptografisk autentisering. Systemet ger säker åtkomst till serverns lagringsyta genom challenge-response-mekanismer.

Tvåskiktat System

📱 Remote USB (Användare)
  • Användarens fysiska USB-enhet
  • Innehåller privat RSA-nyckel
  • Används för autentisering
  • Kan vara var som helst i världen
💾 Server USB (Fysisk)
  • Kingston DataTraveler 230.9GB
  • Monterad i servern (/dev/sda1)
  • Innehåller krypterad data
  • Monteras efter autentisering

Hur det fungerar

  1. Användare begär åtkomst - Öppnar Mount USB-modal i admin-panelen
  2. Laddar USB Package - Väljer sin USB Package-fil från lokal USB
  3. Challenge begärs - Servern genererar en unik challenge-sträng
  4. Signering (klient-sida) - Webbläsaren signerar challenge med privat nyckel
  5. Verifiering - Servern verifierar signatur med offentlig nyckel
  6. Mount - Vid godkänd verifiering monteras server-USB:n
  7. Session skapas - 30-minuters session med automatisk timeout

Åtkomstnivåer

👑 SuperAdmin
  • Full åtkomst till hela USB:n
  • Monteras till: /mnt/cimbora-secure
  • Kan se alla kunders data
  • System-administrationsbehörigheter
👤 Kund
  • Isolerad åtkomst till egen mapp
  • Monteras till: /mnt/cimbora-customers/{slug}
  • Bind mount från USB-undermapp
  • Kan INTE se andra kunders data

🔐 2FA Login & Tiered Security

Two-Factor Authentication (2FA)

Cimbora Admin kräver BÅDE lösenord OCH SuperAdmin USB för att logga in. Detta ger maximal säkerhet för admin-panelen.

Inloggningsflöde:
  1. Steg 1: Lösenord - Användare anger email + lösenord
  2. Validering - Lösenord verifieras mot bcrypt hash i database
  3. Pending Session - Temporary session skapas (5 min timeout)
  4. Steg 2: USB - USB challenge-response krävs
  5. SuperAdmin Check - Endast SuperAdmin USB tillåts för login
  6. JWT Token - Vid godkänd 2FA utfärdas JWT token
  7. Dashboard Access - Användare är inloggad
⚠️ Säkerhetsnotering:

Login kräver SuperAdmin USB men monterar INTE automatiskt server USB. Mount är en separat operation efter login.

Tiered Security Model

Data är uppdelad i två säkerhetsnivåer baserat på känslighet. Detta ger proportionell säkerhet och bättre UX.

🟢 Tier 1: Översikt

INGEN USB krävs

  • /api/dashboard - Aggregate stats
  • /api/system/info - Server health
  • Bara COUNT och metrics
  • Ingen PII eller känslig data
  • Snabb hälsokoll utan friktion
🔒 Tier 2: Känslig Data

USB KRÄVS

  • /api/customers - Kundlistor
  • /api/applications - Ansökningar
  • /api/onboarding - Företagsdetaljer
  • /api/events - Event logs
  • /api/maintenance/* - Detaljerad info

Backend Verification

// USB mount verification middleware
const requireUSBMount = async (req, res, next) => {
  // Check if there's an active SuperAdmin USB session
  const activeSessions = usbSecurity.listActiveSessions();
  const hasActiveSession = activeSessions.some(session =>
    session.businessId === 4 && session.isSuperAdmin
  );

  if (!hasActiveSession) {
    return res.status(403).json({
      error: 'USB måste vara mountad',
      requiresUSBMount: true
    });
  }
  next();
};

// Tier 2 endpoints protected with middleware
app.get('/api/customers', authMiddleware, requireUSBMount, handler);
              

Användningsfall

✅ Scenario 1: Snabb Status Check

Admin loggar in (2FA) → Ser Dashboard stats → Ingen USB mount behövs → Snabb översikt klar

✅ Scenario 2: Arbeta med Kunddata

Admin loggar in (2FA) → Försöker se kunder → Får 🔒 meddelande → Mountar USB → Full åtkomst

✅ Scenario 3: Demo för Kund

Admin visar kund systemet → Försöker se deras data → Måste mounta USB först → Kund SER säkerheten i praktiken

🏗️ Teknisk Arkitektur

Komponentöversikt

┌─────────────────────────────────────────────────────────────┐
│                    ANVÄNDARE (Remote)                       │
│  ┌───────────────┐          ┌──────────────────┐          │
│  │  Webbläsare   │          │  Fysisk USB      │          │
│  │  (Admin UI)   │◄────────►│  (Private Key)   │          │
│  └───────┬───────┘          └──────────────────┘          │
└──────────┼─────────────────────────────────────────────────┘
           │
           │ HTTPS (Challenge-Response)
           │
┌──────────▼─────────────────────────────────────────────────┐
│                    BACKEND SERVER                           │
│  ┌────────────────────────────────────────────────────┐    │
│  │  server.js (Express)                               │    │
│  │  • API Endpoints                                   │    │
│  │  • Authentication Middleware                       │    │
│  └────────┬──────────────────────────┬────────────────┘    │
│           │                          │                      │
│  ┌────────▼──────────┐      ┌───────▼──────────────┐      │
│  │  usb-security.js  │      │  PostgreSQL Database │      │
│  │  • Challenge Gen  │      │  • usb_devices       │      │
│  │  • Verification   │      │  • usb_sessions      │      │
│  │  • Mount/Unmount  │      │  • businesses        │      │
│  └────────┬──────────┘      └──────────────────────┘      │
└───────────┼─────────────────────────────────────────────────┘
            │
            │ sudo mount
            │
┌───────────▼─────────────────────────────────────────────────┐
│              FYSISK SERVER USB                              │
│  ┌────────────────────────────────────────────────────┐    │
│  │  /dev/sda1 (Kingston DataTraveler 230.9GB)        │    │
│  │  ├─ /mnt/cimbora-secure/ (SuperAdmin)             │    │
│  │  └─ /mnt/cimbora-secure/customers/{slug}/ (Kund)  │    │
│  └────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘
              

Nyckelteknologier

Web Crypto API

Klient-sidig kryptografi för nyckelgenerering och signering

RSA-2048

RSASSA-PKCS1-v1_5 med SHA-256 för signering

sudoers

Passwordless mount för cimbora-användaren

Bind Mounts

Isolering av kunders mappar

Databasschema

-- USB Devices Table
CREATE TABLE usb_devices (
  id SERIAL PRIMARY KEY,
  business_id INTEGER REFERENCES businesses(id),
  device_type VARCHAR(50) NOT NULL,
  serial_number VARCHAR(100) UNIQUE NOT NULL,
  public_key TEXT NOT NULL,
  is_super_admin BOOLEAN DEFAULT FALSE,
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW(),
  revoked_at TIMESTAMP
);

-- USB Sessions Table (in-memory via Map)
{
  sessionId: string,
  businessId: number,
  deviceId: number,
  businessName: string,
  isSuperAdmin: boolean,
  mountPoint: string,
  mountPath: string,
  mountedAt: timestamp,
  lastActivity: timestamp
}

⚡ Quick Create USB - Steg för Steg

🎯 Syfte: Skapa en ny USB-säkerhetsenhet för en kund eller SuperAdmin på under 30 sekunder

Förberedelser

  • Ha en fysisk USB-enhet redo (minst 1GB)
  • Vara inloggad i admin-panelen
  • Ha kundens information tillgänglig

Genomförande

  1. Gå till USB-säkerhet
    Klicka på 🔐 USB-säkerhet i navigeringsmenyn
  2. Välj kund
    Välj kund från dropdown-menyn (eller välj "Cimbora Admin" för SuperAdmin)
  3. Klicka Quick Create
    Klicka på ⚡ Quick Create USB knappen
  4. Vänta på generering
    Systemet genererar RSA-2048 keypair i din webbläsare (tar 2-5 sekunder)
  5. Ladda ner USB Package
    Filen {namn}-usb-package.txt laddas ner automatiskt
  6. Kopiera till fysisk USB
    Flytta den nedladdade filen till kundens fysiska USB-enhet
  7. Leverera USB
    Ge USB:n till kunden tillsammans med instruktioner

Vad innehåller USB Package?

  • 📋 Enhetsinformation (ID, serienummer, företag)
  • 🔑 Public Key (registrerad i systemet)
  • 🔐 Private Key (⚠️ hemlig, används för autentisering)
  • 📖 Användningsinstruktioner
  • 🛡️ Säkerhetsriktlinjer
  • 🔗 API-exempel för CLI-användning

Säkerhetsnoteringar

  • Private key genereras ENDAST i webbläsaren (Web Crypto API)
  • Private key skickas ALDRIG till servern
  • Endast public key sparas i databasen
  • USB Package-filen innehåller känslig information - hantera varsamt
  • Radera USB Package från Downloads-mappen efter överföring till USB

🔓 Remote Mount - Användarguide

🎯 Syfte: Montera server-USB från valfri plats i världen via webbläsaren

För Slutanvändare

  1. Anslut din USB
    Sätt in din fysiska USB med USB Package-filen
  2. Öppna Admin UI
    Gå till https://admin.cimbora.se och logga in
  3. Klicka Mount USB
    Klicka på 🔓 Mount USB i övre högra hörnet
  4. Välj USB Package
    Klicka "Choose File" och välj din USB Package-fil från USB:n
  5. Vänta på autentisering
    Systemet utför automatiskt challenge-response-autentisering (2-3 sekunder)
  6. Åtkomst beviljad!
    Du ser nu din session-info och mount-sökväg

Session-hantering

  • Timeout: Sessioner löper ut efter 30 minuter inaktivitet
  • Countdown: Se återstående tid i USB-säkerhets-fliken
  • Förläng: All aktivitet (API-anrop, filåtkomst) återställer timern
  • Unmount: Klicka "Unmount" i sessionskortet för manuell avmontering
  • Auto-cleanup: Automatisk avmontering vid server-omstart

Status-övervakning

Gå till 🔐 USB-säkerhet för att se real-time status:

Mount Status

✓ Mounted / ✗ Not Mounted

Aktiva Sessioner

Antal användare inloggade

Mount Path

Serverns mount-sökväg

Countdown

Återstående sessionstid

🛡️ Säkerhetsfunktioner

Zero-Trust Arkitektur

  • Klient-sidig kryptografi: Alla känsliga operationer sker i webbläsaren
  • Private keys aldrig på servern: Genereras och förblir i användarens kontroll
  • Challenge-Response: Varje autentisering använder en unik, tidsbegränsad challenge
  • JWT Token Auth: Admin UI-åtkomst skyddad med JSON Web Tokens

Kryptografiska Specifikationer

Algorithm RSA-2048
Signature Scheme RSASSA-PKCS1-v1_5
Hash Function SHA-256
Challenge Format 32-byte hex string (crypto.randomBytes)
Challenge Timeout 60 sekunder
Session Timeout 30 minuter

Åtkomstkontroll

Filesystem-nivå
  • Bind mounts för kundisolering
  • Permissions: 700 (endast owner)
  • sudoers passwordless mount
Applikations-nivå
  • JWT authentication middleware
  • Business ID-baserad auktorisering
  • Session-validering per request

Audit Logging

Alla USB-relaterade händelser loggas i system_events tabellen:

  • usb_device_created - Ny USB-enhet registrerad
  • usb_device_revoked - USB-enhet revokerad
  • usb_mounted - Server-USB monterad
  • usb_unmounted - Server-USB avmonterad
  • challenge_requested - Autentiseringsförsök
  • challenge_failed - Misslyckad autentisering

⚙️ API Reference

Authentication

POST /api/auth/login

Admin UI login

Request Body
{
  "username": "admin",
  "password": "password"
}
Response
{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

USB Devices

GET /api/usb/devices

List all USB devices (requires JWT)

Response
{
  "devices": [
    {
      "id": 1,
      "business_id": 4,
      "business_name": "Cimbora Admin",
      "device_type": "Kingston DataTraveler",
      "serial_number": "SA-001",
      "is_super_admin": true,
      "status": "active",
      "created_at": "2025-11-25T..."
    }
  ]
}
POST /api/usb/devices

Register new USB device (requires JWT)

Request Body
{
  "business_id": 4,
  "device_type": "Kingston DataTraveler",
  "serial_number": "SA-001",
  "public_key": "-----BEGIN PUBLIC KEY-----\n...",
  "is_super_admin": true
}

Challenge-Response

POST /api/usb/challenge

Request authentication challenge (no auth required)

Request Body
{
  "serial_number": "SA-001"
}
Response
{
  "success": true,
  "challenge_id": "abc123...",
  "challenge": "d4e5f6..."
}

Mount/Unmount

POST /api/usb/mount

Mount server USB after authentication (no JWT, uses challenge-response)

Request Body
{
  "challenge_id": "abc123...",
  "signature": "base64_signature..."
}
Response
{
  "success": true,
  "sessionId": "session123...",
  "mountPath": "/mnt/cimbora-secure",
  "isSuperAdmin": true,
  "businessId": 4,
  "deviceId": 1
}
POST /api/usb/unmount

Unmount server USB (no auth required, uses session_id)

Request Body
{
  "session_id": "session123..."
}
GET /api/usb/sessions

List active mount sessions (requires JWT)

Response
{
  "sessions": [
    {
      "sessionId": "session123...",
      "businessId": 4,
      "deviceId": 1,
      "businessName": "Cimbora Admin",
      "isSuperAdmin": true,
      "mountPath": "/mnt/cimbora-secure",
      "mountedAt": 1732552800000,
      "lastActivity": 1732552850000,
      "timeoutMinutes": 30
    }
  ]
}

📊 Systemhändelser (Live Log)

Real-time loggning av alla systemhändelser

Laddar händelser...

🔧 Felsökning

Problem: Mount Failed - Permission Denied

Symptom: Fel vid montering: "must be superuser to use mount"

Orsak: sudoers-konfiguration saknas eller är felaktig

Lösning:

  1. Kontrollera att /etc/sudoers.d/cimbora-usb existerar
  2. Verifiera permissions: sudo ls -la /etc/sudoers.d/ (ska vara 440)
  3. Validera syntax: sudo visudo -c
  4. Om problemet kvarstår, återskapa filen från dokumentation

Problem: Challenge-Response Failed

Symptom: "Authentication failed" vid mount-försök

Möjliga orsaker:

  • Fel USB Package-fil (fel private key)
  • Korrupt eller modifierad nyckel
  • USB-enheten har revokats
  • Challenge har löpt ut (60 sekunder)

Lösning:

  1. Verifiera att rätt USB Package används
  2. Kontrollera enhetsstatus i USB-säkerhet-fliken
  3. Om enheten är revoked, skapa en ny med Quick Create
  4. Försök igen med ny challenge

Problem: Session Timeout

Symptom: Session avslutas oväntat, USB avmonteras

Orsak: 30-minuters inaktivitet

Lösning:

  • Montera USB igen via Mount USB-knappen
  • För att förlänga session: utför API-anrop eller filåtkomst regelbundet
  • Övervaka countdown-timer i USB-säkerhet-fliken

Problem: Web Crypto API Error

Symptom: Keypair-generering eller signering misslyckas

Orsak: Webbläsaren stöder inte Web Crypto API eller använder HTTP istället för HTTPS

Lösning:

  • Använd modern webbläsare (Chrome 60+, Firefox 64+, Safari 11+)
  • Säkerställ att admin UI körs över HTTPS
  • Kontrollera att window.crypto.subtle är tillgängligt
  • Om du testar lokalt, använd localhost (Web Crypto fungerar över HTTP på localhost)

📝 Versionshistorik

Version 1.1.0 - 2FA & Tiered Security

2025-11-26
  • 🔐 2FA Login - Kräver lösenord + SuperAdmin USB för inloggning
  • 🎯 Tiered Security Model - Skiktad åtkomst baserat på datakänslighet
  • 🟢 Tier 1: Översikt - Dashboard och system stats utan USB-krav
  • 🔒 Tier 2: Känslig Data - Kunddata kräver mountad USB
  • 🛡️ Backend Verification - requireUSBMount middleware för alla känsliga endpoints
  • Auto-reload - Data laddas automatiskt efter mount/unmount
  • 📊 USB Status Indicator - Live status för fysisk server USB
  • 🔓 Session Management - Unmount-knappar i USB-säkerhet tab
  • 📝 Proportionell Säkerhet - Lås bara det som behöver skyddas
  • 🎨 Förbättrad UX - Tydliga 🔒 meddelanden och Mount USB-knapp

Version 1.0.0

2025-11-25
  • ✨ Initial release av USB Security System
  • 🔐 RSA-2048 Challenge-Response authentication
  • ⚡ Quick Create USB functionality
  • 🔓 Remote USB mount via webbläsare
  • 📱 Client-side keypair generation (Web Crypto API)
  • 👑 SuperAdmin och Customer åtkomstnivåer
  • 📊 Real-time USB status monitoring
  • ⏱️ Session management med 30-min timeout
  • 🛡️ Zero-trust security architecture
  • 📝 System events audit logging

🚀 Projekt & Sandbox Miljöer

Laddar projekt...

💼 Ekonomi

Laddar kunder...

💰 Fakturor - Skedmat-A.P

Laddar fakturor...

📥 Inkommande Fakturor

Laddar inkommande fakturor...