# 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-limit` tillagda 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 ```javascript // 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 ```bash 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: ```bash 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 |