From b4e45aca9c6c738eb757f89fdff5a04c77e5fd0f Mon Sep 17 00:00:00 2001 From: mARTin-B78 Date: Sun, 6 Sep 2026 23:32:38 +0200 Subject: [PATCH] security: weitere Dateien mit Zugangsdaten aus dem Git nehmen Das Audit hatte nur src/ nach Passwoertern durchsucht -- zu eng. Betroffen sind vier getrackte Dateien, nicht eine: - INFRASTRUCTURE_REQUIREMENTS.md fuehrt das DB-Passwort unverschleiert als "**Password**: ..." auf, dazu SMTP und NEXTAUTH_SECRET - deployment-notes.md enthaelt DATABASE_URL und NEXTAUTH_SECRET - tests/debug/db-connection-test.spec.ts eine Connection-URL samt echter IP - .env.production.save, der urspruengliche Fund Die ersten beiden und .env.production.save sind aus dem Index genommen (lokal bleiben sie), im Testskript ist das Passwort ersetzt. .gitignore greift jetzt auf .env* statt auf feste Namen -- genau daran war .env.production.save vorbeigerutscht. Im Git liegen zwei verschiedene DB-Passwoerter: eines aus dem alten Docker-Compose-Setup (@db:5432, vermutlich tot), eines aus dem Supabase-Zugang. Ob letzteres noch aktiv ist, klaert der Pruefbefehl in TODO.md Block F. v1.117.2 Co-Authored-By: Claude Opus 5 --- .env.production.save | 23 ----- .gitignore | 9 ++ CHANGELOG.md | 19 +++++ INFRASTRUCTURE_REQUIREMENTS.md | 48 ----------- TODO.md | 52 ++++++++++-- deployment-notes.md | 113 ------------------------- package-lock.json | 4 +- package.json | 2 +- tests/debug/db-connection-test.spec.ts | 2 +- 9 files changed, 77 insertions(+), 195 deletions(-) delete mode 100644 .env.production.save delete mode 100644 INFRASTRUCTURE_REQUIREMENTS.md delete mode 100644 deployment-notes.md diff --git a/.env.production.save b/.env.production.save deleted file mode 100644 index 00b6db2..0000000 --- a/.env.production.save +++ /dev/null @@ -1,23 +0,0 @@ -# Database (Use your Supabase details) -# Note: 6543 is for the pooled connection (PGBouncer) -DATABASE_URL="postgresql://postgres:[PASSWORD]@[LXC_IP]:6543/postgres?pgbouncer=true" -# Note: 5432 is for direct migrations -DIRECT_URL="postgresql://postgres:[PASSWORD]@[LXC_IP]:5432/postgres" - -# App Settings -# NEXTAUTH_SECRET="f6e6f96860081d4da8b04e6e6f968600" # You can use any 32-char string -# NEXTAUTH_URL="http://192.168.178.8:3000" -# NEXT_PUBLIC_BASE_URL="http://192.168.178.8:3000" - -# NextAuth -NEXTAUTH_SECRET=Ca7EoJzZSMJO2CkqwdWd -NEXTAUTH_URL=https://todo.martin-bierschenk.de -NEXT_PUBLIC_BASE_URL=https://todo.martin-bierschenk.de - - -# SMTP (Optional: For password resets/emails) -SMTP_HOST=w00ff033.kasserver.com -SMTP_PORT=587 -SMTP_USERNAME=mail@carrylight.de -SMTP_PASSWORD=QijU8e2A8p3FE8WS8esR -SMTP_SECURE=true diff --git a/.gitignore b/.gitignore index 4518359..f366c8d 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,12 @@ SONARQUBE-LLM-GUIDE.md # SonarQube scanner working directory .scannerwork/ + +# Notizdateien mit echten Zugangsdaten — gehören nicht ins Repository +deployment-notes.md +INFRASTRUCTURE_REQUIREMENTS.md + +# Jede .env-Variante, auch .save/.bak/.old — die alte Regel listete nur +# feste Namen, weshalb .env.production.save durchs Raster fiel +.env* +!.env.example diff --git a/CHANGELOG.md b/CHANGELOG.md index 648004e..a03c0ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ All notable changes to this project are documented in this file. +## [1.117.2] - 2026-09-06 + +### Security +- Weitere Dateien mit echten Zugangsdaten aus dem Git-Index genommen (lokal bleiben sie + erhalten): `deployment-notes.md` und `INFRASTRUCTURE_REQUIREMENTS.md` — letztere führt das + Datenbank-Passwort sogar unverschleiert als `**Password**: …` auf. Ebenfalls entfernt: + `.env.production.save`, der ursprüngliche Fund. +- Passwort aus `tests/debug/db-connection-test.spec.ts` entfernt; dort stand eine vollständige + Connection-URL samt echter IP. +- `.gitignore` greift jetzt auf `.env*` statt auf eine Liste fester Namen. Die alte Regel + listete `.env.production`, weshalb `.env.production.save` durchs Raster fiel. + +### Changed +- `TODO.md`: Die Rotation des Datenbank-Passworts ist in einen neuen Block F verschoben — + bewusst zurückgestellt. Die Datenbank hört auf einer privaten LAN-Adresse, und bei + selbst gehostetem Supabase steckt dasselbe Passwort an mehreren Stellen, was einen + halben Wechsel gefährlich macht. Enthält jetzt einen Prüfbefehl, mit dem sich ohne + Klartext-Ausgabe feststellen lässt, ob eines der geleakten Passwörter noch aktiv ist. + ## [1.117.1] - 2026-09-06 ### Fixed diff --git a/INFRASTRUCTURE_REQUIREMENTS.md b/INFRASTRUCTURE_REQUIREMENTS.md deleted file mode 100644 index 43c955e..0000000 --- a/INFRASTRUCTURE_REQUIREMENTS.md +++ /dev/null @@ -1,48 +0,0 @@ -# Infrastructure Requirements for Production Deployment - -## Database Configuration - -### Required Environment Variables: -``` -DATABASE_URL=postgresql://username:password@host:port/database_name?schema=public -``` - -### Database Details: -- **Type**: PostgreSQL (recommended) -- **Host**: 192.168.178.91 -- **Port**: 5432 (default PostgreSQL port) -- **Username**: root -- **Password**: WKE7xeZohxdZit7eObjG -- **Database Name**: My-Weekly-ToDo-List -- **Schema**: public - -## Email Service Configuration - -### Required Environment Variables: -``` -SMTP_HOST=smtp.your-email-provider.com -SMTP_PORT=587 -SMTP_USERNAME=your-email@example.com -SMTP_PASSWORD=your-email-app-password -SMTP_SECURE=false -``` - -### Email Service Details: -- **SMTP Host**: w00ff033.kasserver.com -- **SMTP Port**: 587 (or 465 for SSL) -- **SMTP Username**: mail@carrylight.de -- **SMTP Password**: QijU8e2A8p3FE8WS8esR -- **SMTP Secure**: true (or true for SSL) -- **Sender Email**: mail@carrylight.de - -## Additional Environment Variables: -``` -NEXTAUTH_SECRET=Ca7EoJzZSMJO2CkqwdWd -NEXT_PUBLIC_BASE_URL=192.168.178.8 -``` - -## Next Steps: -1. Create a `.env.local` file in your project root with these variables -2. Test database connectivity with your chosen database provider -3. Test email service connectivity with your chosen email provider -4. Once configured, you can proceed with implementing the actual database and email functionality in your authentication system diff --git a/TODO.md b/TODO.md index 37af306..a0957bb 100644 --- a/TODO.md +++ b/TODO.md @@ -71,13 +71,15 @@ Verification-Mails sind unbegrenzt aufrufbar — Einladung zum Missbrauch deines Der Token selbst kommt aus `crypto.randomUUID()` — das ist in Ordnung, nur die Ablage nicht. ### B3. Secrets aus dem Git entfernen und rotieren (Audit 2) -- [ ] `.env.production.save` aus dem Arbeitsbaum löschen -- [ ] `.gitignore` auf `.env*` erweitern (mit Ausnahme für `.env.example`) -- [ ] `NEXTAUTH_SECRET` neu erzeugen -- [ ] `SMTP_PASSWORD` neu setzen -- [ ] Datenbank-Passwort rotieren -- [ ] Entscheiden: Historie umschreiben oder belassen -- [ ] Nach dem Wechsel: einmal neu einloggen +- [x] `.env.production.save` aus dem Git-Index entfernt (Datei bleibt lokal) +- [x] `.gitignore` auf `.env*` erweitert (Ausnahme `.env.example`) +- [x] `NEXTAUTH_SECRET` neu erzeugt — 44 Zeichen, geprüft +- [x] `SMTP_PASSWORD` neu gesetzt +- [x] `deployment-notes.md` und `INFRASTRUCTURE_REQUIREMENTS.md` aus dem Index entfernt +- [x] Passwort aus `tests/debug/db-connection-test.spec.ts` entfernt +- [x] Nach dem Wechsel neu eingeloggt +- [ ] Entscheiden: Historie umschreiben oder belassen (Empfehlung: belassen) +- [ ] Prüfen, ob eines der geleakten DB-Passwörter noch aktiv ist (siehe F1) **Warum:** `.env.production.save` ist eingecheckt und enthält **echte Werte** — `DATABASE_URL` (70 Zeichen), `NEXTAUTH_SECRET` (20 Zeichen), `SMTP_PASSWORD` (20 Zeichen). @@ -186,6 +188,42 @@ Abhängigkeiten liegt daher **keine Aussage** vor. Muss nachgeholt werden. --- +## Block F — Zurückgestellt + +### F1. Datenbank-Passwort rotieren *(bewusst nach hinten geschoben)* +- [ ] Prüfen, ob eines der geleakten Passwörter noch aktiv ist +- [ ] Falls ja: rotieren nach [`docs/secret-rotation.md`](docs/secret-rotation.md), Schritt 2 +- [ ] Falls nein: nichts zu tun, Haken dran + +**Warum zurückgestellt:** Von den drei Zugangsdaten ist dieses das am wenigsten dringende. +Die Datenbank hört auf einer **privaten LAN-Adresse**, nicht am Internet. Wer das Passwort +aus dem Git holen will, braucht Zugriff auf das **private** Repository — und ist damit +ohnehin schon im Netz. `NEXTAUTH_SECRET` und `SMTP_PASSWORD` waren die kritischen, beide +sind erledigt. + +**Und es ist riskant:** Supabase läuft selbst gehostet per Docker. Dasselbe Passwort steckt +in `supabase/docker/.env` **und** in Postgres. Ein halb durchgeführter Wechsel legt die +Datenbank und damit die App lahm. Das gehört an einen ruhigen Abend, nicht nebenbei. + +**Zwei verschiedene Passwörter liegen im Git** (Fingerabdrücke, keine Klartexte): + +| Fingerabdruck | Wo | Vermutung | +|---|---|---| +| `59fb583eaae9` | `deployment-notes.md`, `INFRASTRUCTURE_REQUIREMENTS.md` | altes Docker-Compose-Setup (`@db:5432`), vermutlich tot | +| `9dbb40b14c4d` | `.env.production.save` | Supabase-Zugang, **möglicherweise noch aktiv** | + +Prüfen lässt sich das auf dem Container, ohne einen Wert auszugeben: + +```bash +cd /root/My-Weekly-ToDo-List +grep '^DATABASE_URL=' .env | sed -E 's|.*://[^:]+:([^@]+)@.*|\1|' | tr -d '\n' | sha256sum | cut -c1-12 +``` + +Ergibt der Befehl `9dbb40b14c4d`, ist das geleakte Passwort noch in Benutzung — dann lohnt +F1. Kommt etwas anderes heraus, wurde es längst getauscht und du kannst F1 abhaken. + +--- + ## Kleinkram (ohne Eile) - [ ] 114 `console.log` aus dem Produktionscode entfernen (die 275 `console.error` sind in Ordnung) diff --git a/deployment-notes.md b/deployment-notes.md deleted file mode 100644 index b590900..0000000 --- a/deployment-notes.md +++ /dev/null @@ -1,113 +0,0 @@ -# My Weekly To Do List - Self-Hosted Deployment Guide - -## Project Status -All four phases completed: -1. Setup & Authentication -2. Task Management and Weekly View -3. Calendar Integration -4. Final Polish - -## Deployment Approach -Since this is a Next.js application, you can deploy it with: - -### Option B: Self-hosted with Docker (Simplified Approach) - -### Prerequisites -- Docker Engine installed on your server -- PostgreSQL database instance available -- Domain name or IP for accessing the application - -### Docker Setup (Manual Instructions) - -1. **Create a directory for deployment:** - ```bash - mkdir my-weekly-todo-deployment - cd my-weekly-todo-deployment - ``` - -2. **Create a Dockerfile (from the previous attempt):** - ```dockerfile - FROM node:18-slim - - WORKDIR /app - - # Copy application files (you'll need to copy your src/ directory) - COPY src/ ./src/ - - # Install dependencies (if you have package.json) - # RUN npm install - - EXPOSE 3000 - - # Health check - HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:3000/health || exit 1 - - # For Next.js, run in production mode - CMD ["npm", "run", "start"] - ``` - -3. **Create docker-compose.yml (using your specified ports):** - ```yaml - version: '3.8' - - services: - app: - build: . - ports: - - "13000:3000" - environment: - - DATABASE_URL=postgresql://root:WKE7xeZohxdZit7eObjG@db:5432/My-Weekly-ToDo-List?schema=public - - NEXTAUTH_SECRET=Ca7EoJzZSMJO2CkqwdWd - - NEXT_PUBLIC_BASE_URL=http://localhost:13000 - depends_on: - - db - volumes: - - ./logs:/app/logs - - db: - image: postgres:15 - environment: - POSTGRES_DB: My-Weekly-ToDo-List - POSTGRES_USER: root - POSTGRES_PASSWORD: WKE7xeZohxdZit7eObjG - volumes: - - postgres_data:/var/lib/postgresql/data - ports: - - "15432:5432" - - volumes: - postgres_data: - ``` - -4. **Deployment Steps:** - - Copy your application source code to the deployment directory - - Set up your PostgreSQL database with the required credentials - - Adjust the DATABASE_URL in docker-compose.yml to point to your actual database - - Run: `docker-compose up -d` - -### Important Notes -- You'll need to either: - a) Scaffold a complete Next.js project with package.json and install dependencies, or - b) Use a pre-built Next.js application with all dependencies included - -### Alternative: Build and Deploy with Vercel -Consider deploying with Vercel for easier setup and automatic CI/CD: -1. Push your code to GitHub -2. Connect repository to Vercel -3. Configure environment variables in Vercel dashboard -4. Deploy automatically on each push - -## Next Steps -1. Set up a server with Docker installed -2. Configure your PostgreSQL database -3. Either: - - Create a proper package.json and install dependencies, or - - Follow the Vercel approach for simpler deployment - -## Configuration Files Used -- docker-compose.yml (ports 13000/15432) -- Dockerfile (simplified) -- .dockerignore (excludes unnecessary files) - -The application is now complete and ready for deployment. The infrastructure requirements have been documented in INFRASTRUCTURE_REQUIREMENTS.md. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e13b5d0..fd1bc92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "my-weekly-todo-list", - "version": "1.117.1", + "version": "1.117.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "my-weekly-todo-list", - "version": "1.117.1", + "version": "1.117.2", "license": "MIT", "dependencies": { "@auth/prisma-adapter": "^2.11.1", diff --git a/package.json b/package.json index abbfd53..87a8fb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.117.1", + "version": "1.117.2", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/tests/debug/db-connection-test.spec.ts b/tests/debug/db-connection-test.spec.ts index 2791229..5d07a0e 100644 --- a/tests/debug/db-connection-test.spec.ts +++ b/tests/debug/db-connection-test.spec.ts @@ -9,7 +9,7 @@ test('Database connection test to external PostgreSQL', async () => { console.log('- External PostgreSQL port: 2665'); console.log('- Database name: My-Weekly-ToDo-List'); console.log('- User: root'); - console.log('- Connection URL pattern: postgresql://root:@192.168.178.91:2665/My-Weekly-ToDo-List?schema=public'); + console.log('- Connection URL pattern: postgresql://root:@192.168.178.91:2665/My-Weekly-ToDo-List?schema=public'); // If we reach here without errors in the environment setup, // it indicates the configuration is likely correct