bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
4.8 KiB
4.8 KiB
AAMOS Ledger - Sprint 1 Säkerhetshårdning - Statusrapport
Sammanfattning
Sprint 1 påbörjades och stora delar är klara, men några kritiska säkerhetsfixar återstår.
✅ Klart
1. JWT Secrets (delvis)
- auth.mjs: Hårdkodad secret borttagen. Använder nu
process.env.AMOS_JWT_SECRET || process.env.JWT_SECRET - index.mjs: Hårdkodad secret borttagen. Använder nu env-variabler
- SECURITY.md: Dokumentation skapad
2. Internal Tokens
- auth.mjs: Hårdkodade interna tokens borttagna. Endast
process.env.LEDGER_INTERNAL_TOKEN
3. RBAC (delvis)
- auth.mjs: Full RBAC-implementering med roller: admin, accountant, viewer
- index.mjs: RBAC på viktiga endpoints:
- POST /api/ledger/accounts (admin, accountant)
- POST /api/ledger/journal (admin, accountant)
- POST /api/ledger/journal/:id/post (admin, accountant)
- POST /api/ledger/journal/:id/void (admin, accountant)
4. Säkerhetsheaders & Rate limiting
- helmet installerat och konfigurerat
- express-rate-limit installerat och konfigurerat (1000 req/15min i prod)
- CORS begränsat i production
5. Beroenden
zod,helmet,express-rate-limittillagda till package.json
❌ Kvar att göra (KRITISKT)
1. Hårdkodad secret i period-workflow.mjs (KRITISKT)
Fil: /opt/amos/services/aamos-ledger/period-workflow.mjs rad 24
// NU (osäkert):
const _JWT_SECRET = process.env.AMOS_JWT_SECRET || process.env.JWT_SECRET || 'y8Lf__vnWpImX2lxyPo3R0WYFEgCrtmQ3r8FcCwKjAWTNsLBKhaqIrP5oGAdt31E';
// BÖR VARA:
const _JWT_SECRET = process.env.AMOS_JWT_SECRET || process.env.JWT_SECRET;
// Kasta fel om JWT_SECRET saknas i production
if (process.env.NODE_ENV === 'production' && !_JWT_SECRET && !_ledgerPrivKey) {
throw new Error('AMOS_JWT_SECRET eller JWT_SECRET måste sättas i production');
}
2. RBAC saknas på flera endpoints
Följande endpoints har INTE RBAC-skydd:
| Endpoint | Metod | Status |
|---|---|---|
| /api/ledger/customers | POST | ❌ Oskyddad |
| /api/ledger/journal/:id/upload | POST | ❌ Oskyddad |
| /api/ledger/journal/:id/receipt | POST | ❌ Oskyddad |
| /api/ledger/journal/:id/receipts | GET | ❌ Oskyddad |
| /api/ledger/periods/:period/open | POST | ❌ Oskyddad |
| /api/ledger/periods/:period/submit-review | POST | ❌ Oskyddad |
| /api/ledger/periods/:period/approve | POST | ❌ Oskyddad |
| /api/ledger/periods/:period/reject | POST | ❌ Oskyddad |
| /api/ledger/periods/:period/close | POST | ❌ Oskyddad |
| /api/ledger/periods/:period/reopen | POST | ❌ Oskyddad |
Rekommenderade roller:
- POST /api/ledger/customers → requireRole(ROLES.ADMIN, ROLES.ACCOUNTANT)
- POST /api/ledger/journal/:id/upload → requireRole(ROLES.ADMIN, ROLES.ACCOUNTANT)
- POST /api/ledger/journal/:id/receipt → requireRole(ROLES.ADMIN, ROLES.ACCOUNTANT)
- POST /api/ledger/periods/* → requireRole(ROLES.ADMIN) (period-hantering = admin-only)
3. Zod-validering ej implementerad
Zod är importerat men inga valideringsscheman är skrivna.
Behövs för:
- POST /api/ledger/accounts (account_number, name, account_type, normal_balance)
- POST /api/ledger/journal (entry_date, description, lines-array)
- POST /api/ledger/customers (name, org_number, etc.)
- POST /api/ledger/periods/* (period, fiscal_year, reason)
4. Validering av JWT_SECRET i auth.mjs
auth.mjs kastar inte fel om JWT_SECRET saknas i production när RS256 inte används.
🔧 Fixar som behöver appliceras
Fix 1: period-workflow.mjs
sudo sed -i "s/const _JWT_SECRET = process.env.AMOS_JWT_SECRET || process.env.JWT_SECRET || 'y8Lf__vnWpImX2lxyPo3R0WYFEgCrtmQ3r8FcCwKjAWTNsLBKhaqIrP5oGAdt31E';/const _JWT_SECRET = process.env.AMOS_JWT_SECRET || process.env.JWT_SECRET;\n\n\/\/ Kasta fel om JWT_SECRET saknas i production\nif (process.env.NODE_ENV === 'production' \&\& !_JWT_SECRET \&\& !_ledgerPrivKey) {\n throw new Error('AMOS_JWT_SECRET eller JWT_SECRET måste sättas i production');\n}/" /opt/amos/services/aamos-ledger/period-workflow.mjs
Fix 2: Lägg till RBAC på period-workflow endpoints
I period-workflow.mjs, lägg till requireRole(ROLES.ADMIN) på alla period-endpoints.
Fix 3: Lägg till RBAC på återstående index.mjs endpoints
Lägg till requireRole(ROLES.ADMIN, ROLES.ACCOUNTANT) på:
- POST /api/ledger/customers
- POST /api/ledger/journal/:id/upload
- POST /api/ledger/journal/:id/receipt
📋 Verifiering
Efter fixar, testa:
cd /opt/amos/services/aamos-ledger
sudo systemctl restart aamos-ledger
sudo journalctl -u aamos-ledger -f
📁 Ändrade filer (från tidigare arbete)
| Fil | Status |
|---|---|
| auth.mjs | ✅ Härdad |
| index.mjs | ✅ Delvis härdad |
| period-workflow.mjs | ❌ Hårdkodad secret kvar |
| package.json | ✅ Zod/helmet/rate-limit tillagda |
| SECURITY.md | ✅ Skapad |