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
118 lines
4.8 KiB
Markdown
118 lines
4.8 KiB
Markdown
# 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 |
|