Files
boc/aamos-ledger-sprint1-status.md
T

118 lines
4.8 KiB
Markdown
Raw Normal View History

# 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 |