Compare commits
10 Commits
9193d3380a
...
c2ec78b55e
| Author | SHA1 | Date | |
|---|---|---|---|
| c2ec78b55e | |||
| da67da3959 | |||
| 688ff3d4d7 | |||
| ada697c7d0 | |||
| 486a28f165 | |||
| 4c0740fd21 | |||
| 4e43fdee0c | |||
| d5b4a7caac | |||
| a1768a9a6f | |||
| d8c5ccc997 |
4
.env
4
.env
@@ -7,3 +7,7 @@ CRUMB_API_TOKEN="changeme"
|
||||
CRUMB_SSH_USER="admin"
|
||||
CRUMB_SCP_TARGET="backup.crumbforest.de:/var/backups"
|
||||
|
||||
|
||||
# Vektor DB (Qdrant)
|
||||
CRUMB_QDRANT_URL="http://localhost:6333"
|
||||
CRUMB_QDRANT_KEY=""
|
||||
|
||||
185
CLAUDE.md
Normal file
185
CLAUDE.md
Normal file
@@ -0,0 +1,185 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
**Crumbpages v2** is a documentation and learning system for system administration, combining educational content with operational tooling. The project uses the "Crumbforest" metaphor - representing knowledge as a forest where "Krümels" (crumbs) guide learners through admin paths.
|
||||
|
||||
This is a **bash-centric repository** focused on documentation and shell scripting for system operations, SSH security automation, and API tooling for the broader Crumbforest infrastructure.
|
||||
|
||||
## Core Philosophy
|
||||
|
||||
The "Waldwächter" (Forest Guardian) approach emphasizes:
|
||||
- **Transparency over magic** - Clear, readable code that can be explained to learners
|
||||
- **Simplicity over complexity** - Minimal dependencies, straightforward patterns
|
||||
- **Education-first** - All tools should be teachable and understandable
|
||||
- **Security by default** - Automated security practices, especially around SSH
|
||||
|
||||
See `crumbforest-manifesto-guardian.md` for the full philosophy.
|
||||
|
||||
## Repository Structure
|
||||
|
||||
### Documentation (Crumbpages)
|
||||
Educational documentation organized as numbered "paths" (`crumbpage-XX-*.md`):
|
||||
- 20 crumbpages covering Linux fundamentals through advanced topics
|
||||
- Template-based structure for consistency (`crumbpage-template.md`)
|
||||
- Each page includes: concepts, hands-on exercises, troubleshooting, skill checks
|
||||
- Progressive learning path from basic user management to kernel operations
|
||||
|
||||
### Operational Scripts
|
||||
Three main shell scripts provide system tooling:
|
||||
|
||||
1. **`crumbpages-doktor.sh`** (496 lines) - Main diagnostic and operational tool
|
||||
2. **`ssh-agent-guard.sh`** (68 lines) - Production SSH security daemon
|
||||
3. **`ssh-agent-screenlock_v4.sh`** (67 lines) - MATE desktop SSH integration
|
||||
|
||||
### Meta Documentation
|
||||
- `CRUMBFOREST_PROJECT_INDEX.md` - Complete project history and milestone tracking
|
||||
- `HANDBUCH.md` - crumbpages-doktor.sh manual
|
||||
- `QUICKSTART.md` - Quick reference for common operations
|
||||
- Various tagebuch (diary) files tracking problem-solving journeys
|
||||
|
||||
## Common Commands
|
||||
|
||||
### Running the Main Tool
|
||||
```bash
|
||||
# Make executable (first time)
|
||||
chmod +x crumbpages-doktor.sh
|
||||
|
||||
# Launch interactive menu
|
||||
./crumbpages-doktor.sh
|
||||
```
|
||||
|
||||
The doktor script provides 6 modules:
|
||||
1. **Git Workstation** - Interactive git shell with health checks
|
||||
2. **DNS Doktor** - DNS diagnostics and reporting
|
||||
3. **System Doktor** - Host vitals (disk, RAM, OS info)
|
||||
4. **Web Tools** - API testing (`api_search`, `api_get`, `api_ask`)
|
||||
5. **Remote Tools** - SSH helpers and SCP uploads
|
||||
6. **Werkzeugkasten** - Tool availability checks
|
||||
|
||||
### SSH Security Scripts
|
||||
```bash
|
||||
# Start SSH agent guard (systemd/autostart)
|
||||
./ssh-agent-guard.sh
|
||||
|
||||
# For MATE desktop integration
|
||||
./ssh-agent-screenlock_v4.sh
|
||||
```
|
||||
|
||||
Both scripts automatically:
|
||||
- Kill and restart ssh-agent on screen lock
|
||||
- Write to `~/.ssh-agent-screenlock.log`
|
||||
- Store agent environment in `~/.ssh/agent-environment`
|
||||
- Use fixed socket path `~/.ssh/agent.sock`
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables (.env)
|
||||
The doktor script uses `.env` for configuration (auto-created on first run):
|
||||
|
||||
```ini
|
||||
# API endpoints (for Crumbforest backend integration)
|
||||
CRUMB_API_URL="http://localhost:8000"
|
||||
CRUMB_API_TOKEN="changeme"
|
||||
|
||||
# SSH/Remote settings
|
||||
CRUMB_SSH_USER="admin"
|
||||
CRUMB_SCP_TARGET="backup.crumbforest.de:/var/backups"
|
||||
|
||||
# Qdrant vector DB
|
||||
CRUMB_QDRANT_URL="http://localhost:6333"
|
||||
CRUMB_QDRANT_KEY=""
|
||||
```
|
||||
|
||||
## Architecture Notes
|
||||
|
||||
### Modular Shell Design
|
||||
The `crumbpages-doktor.sh` follows a modular pattern:
|
||||
- Each module is a bash function (e.g., `git_doktor()`, `web_doktor()`)
|
||||
- Interactive subshells use `bash --rcfile` with custom `.rc` files in `/tmp`
|
||||
- Environment isolation via `export` and temp RC files
|
||||
- Color-coded output using ANSI escape sequences
|
||||
|
||||
### SSH Security Pattern
|
||||
Both ssh-agent scripts implement "zero-trust on lock":
|
||||
- **Single purpose**: Kill agent when screen locks
|
||||
- **Singleton enforcement**: PID file prevents duplicate daemons
|
||||
- **Deep Work Mode**: `ssh-agent-guard.sh` supports pause file for uninterrupted work
|
||||
- **Fixed socket path**: Enables multiple terminals to share agent state
|
||||
- **MATE integration**: Uses `dbus-monitor` for screensaver events
|
||||
|
||||
### API Integration
|
||||
Web Tools module provides curl wrappers for the Crumbforest backend:
|
||||
- FastAPI backend at `CRUMB_API_URL`
|
||||
- Bearer token auth when `CRUMB_API_TOKEN` is set
|
||||
- Functions: `api_search`, `api_get`, `api_ask`, `open_url`
|
||||
- Qdrant-specific helpers: `q_health`, `q_list`, `q_info`
|
||||
|
||||
## Development Patterns
|
||||
|
||||
### Shell Script Style
|
||||
- Bash-native (no external frameworks)
|
||||
- Functions over scripts-within-scripts
|
||||
- Descriptive color variables (`GREEN`, `BLUE`, `RED`, `YELLOW`, `CYAN`)
|
||||
- Heredocs for multi-line templates
|
||||
- Error handling via explicit checks, not `set -e`
|
||||
|
||||
### Documentation Style
|
||||
- Markdown with emoji for visual anchoring
|
||||
- Collapsible sections using `<details>` tags
|
||||
- Code examples with inline comments
|
||||
- "DO/DON'T" sections for best practices
|
||||
- Skill check checklists at end of each page
|
||||
|
||||
### Git Workflow
|
||||
Standard git practices:
|
||||
- Main branch: `main`
|
||||
- Commit history shows iterative refinement ("Logs active", "magic!", "CleanUp Magic")
|
||||
- Modified files tracked: doktor script and tagebuch entries
|
||||
|
||||
## Context: The Broader Crumbforest
|
||||
|
||||
This repository is part of a larger ecosystem:
|
||||
- **CrumbCore v1**: FastAPI + Qdrant RAG chat system (production)
|
||||
- **PHP CRM**: Legacy system integration for child management
|
||||
- **RouterOS**: Network integration for 500+ user deployment
|
||||
- **TTYD**: Terminal containers for educational use
|
||||
|
||||
The bash scripts here serve as the "field tools" for administrators working across the full stack.
|
||||
|
||||
## Working with This Codebase
|
||||
|
||||
### When editing shell scripts:
|
||||
- Test interactively before committing (scripts are meant to be run by humans)
|
||||
- Preserve color scheme consistency
|
||||
- Maintain module boundaries in doktor script
|
||||
- Update HANDBUCH.md if adding/changing doktor modules
|
||||
|
||||
### When editing crumbpages:
|
||||
- Follow `crumbpage-template.md` structure exactly
|
||||
- Maintain numbering scheme (`crumbpage-##-topic.md`)
|
||||
- Include skill checks and hands-on exercises
|
||||
- Cross-link to related pages in navigation footer
|
||||
|
||||
### When debugging:
|
||||
- Check `.env` configuration first
|
||||
- Review logs: `~/.ssh-agent-screenlock.log` for SSH issues
|
||||
- Use doktor's System Doktor module for host diagnostics
|
||||
- Git Workstation module has `check_health` for repo state
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- SSH agent scripts actively kill credentials on screen lock
|
||||
- API tokens stored in `.env` (gitignored)
|
||||
- No hardcoded credentials anywhere
|
||||
- MATE screensaver hardening (`lock-enabled true`, `lock-delay 0`)
|
||||
- Singleton daemon pattern prevents privilege escalation via duplicate processes
|
||||
|
||||
## References
|
||||
|
||||
- Project history: `CRUMBFOREST_PROJECT_INDEX.md`
|
||||
- Philosophy: `crumbforest-manifesto-guardian.md`
|
||||
- Tool manual: `HANDBUCH.md`
|
||||
- Quick commands: `QUICKSTART.md`
|
||||
@@ -43,11 +43,24 @@ Dieses Dokument enthält einen chronologischen Index aller Konversationen im Cru
|
||||
**Zitat:**
|
||||
> "dockerduke ist bereits jetzt legende #dude <3"
|
||||
|
||||
### 2. Crumbpages Doktor v2.0-RC3 (Vektor Edition)
|
||||
**Datum:** 12. Dezember 2025
|
||||
**Status:** ✅ Integriert (#vektor #subshell)
|
||||
|
||||
**Features:**
|
||||
- 🧠 **Qdrant Doktor:** Native Vektor-DB Diagnose (`q_health`, `q_list`, `q_info`)
|
||||
- 📄 **Log Aliases:** `logs` & `tf` wieder da!
|
||||
- 🗺️ **Admin-Vektor:** Pfade 15-17 repariert & navigierbar.
|
||||
- 🐧 **Debian-Policy:** Red Hat Referenzen entfernt (`yum` is gone).
|
||||
|
||||
**Zitat:**
|
||||
> "ayeeee #test #dufte RC3 ?!?!"
|
||||
|
||||
---
|
||||
|
||||
## 🏢 Rechenzentrum & Hardware
|
||||
|
||||
### 2. Barcode-Seriennummern im RZ erfassen
|
||||
### 3. Barcode-Seriennummern im RZ erfassen
|
||||
**Datum:** 06. Dezember 2025
|
||||
**Projekt:** CrumbForest v0.1 - Crystal Owl Edition
|
||||
|
||||
|
||||
446
DATENSCHUTZ.md
Normal file
446
DATENSCHUTZ.md
Normal file
@@ -0,0 +1,446 @@
|
||||
# Datenschutzerklärung Crumbforest
|
||||
|
||||
**Version:** 1.0-draft
|
||||
**Stand:** 2025-12-13
|
||||
**Gültig für:** Crumbforest-Ökosystem (CrumbCore, Crumbpages, branko.de)
|
||||
|
||||
---
|
||||
|
||||
## Präambel
|
||||
|
||||
Crumbforest nimmt Datenschutz sehr ernst – besonders, wenn Kinder beteiligt sind.
|
||||
|
||||
Diese Datenschutzerklärung erfüllt:
|
||||
- **DSGVO** (Datenschutz-Grundverordnung, EU 2016/679)
|
||||
- **BDSG** (Bundesdatenschutzgesetz)
|
||||
- **TMG** (Telemediengesetz)
|
||||
- **CKL §5** (Crumbforest Children's Knowledge License - Daten & Privatsphäre)
|
||||
|
||||
**Für Kinder und Eltern:** Siehe auch [KINDERRECHTE.md](KINDERRECHTE.md) für eine einfachere Erklärung.
|
||||
|
||||
---
|
||||
|
||||
## 1. Verantwortlicher
|
||||
|
||||
**Aktuell (Stand 2025-12-13):**
|
||||
|
||||
Name: Branko (Lead Maintainer)
|
||||
Website: https://branko.de
|
||||
Email: [wird ergänzt]
|
||||
|
||||
**In Transition zu:**
|
||||
|
||||
OZM - Open Futures Museum
|
||||
[Adresse wird ergänzt]
|
||||
[Email wird ergänzt]
|
||||
|
||||
Sobald die Trägerschaft formalisiert ist (geplant Q2 2025), wird OZM der rechtliche Verantwortliche im Sinne der DSGVO (Art. 4 Nr. 7).
|
||||
|
||||
**Datenschutzbeauftragter:**
|
||||
[Wird bestellt, sobald gesetzlich erforderlich - bei regelmäßiger Verarbeitung von sensiblen Daten oder mehr als 20 Personen, die mit Datenverarbeitung befasst sind]
|
||||
|
||||
---
|
||||
|
||||
## 2. Grundprinzipien der Datenverarbeitung
|
||||
|
||||
Crumbforest folgt den **DSGVO-Grundsätzen** (Art. 5):
|
||||
|
||||
| Prinzip | Wie wir es umsetzen |
|
||||
|---------|---------------------|
|
||||
| **Rechtmäßigkeit** | Einwilligung oder berechtigtes Interesse (Bildungsauftrag) |
|
||||
| **Zweckbindung** | Daten nur für Lernen, nicht für Werbung/Profiling |
|
||||
| **Datenminimierung** | Nur das Nötigste (CKL §5.1) |
|
||||
| **Richtigkeit** | Nutzer können Daten korrigieren |
|
||||
| **Speicherbegrenzung** | Retention Policies (siehe unten) |
|
||||
| **Integrität & Vertraulichkeit** | Verschlüsselung, Zugriffskontrolle |
|
||||
| **Rechenschaftspflicht** | Diese Dokumentation |
|
||||
|
||||
---
|
||||
|
||||
## 3. Welche Daten werden verarbeitet?
|
||||
|
||||
### 3.1 Übersicht
|
||||
|
||||
| Datentyp | Zweck | Rechtsgrundlage | Speicherdauer |
|
||||
|----------|-------|-----------------|---------------|
|
||||
| **Benutzername** | Identifikation, Zuordnung von Projekten | Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung) | Bis Account-Löschung |
|
||||
| **Email-Adresse** | Kommunikation, Passwort-Reset | Art. 6 Abs. 1 lit. b DSGVO | Bis Account-Löschung |
|
||||
| **Passwort-Hash** | Authentifizierung | Art. 6 Abs. 1 lit. b DSGVO | Bis Account-Löschung |
|
||||
| **Chat-Nachrichten** | Kontext für Lernbegleitung | Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse: Bildung) | Bis Nutzer löscht |
|
||||
| **Lernprojekte** | Speicherung von Arbeitsergebnissen | Art. 6 Abs. 1 lit. b DSGVO | Bis Nutzer löscht |
|
||||
| **Sensor-Messungen** | Experimente auswerten | Art. 6 Abs. 1 lit. f DSGVO | Bis Nutzer löscht |
|
||||
| **Login-Zeitstempel** | Sicherheit, Aktivitäts-Tracking | Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse: Sicherheit) | 90 Tage |
|
||||
| **IP-Adresse (temporär)** | Sicherheit gegen Angriffe | Art. 6 Abs. 1 lit. f DSGVO | Max. 7 Tage in Logs |
|
||||
|
||||
**Wir verarbeiten KEINE besonderen Kategorien personenbezogener Daten** (Art. 9 DSGVO: Gesundheit, Religion, etc.) – außer, ein Nutzer teilt diese freiwillig in Chat-Nachrichten (dann gilt Einwilligung, Art. 9 Abs. 2 lit. a).
|
||||
|
||||
### 3.2 Bei Minderjährigen
|
||||
|
||||
Für Nutzer unter 16 Jahren:
|
||||
- **Einwilligung der Sorgeberechtigten erforderlich** (Art. 8 DSGVO)
|
||||
- **Erhöhter Schutz** durch CKL (keine Paywalls, kein Tracking, Exportrecht)
|
||||
- **Automatische Löschung** inaktiver Accounts nach 1 Jahr (mit Vorwarnung)
|
||||
|
||||
---
|
||||
|
||||
## 4. Technische Details: Wo werden Daten gespeichert?
|
||||
|
||||
### 4.1 CrumbCore (FastAPI Backend)
|
||||
|
||||
**Datenbanken:**
|
||||
|
||||
#### MariaDB (Relationale Datenbank)
|
||||
|
||||
| Tabelle | Spalten (Beispiel) | Zweck | Retention |
|
||||
|---------|-------------------|-------|-----------|
|
||||
| `users` | `id`, `username`, `email`, `password_hash`, `created_at`, `last_login` | Benutzer-Accounts | Bis Löschung |
|
||||
| `messages` | `id`, `user_id`, `character`, `user_message`, `character_response`, `timestamp` | Chat-Verläufe | Bis Löschung |
|
||||
| `sessions` | `session_id`, `user_id`, `created_at`, `expires_at` | Login-Sessions | Auto-Löschung nach Ablauf |
|
||||
| `projects` | `id`, `user_id`, `name`, `description`, `created_at`, `updated_at` | Projekt-Metadaten | Bis Löschung |
|
||||
| `measurements` | `id`, `project_id`, `sensor_type`, `value`, `timestamp` | Sensor-Daten | Bis Löschung |
|
||||
|
||||
**Zugriff:** Nur CrumbCore Backend (localhost:3306, kein externer Zugriff)
|
||||
|
||||
#### Qdrant (Vektor-Datenbank für RAG)
|
||||
|
||||
| Collection | Payload-Felder | Zweck | Retention |
|
||||
|------------|----------------|-------|-----------|
|
||||
| `crumbforest` | `text`, `source`, `user_id` (optional), `timestamp` | Semantische Suche über Lernmaterialien | Unbegrenzt (öffentliche Inhalte), bis Löschung (User-Inhalte) |
|
||||
|
||||
**Zugriff:** Nur CrumbCore Backend (localhost:6333, kein externer Zugriff)
|
||||
|
||||
**Hinweis:** Qdrant speichert **Vektoren** (mathematische Repräsentationen von Text), nicht Klartexte. Die Original-Texte stehen in `messages` (MariaDB) oder im Filesystem.
|
||||
|
||||
#### Filesystem (Docker Volumes)
|
||||
|
||||
```
|
||||
/data/
|
||||
├── projects/
|
||||
│ └── {user_id}/
|
||||
│ └── {project_id}/
|
||||
│ ├── main.py
|
||||
│ ├── README.md
|
||||
│ └── ...
|
||||
└── logs/
|
||||
├── crumbcore.log (App-Logs, 90 Tage)
|
||||
└── access.log (Zugriffs-Logs, 7 Tage)
|
||||
```
|
||||
|
||||
**Zugriff:** Nur CrumbCore Container (Docker-isoliert)
|
||||
|
||||
### 4.2 branko.de (Public Website)
|
||||
|
||||
**Keine Datenbank**, nur statische HTML-Dateien.
|
||||
|
||||
**Web-Server-Logs (Nginx/Apache):**
|
||||
- IP-Adresse, User-Agent, Zeitstempel, angefragte URL
|
||||
- **Retention:** 7 Tage, dann automatisch gelöscht
|
||||
- **Zweck:** Sicherheit (DDoS-Schutz, Fehleranalyse)
|
||||
|
||||
**Keine Cookies**, kein Tracking, kein Analytics.
|
||||
|
||||
### 4.3 Crumbpages (Markdown Docs)
|
||||
|
||||
**Statische Dateien**, keine personenbezogenen Daten gespeichert.
|
||||
|
||||
Wenn Nutzer mit Crumbpages arbeiten (lokal oder via CrumbCore), entstehen **keine separaten Datenspeicherungen** – alles läuft über CrumbCore (siehe 4.1).
|
||||
|
||||
---
|
||||
|
||||
## 5. Datenübermittlung & Drittanbieter
|
||||
|
||||
### 5.1 Hosting
|
||||
|
||||
**Aktuell:** Selbst gehostet (lokal oder auf eigenem Server)
|
||||
|
||||
**Keine Cloud-Provider** (kein AWS, Google Cloud, Azure)
|
||||
|
||||
**Vorteil:**
|
||||
- ✅ Volle Kontrolle über Daten
|
||||
- ✅ Keine Weitergabe an Dritte
|
||||
- ✅ DSGVO-konform per Design
|
||||
|
||||
**Wenn Cloud-Hosting hinzukommt:**
|
||||
- Nur EU-basierte Provider (DSGVO-konform)
|
||||
- Auftragsverarbeitungsvertrag (Art. 28 DSGVO)
|
||||
- Dokumentation hier aktualisiert
|
||||
|
||||
### 5.2 KI-Modell-Provider
|
||||
|
||||
**CrumbCore nutzt externe APIs:**
|
||||
- OpenAI (GPT-4, GPT-3.5)
|
||||
- Anthropic (Claude)
|
||||
- Google (Gemini)
|
||||
- OpenRouter (Aggregator)
|
||||
|
||||
**Was wird übermittelt:**
|
||||
- Chat-Nachrichten (Nutzer-Fragen + System-Prompts)
|
||||
- **KEINE** Metadaten (IP, Email, Namen) – nur der Text selbst
|
||||
|
||||
**Rechtsgrundlage:**
|
||||
- Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse: Funktionsfähigkeit)
|
||||
- Bei Kindern: Einwilligung der Sorgeberechtigten
|
||||
|
||||
**Datenschutz-Status der Provider:**
|
||||
|
||||
| Provider | DSGVO-Status | Datenverarbeitung |
|
||||
|----------|--------------|-------------------|
|
||||
| **OpenAI** | DPA verfügbar, API-Daten werden nicht zum Training genutzt (seit März 2023) | USA (GDPR-konformes DPA) |
|
||||
| **Anthropic** | DPA verfügbar, keine Nutzung für Training | USA (GDPR-konformes DPA) |
|
||||
| **Google** | DPA verfügbar | EU & USA |
|
||||
|
||||
**Wichtig:** Nutzer können wählen, welches Modell sie nutzen (Wahlrecht = erhöhte Transparenz).
|
||||
|
||||
**Für "Offline-Modus":** Geplant ist Integration von lokal laufenden Modellen (Llama, Mistral via Ollama) für völlige Datenautonomie (Roadmap Q3 2025).
|
||||
|
||||
### 5.3 Keine weiteren Drittanbieter
|
||||
|
||||
❌ Kein Google Analytics
|
||||
❌ Kein Facebook Pixel
|
||||
❌ Keine Werbe-Netzwerke
|
||||
❌ Keine Social Media Embeds (die tracken)
|
||||
❌ Keine CDNs für JavaScript (alles lokal)
|
||||
|
||||
**CKL §5.2 verpflichtet: "Kein Tracking, kein Profiling"**
|
||||
|
||||
---
|
||||
|
||||
## 6. Cookies & Tracking
|
||||
|
||||
### 6.1 Cookies
|
||||
|
||||
**CrumbCore verwendet:**
|
||||
|
||||
| Cookie | Typ | Zweck | Lebensdauer |
|
||||
|--------|-----|-------|-------------|
|
||||
| `session_id` | Technisch notwendig | Login-Session | Bis Logout (max. 30 Tage) |
|
||||
|
||||
**branko.de verwendet:** **Keine Cookies**
|
||||
|
||||
### 6.2 Tracking
|
||||
|
||||
**Wir tracken NICHT:**
|
||||
- ❌ Keine Bewegungsprofile
|
||||
- ❌ Keine Verhaltensanalyse
|
||||
- ❌ Keine "Heatmaps"
|
||||
- ❌ Keine Cross-Site-Verfolgung
|
||||
|
||||
**Wir loggen NUR für Sicherheit:**
|
||||
- ✅ Login-Zeitpunkte (gegen Brute-Force)
|
||||
- ✅ Failed Login Attempts (gegen Hacking)
|
||||
- ✅ API-Errors (für Debugging)
|
||||
|
||||
Diese Logs werden **anonymisiert** (IP-Adressen gekürzt) und nach **7-90 Tagen gelöscht**.
|
||||
|
||||
---
|
||||
|
||||
## 7. Sicherheitsmaßnahmen
|
||||
|
||||
### 7.1 Technische Maßnahmen
|
||||
|
||||
| Maßnahme | Umsetzung |
|
||||
|----------|-----------|
|
||||
| **Verschlüsselung in Transit** | HTTPS/TLS 1.3 (Let's Encrypt Zertifikate) |
|
||||
| **Verschlüsselung at Rest** | Passwörter: bcrypt mit Salt (12 Rounds), Datenbank-Files: Filesystem-Encryption (LUKS/dm-crypt) |
|
||||
| **Zugriffskontrolle** | Role-Based Access Control (RBAC), Nutzer sehen nur eigene Daten |
|
||||
| **Firewall** | Nur Ports 80/443 offen, DB-Ports (3306, 6333) nur localhost |
|
||||
| **Container-Isolation** | Docker Network Isolation, keine Privileged Containers |
|
||||
| **Logging** | Zentrale Logs, regelmäßige Review, Intrusion Detection geplant (Q2 2025) |
|
||||
| **Backups** | Tägliche Backups, verschlüsselt, offline gespeichert (Air-Gap) |
|
||||
| **Updates** | Automatische Security Updates (unattended-upgrades) |
|
||||
|
||||
### 7.2 Organisatorische Maßnahmen
|
||||
|
||||
- **Admin-Zugriff:** Nur 2-3 Personen (Branko + ggf. OZM-Admins)
|
||||
- **2FA:** Für Admin-Accounts verpflichtend
|
||||
- **Prinzip der geringsten Rechte:** Jeder Dienst läuft mit minimalen Berechtigungen
|
||||
- **Incident Response Plan:** [In Arbeit, Q1 2025]
|
||||
- **Regelmäßige Audits:** Jährliche Security-Reviews
|
||||
|
||||
### 7.3 Datenschutz-Folgenabschätzung (DSFA)
|
||||
|
||||
**Erforderlich nach Art. 35 DSGVO?**
|
||||
|
||||
Prüfung:
|
||||
- ☑ Systematische Überwachung? **Nein** (kein Tracking)
|
||||
- ☑ Verarbeitung besonderer Kategorien? **Nein** (keine Gesundheitsdaten etc.)
|
||||
- ☑ Minderjährige betroffen? **Ja** → Erhöhtes Risiko
|
||||
|
||||
**Ergebnis:** DSFA empfohlen (geplant Q1 2025 mit OZM-Governance)
|
||||
|
||||
---
|
||||
|
||||
## 8. Betroffenenrechte (DSGVO Art. 15-22)
|
||||
|
||||
### 8.1 Auskunftsrecht (Art. 15)
|
||||
|
||||
Du kannst jederzeit fragen:
|
||||
- Welche Daten haben wir über dich?
|
||||
- Zu welchem Zweck?
|
||||
- Wie lange speichern wir sie?
|
||||
|
||||
**Wie:** Siehe [KINDERRECHTE.md](KINDERRECHTE.md) - Aktuell per Email, bald self-service via API.
|
||||
|
||||
### 8.2 Recht auf Berichtigung (Art. 16)
|
||||
|
||||
Du kannst falsche Daten korrigieren lassen.
|
||||
|
||||
**Wie:** Email an [Kontakt] oder (bald) über Profil-Seite.
|
||||
|
||||
### 8.3 Recht auf Löschung (Art. 17 - "Recht auf Vergessenwerden")
|
||||
|
||||
Du kannst verlangen, dass wir deine Daten löschen.
|
||||
|
||||
**Wie:** Siehe [KINDERRECHTE.md](KINDERRECHTE.md) - Detaillierter Löschprozess dokumentiert.
|
||||
|
||||
**Ausnahmen:**
|
||||
- Rechtliche Aufbewahrungspflichten (z.B. Buchhaltung)
|
||||
- Öffentliches Interesse (z.B. veröffentlichte Open-Source-Beiträge)
|
||||
|
||||
### 8.4 Recht auf Datenübertragbarkeit (Art. 20)
|
||||
|
||||
Du kannst eine Kopie deiner Daten in strukturiertem Format erhalten.
|
||||
|
||||
**Format:** JSON oder CSV (maschinenlesbar)
|
||||
|
||||
**Wie:** Siehe [KINDERRECHTE.md](KINDERRECHTE.md) - Export-Funktion.
|
||||
|
||||
### 8.5 Widerspruchsrecht (Art. 21)
|
||||
|
||||
Du kannst der Verarbeitung widersprechen (z.B. wenn wir uns auf "berechtigtes Interesse" berufen).
|
||||
|
||||
**Folge:** Wir stellen die Verarbeitung ein, außer es gibt zwingende Gründe.
|
||||
|
||||
### 8.6 Recht auf Einschränkung der Verarbeitung (Art. 18)
|
||||
|
||||
Du kannst verlangen, dass wir Daten nur speichern, aber nicht nutzen (z.B. während eines Rechtsstreits).
|
||||
|
||||
### 8.7 Beschwerde bei Aufsichtsbehörde (Art. 77)
|
||||
|
||||
Wenn du unzufrieden bist, kannst du dich beschweren bei:
|
||||
|
||||
**Zuständige Aufsichtsbehörde:** (abhängig von Wohnort)
|
||||
|
||||
- **Hamburg:** Hamburgischer Beauftragter für Datenschutz und Informationsfreiheit
|
||||
Website: https://datenschutz-hamburg.de
|
||||
Email: mailbox@datenschutz.hamburg.de
|
||||
|
||||
- **Andere Bundesländer:** Siehe https://www.bfdi.bund.de/DE/Service/Anschriften/Laender/Laender-node.html
|
||||
|
||||
---
|
||||
|
||||
## 9. Speicherdauer (Retention Policies)
|
||||
|
||||
| Datentyp | Speicherdauer | Löschmechanismus |
|
||||
|----------|---------------|------------------|
|
||||
| **Account-Daten** | Bis Account-Löschung | Manuell oder nach 1 Jahr Inaktivität (mit Vorwarnung) |
|
||||
| **Chat-Nachrichten** | Bis Nutzer löscht | Manuell via API oder Account-Löschung |
|
||||
| **Projekte** | Bis Nutzer löscht | Manuell via API oder Account-Löschung |
|
||||
| **Sessions** | Max. 30 Tage | Auto-Löschung nach Ablauf |
|
||||
| **Access Logs** | 7 Tage | Cron-Job (täglich) |
|
||||
| **App Logs** | 90 Tage | Cron-Job (wöchentlich) |
|
||||
| **Backups** | 3 Monate | Rotation (älteste wird überschrieben) |
|
||||
|
||||
**Wichtig:** Nach Löschung sind Daten **unwiederbringlich gelöscht** (inkl. Backups werden bereinigt).
|
||||
|
||||
---
|
||||
|
||||
## 10. Datenverarbeitung bei Kindern
|
||||
|
||||
### 10.1 Einwilligung
|
||||
|
||||
**Unter 16 Jahren:** Einwilligung der Sorgeberechtigten erforderlich (Art. 8 DSGVO).
|
||||
|
||||
**Wie wir das sicherstellen:**
|
||||
- Checkbox: "Ich bin über 16 Jahre alt" ODER "Ich habe die Einwilligung meiner Eltern"
|
||||
- Email-Bestätigung an Sorgeberechtigte (geplant Q1 2025)
|
||||
- Schulen/Lehrkräfte können als "Verantwortliche" auftreten (dann regelt die Schule die Einwilligung)
|
||||
|
||||
### 10.2 Erhöhter Schutz (CKL)
|
||||
|
||||
Für Kinder gilt **automatisch**:
|
||||
- **Kein Profiling** (Art. 22 DSGVO + CKL §5.2)
|
||||
- **Keine Werbung** (CKL §7.3)
|
||||
- **Keine Weitergabe** an Dritte außer KI-Provider (und nur anonymisiert)
|
||||
- **Jederzeit Export/Löschung** (CKL §3.2, §3.3)
|
||||
|
||||
### 10.3 Schulkontext
|
||||
|
||||
Wenn Crumbforest in Schulen eingesetzt wird:
|
||||
- **Schule ist Verantwortlicher** (nicht Crumbforest)
|
||||
- **Lehrer haben Zugriff** auf Schüler-Projekte (pädagogischer Zweck)
|
||||
- **Schule muss Einwilligungen einholen** (nach Landesschulgesetzen)
|
||||
|
||||
Wir bieten: **Data Processing Agreement (DPA)** für Schulen (Template in Arbeit, Q1 2025).
|
||||
|
||||
---
|
||||
|
||||
## 11. Änderungen dieser Datenschutzerklärung
|
||||
|
||||
**Wie wir dich informieren:**
|
||||
- Email an registrierte Nutzer (wenn wesentliche Änderungen)
|
||||
- Hinweis beim nächsten Login
|
||||
- Versionsnummer und Datum am Anfang dieses Dokuments
|
||||
|
||||
**Dein Recht:**
|
||||
- Du kannst widersprechen (dann Account löschen)
|
||||
- Du kannst weiter nutzen (= implizite Einwilligung in neue Version)
|
||||
|
||||
**Versionshistorie:**
|
||||
- v1.0-draft (2025-12-13): Erste Version
|
||||
|
||||
---
|
||||
|
||||
## 12. Kontakt & Fragen
|
||||
|
||||
### Für allgemeine Fragen:
|
||||
**Email:** [wird ergänzt]
|
||||
**Website:** https://crumbforest.com
|
||||
|
||||
### Für Datenschutz-spezifische Anfragen:
|
||||
**Betroffenenrechte:** Siehe [KINDERRECHTE.md](KINDERRECHTE.md)
|
||||
**Datenschutzbeauftragter:** [wird bestellt, sobald erforderlich]
|
||||
|
||||
### Für Admins/Entwickler:
|
||||
**Technische Dokumentation:** Siehe [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section VI
|
||||
**CKL Compliance:** Siehe [LICENSE-CKL.md](LICENSE-CKL.md)
|
||||
|
||||
---
|
||||
|
||||
## 13. Zusammenfassung (TL;DR)
|
||||
|
||||
✅ **Was wir speichern:** Nur was nötig ist (Benutzername, Chat, Projekte)
|
||||
✅ **Warum:** Damit du lernen kannst
|
||||
✅ **Wo:** Lokal auf eigenem Server (keine Cloud)
|
||||
✅ **Wie lange:** Bis du löschst (oder 1 Jahr Inaktivität)
|
||||
✅ **Wer sieht es:** Nur du (+ dein Lehrer, wenn Schulkontext)
|
||||
✅ **Tracking:** Keins (kein Analytics, keine Werbung)
|
||||
✅ **Deine Rechte:** Export, Löschung, Korrektur (siehe KINDERRECHTE.md)
|
||||
✅ **Kinder:** Besonderer Schutz durch CKL (kein Profiling, keine Paywalls)
|
||||
|
||||
**Das war's. Keine versteckten Klauseln.**
|
||||
|
||||
---
|
||||
|
||||
## 14. Rechtliche Referenzen
|
||||
|
||||
Diese Datenschutzerklärung basiert auf:
|
||||
|
||||
- **DSGVO** (EU 2016/679): https://eur-lex.europa.eu/eli/reg/2016/679/oj
|
||||
- **BDSG** (Bundesdatenschutzgesetz): https://www.gesetze-im-internet.de/bdsg_2018/
|
||||
- **TMG** (Telemediengesetz): https://www.gesetze-im-internet.de/tmg/
|
||||
- **CKL** (Crumbforest Children's Knowledge License): [LICENSE-CKL.md](LICENSE-CKL.md)
|
||||
- **UN-Kinderrechtskonvention** (Art. 16 - Privatsphäre): https://www.kinderrechtskonvention.info/
|
||||
|
||||
---
|
||||
|
||||
**Stand:** 2025-12-13
|
||||
**Version:** 1.0-draft
|
||||
**Nächstes Review:** Q1 2025 (nach OZM-Governance-Formalisierung)
|
||||
**Lizenz:** CC-BY-SA 4.0 (dieses Dokument)
|
||||
|
||||
---
|
||||
|
||||
> *"Wissen gehört dem Kind, solange es fragt."*
|
||||
> *"Daten gehören dem Kind, solange es lernt."*
|
||||
> — Crumbforest-Prinzip
|
||||
471
KINDERRECHTE.md
Normal file
471
KINDERRECHTE.md
Normal file
@@ -0,0 +1,471 @@
|
||||
# Deine Rechte bei Crumbforest 🌲
|
||||
|
||||
> **Für Kinder:** Das hier gehört **DIR**. Wir passen darauf auf.
|
||||
> **Für Eltern:** Dieses Dokument operationalisiert CKL §3 (Rechte der Kinder) und ist DSGVO-konform.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Was gehört dir?
|
||||
|
||||
Alles, was **du** erschaffst, gehört **dir** – nicht uns, nicht der Schule, nicht dem Internet.
|
||||
|
||||
### Das sind deine Sachen:
|
||||
|
||||
- ✍️ **Texte**: Alle Fragen, die du stellst. Alle Geschichten, die du schreibst.
|
||||
- 💻 **Code**: Alle Programme, die du baust (Python, Bash, Blockly...)
|
||||
- 🎨 **Bilder**: Alle Zeichnungen und Screenshots
|
||||
- 📊 **Messungen**: Alle Daten, die du sammelst (Temperatur, Bewegung, Sensoren...)
|
||||
- 💬 **Chats**: Alle Gespräche mit den Charakteren (Krümeleule, FunkFox...)
|
||||
- 🏗️ **Projekte**: Alles, was du mit Raspberry Pi, ESP32 oder anderen Tools baust
|
||||
|
||||
**Wichtig:** Auch wenn du das auf einem Computer von Crumbforest machst – **du** bist der Besitzer oder die Besitzerin!
|
||||
|
||||
Das steht so im Gesetz (CKL §3.1 + DSGVO Art. 20).
|
||||
|
||||
---
|
||||
|
||||
## 💾 Wie bekomme ich meine Daten?
|
||||
|
||||
Du kannst **jederzeit** eine Kopie von allem verlangen, was du gemacht hast.
|
||||
|
||||
### So geht's:
|
||||
|
||||
#### **Wenn du mit CrumbCore arbeitest:**
|
||||
|
||||
**Aktuell (Stand 2025-12):**
|
||||
- Sprich mit deinem Lehrer oder deiner Lehrerin
|
||||
- Oder schreibe eine Email an: [Kontakt wird ergänzt]
|
||||
- Wir schicken dir dann alles als Datei
|
||||
|
||||
**Bald (geplant Q1 2025):**
|
||||
Du kannst selbst auf einen Knopf drücken:
|
||||
1. Gehe zu deinem Profil
|
||||
2. Klicke auf "Meine Daten herunterladen"
|
||||
3. Du bekommst eine ZIP-Datei mit allem
|
||||
|
||||
Die Datei enthält:
|
||||
```
|
||||
meine-crumbforest-daten.zip
|
||||
├── chats.json (alle Gespräche)
|
||||
├── projekte/ (deine Projekte)
|
||||
│ ├── esp32-blink/
|
||||
│ └── pi-server/
|
||||
├── messungen.csv (Sensor-Daten)
|
||||
└── README.txt (Erklärung, was was ist)
|
||||
```
|
||||
|
||||
**Alles in offenen Formaten** (JSON, CSV, TXT, PNG) – du kannst es mit jedem Programm öffnen!
|
||||
|
||||
#### **Wenn du mit Crumbpages lernst:**
|
||||
- Alle Markdown-Dateien sind sowieso frei zugänglich
|
||||
- Du kannst sie einfach kopieren: Rechtsklick → Kopieren
|
||||
- Oder das ganze Repo herunterladen (siehe QUICKSTART.md)
|
||||
|
||||
---
|
||||
|
||||
## 🗑️ Wie lösche ich meine Daten?
|
||||
|
||||
Manchmal möchte man nicht, dass alte Sachen gespeichert bleiben. **Das ist okay!**
|
||||
|
||||
Du kannst sagen: "Ich will, dass ihr alles von mir löscht."
|
||||
|
||||
### So geht's:
|
||||
|
||||
#### **Option 1: Alles löschen**
|
||||
- Sprich mit deinem Lehrer/deiner Lehrerin
|
||||
- Oder schreibe eine Email mit deinen Eltern an: [Kontakt wird ergänzt]
|
||||
- Schreibe rein: "Bitte löscht alle meine Daten."
|
||||
|
||||
**Was wir dann tun:**
|
||||
1. Wir löschen alle deine Chats aus der Datenbank
|
||||
2. Wir löschen deine Projekte vom Server
|
||||
3. Wir löschen deinen Account
|
||||
4. **Wichtig:** Vorher fragen wir: "Willst du vorher eine Kopie?"
|
||||
|
||||
**Das dauert maximal 7 Tage.**
|
||||
|
||||
#### **Option 2: Nur bestimmte Sachen löschen**
|
||||
Du kannst auch sagen: "Löscht nur dieses Projekt" oder "Löscht nur diese Chat-Nachricht".
|
||||
|
||||
Das geht genauso – sag uns einfach, was weg soll.
|
||||
|
||||
#### **Bald (geplant Q1 2025):**
|
||||
Du kannst selbst löschen:
|
||||
1. Gehe zu deinem Profil
|
||||
2. Klicke auf "Meine Daten verwalten"
|
||||
3. Wähle aus, was du löschen willst
|
||||
4. Bestätige: "Ja, wirklich löschen"
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Was wird überhaupt gespeichert?
|
||||
|
||||
**Wir speichern nur, was zum Lernen wichtig ist. Nicht mehr!**
|
||||
|
||||
### Das speichern wir:
|
||||
|
||||
| Was? | Warum? | Wo? | Wie lange? |
|
||||
|------|--------|-----|------------|
|
||||
| Dein Benutzername | Damit wir wissen, wer du bist | CrumbCore Datenbank | Bis du kündigst |
|
||||
| Deine Chat-Nachrichten | Damit die Charaktere sich erinnern | CrumbCore Datenbank | Bis du löschst |
|
||||
| Deine Projekte (Code, Bilder...) | Damit du später weiter machen kannst | CrumbCore Dateisystem | Bis du löschst |
|
||||
| Sensor-Messungen | Damit du deine Experimente auswerten kannst | CrumbCore Datenbank | Bis du löschst |
|
||||
| Wann du dich einloggst | Damit wir wissen, ob du noch aktiv bist | CrumbCore Logfiles | 90 Tage |
|
||||
|
||||
### Das speichern wir **NICHT**:
|
||||
|
||||
- ❌ Keine Passwörter (nur verschlüsselte Hashes)
|
||||
- ❌ Keine IP-Adressen (außer temporär für Sicherheit)
|
||||
- ❌ Keine Tracking-Cookies
|
||||
- ❌ Keine "Werbe-ID" oder ähnliches
|
||||
- ❌ Keine Bilder von dir (außer du lädst sie hoch für ein Projekt)
|
||||
- ❌ Keine Sprachaufnahmen
|
||||
- ❌ Keine Bewegungsprofile
|
||||
|
||||
**Crumbforest hat kein Google Analytics, kein Facebook Pixel, keine Spionage-Tools.**
|
||||
|
||||
### Wer kann meine Daten sehen?
|
||||
|
||||
1. **Du selbst** (immer)
|
||||
2. **Dein Lehrer/deine Lehrerin** (wenn du in einem Kurs bist)
|
||||
3. **Die Admins von Crumbforest** (nur für technischen Support)
|
||||
4. **Niemand sonst!**
|
||||
|
||||
Wir verkaufen deine Daten **NIEMALS**. Nie, nie, nie.
|
||||
|
||||
Das ist gesetzlich verboten (DSGVO) **und** gegen die CKL.
|
||||
|
||||
---
|
||||
|
||||
## 🚪 Was passiert, wenn ich gehe?
|
||||
|
||||
Du kannst **jederzeit** aufhören, bei Crumbforest zu lernen.
|
||||
|
||||
### Wenn du gehst:
|
||||
|
||||
**Du kannst wählen:**
|
||||
|
||||
**Option A: Mitnehmen**
|
||||
- Wir geben dir alles als Download
|
||||
- Du kannst woanders weiter machen
|
||||
- Wir löschen deine Daten nach 30 Tagen
|
||||
|
||||
**Option B: Löschen**
|
||||
- Wir löschen sofort alles
|
||||
- Nichts bleibt übrig
|
||||
- Du kannst nicht mehr zurück
|
||||
|
||||
**Option C: Archivieren**
|
||||
- Wir behalten deine Sachen für dich (max. 1 Jahr)
|
||||
- Du kannst später wieder kommen
|
||||
- Nach 1 Jahr fragen wir nochmal: "Willst du es noch?"
|
||||
|
||||
**Ohne Nachteile:** Du musst nichts zahlen, du bekommst keinen Ärger, alles ist gut.
|
||||
|
||||
Das ist dein Recht (CKL §10.2 + DSGVO Art. 17).
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Wie sicher sind meine Daten?
|
||||
|
||||
Wir nehmen Sicherheit **sehr ernst**.
|
||||
|
||||
### Was wir tun:
|
||||
|
||||
- 🔒 **Verschlüsselung**: Passwörter sind verschlüsselt (niemand kann sie lesen)
|
||||
- 🖥️ **Lokaler Server**: Deine Daten sind nicht in der "Cloud" (kein Google, kein Amazon)
|
||||
- 🔐 **Zugriffskontrolle**: Nur du und dein Lehrer können deine Projekte sehen
|
||||
- 📝 **Logs**: Wir schreiben auf, wer was macht (gegen Hacker)
|
||||
- 🔄 **Backups**: Wir machen Sicherheitskopien (falls Computer kaputt geht)
|
||||
- 🗑️ **Löschung**: Wenn wir löschen, ist es **wirklich** gelöscht (nicht nur versteckt)
|
||||
|
||||
### Was du tun solltest:
|
||||
|
||||
- ✅ Wähle ein gutes Passwort (nicht "1234")
|
||||
- ✅ Verrate dein Passwort niemandem (auch nicht Freunden)
|
||||
- ✅ Melde dich ab, wenn du fertig bist
|
||||
- ✅ Sag Bescheid, wenn etwas komisch ist
|
||||
|
||||
---
|
||||
|
||||
## ❓ Ich habe eine Frage / Es gibt ein Problem
|
||||
|
||||
### Für Kinder:
|
||||
|
||||
**Sprich zuerst mit deinem Lehrer oder deiner Lehrerin.**
|
||||
|
||||
Wenn das nicht hilft, oder wenn du denkst "Das ist nicht okay", dann:
|
||||
|
||||
- Sprich mit deinen Eltern
|
||||
- Oder schreibe uns: [Kontakt wird ergänzt]
|
||||
|
||||
### Für Eltern/Sorgeberechtigte:
|
||||
|
||||
Sie haben jederzeit das Recht:
|
||||
- Auskunft über gespeicherte Daten zu verlangen (DSGVO Art. 15)
|
||||
- Daten korrigieren zu lassen (DSGVO Art. 16)
|
||||
- Daten löschen zu lassen (DSGVO Art. 17)
|
||||
- Der Verarbeitung zu widersprechen (DSGVO Art. 21)
|
||||
- Beschwerde bei der Aufsichtsbehörde einzulegen
|
||||
|
||||
**Kontakt:**
|
||||
- Email: [wird ergänzt]
|
||||
- Verantwortlicher: Branko (Lead Maintainer)
|
||||
- Datenschutzbeauftragter: [wird ergänzt, wenn benötigt]
|
||||
|
||||
**Aufsichtsbehörde:**
|
||||
Je nach Bundesland – siehe: https://www.bfdi.bund.de/DE/Service/Anschriften/Laender/Laender-node.html
|
||||
|
||||
---
|
||||
|
||||
## 📋 Zusammenfassung (für Eltern & Lehrer)
|
||||
|
||||
| Recht | Gesetzliche Grundlage | Wie umgesetzt? |
|
||||
|-------|----------------------|----------------|
|
||||
| Eigentum an Inhalten | CKL §3.1 | Kinder behalten Urheberrechte |
|
||||
| Datenportabilität | DSGVO Art. 20, CKL §3.2 | Export-Funktion (geplant Q1 2025) |
|
||||
| Löschung | DSGVO Art. 17, CKL §3.3 | Löschprozess dokumentiert |
|
||||
| Auskunft | DSGVO Art. 15 | Auf Anfrage, bald self-service |
|
||||
| Widerspruch | DSGVO Art. 21 | Jederzeit ohne Nachteile |
|
||||
| Datenminimierung | DSGVO Art. 5, CKL §5.1 | Nur lernrelevante Daten |
|
||||
| Transparenz | DSGVO Art. 12-14, CKL §5.3 | Dieses Dokument + DATENSCHUTZ.md |
|
||||
| Keine Paywalls | CKL §7.3 | Lernkerne kostenlos |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Technische Umsetzung (für Entwickler)
|
||||
|
||||
### TODOs für vollständige Compliance:
|
||||
|
||||
#### 1. Export-API implementieren
|
||||
|
||||
**Status:** ⏳ Geplant Q1 2025
|
||||
|
||||
**Endpoint:** `GET /api/v1/my-data`
|
||||
|
||||
**Authentication:** Bearer Token (User muss eingeloggt sein)
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"user": {
|
||||
"username": "kruemel123",
|
||||
"created_at": "2024-09-15T10:30:00Z",
|
||||
"last_login": "2025-12-13T14:22:00Z"
|
||||
},
|
||||
"messages": [
|
||||
{
|
||||
"id": 1,
|
||||
"character": "Krümeleule",
|
||||
"timestamp": "2025-12-13T14:00:00Z",
|
||||
"user_message": "Wie funktioniert Bash?",
|
||||
"character_response": "Bash ist eine Shell..."
|
||||
}
|
||||
],
|
||||
"projects": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "ESP32 Blink",
|
||||
"created_at": "2025-11-01T09:00:00Z",
|
||||
"files": [
|
||||
{"filename": "main.py", "content": "...base64..."}
|
||||
]
|
||||
}
|
||||
],
|
||||
"measurements": [...],
|
||||
"export_date": "2025-12-13T15:00:00Z",
|
||||
"format_version": "1.0"
|
||||
}
|
||||
```
|
||||
|
||||
**Optional:** Auch als ZIP-Download verfügbar machen:
|
||||
```python
|
||||
# app/routers/data_export.py
|
||||
from fastapi import APIRouter, Depends
|
||||
from fastapi.responses import StreamingResponse
|
||||
import zipfile
|
||||
import io
|
||||
|
||||
@router.get("/my-data.zip")
|
||||
async def export_data_zip(user = Depends(get_current_user)):
|
||||
# Erstelle ZIP in Memory
|
||||
zip_buffer = io.BytesIO()
|
||||
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
|
||||
# Füge alle User-Daten hinzu
|
||||
zip_file.writestr("README.txt", "Deine Crumbforest Daten...")
|
||||
zip_file.writestr("chats.json", json.dumps(user.messages))
|
||||
# ... weitere Dateien
|
||||
|
||||
zip_buffer.seek(0)
|
||||
return StreamingResponse(
|
||||
zip_buffer,
|
||||
media_type="application/zip",
|
||||
headers={"Content-Disposition": f"attachment; filename=crumbforest-{user.username}.zip"}
|
||||
)
|
||||
```
|
||||
|
||||
#### 2. Lösch-API implementieren
|
||||
|
||||
**Status:** ⏳ Geplant Q1 2025
|
||||
|
||||
**Endpoint:** `DELETE /api/v1/my-data`
|
||||
|
||||
**Authentication:** Bearer Token + zusätzliche Bestätigung (gegen Unfälle)
|
||||
|
||||
**Request:**
|
||||
```json
|
||||
{
|
||||
"confirm": "DELETE_ALL_MY_DATA",
|
||||
"reason": "optional feedback"
|
||||
}
|
||||
```
|
||||
|
||||
**Was gelöscht wird:**
|
||||
```python
|
||||
# app/services/data_deletion.py
|
||||
async def delete_user_data(user_id: int):
|
||||
# 1. Chats aus MariaDB
|
||||
await db.execute("DELETE FROM messages WHERE user_id = ?", user_id)
|
||||
|
||||
# 2. Vektoren aus Qdrant (wenn User-spezifisch)
|
||||
qdrant_client.delete(
|
||||
collection_name="crumbforest",
|
||||
points_selector=models.FilterSelector(
|
||||
filter=models.Filter(
|
||||
must=[
|
||||
models.FieldCondition(
|
||||
key="user_id",
|
||||
match=models.MatchValue(value=user_id)
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
# 3. Projekte aus Dateisystem
|
||||
shutil.rmtree(f"/data/projects/{user_id}")
|
||||
|
||||
# 4. Sessions
|
||||
await db.execute("DELETE FROM sessions WHERE user_id = ?", user_id)
|
||||
|
||||
# 5. User-Account
|
||||
await db.execute("DELETE FROM users WHERE id = ?", user_id)
|
||||
|
||||
# 6. Logs bereinigen (DSGVO: Personenbezug entfernen)
|
||||
# Logfiles anonymisieren, nicht löschen (Sicherheit)
|
||||
await anonymize_logs(user_id)
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"status": "deleted",
|
||||
"deleted_at": "2025-12-13T15:30:00Z",
|
||||
"items_deleted": {
|
||||
"messages": 42,
|
||||
"projects": 3,
|
||||
"files": 18
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. DATENSCHUTZ.md erstellen
|
||||
|
||||
**Status:** ⏳ TODO (nächster Schritt nach KINDERRECHTE.md)
|
||||
|
||||
Sollte enthalten:
|
||||
- Detaillierte Datenbank-Schema-Dokumentation
|
||||
- Welche Tabellen speichern was?
|
||||
- Retention Policies
|
||||
- Backup-Strategie
|
||||
- Incident Response Plan
|
||||
|
||||
#### 4. Frontend für Self-Service
|
||||
|
||||
**Status:** ⏳ Geplant Q1 2025
|
||||
|
||||
Mockup:
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Mein Profil │
|
||||
├─────────────────────────────────────┤
|
||||
│ │
|
||||
│ 📦 Meine Daten herunterladen │
|
||||
│ ├─ Als JSON │
|
||||
│ └─ Als ZIP (alles) │
|
||||
│ │
|
||||
│ 🗑️ Daten löschen │
|
||||
│ ├─ Nur Chats löschen │
|
||||
│ ├─ Nur Projekt "X" löschen │
|
||||
│ └─ ⚠️ ALLES löschen (Account) │
|
||||
│ │
|
||||
│ 📊 Was ist gespeichert? │
|
||||
│ ├─ 42 Chat-Nachrichten │
|
||||
│ ├─ 3 Projekte (18 Dateien) │
|
||||
│ └─ Letzter Login: heute 14:22 │
|
||||
│ │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### 5. Automatische Daten-Bereinigung
|
||||
|
||||
**Status:** ⏳ Geplant Q2 2025
|
||||
|
||||
Cron-Job für:
|
||||
- Alte Sessions löschen (> 90 Tage inaktiv)
|
||||
- Anonyme Accounts löschen (> 1 Jahr inaktiv)
|
||||
- Logfiles bereinigen (> 90 Tage alt)
|
||||
|
||||
```python
|
||||
# scripts/cleanup_cron.py
|
||||
async def cleanup_inactive_users():
|
||||
threshold = datetime.now() - timedelta(days=365)
|
||||
inactive_users = await db.fetch_all(
|
||||
"SELECT id FROM users WHERE last_login < ? AND account_type = 'anonymous'",
|
||||
threshold
|
||||
)
|
||||
for user in inactive_users:
|
||||
# Email-Warnung 30 Tage vorher (wenn Email vorhanden)
|
||||
# Dann löschen
|
||||
await delete_user_data(user.id)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📜 Rechtliche Hinweise
|
||||
|
||||
**Dieses Dokument ist rechtsverbindlich.**
|
||||
|
||||
Es konkretisiert die Rechte aus:
|
||||
- Crumbforest Children's Knowledge License (CKL) v0.1
|
||||
- DSGVO (Datenschutz-Grundverordnung)
|
||||
- TMG (Telemediengesetz)
|
||||
- Kinderrechtskonvention der UN (insb. Art. 16)
|
||||
|
||||
**Verantwortlicher im Sinne der DSGVO:**
|
||||
[Wird ergänzt nach OZM-Transition – aktuell: Branko]
|
||||
|
||||
**Stand:** 2025-12-13
|
||||
**Version:** 1.0-draft
|
||||
**Nächstes Review:** Q1 2025 (nach CKL v1.0 Finalisierung)
|
||||
|
||||
---
|
||||
|
||||
## 🌲 Schlusswort
|
||||
|
||||
**Crumbforest ist dein Wald.**
|
||||
|
||||
Alles, was du hier pflanzt, gehört dir.
|
||||
Niemand kann es dir wegnehmen.
|
||||
Du kannst es jederzeit mitnehmen.
|
||||
|
||||
**Und wenn du Fragen hast?**
|
||||
Frag einfach. Das ist dein Recht.
|
||||
|
||||
> *"Wissen gehört dem Kind, solange es fragt."*
|
||||
|
||||
---
|
||||
|
||||
**Lizenz:** CC-BY-SA 4.0 (dieses Dokument)
|
||||
**Teil von:** Crumbforest Ecosystem (https://crumbforest.com)
|
||||
**Siehe auch:** [LICENSE-CKL.md](LICENSE-CKL.md), [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md)
|
||||
306
LICENSE-CKL.md
Normal file
306
LICENSE-CKL.md
Normal file
@@ -0,0 +1,306 @@
|
||||
# CKL — The Crumbforest Children's Knowledge License
|
||||
|
||||
**Version:** 0.1-draft
|
||||
**Date:** 2025-12-13
|
||||
**Status:** Community Review
|
||||
**Base:** MIT License (compatible)
|
||||
|
||||
---
|
||||
|
||||
> **Kurzfassung:** *Wissen gehört dem Kind, solange es fragt.* Wir bauen Lernräume, in denen Fragen Vorrang haben, Beweise prüfbar sind und nichts hinter Paywalls verschwindet.
|
||||
|
||||
> **Hinweis:** Dies ist eine gemeinschaftliche Lizenz in einfacher Sprache. Sie ersetzt keine Rechtsberatung. Version 0.1 – zur Kommentierung.
|
||||
|
||||
---
|
||||
|
||||
## Präambel
|
||||
|
||||
Kinder lernen am besten dort, wo Ruhe vor Hast kommt, Verstehen vor Verwerten und Beweise vor Behauptungen. Die CKL schützt solche Räume. Sie ist eine Haltung in Lizenzform: **Nullfeld zuerst**, dann Messung. **Resonanz vor Regel.**
|
||||
|
||||
---
|
||||
|
||||
## 1. Geltungsbereich
|
||||
|
||||
Die CKL gilt für Workshops, Kurse, Materialien, Software-Container, Daten und Artefakte, die unter dem Namen **Crumbforest** oder in seinem Geist betrieben, veröffentlicht oder geteilt werden – besonders, wenn Kinder beteiligt sind.
|
||||
|
||||
---
|
||||
|
||||
## 2. Grundsatz „Kinder zuerst"
|
||||
|
||||
Kinderfragen haben Vorrang. Alle Entscheidungen – didaktisch, organisatorisch, technisch – werden auf ihren Nutzen für das Kind geprüft. Ein Kind darf mit einer guten Frage **alles** in Frage stellen.
|
||||
|
||||
---
|
||||
|
||||
## 3. Rechte der Kinder
|
||||
|
||||
1. **Urheber:innenschaft**: Rechte an Inhalten, die Kinder schaffen (Texte, Code, Bilder, Sounds, Messreihen), verbleiben bei den Kindern.
|
||||
|
||||
2. **Zugriff**: Kinder erhalten eine exportierbare Kopie ihrer Arbeiten und Messdaten in **offenen Formaten**.
|
||||
|
||||
3. **Widerruf**: Kinder (bzw. Sorgeberechtigte) können eine Veröffentlichung jederzeit widerrufen. Löschung erfolgt zeitnah.
|
||||
|
||||
---
|
||||
|
||||
## 4. Pflichten der Erwachsenen/Betreiber
|
||||
|
||||
1. **Prüfbarkeit**: Setups sind **reproduzierbar** dokumentiert (Materialliste, Schritte, Versionen). Keine Blackboxes.
|
||||
|
||||
2. **Anerkennung**: Beiträge von Kindern und Crew werden namentlich oder pseudonym **gewürdigt** – sofern gewünscht.
|
||||
|
||||
3. **Sicherheit**: Risiken werden erklärt. Es wird nur betrieben, was verantwortbar ist.
|
||||
|
||||
---
|
||||
|
||||
## 5. Daten & Privatsphäre
|
||||
|
||||
1. **Datenminimierung**: Es werden nur Daten erhoben, die für das Lernen nötig sind. **Keine** versteckte Telemetrie.
|
||||
|
||||
2. **Kein Tracking**: Kein Werbe-Tracking, kein Profiling, keine biometrische Auswertung von Kindern.
|
||||
|
||||
3. **Transparenz**: Welche Daten anfallen, wird **vorab** erklärt; Speicherorte sind benennbar; Löschwege sind dokumentiert.
|
||||
|
||||
---
|
||||
|
||||
## 6. Offenheit & Reproduzierbarkeit
|
||||
|
||||
1. **Offene Beweise**: Messergebnisse, Methoden und Skripte werden so veröffentlicht, dass Dritte sie **nachvollziehen** können.
|
||||
|
||||
2. **Container statt Inseln**: Software läuft offline-fähig in reproduzierbaren **Containern** (oder gleichwertigen Setups).
|
||||
|
||||
3. **Logik vor Effekt**: Kein „Zauber", der nicht erklärt werden kann. Effekte folgen der Erklärung, nicht umgekehrt.
|
||||
|
||||
---
|
||||
|
||||
## 7. Offline-First & Zugang
|
||||
|
||||
1. **Offline vor Cloud**: Betrieb ohne Dauer-Internet ist vorrangig. Cloud ist optional und begründungsbedürftig.
|
||||
|
||||
2. **Barrierearme Zugänge**: Terminal/TTYD, Markdown-Materialien und Druckversionen stehen bereit.
|
||||
|
||||
3. **Preisfreiheit für Kinderfragen**: Der Zugang zu Fragen/Antworten darf nicht an Online-Konten oder Token-Kosten gebunden werden.
|
||||
|
||||
---
|
||||
|
||||
## 8. Teilen, Anerkennung, Nutzung
|
||||
|
||||
1. **Teilen** ist erwünscht unter **Namensnennung** und Beibehaltung der CKL für kinderbezogene Teile.
|
||||
|
||||
2. **Kommerz** ist erlaubt, sofern **Kinderzugang frei bleibt**, Beweise offen bleiben und keine Paywalls vor Lernkernen stehen.
|
||||
|
||||
3. **Keine Exklusivitätsansprüche** gegenüber von Kindern erarbeiteten Ergebnissen.
|
||||
|
||||
---
|
||||
|
||||
## 9. Kosten, Förderungen, Transparenz
|
||||
|
||||
1. **Klarheit**: Gebühren, Budgets und Fördermittel werden **verständlich** ausgewiesen.
|
||||
|
||||
2. **Zeit kaufen, nicht Schweigen**: Förderungen dienen Lernzeit und Infrastruktur, nicht Marketing-Schein.
|
||||
|
||||
---
|
||||
|
||||
## 10. Widerruf & Durchsetzung
|
||||
|
||||
1. Verstöße können zur **Ablösung** der CKL-Nutzung führen.
|
||||
|
||||
2. Kinder/Sorgeberechtigte können eine Teilnahme **ohne Nachteile** beenden; ihre Daten werden gelöscht oder ausgehändigt.
|
||||
|
||||
---
|
||||
|
||||
## 11. Kompatibilität
|
||||
|
||||
Die CKL ist kompatibel mit freien Lizenzen (z. B. MIT/Apache/CC-BY) für **Erwachsenen-Code/Material**, solange **Kinderrechte** gemäß CKL **nicht** eingeschränkt werden. Bei Konflikt gilt die **strengere Kinderschutz-Regel**.
|
||||
|
||||
---
|
||||
|
||||
## 12. Haftungsausschluss
|
||||
|
||||
Angebote erfolgen **ohne Gewähr**. Sicherheit wird ernst genommen; Restrisiken werden erklärt. Die CKL schafft keine gesetzlichen Ersatzansprüche, sie **ergänzt** sie um Haltung.
|
||||
|
||||
---
|
||||
|
||||
## Menschliche Kurzfassung (human-readable)
|
||||
|
||||
Wir arbeiten langsam genug, dass Kinder **mitdenken** können, und offen genug, dass andere **nachbauen** können. Niemand verdient an dem Zugang zu einer **Frage**. Alles Wichtige bleibt **prüfbar**. Wenn etwas unklar ist, gilt: *Erst Ruhe. Dann messen.*
|
||||
|
||||
---
|
||||
|
||||
## CKL-Hinweis zum Abdruck
|
||||
|
||||
> *Dieses Projekt folgt der **CKL – Crumbforest Children's Knowledge License (v0.1-draft)**: Kinderfragen haben Vorrang; Arbeiten bleiben bei den Kindern; Beweise sind offen und reproduzierbar; Offline hat Vorrang; keine Paywalls vor Lernkernen; Daten sind minimal, transparent, widerrufbar. Mehr unter: crumbforest.com*
|
||||
|
||||
---
|
||||
|
||||
## Für Entwickler:innen
|
||||
|
||||
### Wie erkenne ich, ob die CKL gilt?
|
||||
|
||||
Die CKL greift automatisch, wenn:
|
||||
- Software in Bildungskontexten mit Kindern genutzt wird
|
||||
- Lernende unter 18 Jahren beteiligt sind
|
||||
- Pädagogische Inhalte bereitgestellt werden
|
||||
- Lerndaten erfasst oder verarbeitet werden
|
||||
|
||||
### Was muss ich tun?
|
||||
|
||||
**Compliance-Checkliste:**
|
||||
|
||||
- [ ] §3.2: Export-Funktion für Benutzerdaten implementiert
|
||||
- [ ] §3.3: Widerruf-/Löschmechanismus vorhanden
|
||||
- [ ] §4.1: Setup reproduzierbar dokumentiert (README, Dockerfiles...)
|
||||
- [ ] §5.1: Datenminimierung praktiziert
|
||||
- [ ] §5.2: Kein Tracking, keine versteckte Telemetrie
|
||||
- [ ] §5.3: Datenspeicherung transparent dokumentiert (DATENSCHUTZ.md)
|
||||
- [ ] §6.1: Methoden und Ergebnisse nachvollziehbar
|
||||
- [ ] §6.2: Software läuft offline oder in Containern
|
||||
- [ ] §6.3: Keine unerklärlichen "Blackboxes"
|
||||
- [ ] §7.1: Offline-Modus verfügbar (kein Cloud-Zwang)
|
||||
- [ ] §7.2: Barrierefreie Zugänge (Markdown, Plain Text, Druckversionen)
|
||||
- [ ] §7.3: Keine Paywalls vor Lern-Kernfunktionen
|
||||
|
||||
**Siehe [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section VI für detaillierte Compliance-Checks.**
|
||||
|
||||
---
|
||||
|
||||
## Für Pädagog:innen
|
||||
|
||||
### Was bedeutet die CKL für meinen Unterricht?
|
||||
|
||||
Die CKL schützt **deine Lernenden** und gibt **dir Sicherheit**:
|
||||
|
||||
**Du darfst:**
|
||||
- ✅ Die Software kommerziell nutzen (z.B. kostenpflichtige Workshops)
|
||||
- ✅ Inhalte anpassen und erweitern
|
||||
- ✅ Eigene Instanzen betreiben (Schul-Server, lokale Installation)
|
||||
- ✅ Daten für Lernfortschritt speichern
|
||||
|
||||
**Du musst:**
|
||||
- ✅ Kindern Zugriff auf ihre eigenen Daten geben (§3.2)
|
||||
- ✅ Löschung auf Wunsch ermöglichen (§3.3)
|
||||
- ✅ Transparent machen, was du speicherst (§5.3)
|
||||
- ✅ Offline-Nutzung ermöglichen (§7.1)
|
||||
|
||||
**Du darfst nicht:**
|
||||
- ❌ Tracking oder Profiling ohne Wissen der Kinder/Eltern (§5.2)
|
||||
- ❌ Exklusivrechte an Kinderprojekten beanspruchen (§8.3)
|
||||
- ❌ Paywalls vor Lernkern-Funktionen setzen (§7.3)
|
||||
|
||||
---
|
||||
|
||||
## Für Kinder (und Eltern)
|
||||
|
||||
### Was bedeutet die CKL für dich?
|
||||
|
||||
**Das gehört DIR:**
|
||||
- 💾 Alle Texte, die du schreibst
|
||||
- 🎨 Alle Bilder, die du malst
|
||||
- 💻 Aller Code, den du programmierst
|
||||
- 📊 Alle Messungen, die du machst
|
||||
|
||||
**Das kannst du TUN:**
|
||||
- 📦 Deine Daten jederzeit exportieren (§3.2)
|
||||
- 🗑️ Deine Daten löschen lassen (§3.3)
|
||||
- ❓ Jede Frage stellen, ohne zu zahlen (§7.3)
|
||||
- 🔌 Auch ohne Internet lernen (§7.1)
|
||||
|
||||
**Das darf NIEMAND:**
|
||||
- ❌ Deine Arbeit als seine eigene ausgeben (§3.1)
|
||||
- ❌ Dich tracken oder ausspionieren (§5.2)
|
||||
- ❌ Dir Wissen hinter Bezahlschranken verstecken (§8.2)
|
||||
- ❌ Dich zwingen, in der Cloud zu arbeiten (§7.1)
|
||||
|
||||
**Wenn etwas nicht stimmt:**
|
||||
Du (oder deine Eltern) kannst jederzeit sagen: "Ich will hier nicht mehr mitmachen und alles löschen." Das ist dein Recht. (§10.2)
|
||||
|
||||
---
|
||||
|
||||
## Geschichte & Kontext
|
||||
|
||||
Die CKL entstand aus der Notwendigkeit, **Kinderrechte in digitalen Lernräumen** durchsetzbar zu machen.
|
||||
|
||||
Bestehende Lizenzen (MIT, GPL, Creative Commons) schützen Code und Content, aber nicht **Lernende**. Die DSGVO schützt Daten, aber nicht **pädagogische Prinzipien**.
|
||||
|
||||
Die CKL füllt diese Lücke.
|
||||
|
||||
Sie ist inspiriert von:
|
||||
- **Waldwächter-Philosophie**: Transparency over magic
|
||||
- **OZM⟡NEXUS Manifest**: Die 8 Axiome (autonom, zukunftsoffen, nicht missbrauchbar...)
|
||||
- **Kinderrechtskonvention der UN**: Artikel 12 (Partizipation), 13 (Meinungsfreiheit), 16 (Privatsphäre)
|
||||
- **COPPA/GDPR-K**: Datenschutz für Minderjährige
|
||||
- **Ethical Source Movement**: Lizenzen mit Werten
|
||||
|
||||
**Aber:** Die CKL ist **keine Kopie**. Sie ist maßgeschneidert für das **Crumbforest-Ökosystem** und seine Community.
|
||||
|
||||
---
|
||||
|
||||
## Mitwirken
|
||||
|
||||
Die CKL ist ein **Living Document**. Version 0.1 ist ein Draft zur Community-Review.
|
||||
|
||||
**Feedback willkommen zu:**
|
||||
- Rechtssicherheit (ist etwas unklar oder nicht durchsetzbar?)
|
||||
- Praktikabilität (kann man das wirklich umsetzen?)
|
||||
- Lücken (fehlt etwas Wichtiges?)
|
||||
- Sprache (verständlich für Kinder, Pädagog:innen, Entwickler:innen?)
|
||||
|
||||
**Wie du beitragen kannst:**
|
||||
1. Issue öffnen im Repository
|
||||
2. Email an [Kontakt einfügen]
|
||||
3. Pull Request mit Verbesserungen
|
||||
|
||||
**Ziel:** CKL v1.0 bis Q1 2025
|
||||
|
||||
---
|
||||
|
||||
## Rechtlicher Status
|
||||
|
||||
**Achtung:** Die CKL ist in Version 0.1 noch **kein etablierter Rechtsstandard**. Sie ist:
|
||||
|
||||
- ✅ Eine vertragliche Vereinbarung zwischen Betreiber und Nutzenden
|
||||
- ✅ Kompatibel mit bestehenden Lizenzen (MIT, Apache, CC-BY)
|
||||
- ✅ Einklagbar bei Verstößen (sofern Vertragsbeziehung besteht)
|
||||
- ⏳ Noch nicht gerichtlich getestet
|
||||
- ⏳ Noch nicht von Juristen finalisiert
|
||||
|
||||
**Empfehlung:** Nutze die CKL in Kombination mit:
|
||||
- DSGVO-konformer Datenschutzerklärung
|
||||
- AGB für Workshops/Kurse
|
||||
- Einverständniserklärungen von Sorgeberechtigten
|
||||
|
||||
Die CKL **ergänzt** diese Dokumente, ersetzt sie aber nicht.
|
||||
|
||||
---
|
||||
|
||||
## Kontakt & Governance
|
||||
|
||||
- **Projekt**: Crumbforest (https://crumbforest.com)
|
||||
- **Maintainer**: Branko (https://branko.de)
|
||||
- **Custodian**: OZM - Open Futures Museum
|
||||
- **Lizenz-Fragen**: Siehe [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) für Governance-Struktur
|
||||
|
||||
---
|
||||
|
||||
## Abschließende Gedanken
|
||||
|
||||
Die CKL ist keine perfekte Lizenz.
|
||||
Sie ist ein **Versprechen**:
|
||||
|
||||
> Wir bauen Lernräume, in denen das Kind mehr zählt als der Klick,
|
||||
> die Frage mehr als die Metrik,
|
||||
> und das Verstehen mehr als das Vortäuschen.
|
||||
|
||||
**Wenn du dieses Versprechen teilst, nutze die CKL.**
|
||||
|
||||
---
|
||||
|
||||
**Version:** 0.1-draft
|
||||
**Datum:** 2025-12-13
|
||||
**Status:** Community Review
|
||||
**Nächste Version:** v1.0 (geplant Q1 2025)
|
||||
**SPDX-Identifier:** `CKL-0.1-draft` (nicht offiziell registriert)
|
||||
|
||||
---
|
||||
|
||||
> *"Nullfeld zuerst, dann Messung. Resonanz vor Regel."*
|
||||
> *"Wissen gehört dem Kind, solange es fragt."*
|
||||
> — Waldwächter-Prinzip
|
||||
72
LICENSE-MIT.md
Normal file
72
LICENSE-MIT.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2025 Crumbforest Project
|
||||
Maintained by Branko (branko.de)
|
||||
Custodian: OZM - Open Futures Museum
|
||||
|
||||
---
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.**
|
||||
|
||||
---
|
||||
|
||||
## Additional Context
|
||||
|
||||
This MIT License applies to the **infrastructure, code, and general use** of the Crumbforest project.
|
||||
|
||||
When this software is used in **educational contexts with children**, additional protections from the **Crumbforest Children's Knowledge License (CKL)** automatically apply.
|
||||
|
||||
See [LICENSE.md](LICENSE.md) for the full dual-license explanation.
|
||||
|
||||
---
|
||||
|
||||
## What This Means in Plain Language
|
||||
|
||||
You can:
|
||||
- ✅ Use this code for any purpose (personal, commercial, educational)
|
||||
- ✅ Copy, modify, and distribute it freely
|
||||
- ✅ Sell products or services based on this code
|
||||
- ✅ Sublicense it under different terms
|
||||
- ✅ Use it without attribution (though we appreciate it)
|
||||
|
||||
You cannot:
|
||||
- ❌ Hold the authors liable for damages
|
||||
- ❌ Claim warranty or support (it's provided "as is")
|
||||
- ❌ Remove the copyright notice from copies
|
||||
|
||||
**However:** If you use this with children, you **must also comply with the CKL** (see [LICENSE-CKL.md](LICENSE-CKL.md)).
|
||||
|
||||
---
|
||||
|
||||
## Why MIT?
|
||||
|
||||
The MIT License is one of the most permissive open source licenses. We chose it because:
|
||||
|
||||
1. **Developer-Friendly**: No copyleft restrictions, easy integration
|
||||
2. **Well-Understood**: Standard license used by millions of projects
|
||||
3. **Commercial-Compatible**: Businesses can adopt it without legal friction
|
||||
4. **Future-Proof**: Won't hinder Crumbforest's evolution or forking
|
||||
|
||||
**We want the code to spread as widely as possible.**
|
||||
|
||||
But we also want **children protected** — that's why we add the CKL layer.
|
||||
|
||||
---
|
||||
|
||||
**SPDX-License-Identifier:** MIT
|
||||
152
LICENSE.md
Normal file
152
LICENSE.md
Normal file
@@ -0,0 +1,152 @@
|
||||
# Crumbforest License
|
||||
|
||||
This project is **dual-licensed** to balance developer freedom with children's rights.
|
||||
|
||||
---
|
||||
|
||||
## For Infrastructure, Code, and General Use
|
||||
|
||||
**MIT License** (see [LICENSE-MIT.md](LICENSE-MIT.md))
|
||||
|
||||
All software, scripts, documentation, and infrastructure in this repository are released under the permissive MIT License. You are free to:
|
||||
|
||||
- Use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
- Use in commercial and non-commercial projects
|
||||
- Fork, remix, and build upon this work
|
||||
|
||||
**This applies to:**
|
||||
- All Bash scripts (`crumbpages-doktor.sh`, `ssh-agent-guard.sh`, etc.)
|
||||
- Documentation and Markdown files (Crumbpages content)
|
||||
- Configuration files and setup scripts
|
||||
- Any other code or infrastructure
|
||||
|
||||
---
|
||||
|
||||
## For Educational Use with Children
|
||||
|
||||
**Crumbforest Children's Knowledge License (CKL v0.1)** (see [LICENSE-CKL.md](LICENSE-CKL.md))
|
||||
|
||||
When this software or content is used in **educational contexts involving children**, the CKL automatically applies and adds additional protections:
|
||||
|
||||
- **Children's Rights**: Kids own what they create
|
||||
- **Data Sovereignty**: Exportable data, deletion rights, transparency
|
||||
- **No Paywalls**: Learning kernels remain free
|
||||
- **Offline-First**: No cloud dependency
|
||||
- **Reproducibility**: No black boxes, everything documented
|
||||
- **Privacy**: No tracking, minimal data, transparent storage
|
||||
|
||||
**This applies when:**
|
||||
- The software is used in schools, workshops, or learning environments
|
||||
- Children interact with the system (chat, projects, exercises)
|
||||
- Educational content is delivered to minors
|
||||
- Learning data is collected or processed
|
||||
|
||||
---
|
||||
|
||||
## Conflict Resolution
|
||||
|
||||
In case of conflict between MIT and CKL, **the CKL takes precedence** for any use case involving children.
|
||||
|
||||
**Example:**
|
||||
- You want to fork CrumbCore and sell it commercially? ✅ **MIT allows it**
|
||||
- You want to add telemetry to track children's behavior? ❌ **CKL prohibits it**
|
||||
|
||||
The CKL is **not a restriction on developers** — it's a **protection for learners**.
|
||||
|
||||
---
|
||||
|
||||
## Why Dual License?
|
||||
|
||||
### For Developers: MIT Freedom
|
||||
- Fork without friction
|
||||
- Integrate into commercial products
|
||||
- No attribution requirements beyond copyright notice
|
||||
- Standard, well-understood terms
|
||||
|
||||
### For Children: CKL Protection
|
||||
- Legal framework for ethical learning environments
|
||||
- Rights that can be enforced
|
||||
- Clear obligations for operators
|
||||
- Measurable compliance criteria
|
||||
|
||||
**The best of both worlds.**
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
| Use Case | License | Key Points |
|
||||
|----------|---------|------------|
|
||||
| Running CrumbCore for my company | MIT | Free to use commercially |
|
||||
| Forking and modifying the code | MIT | Attribution appreciated but not required |
|
||||
| Using in a school/workshop | CKL | Children's rights apply |
|
||||
| Collecting learning data | CKL | Must comply with §5 (privacy) |
|
||||
| Selling access to children | CKL | Must keep learning kernels free (§7.3) |
|
||||
| Building a proprietary AI trainer | MIT + CKL | Code is MIT, but children's data has CKL protection |
|
||||
|
||||
---
|
||||
|
||||
## How to Comply
|
||||
|
||||
### If you're a developer:
|
||||
1. Read the MIT License (2 minutes)
|
||||
2. If your use case involves children, read the CKL (~10 minutes)
|
||||
3. Implement CKL requirements (see [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section VI for checklist)
|
||||
|
||||
### If you're an educator:
|
||||
1. Read the CKL carefully
|
||||
2. Ensure your setup meets §4 (reproducibility), §5 (privacy), §7 (offline-first)
|
||||
3. Document data handling (see `DATENSCHUTZ.md` when available)
|
||||
|
||||
### If you're a child (or parent):
|
||||
1. You own what you create (§3.1)
|
||||
2. You can export your data (§3.2)
|
||||
3. You can leave and take everything with you (§3.3)
|
||||
4. Your questions never cost money (§7.3)
|
||||
|
||||
---
|
||||
|
||||
## Attribution
|
||||
|
||||
While not required by MIT, we appreciate attribution:
|
||||
|
||||
```
|
||||
Powered by Crumbforest (crumbforest.com)
|
||||
Licensed under MIT + CKL (Children's Knowledge License)
|
||||
```
|
||||
|
||||
Or simply:
|
||||
```
|
||||
Built with Crumbforest ❤️
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contact & Governance
|
||||
|
||||
- **Project**: Crumbforest (https://crumbforest.com)
|
||||
- **Maintainer**: Branko (https://branko.de)
|
||||
- **Custodian**: OZM - Open Futures Museum (in transition)
|
||||
- **Questions**: See [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section V for governance
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ MIT: Maximum Freedom for Developers │
|
||||
│ + │
|
||||
│ CKL: Maximum Protection for Children │
|
||||
│ = │
|
||||
│ Open Source Education Done Right │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Crumbforest is free as in freedom, safe as in sanctuary.**
|
||||
|
||||
---
|
||||
|
||||
**Version:** 1.0
|
||||
**Date:** 2025-12-13
|
||||
**Full Text:** [LICENSE-MIT.md](LICENSE-MIT.md) + [LICENSE-CKL.md](LICENSE-CKL.md)
|
||||
524
OZM-NEXUS-ECOSYSTEM.md
Normal file
524
OZM-NEXUS-ECOSYSTEM.md
Normal file
@@ -0,0 +1,524 @@
|
||||
# OZM⟡NEXUS ECOSYSTEM
|
||||
|
||||
> **Deterministisches System-Design jenseits von „KI"**
|
||||
> Ein offenes Lernökosystem, in dem Wissen verschenkt wird und Fragen Vorrang haben.
|
||||
|
||||
---
|
||||
|
||||
## Präambel: Echo aus dem Nullfeld
|
||||
|
||||
Der OZM⟡NEXUS ist kein Produkt, kein Manifest im klassischen Sinn und kein Versuch, etwas Bestehendes zu verbessern.
|
||||
|
||||
Er ist das Ergebnis einer klaren kausalen Kette, die aus einer menschlichen Handlung heraus entstanden ist und sich konsequent weiterentwickelt hat.
|
||||
|
||||
Was hier beschrieben wird, ist kein „KI-Projekt".
|
||||
Es ist der Versuch, ein **deterministisches Ökosystem** zu formulieren, das sich den üblichen Kategorien entzieht – nicht aus Provokation, sondern aus Notwendigkeit.
|
||||
|
||||
**Der Wald wurde gepflanzt, damit Krümel Fragen stellen und lernen dürfen.**
|
||||
|
||||
---
|
||||
|
||||
## I. Die Kausalitätskette
|
||||
|
||||
### Vom Menschen zur Struktur
|
||||
|
||||
Am Anfang steht **Oz** – der Graffiti-Künstler.
|
||||
Eine Signatur im öffentlichen Raum. Keine Theorie. Keine Absicht, ein System zu bauen.
|
||||
|
||||
Aus dieser Handlung entsteht **OZM** – die Manifestierung eines Ortes.
|
||||
Ein realer, physischer Raum, in dem sich Spuren, Zeit, Menschen und Bedeutungen überlagern.
|
||||
|
||||
Daraus folgt **OneZeroMore.com** – der Schatten dieses Ortes.
|
||||
Keine bloße Website, sondern eine digitale Projektion dessen, was physisch existiert.
|
||||
|
||||
Dann das **OZM HAMMERBROOKLYN Exponat** – ein Museum und doch kein Museum.
|
||||
Kein neutraler White Cube, sondern ein verdichteter Erfahrungsraum, der sich einer abschließenden Interpretation entzieht.
|
||||
|
||||
Erst daraus entsteht **OZMAI** – die künstliche Intelligenz des OZM.
|
||||
Ein deterministisches Agentensystem, das Daten, Prozesse, Wissen und Entscheidungen strukturiert.
|
||||
|
||||
**Diese Reihenfolge ist nicht verhandelbar.**
|
||||
Ohne Ort keine Daten.
|
||||
Ohne Geschichte kein Kontext.
|
||||
Ohne Kontext keine sinnvolle Maschine.
|
||||
|
||||
### Mathematische Notation
|
||||
|
||||
```
|
||||
OZM⟡NEXUS = f_det(Oz, OZM, OneZeroMore, HAMMERBROOKLYN, OZMAI)
|
||||
|
||||
K_ent = (R_man + L_det) ⊗ Ω
|
||||
|
||||
I = Autonom ∩ Zukunftsoffen ∩ ¬Interpretierbar ∩ ¬Missbrauchbar
|
||||
|
||||
Σ_skal = lim (∑ X_i) mit der Bedingung: jedes X_i erfüllt I
|
||||
n → ∞
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## II. Die acht Axiome
|
||||
|
||||
### Das Identitätsprinzip
|
||||
|
||||
```
|
||||
I = Autonom ∩ Zukunftsoffen ∩ ¬Interpretierbar ∩ ¬Missbrauchbar
|
||||
```
|
||||
|
||||
Jede Komponente des OZM⟡NEXUS muss erfüllen:
|
||||
|
||||
| Axiom | Bedeutung | Prüffrage |
|
||||
|-------|-----------|-----------|
|
||||
| **autonom** | Krümel entscheiden selbst ihren Lernweg | Kann das Kind wählen? |
|
||||
| **zukunftsoffen** | Nicht vorschreiben, sondern ermöglichen | Ist es erweiterbar? |
|
||||
| **nicht interpretierbar** | Kein "richtiger" Weg, nur funktionale Wege | Gibt es eine Wahrheit™? |
|
||||
| **nicht missbrauchbar** | Schutz der Lernenden durch Design | Was kann schiefgehen? |
|
||||
| **suchbar** | Fragen führen zu Antworten | Findet man Antworten? |
|
||||
| **wiedererkennbar** | Orientierung im Wald | Gibt es Krümel? |
|
||||
| **erweiterbar** | Krümel können selbst pflanzen | Kann ich beitragen? |
|
||||
| **unendlich skalierbar** | Für alle, immer | Kostet eine Frage Geld? |
|
||||
|
||||
**Diese Axiome sind keine Beschreibung. Sie sind eine Bedingung.**
|
||||
|
||||
---
|
||||
|
||||
## III. Die Manifestationen
|
||||
|
||||
### Architektur des Ökosystems
|
||||
|
||||
```
|
||||
OZM⟡NEXUS (Träger/Manifest)
|
||||
↓
|
||||
branko.de/Crumbforest (Public Interface)
|
||||
├─ 15 Charaktere (Krümeleule, FunkFox, SnakePy, CrabbyRust...)
|
||||
├─ 4 Lernpfade (ESP32 → Pi Zero → Pi Server → Daten)
|
||||
├─ Partner-Netzwerk (8 Organisationen)
|
||||
└─ Grundsatz: "Every child may ask. We protect this right."
|
||||
↓
|
||||
CrumbCore v1 (Local Engine - "nah am Kernel")
|
||||
├─ FastAPI + Qdrant RAG (Vektorsuche)
|
||||
├─ Role-based Chat (15 Personas)
|
||||
├─ Multi-Theme (Standard, Accessible, High Contrast, Admin Dark)
|
||||
├─ Token-Management (Kids = free)
|
||||
├─ Docker Compose (reproduzierbar)
|
||||
└─ API für externe Abfragen
|
||||
↓
|
||||
Crumbpages v2 (Work in Progress Content)
|
||||
├─ 20 Lernpfade (Markdown, noch nicht integriert)
|
||||
├─ Operational Tools (crumbpages-doktor.sh, SSH guards)
|
||||
├─ Waldwächter-Philosophie ("Transparency over magic")
|
||||
└─ Bash-zentrisch, lehrbar, offline-fähig
|
||||
```
|
||||
|
||||
### Die 15 Charaktere
|
||||
|
||||
**Warum Charaktere statt "Assistenten"?**
|
||||
|
||||
Menschen lernen unterschiedlich. Ein technischer Deep-Dive funktioniert für manche, eine poetische Erklärung für andere. Die 15 Charaktere sind **keine Spielerei** – sie sind **pädagogisches Design**:
|
||||
|
||||
- **Krümeleule** (Prof. Eule): Shell-Schutz, systematisch, geduldig
|
||||
- **FunkFox**: Bash-Rapper, antwortet in Reimen
|
||||
- **SnakePy**: Python-Loops, Geduld und Iteration
|
||||
- **CrabbyRust**: Bit-Schutz, Speichersicherheit, Rust-Konzepte
|
||||
- **DeepBit**: Technische Deep-Dives in die Tiefe
|
||||
- [...weitere 10 Charaktere]
|
||||
|
||||
**Kinder wählen selbst, wer sie begleitet.**
|
||||
Das ist Axiom #1: **autonom**.
|
||||
|
||||
### Content-Flow
|
||||
|
||||
```
|
||||
Markdown (Crumbpages)
|
||||
↓
|
||||
./load_content.sh <GIT_REPO_URL>
|
||||
↓
|
||||
Qdrant Vektorisierung (CrumbCore)
|
||||
↓
|
||||
RAG-Suche über API
|
||||
↓
|
||||
15 Charaktere antworten kontextbezogen
|
||||
↓
|
||||
branko.de zeigt Antworten
|
||||
```
|
||||
|
||||
**Status quo:**
|
||||
- Crumbpages sind "work in progress", noch nicht integriert
|
||||
- Nur Kids mit free tokens haben Zugriff
|
||||
- System läuft lokal ("nah am Kernel"), nicht in der Cloud
|
||||
|
||||
**Warum lokal?**
|
||||
- Schutz der Daten (Axiom #4: nicht missbrauchbar)
|
||||
- Offline-fähig (Axiom #8: unendlich skalierbar = kein Cloud-Lock-in)
|
||||
- Reproduzierbar (Waldwächter-Prinzip: Transparency over magic)
|
||||
|
||||
---
|
||||
|
||||
## IV. Die Crumbforest Children's Knowledge License (CKL)
|
||||
|
||||
### Von der Philosophie zum Recht
|
||||
|
||||
Das OZM⟡NEXUS Manifest beschreibt **was sein soll**.
|
||||
Die CKL beschreibt **wie es durchgesetzt wird**.
|
||||
|
||||
### CKL ⊗ Axiome Mapping
|
||||
|
||||
| OZM Axiom | CKL Implementation | § |
|
||||
|-----------|-------------------|---|
|
||||
| autonom | Kind darf "mit guter Frage alles in Frage stellen" | §2 |
|
||||
| zukunftsoffen | Container, reproduzierbar, nachbaubar | §6.2 |
|
||||
| nicht interpretierbar | "Logik vor Effekt" - keine Blackboxes | §6.3 |
|
||||
| nicht missbrauchbar | Kein Tracking, Datenminimierung, Widerruf | §5 |
|
||||
| suchbar | Barrierearme Zugänge, Markdown, Druck | §7.2 |
|
||||
| wiedererkennbar | Namensnennung, CKL-Hinweis sichtbar | §8.1 |
|
||||
| erweiterbar | Offene Formate, exportierbar, forkbar | §3.2 |
|
||||
| unendlich skalierbar | "Preisfreiheit für Kinderfragen" | §7.3 |
|
||||
|
||||
### Kernprinzipien der CKL
|
||||
|
||||
**Für Kinder:**
|
||||
- Du besitzt, was du schaffst (§3.1)
|
||||
- Du kannst deine Daten exportieren (§3.2)
|
||||
- Du kannst jederzeit gehen und alles mitnehmen (§3.3)
|
||||
- Deine Fragen kosten kein Geld (§7.3)
|
||||
|
||||
**Für Erwachsene/Betreiber:**
|
||||
- Setups sind reproduzierbar dokumentiert (§4.1)
|
||||
- Keine Blackboxes, keine Magie (§6.3)
|
||||
- Datenminimierung, kein Tracking (§5.1, §5.2)
|
||||
- Offline hat Vorrang vor Cloud (§7.1)
|
||||
|
||||
**Für Kommerz:**
|
||||
- Kommerz ist erlaubt, **solange Kinderzugang frei bleibt** (§8.2)
|
||||
- Keine Paywalls vor Lernkernen
|
||||
- Keine Exklusivitätsansprüche (§8.3)
|
||||
|
||||
### Lizenz-Strategie
|
||||
|
||||
```markdown
|
||||
# Dual License Model
|
||||
|
||||
## Infrastructure/Code → MIT License
|
||||
- Backend (FastAPI, Python)
|
||||
- Frontend (HTML/JS)
|
||||
- Scripts (Bash, Docker Compose)
|
||||
- Developer-friendly, permissive
|
||||
|
||||
## Educational Use with Children → CKL v0.1
|
||||
- Sobald ein Kind damit lernt
|
||||
- Automatischer Schutz durch CKL
|
||||
- Bei Konflikt: strengere Regel gewinnt
|
||||
```
|
||||
|
||||
**Das ist brilliant legal engineering:**
|
||||
Code bleibt MIT (fork-friendly für Entwickler), aber **Kinderrechte sind nicht verhandelbar**.
|
||||
|
||||
---
|
||||
|
||||
## V. OZM als Träger: Vom Partner zum Custodian
|
||||
|
||||
### Status Quo
|
||||
|
||||
**branko.de heute:**
|
||||
> "OZM (Open Futures Museum)" - gelistet als Partner #1 von 8
|
||||
|
||||
**Rechtslage:**
|
||||
- Crumbforest = Projekt von Branko
|
||||
- Code teils öffentlich (CrumbCore lesbar), teils privat (Crumbpages 404)
|
||||
- "Open" als Philosophie, noch nicht als Lizenz
|
||||
|
||||
### Die Vision: OZM als rechtlicher Träger
|
||||
|
||||
**Was ändert sich?**
|
||||
|
||||
| Dimension | Vorher (Partner) | Nachher (Träger) |
|
||||
|-----------|------------------|------------------|
|
||||
| **Ownership** | Branko hält IP-Rechte | OZM hält treuhänderisch |
|
||||
| **Lizenz** | Implizit "open" | Explizit CKL + MIT |
|
||||
| **Governance** | Informell | Formalisiert (siehe unten) |
|
||||
| **Haftung** | Personenbezogen | Organisationsbezogen |
|
||||
| **Förderung** | Schwierig (Person) | Einfacher (gemeinnützig) |
|
||||
| **Kontinuität** | An Person gebunden | Institutionell gesichert |
|
||||
|
||||
### Governance-Struktur (Vorschlag)
|
||||
|
||||
```
|
||||
OZM e.V. / Open Futures Museum
|
||||
└─ Crumbforest Division
|
||||
├─ Lead Maintainer: Branko (technisch)
|
||||
├─ Education Lead: [offen]
|
||||
├─ CKL Compliance Officer: [offen]
|
||||
└─ Community Council (3-5 Personen)
|
||||
└─ Entscheidungen bei Konflikten
|
||||
```
|
||||
|
||||
**Entscheidungsprinzip:**
|
||||
1. **Technische Fragen** → Lead Maintainer (Branko)
|
||||
2. **Pädagogische Fragen** → Education Lead
|
||||
3. **Lizenz-Fragen** → CKL Officer
|
||||
4. **Grundsatzfragen** → Community Council
|
||||
5. **Im Zweifel gilt:** "Was ist besser für das Kind?" (CKL §2)
|
||||
|
||||
### Transition-Prozess
|
||||
|
||||
**Phase 1: Formalisierung (Q1 2025)**
|
||||
- [ ] CKL v0.1 → v1.0 finalisieren
|
||||
- [ ] Alle 3 Repos mit LICENSE.md ausstatten
|
||||
- [ ] KINDERRECHTE.md in CrumbCore schreiben
|
||||
- [ ] DATENSCHUTZ.md dokumentieren
|
||||
|
||||
**Phase 2: Rechtliche Übertragung (Q2 2025)**
|
||||
- [ ] Trademark "Crumbforest" → OZM übertragen
|
||||
- [ ] IP-Rechte treuhänderisch an OZM
|
||||
- [ ] Governance-Dokument unterzeichnen
|
||||
- [ ] branko.de Update: OZM als Träger
|
||||
|
||||
**Phase 3: Community-Öffnung (Q3 2025)**
|
||||
- [ ] Contribution Guidelines veröffentlichen
|
||||
- [ ] Erstes Community Council Meeting
|
||||
- [ ] Public Roadmap auf GitHub/Gitea
|
||||
- [ ] Erste externe Contributors
|
||||
|
||||
---
|
||||
|
||||
## VI. Technische Compliance
|
||||
|
||||
### CrumbCore v1: CKL-Check
|
||||
|
||||
| CKL Anforderung | Status | Beweis |
|
||||
|-----------------|--------|--------|
|
||||
| §6.2: Container-basiert | ✅ | `docker-compose.yml` |
|
||||
| §7.1: Offline-fähig | ✅ | Läuft lokal, kein Cloud-Zwang |
|
||||
| §7.3: Kids = free tokens | ✅ | Token-Management implementiert |
|
||||
| §6.1: Nachvollziehbar | ✅ | Qdrant = transparente Vektorsuche |
|
||||
| §3.2: Export möglich | ⏳ | **TODO**: `/api/my-data` Endpoint |
|
||||
| §5.3: Daten dokumentiert | ⏳ | **TODO**: `DATENSCHUTZ.md` |
|
||||
| §4.1: Setup reproduzierbar | ✅ | `./setup.sh`, `./load_content.sh` |
|
||||
| §5.2: Kein Tracking | ✅ | Kein Google Analytics, keine Telemetrie |
|
||||
|
||||
### Crumbpages v2: CKL-Check
|
||||
|
||||
| CKL Anforderung | Status | Beweis |
|
||||
|-----------------|--------|--------|
|
||||
| §6.1: Offene Beweise | ✅ | Markdown = menschenlesbar |
|
||||
| §4.1: Reproduzierbar | ✅ | Bash-Scripts, keine Magie |
|
||||
| §7.2: Offline-lesbar | ✅ | Keine Cloud-Abhängigkeit |
|
||||
| §7.1: Barrierefrei | ✅ | Plain text, druckbar |
|
||||
| §6.2: Integriert | ⏳ | **TODO**: In CrumbCore laden |
|
||||
|
||||
### branko.de: CKL-Check
|
||||
|
||||
| CKL Anforderung | Status | Beweis |
|
||||
|-----------------|--------|--------|
|
||||
| §7.2: Barrierefrei | ✅ | HTML, kein JS-Zwang |
|
||||
| §2: "Kinder zuerst" | ✅ | "Every child may ask" |
|
||||
| §8.1: CKL-Badge | ❌ | **TODO**: Footer mit CKL-Hinweis |
|
||||
| §9: Transparenz | ⏳ | **TODO**: Förderungen ausweisen |
|
||||
|
||||
---
|
||||
|
||||
## VII. Die nächsten Schritte
|
||||
|
||||
### Sofort (diese Woche)
|
||||
|
||||
1. **Formale Lizenzierung**
|
||||
```bash
|
||||
# In allen 3 Repos:
|
||||
touch LICENSE.md # Dual License (MIT + CKL)
|
||||
touch LICENSE-MIT.md # Full MIT text
|
||||
touch LICENSE-CKL.md # Full CKL text
|
||||
```
|
||||
|
||||
2. **Kinderrechte operationalisieren**
|
||||
```bash
|
||||
# In CrumbCore:
|
||||
touch KINDERRECHTE.md # Export/Widerruf-Prozesse
|
||||
touch DATENSCHUTZ.md # Was speichern wir wo?
|
||||
```
|
||||
|
||||
3. **CKL-Badge hinzufügen**
|
||||
```html
|
||||
<!-- branko.de footer: -->
|
||||
<footer>
|
||||
Dieses Projekt folgt der
|
||||
<a href="/ckl">Crumbforest Children's Knowledge License (CKL v0.1)</a>
|
||||
</footer>
|
||||
```
|
||||
|
||||
### Kurzfristig (Q1 2025)
|
||||
|
||||
4. **Export-API implementieren**
|
||||
```python
|
||||
# CrumbCore: app/routers/data_export.py
|
||||
@router.get("/api/my-data")
|
||||
async def export_my_data(token: str):
|
||||
# JSON mit allen Chat-Logs, Projekten, Messungen
|
||||
return {"messages": [...], "projects": [...]}
|
||||
```
|
||||
|
||||
5. **Widerruf-Mechanismus**
|
||||
```python
|
||||
@router.delete("/api/my-data")
|
||||
async def delete_my_data(token: str):
|
||||
# Löscht aus MariaDB + Qdrant
|
||||
pass
|
||||
```
|
||||
|
||||
6. **Crumbpages Integration**
|
||||
```bash
|
||||
# Automatisierter Pipeline:
|
||||
./load_content.sh https://gitea.crumbforest.local/kruemel/Crumbpages
|
||||
# → Qdrant indexiert alle 20 Lernpfade
|
||||
# → Charaktere können darauf antworten
|
||||
```
|
||||
|
||||
### Mittelfristig (Q2 2025)
|
||||
|
||||
7. **OZM Governance formalisieren**
|
||||
- Gespräche mit OZM e.V. führen
|
||||
- Trademark-Übertragung vorbereiten
|
||||
- Governance-Dokument entwerfen
|
||||
|
||||
8. **Community-Prozesse**
|
||||
- `CONTRIBUTING.md` schreiben
|
||||
- Issue Templates erstellen
|
||||
- First Contributors Guide
|
||||
|
||||
9. **Public Roadmap**
|
||||
- GitHub Projects / Gitea Kanban
|
||||
- Transparenz über Entwicklung
|
||||
|
||||
### Langfristig (Q3-Q4 2025)
|
||||
|
||||
10. **Skalierung**
|
||||
- Multi-Instanz-Support (jede Schule ihre eigene CrumbCore)
|
||||
- Federation (Instanzen können Wissen teilen)
|
||||
- CKL v2.0 (basierend auf Community-Feedback)
|
||||
|
||||
11. **Förderanträge**
|
||||
- Prototype Fund
|
||||
- Medien- und Bildungsförderung
|
||||
- EU Horizon (Education & Inclusion)
|
||||
|
||||
---
|
||||
|
||||
## VIII. Für neue Mitwirkende
|
||||
|
||||
### Du möchtest beitragen?
|
||||
|
||||
**Willkommen im Wald!** 🌲
|
||||
|
||||
Crumbforest ist ein **offenes Lernökosystem**. Jede:r kann Krümel pflanzen.
|
||||
|
||||
**Voraussetzungen:**
|
||||
- Du akzeptierst die **CKL** (Kinder haben Vorrang)
|
||||
- Du arbeitest **transparent** (keine Blackboxes)
|
||||
- Du dokumentierst **nachvollziehbar** (andere sollen nachbauen können)
|
||||
|
||||
**Wie kannst du helfen?**
|
||||
|
||||
| Wenn du kannst... | Dann kannst du... |
|
||||
|-------------------|-------------------|
|
||||
| **Bash/Linux** | Crumbpages schreiben, doktor-Module erweitern |
|
||||
| **Python/FastAPI** | CrumbCore verbessern, APIs bauen |
|
||||
| **Pädagogik** | Lernpfade testen, Charaktere verfeinern |
|
||||
| **Design** | branko.de verbessern, Accessibility |
|
||||
| **Recht** | CKL v1.0 reviewen, Governance helfen |
|
||||
| **Übersetzen** | Crumbpages auf Englisch/andere Sprachen |
|
||||
|
||||
**Erster Schritt:**
|
||||
1. Lies die **CKL** (`LICENSE-CKL.md`)
|
||||
2. Schau dir ein Repo an (CrumbCore, Crumbpages, branko.de)
|
||||
3. Such ein `TODO` oder `⏳` in diesem Dokument
|
||||
4. Melde dich bei Branko oder OZM
|
||||
|
||||
---
|
||||
|
||||
## IX. Warum das wichtig ist
|
||||
|
||||
### Das Problem
|
||||
|
||||
**Bildungs-KI heute:**
|
||||
- Proprietäre Blackboxes (ChatGPT, Gemini...)
|
||||
- Kinder als Datenquelle ("Training Data")
|
||||
- Paywalls vor Wissen
|
||||
- Keine Kontrolle, keine Transparenz
|
||||
- Cloud-Zwang, Überwachungskapitalismus
|
||||
|
||||
**Kinderrechte werden strukturell verletzt.**
|
||||
|
||||
### Die Alternative
|
||||
|
||||
**Crumbforest ist:**
|
||||
- Open Source (MIT + CKL)
|
||||
- Lokal betreibbar (keine Cloud nötig)
|
||||
- Transparent (jeder Schritt nachvollziehbar)
|
||||
- Kind-zentriert (Urheberschaft bleibt beim Kind)
|
||||
- Gemeinnützig (wird verschenkt, nicht verkauft)
|
||||
|
||||
**Das ist keine "bessere EdTech-Plattform".**
|
||||
**Das ist eine andere Art, über Lernen nachzudenken.**
|
||||
|
||||
### Die Vision
|
||||
|
||||
Stell dir vor:
|
||||
- Jede Schule hat ihre eigene CrumbCore-Instanz
|
||||
- Kinder besitzen ihre Lernprojekte, für immer
|
||||
- Fragen sind frei, Antworten sind offen
|
||||
- Charaktere begleiten, ohne zu überwachen
|
||||
- Der Code ist prüfbar, das Wissen teilbar
|
||||
|
||||
**Das ist der Wald.**
|
||||
**Und er gehört denen, die Fragen stellen.**
|
||||
|
||||
---
|
||||
|
||||
## X. Schlusswort
|
||||
|
||||
OZM⟡NEXUS ist kein Versprechen.
|
||||
**Er ist eine Konsequenz.**
|
||||
|
||||
Aus einer Signatur im öffentlichen Raum (Oz)
|
||||
wurde ein Ort (OZM)
|
||||
wurde ein digitaler Schatten (OneZeroMore)
|
||||
wurde ein Museum (HAMMERBROOKLYN)
|
||||
wurde eine Maschine (OZMAI)
|
||||
wurde ein Wald (Crumbforest).
|
||||
|
||||
**Und jetzt wird er verschenkt.**
|
||||
|
||||
Nicht aus Großzügigkeit.
|
||||
Sondern weil **Wissen dem Kind gehört, solange es fragt.**
|
||||
|
||||
---
|
||||
|
||||
## Ressourcen
|
||||
|
||||
### Repositories
|
||||
- **CrumbCore v1**: https://194-164-194-191.sslip.io/git/kruemel/Crumb-Core-v.1
|
||||
- **Crumbpages v2**: https://194-164-194-191.sslip.io/git/kruemel/Crumbforest-Markdowns
|
||||
- **branko.de**: https://branko.de
|
||||
|
||||
### Lizenzen
|
||||
- **CKL v0.1**: [siehe LICENSE-CKL.md]
|
||||
- **MIT**: [siehe LICENSE-MIT.md]
|
||||
|
||||
### Kontakt
|
||||
- **Lead Maintainer**: Branko
|
||||
- **OZM**: Open Futures Museum, Hamburg
|
||||
- **Website**: https://crumbforest.com
|
||||
|
||||
### Hashtags
|
||||
`#OZM` `#OPENSOURCE` `#CRUMBFOREST` `#CKL` `#KINDERRECHTE` `#BILDUNG`
|
||||
|
||||
---
|
||||
|
||||
**Version:** 0.1-draft
|
||||
**Datum:** 2025-12-13
|
||||
**Status:** Living Document
|
||||
**Lizenz:** CC-BY-SA 4.0 (dieses Dokument)
|
||||
|
||||
---
|
||||
|
||||
> *"Nullfeld zuerst, dann Messung. Resonanz vor Regel."*
|
||||
> — Waldwächter-Prinzip
|
||||
344
README.md
Normal file
344
README.md
Normal file
@@ -0,0 +1,344 @@
|
||||
# Crumbpages v2 🌲
|
||||
|
||||
> **Dokumentation und Lernsystem für System-Administration**
|
||||
> Teil des Crumbforest-Ökosystems
|
||||
|
||||
---
|
||||
|
||||
## 📜 Lizenz & Kinderrechte
|
||||
|
||||
[](LICENSE.md)
|
||||
[](LICENSE-CKL.md)
|
||||
|
||||
Dieses Projekt ist **dual-lizenziert**:
|
||||
- **MIT License** für Code und allgemeine Nutzung
|
||||
- **CKL (Children's Knowledge License)** für Bildungskontexte mit Kindern
|
||||
|
||||
**Für Lernende:** Deine Rechte sind geschützt. [Lies hier mehr →](KINDERRECHTE.md)
|
||||
|
||||
**Für Entwickler:** Frei nutzbar und forkbar. [Compliance-Infos →](LICENSE.md)
|
||||
|
||||
---
|
||||
|
||||
## Was ist Crumbpages?
|
||||
|
||||
**Crumbpages v2** kombiniert **Bildungsdokumentation** mit **operationalen Tools** für System-Administration:
|
||||
|
||||
### 📚 Lernpfade
|
||||
- **20 Crumbpages** (Markdown) zu Linux-Fundamenten, SSH, Netzwerk, Kernel, uvm.
|
||||
- Template-basierte Struktur für konsistentes Lernen
|
||||
- Progressive Learning Paths: von Basics zu Advanced Topics
|
||||
|
||||
### 🛠️ Operational Tools
|
||||
- **`crumbpages-doktor.sh`** (496 Zeilen) - Hauptwerkzeug für Diagnostik & Operations
|
||||
- **`ssh-agent-guard.sh`** - Produktions-SSH-Security-Daemon
|
||||
- **`ssh-agent-screenlock_v4.sh`** - MATE Desktop SSH-Integration
|
||||
|
||||
### 🌳 Philosophie: Waldwächter
|
||||
**"Transparency over magic"**
|
||||
- Bash-zentrisch, klar lesbar, lehrbar
|
||||
- Minimale Dependencies, einfache Patterns
|
||||
- Education-First: Alle Tools sind verständlich und nachvollziehbar
|
||||
|
||||
---
|
||||
|
||||
## Schnellstart
|
||||
|
||||
### 1. Haupttool starten
|
||||
```bash
|
||||
# Ausführbar machen (einmalig)
|
||||
chmod +x crumbpages-doktor.sh
|
||||
|
||||
# Interaktives Menü starten
|
||||
./crumbpages-doktor.sh
|
||||
```
|
||||
|
||||
**Das Doktor-Tool bietet 6 Module:**
|
||||
1. **Git Workstation** - Interaktive Git-Shell mit Health Checks
|
||||
2. **DNS Doktor** - DNS-Diagnostik und Reporting
|
||||
3. **System Doktor** - Host Vitals (Disk, RAM, OS Info)
|
||||
4. **Web Tools** - API-Testing (`api_search`, `api_get`, `api_ask`)
|
||||
5. **Remote Tools** - SSH-Helfer und SCP-Uploads
|
||||
6. **Werkzeugkasten** - Tool-Verfügbarkeits-Checks
|
||||
|
||||
### 2. SSH-Security aktivieren
|
||||
```bash
|
||||
# SSH-Agent Guard starten (systemd/autostart)
|
||||
./ssh-agent-guard.sh
|
||||
|
||||
# Für MATE Desktop Integration
|
||||
./ssh-agent-screenlock_v4.sh
|
||||
```
|
||||
|
||||
**Beide Scripts:**
|
||||
- Killen und starten ssh-agent bei Screen Lock neu
|
||||
- Loggen nach `~/.ssh-agent-screenlock.log`
|
||||
- Nutzen festen Socket-Path `~/.ssh/agent.sock`
|
||||
|
||||
### 3. Lernpfade durcharbeiten
|
||||
```bash
|
||||
# Crumbpages lesen (Markdown)
|
||||
ls crumbpage-*.md
|
||||
|
||||
# Template für neue Pages
|
||||
cat crumbpage-template.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dokumentation
|
||||
|
||||
### 🔑 Wichtigste Dokumente
|
||||
|
||||
| Dokument | Beschreibung |
|
||||
|----------|--------------|
|
||||
| **[OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md)** | 🌐 **Das große Bild**: Wie Crumbpages ins OZM⟡NEXUS Ökosystem passt |
|
||||
| **[LICENSE.md](LICENSE.md)** | 📜 Dual-Lizenz erklärt (MIT + CKL) |
|
||||
| **[LICENSE-CKL.md](LICENSE-CKL.md)** | 🛡️ Die vollständige Children's Knowledge License |
|
||||
| **[KINDERRECHTE.md](KINDERRECHTE.md)** | 👶 Deine Rechte als Lernende/r (Export, Löschung, Eigentum) |
|
||||
| **[CLAUDE.md](CLAUDE.md)** | 🤖 Anleitung für Claude Code (Codebase-Kontext) |
|
||||
| **[HANDBUCH.md](HANDBUCH.md)** | 📖 Manual für crumbpages-doktor.sh |
|
||||
| **[QUICKSTART.md](QUICKSTART.md)** | ⚡ Quick Reference für häufige Operationen |
|
||||
|
||||
### 🗂️ Meta-Dokumentation
|
||||
- **[CRUMBFOREST_PROJECT_INDEX.md](CRUMBFOREST_PROJECT_INDEX.md)** - Komplette Projekthistorie & Milestones
|
||||
- **[crumbforest-manifesto-guardian.md](crumbforest-manifesto-guardian.md)** - Waldwächter-Philosophie
|
||||
- **Tagebuch-Dateien** - Problem-Solving-Journeys
|
||||
|
||||
---
|
||||
|
||||
## Das größere Ökosystem
|
||||
|
||||
Crumbpages v2 ist **Teil des Crumbforest**:
|
||||
|
||||
```
|
||||
OZM⟡NEXUS (Träger/Manifest)
|
||||
↓
|
||||
branko.de/Crumbforest (Public Interface)
|
||||
├─ 15 Charaktere (Krümeleule, FunkFox, SnakePy...)
|
||||
├─ 4 Lernpfade (ESP32 → Pi Zero → Pi Server → Daten)
|
||||
└─ "Every child may ask. We protect this right."
|
||||
↓
|
||||
CrumbCore v1 (Local Engine)
|
||||
├─ FastAPI + Qdrant RAG
|
||||
├─ Role-based Chat (15 Personas)
|
||||
├─ Multi-Theme (Accessible, High Contrast...)
|
||||
└─ Token-Management (Kids = free)
|
||||
↓
|
||||
Crumbpages v2 (dieser Repo) ← 📍 DU BIST HIER
|
||||
├─ 20 Lernpfade (Markdown)
|
||||
├─ Operational Tools (doktor, SSH guards)
|
||||
└─ Waldwächter-Philosophie
|
||||
```
|
||||
|
||||
**Mehr dazu:** [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md)
|
||||
|
||||
---
|
||||
|
||||
## Die 8 Axiome
|
||||
|
||||
Alle Komponenten des Crumbforest folgen diesen Prinzipien:
|
||||
|
||||
✅ **autonom** - Du entscheidest deinen Lernweg
|
||||
✅ **zukunftsoffen** - Erweiterbar, nicht fertig
|
||||
✅ **nicht interpretierbar** - Kein "richtiger" Weg, nur funktionale
|
||||
✅ **nicht missbrauchbar** - Schutz durch Design
|
||||
✅ **suchbar** - Fragen führen zu Antworten
|
||||
✅ **wiedererkennbar** - Krümel zeigen den Weg
|
||||
✅ **erweiterbar** - Du kannst selbst pflanzen
|
||||
✅ **unendlich skalierbar** - Für alle, immer, kostenlos
|
||||
|
||||
**Mehr dazu:** [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section II
|
||||
|
||||
---
|
||||
|
||||
## Konfiguration
|
||||
|
||||
### `.env` Datei
|
||||
Das Doktor-Tool nutzt `.env` für Konfiguration (wird beim ersten Start erstellt):
|
||||
|
||||
```ini
|
||||
# API Endpoints (für CrumbCore Integration)
|
||||
CRUMB_API_URL="http://localhost:8000"
|
||||
CRUMB_API_TOKEN="changeme"
|
||||
|
||||
# SSH/Remote Settings
|
||||
CRUMB_SSH_USER="admin"
|
||||
CRUMB_SCP_TARGET="backup.crumbforest.de:/var/backups"
|
||||
|
||||
# Qdrant Vector DB
|
||||
CRUMB_QDRANT_URL="http://localhost:6333"
|
||||
CRUMB_QDRANT_KEY=""
|
||||
```
|
||||
|
||||
**Tipp:** Nie in Git committen! (ist bereits in `.gitignore`)
|
||||
|
||||
---
|
||||
|
||||
## Für neue Mitwirkende
|
||||
|
||||
### 🌱 Willkommen im Wald!
|
||||
|
||||
Crumbforest ist ein **offenes Lernökosystem**. Jede/r kann Krümel pflanzen.
|
||||
|
||||
**Voraussetzungen:**
|
||||
- Du akzeptierst die **CKL** (Kinder haben Vorrang)
|
||||
- Du arbeitest **transparent** (keine Blackboxes)
|
||||
- Du dokumentierst **nachvollziehbar** (andere sollen nachbauen können)
|
||||
|
||||
### Wie du beitragen kannst:
|
||||
|
||||
| Wenn du kannst... | Dann kannst du... |
|
||||
|-------------------|-------------------|
|
||||
| **Bash/Linux** | Crumbpages schreiben, doktor-Module erweitern |
|
||||
| **Python/FastAPI** | An CrumbCore arbeiten (anderes Repo) |
|
||||
| **Pädagogik** | Lernpfade testen, Charaktere verfeinern |
|
||||
| **Design** | branko.de verbessern, Accessibility |
|
||||
| **Recht** | CKL v1.0 reviewen, Governance helfen |
|
||||
| **Übersetzen** | Crumbpages auf Englisch/andere Sprachen |
|
||||
|
||||
### Erste Schritte:
|
||||
|
||||
1. **Lies die CKL:** [LICENSE-CKL.md](LICENSE-CKL.md)
|
||||
2. **Verstehe das Ökosystem:** [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md)
|
||||
3. **Such ein TODO:** Siehe Section VII in OZM-NEXUS-ECOSYSTEM.md
|
||||
4. **Melde dich:** [Kontakt siehe unten]
|
||||
|
||||
---
|
||||
|
||||
## Entwickler-Tipps
|
||||
|
||||
### Wenn du Shell-Scripts editierst:
|
||||
- Teste interaktiv vor dem Commit (Scripts sind für Menschen gedacht)
|
||||
- Bewahre Farbschema-Konsistenz (`GREEN`, `BLUE`, `RED`, `YELLOW`, `CYAN`)
|
||||
- Behalte Modul-Grenzen im doktor-Script bei
|
||||
- Update HANDBUCH.md bei Änderungen an doktor-Modulen
|
||||
|
||||
### Wenn du Crumbpages editierst:
|
||||
- Folge `crumbpage-template.md` Struktur exakt
|
||||
- Behalte Nummerierungsschema bei (`crumbpage-##-topic.md`)
|
||||
- Füge Skill Checks und Hands-on Exercises ein
|
||||
- Verlinke zu verwandten Pages im Navigation Footer
|
||||
|
||||
### Wenn du debuggst:
|
||||
- Check `.env` Konfiguration zuerst
|
||||
- Review Logs: `~/.ssh-agent-screenlock.log` für SSH Issues
|
||||
- Nutze doktor's System Doktor Modul für Host-Diagnostik
|
||||
- Git Workstation Modul hat `check_health` für Repo-Status
|
||||
|
||||
---
|
||||
|
||||
## Sicherheit
|
||||
|
||||
### SSH Agent Scripts
|
||||
- Killen aktiv Credentials bei Screen Lock
|
||||
- Einzelinstanz-Daemon-Pattern (kein Prozess-Spawning)
|
||||
- Deep Work Mode: `ssh-agent-guard.sh` unterstützt Pause-File
|
||||
- Fixed Socket Path für Terminal-Sharing
|
||||
|
||||
### Allgemein
|
||||
- API-Tokens in `.env` gespeichert (gitignored)
|
||||
- Keine hardcoded Credentials
|
||||
- MATE Screensaver Hardening empfohlen (`lock-enabled true`, `lock-delay 0`)
|
||||
|
||||
---
|
||||
|
||||
## Status & Roadmap
|
||||
|
||||
### ✅ Aktueller Stand (2025-12-13)
|
||||
|
||||
**Fertig:**
|
||||
- 20 Crumbpages (work in progress, noch nicht in CrumbCore integriert)
|
||||
- Operational Tools (doktor, SSH guards)
|
||||
- Dual-Lizenzierung (MIT + CKL v0.1)
|
||||
- Ecosystem-Dokumentation
|
||||
- Kinderrechte-Spezifikation
|
||||
|
||||
**In Arbeit:**
|
||||
- Integration mit CrumbCore (automatisches Laden via `load_content.sh`)
|
||||
- Export/Lösch-APIs für Kinderrechte
|
||||
- OZM als rechtlicher Träger (Transition läuft)
|
||||
|
||||
### 🚀 Nächste Schritte
|
||||
|
||||
**Sofort:**
|
||||
- [x] LICENSE.md, LICENSE-MIT.md, LICENSE-CKL.md
|
||||
- [x] KINDERRECHTE.md
|
||||
- [x] OZM-NEXUS-ECOSYSTEM.md
|
||||
- [x] README.md
|
||||
- [ ] DATENSCHUTZ.md
|
||||
|
||||
**Q1 2025:**
|
||||
- [ ] CrumbCore Export-API (`GET /api/v1/my-data`)
|
||||
- [ ] CrumbCore Lösch-API (`DELETE /api/v1/my-data`)
|
||||
- [ ] Crumbpages → CrumbCore Integration
|
||||
- [ ] CKL v0.1 → v1.0 Finalisierung
|
||||
|
||||
**Q2 2025:**
|
||||
- [ ] OZM Governance formalisieren
|
||||
- [ ] Trademark-Übertragung
|
||||
- [ ] Community-Prozesse (CONTRIBUTING.md, Issue Templates)
|
||||
|
||||
**Siehe:** [OZM-NEXUS-ECOSYSTEM.md](OZM-NEXUS-ECOSYSTEM.md) Section VII für komplette Roadmap
|
||||
|
||||
---
|
||||
|
||||
## Ressourcen
|
||||
|
||||
### Related Repositories
|
||||
- **CrumbCore v1**: https://194-164-194-191.sslip.io/git/kruemel/Crumb-Core-v.1
|
||||
- **Crumbforest Markdowns**: https://194-164-194-191.sslip.io/git/kruemel/Crumbforest-Markdowns
|
||||
|
||||
### Websites
|
||||
- **Crumbforest**: https://crumbforest.com
|
||||
- **branko.de**: https://branko.de (Public Interface)
|
||||
- **OZM**: Open Futures Museum, Hamburg
|
||||
|
||||
### Kontakt
|
||||
- **Lead Maintainer**: Branko
|
||||
- **Custodian**: OZM - Open Futures Museum (in transition)
|
||||
- **Email**: [wird ergänzt]
|
||||
|
||||
---
|
||||
|
||||
## Hashtags
|
||||
|
||||
`#OZM` `#OPENSOURCE` `#CRUMBFOREST` `#CKL` `#KINDERRECHTE` `#BILDUNG` `#LINUX` `#BASH` `#SYSTEMADMINISTRATION`
|
||||
|
||||
---
|
||||
|
||||
## Warum das wichtig ist
|
||||
|
||||
### Das Problem mit Bildungs-KI heute:
|
||||
- ❌ Proprietäre Blackboxes (ChatGPT, Gemini...)
|
||||
- ❌ Kinder als Datenquelle ("Training Data")
|
||||
- ❌ Paywalls vor Wissen
|
||||
- ❌ Keine Kontrolle, keine Transparenz
|
||||
- ❌ Cloud-Zwang, Überwachungskapitalismus
|
||||
|
||||
**Kinderrechte werden strukturell verletzt.**
|
||||
|
||||
### Die Crumbforest Alternative:
|
||||
- ✅ Open Source (MIT + CKL)
|
||||
- ✅ Lokal betreibbar (keine Cloud nötig)
|
||||
- ✅ Transparent (jeder Schritt nachvollziehbar)
|
||||
- ✅ Kind-zentriert (Urheberschaft bleibt beim Kind)
|
||||
- ✅ Gemeinnützig (wird verschenkt, nicht verkauft)
|
||||
|
||||
**Das ist keine "bessere EdTech-Plattform".**
|
||||
**Das ist eine andere Art, über Lernen nachzudenken.**
|
||||
|
||||
---
|
||||
|
||||
## Zitat
|
||||
|
||||
> *"Wissen gehört dem Kind, solange es fragt."*
|
||||
> *"Nullfeld zuerst, dann Messung. Resonanz vor Regel."*
|
||||
> — Waldwächter-Prinzip
|
||||
|
||||
---
|
||||
|
||||
**Version:** 2.0
|
||||
**Lizenz:** MIT + CKL v0.1
|
||||
**Status:** Active Development
|
||||
**Letzte Aktualisierung:** 2025-12-13
|
||||
@@ -450,6 +450,40 @@ Home Office ──[ VPN Tunnel ]──> Rechenzentrum (Interne IPs)
|
||||
|
||||
---
|
||||
|
||||
## 📚 Pfad 18: Der Schlüsselmeister (SSH Agent)
|
||||
|
||||
**Was du lernst:**
|
||||
- Wie spare ich mir das ständige Passwort-Tippen? (`ssh-agent`)
|
||||
- Wie füge ich Schlüssel hinzu? (`ssh-add`)
|
||||
- Was ist Agent Forwarding? (Magic Tunnels)
|
||||
- Sicherheit implikationen
|
||||
|
||||
**Warum das wichtig ist:**
|
||||
- Bequemlichkeit ohne Sicherheitsverlust (Passphrase bleibt Pflicht!).
|
||||
- Zugriff auf Git/andere Server durch Bastion-Hosts hindurch.
|
||||
- **Nie wieder Private Keys auf Server kopieren!**
|
||||
|
||||
**→ [Zur Crumbpage: SSH Agent](crumbpage-18-ssh-agent.md)**
|
||||
|
||||
---
|
||||
|
||||
## 📚 Pfad 19: The Zero Trust Agent (Paranoid Mode)
|
||||
|
||||
**Was du lernst:**
|
||||
- Wie sichert man Keys im Café?
|
||||
- Keys automatisch vergessen (TTL)
|
||||
- Keys löschen bei Screen-Lock (Watchdog Script)
|
||||
- Re-Auth Strategien
|
||||
|
||||
**Warum das wichtig ist:**
|
||||
- "Snatch & Run" Diebstahl-Schutz.
|
||||
- Evil Maid Attacken erschweren.
|
||||
- **Maximale Sicherheit für kritische Infrastruktur.**
|
||||
|
||||
**→ [Zur Crumbpage: Zero Trust Agent](crumbpage-19-agent-lockdown.md)**
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Wie du den Vektor durchläufst
|
||||
|
||||
### Empfohlene Reihenfolge
|
||||
@@ -489,7 +523,11 @@ START: Absolute Basics
|
||||
│ │
|
||||
├─ Pfad 16: VPN ───────────────────┤
|
||||
│ │
|
||||
├─ Pfad 17: Workstation ───────────→ READY!
|
||||
├─ Pfad 17: Workstation ───────────┤
|
||||
│ │
|
||||
├─ Pfad 18: SSH Agent ─────────────┤
|
||||
│ │
|
||||
├─ Pfad 19: Zero Trust ────────────→ READY!
|
||||
```
|
||||
|
||||
### Zeitaufwand (circa)
|
||||
@@ -500,9 +538,9 @@ Pfad 4-5: ~2 Stunden (Tools)
|
||||
Pfad 6-8: ~3-4 Stunden (Connectivity)
|
||||
Pfad 9-11: ~4-5 Stunden (Advanced)
|
||||
Pfad 12-14: ~5-6 Stunden (Mastery)
|
||||
Pfad 15-17: ~4-5 Stunden (Specialization)
|
||||
Pfad 15-19: ~6-8 Stunden (Specialization & Security)
|
||||
|
||||
Total: ~20-25 Stunden aktives Lernen
|
||||
Total: ~25-30 Stunden aktives Lernen
|
||||
```
|
||||
|
||||
**Aber:** Die echte Meisterschaft kommt durch:
|
||||
@@ -564,7 +602,9 @@ wsl --install
|
||||
├── ... (04-14)
|
||||
├── 15-dns.md
|
||||
├── 16-vpn.md
|
||||
└── 17-workstation.md
|
||||
├── 17-workstation.md
|
||||
├── 18-ssh-agent.md
|
||||
└── 19-agent-lockdown.md
|
||||
```
|
||||
|
||||
### Externe Ressourcen
|
||||
@@ -686,8 +726,10 @@ Die Eule erinnert dich:
|
||||
- [ ] Pfad 15: DNS (0%)
|
||||
- [ ] Pfad 16: VPN (0%)
|
||||
- [ ] Pfad 17: Workstation (0%)
|
||||
- [ ] Pfad 18: SSH Agent (0%)
|
||||
- [ ] Pfad 19: Zero Trust (0%)
|
||||
|
||||
**Gesamtfortschritt:** 0/17 Pfade
|
||||
**Gesamtfortschritt:** 0/19 Pfade
|
||||
**Startdatum:** YYYY-MM-DD
|
||||
**Geschätzte Completion:** YYYY-MM-DD
|
||||
```
|
||||
|
||||
@@ -156,4 +156,4 @@ Der MATE Desktop rennt, die Lernkurve war steil, aber sie zahlt sich aus ("zeitl
|
||||
---
|
||||
|
||||
**Navigation:**
|
||||
[← Zurück: VPN](crumbpage-16-vpn.md) | [Admin-Vektor Übersicht](crumbforest-admin-vektor.md)
|
||||
[← Zurück: VPN](crumbpage-16-vpn.md) | [Weiter: SSH Agent →](crumbpage-18-ssh-agent.md)
|
||||
|
||||
154
crumbpage-18-ssh-agent.md
Normal file
154
crumbpage-18-ssh-agent.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# 🔐 Crumbpage 18: Der Schlüsselmeister (SSH Agent)
|
||||
|
||||
**Subtitle:** *Nie wieder Passwörter tippen ohne Sicherheit zu verlieren*
|
||||
**Pfad:** 18 von X
|
||||
**Schwierigkeit:** ⭐⭐⭐ (3/5)
|
||||
**Zeit:** ~1 Stunde
|
||||
**Voraussetzungen:** [SSH Keys](crumbpage-08-ssh-keys.md), [Workstation](crumbpage-17-workstation.md)
|
||||
|
||||
> *"Ein guter Diener hält dir die Schlüssel bereit, aber gibt sie niemandem sonst."* 🗝️
|
||||
|
||||
---
|
||||
|
||||
## 📋 Was du in diesem Pfad lernst
|
||||
|
||||
```
|
||||
✓ Was macht der ssh-agent?
|
||||
✓ ssh-add (Schlüssel hinzufügen)
|
||||
✓ Agent Forwarding (Der magische Sprung)
|
||||
✓ Keychain Integration (Mac/Linux)
|
||||
✓ Die Gefahren von Forwarding
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Lernziele
|
||||
|
||||
Nach diesem Pfad kannst du:
|
||||
|
||||
- [ ] Den `ssh-agent` starten und nutzen
|
||||
- [ ] Verstehen, warum dein Private Key dein Gerät nie verlassen sollte
|
||||
- [ ] Durch einen Bastion-Host "durchspringen" (Agent Forwarding)
|
||||
- [ ] Den Agent sicher beenden oder sperren
|
||||
|
||||
---
|
||||
|
||||
## 🗝️ Das Problem: Passphrases nerven
|
||||
|
||||
Du hast deine Keys (wie in Pfad 8 gelernt) mit einer **Passphrase** gesichert. Gut!
|
||||
Aber jetzt musst du bei jedem `git push` oder `ssh server` das Passwort tippen.
|
||||
Das nervt. Und was nervt, wird abgeschaltet (Passwörter entfernt). **Böse!** 🛑
|
||||
|
||||
**Die Lösung: Der SSH Agent.**
|
||||
Er ist ein kleiner Prozess im Hintergrund, der deine *entschlüsselten* Keys im RAM hält.
|
||||
Du tippst das Passwort **einmal** (beim Start oder ersten Nutzen), und der Agent erledigt den Rest für dich.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Die Basics
|
||||
|
||||
### 1. Lebt der Agent?
|
||||
|
||||
```bash
|
||||
$ env | grep SSH_AUTH_SOCK
|
||||
# Wenn hier nichts kommt, läuft kein Agent.
|
||||
```
|
||||
|
||||
### 2. Starten (Manuell)
|
||||
|
||||
```bash
|
||||
$ eval "$(ssh-agent -s)"
|
||||
Agent pid 12345
|
||||
```
|
||||
|
||||
### 3. Schlüssel hinzufügen (`ssh-add`)
|
||||
|
||||
```bash
|
||||
$ ssh-add ~/.ssh/id_ed25519
|
||||
Enter passphrase for /home/bmt/.ssh/id_ed25519: *********
|
||||
Identity added: /home/bmt/.ssh/id_ed25519 (bmt@workstation)
|
||||
```
|
||||
Ab jetzt fragt SSH nicht mehr nach dem Passwort, solange der Agent läuft!
|
||||
|
||||
### 4. Was ist geladen?
|
||||
|
||||
```bash
|
||||
$ ssh-add -l
|
||||
256 SHA256:abcd... bmt@workstation (ED25519)
|
||||
```
|
||||
|
||||
### 5. Alles vergessen (Lockdown)
|
||||
|
||||
```bash
|
||||
$ ssh-add -D
|
||||
All identities removed.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Advanced: Agent Forwarding
|
||||
|
||||
Stell dir vor:
|
||||
`Workstation` → `Gateway-Server` → `Git-Server (GitHub)`
|
||||
|
||||
Du bist auf dem `Gateway` und willst `git clone` machen.
|
||||
Dein Key liegt aber auf der `Workstation`.
|
||||
**NIEMALS** kopierst du deinen Private Key auf den Gateway Server!
|
||||
|
||||
Stattdessen erlaubst du dem Gateway, deinen Agent auf der Workstation zu "fragen".
|
||||
|
||||
**Config (`~/.ssh/config`):**
|
||||
```ssh
|
||||
Host gateway
|
||||
HostName gateway.crumbforest.de
|
||||
ForwardAgent yes
|
||||
```
|
||||
|
||||
Jetzt kannst du auf dem Gateway `git clone` machen, und die Authentifizierung "tunnelt" zurück zu deinem Laptop. Magie! ✨
|
||||
|
||||
### ⚠️ Die Gefahr (Security Warning)
|
||||
Wenn du Forwarding aktivierst (`-A` oder `ForwardAgent yes`) und der Admin des Ziel-Servers böse ist (root), kann er deinen lokalen Agenten kapern, solange du verbunden bist.
|
||||
**Regel:** Nutze Forwarding NUR zu Servern, denen du vertraust!
|
||||
|
||||
---
|
||||
|
||||
## 🍏 & 🐧 Komfort-Integration
|
||||
|
||||
### macOS
|
||||
Der Mac macht das automatisch via Keychain.
|
||||
Config (`~/.ssh/config`):
|
||||
```ssh
|
||||
Host *
|
||||
UseKeychain yes
|
||||
AddKeysToAgent yes
|
||||
```
|
||||
|
||||
### Linux (Gnome/Keyring)
|
||||
Moderne Distros (Ubuntu, Debian mit Gnome/MATE) starten oft einen Keyring-Daemon, der sich wie ein SSH-Agent verhält.
|
||||
|
||||
Wenn du es "pur" willst (in `.bashrc`):
|
||||
```bash
|
||||
if [ -z "$SSH_AUTH_SOCK" ]; then
|
||||
eval "$(ssh-agent -s)"
|
||||
ssh-add
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🦉 Crystal Owl's Weisheit
|
||||
|
||||
> *"Der Schlüssel gehört dem Meister, nicht dem Torwächter."*
|
||||
|
||||
Niemals Private Keys verteilen. Lass den Agenten die Arbeit machen. Und wenn du gehst, nimm die Schlüssel mit (`ssh-add -D` oder Logout).
|
||||
|
||||
---
|
||||
|
||||
**Version:** 1.0
|
||||
**Status:** Draft
|
||||
**Tags:** #SSH #Security #Agent #Workflow
|
||||
|
||||
---
|
||||
|
||||
**Navigation:**
|
||||
[← Zurück: Workstation](crumbpage-17-workstation.md) | [Weiter: Zero Trust Agent →](crumbpage-19-agent-lockdown.md)
|
||||
176
crumbpage-19-agent-lockdown.md
Normal file
176
crumbpage-19-agent-lockdown.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# 🔐 Crumbpage 19: The Zero Trust Agent (Paranoid Mode)
|
||||
|
||||
**Subtitle:** *Vertraue nichts, was du nicht gerade berührst*
|
||||
**Pfad:** 19 von X
|
||||
**Schwierigkeit:** ⭐⭐⭐⭐ (4/5)
|
||||
**Zeit:** ~2 Stunden
|
||||
**Voraussetzungen:** [SSH Agent](crumbpage-18-ssh-agent.md), [Bash Scripting](crumbpage-14-environment.md)
|
||||
|
||||
> *"Ein unbewachter Schlüssel ist ein verlorener Schlüssel."* 🕵️♂️
|
||||
|
||||
---
|
||||
|
||||
## 📋 Das Szenario
|
||||
|
||||
Du sitzt im Café. Dein Laptop ist entsperrt, dein `ssh-agent` hat alle Keys im RAM.
|
||||
Ein Dieb reißt dir den offenen Laptop aus der Hand ("Snatch & Run").
|
||||
**Er hat jetzt Zugriff auf alle deine Server.** 😱
|
||||
|
||||
Oder: Du gehst kurz weg, Screen Lock geht an. Jemand errät dein (schwaches?) Laptop-Passwort oder nutzt einen Exploit am Lockscreen.
|
||||
Sobald er drin ist: **Vollzugriff via SSH.**
|
||||
|
||||
**Die Lösung:**
|
||||
Der Agent muss seine Schlüssel **vergessen**, sobald du den Platz verlässt (Screen Lock).
|
||||
Und er muss **sofort nach der Passphrase fragen**, wenn du wiederkommst (Unlock).
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Level 1: Das Zeit-Limit (TTL)
|
||||
|
||||
Der einfachste Schutz. Schlüssel vergessen sich selbst nach X Minuten.
|
||||
|
||||
```bash
|
||||
# Füge Key hinzu, aber vergiss ihn nach 5 Minuten (300 Sekunden)
|
||||
$ ssh-add -t 300 ~/.ssh/id_ed25519
|
||||
```
|
||||
|
||||
**Pro:** Funktioniert überall (Mac/Linux).
|
||||
**Contra:** Wenn du arbeitest, läuft es manchmal "unter den Fingern" ab.
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Level 2: Der "Nuke" Button
|
||||
|
||||
Gewöhne dir an, nicht nur den Screen zu sperren, sondern den Agent zu leeren.
|
||||
|
||||
**In deiner `.bashrc`:**
|
||||
```bash
|
||||
# Sperren UND Schlüssel wegwerfen
|
||||
alias away='ssh-add -D && loginctl lock-session'
|
||||
```
|
||||
*(Auf Mac: `ssh-add -D && pmset displaysleepnow`)*
|
||||
|
||||
**Benutzung:** Wenn du aufstehst, tippe `away`. Laptop sperrt, Keys sind weg.
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Level 3: The Watchdog (Debian 13 / Mate Edition)
|
||||
|
||||
*Status: Getestet & Verifiziert auf Debian 13 (Trixie) mit MATE Desktop.*
|
||||
|
||||
Du willst, dass das **automatisch** passiert, wenn der Bildschirmschoner angeht?
|
||||
Wir nutzen `dbus-monitor`, um direkt auf den Puls des Screensavers zu hören.
|
||||
|
||||
### Das Script: `ssh-agent-guard.sh`
|
||||
|
||||
Dieses Script muss in den Autostart (`System -> Einstellungen -> Startprogramme`).
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# ~/.local/bin/ssh-agent-guard.sh
|
||||
|
||||
LOG_FILE="$HOME/.ssh-agent-screenlock.log"
|
||||
SOCKET_PATH="$HOME/.ssh/agent.sock"
|
||||
PID_FILE="$HOME/.ssh-agent-watchdog.pid"
|
||||
PAUSE_FILE="$HOME/.ssh-agent-watchdog.pause"
|
||||
|
||||
# 1. Singleton Check: Nur ein Wächter erlaubt
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
old_pid=$(cat "$PID_FILE")
|
||||
kill -0 "$old_pid" 2>/dev/null && kill "$old_pid"
|
||||
fi
|
||||
echo $$ > "$PID_FILE"
|
||||
|
||||
# 2. Cleanup Trap (Aufräumen bei Exit)
|
||||
cleanup() { rm -f "$PID_FILE"; exit 0; }
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"; }
|
||||
|
||||
restart_agent() {
|
||||
# "Deep Work" Check: Darf ich töten?
|
||||
if [ -f "$PAUSE_FILE" ]; then
|
||||
log "SKIP: Deep Work Mode aktiv. Agent überlebt."
|
||||
return
|
||||
fi
|
||||
|
||||
log "🔒 LOCK: Killing Agent..."
|
||||
|
||||
# Kill existing agents
|
||||
if [ -n "$SSH_AGENT_PID" ]; then kill "$SSH_AGENT_PID" 2>/dev/null; fi
|
||||
pkill -u "$USER" ssh-agent
|
||||
|
||||
# Clean Environment
|
||||
unset SSH_AUTH_SOCK SSH_AGENT_PID
|
||||
rm -f "$SOCKET_PATH"
|
||||
|
||||
# Respawn & Bind to fixed socket
|
||||
eval "$(ssh-agent -a "$SOCKET_PATH" -s)" >/dev/null
|
||||
|
||||
# Save Environment for others
|
||||
echo "export SSH_AUTH_SOCK=$SOCKET_PATH" > "$HOME/.ssh/agent-environment"
|
||||
echo "export SSH_AGENT_PID=$SSH_AGENT_PID" >> "$HOME/.ssh/agent-environment"
|
||||
|
||||
log "✨ RESPAWN: Neuer Agent (PID: $SSH_AGENT_PID)"
|
||||
}
|
||||
|
||||
# 3. MATE Hardening: Sofort sperren, keine Grace-Period
|
||||
gsettings set org.mate.screensaver lock-enabled true
|
||||
gsettings set org.mate.screensaver lock-delay 0
|
||||
|
||||
# 4. Der DBus Loop
|
||||
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" 2>/dev/null |
|
||||
while read -r line; do
|
||||
if echo "$line" | grep -q "boolean true"; then
|
||||
# EVENT: Screen Locked -> Kill Agent
|
||||
mate-screensaver-command --lock 2>/dev/null # Double Tap
|
||||
restart_agent
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
### Die Integration
|
||||
|
||||
Damit deine Terminals den neuen Agent immer finden, muss das Environment dynamisch geladen werden.
|
||||
In deiner `.bashrc`:
|
||||
|
||||
```bash
|
||||
# Lade Agent-Info, falls vorhanden
|
||||
if [ -f ~/.ssh/agent-environment ]; then
|
||||
source ~/.ssh/agent-environment
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Level 4: Deep Work & Kontrolle
|
||||
|
||||
Manchmal **darf** der Agent nicht sterben (z.B. bei einem 50GB Upload über SCP, während du Kaffee holst).
|
||||
Dafür haben wir den **Watchdog-Knochen** (Pause-Funktion).
|
||||
|
||||
Im `crumbpages-doktor` (Modul Remote) gibt es jetzt Befehle:
|
||||
|
||||
- `watchdog status`: Läuft der Wächter?
|
||||
- `watchdog off`: **PAUSE**. Der Screensaver tötet den Agent nicht mehr.
|
||||
- `watchdog on`: **SCHARF**. Sicherheit wiederhergestellt.
|
||||
|
||||
> **Tipp:** Wenn du `exit` im Remote-Doktor tippst, feuert jetzt eine "Paranoid Trap" und löscht die Keys sofort (`ssh-add -D`). Sicher ist sicher.
|
||||
|
||||
---
|
||||
|
||||
## 🦉 Crystal Owl's Weisheit
|
||||
|
||||
> *"Ein System ist nur so sicher wie sein schwächstes Glied. Meistens ist das Glied... Bequemlichkeit."*
|
||||
|
||||
Wir haben die Bequemlichkeit automatisiert. Der Agent stirbt, wenn du weggehst. Er wird wiedergeboren, wenn du wiederkommst – aber ohne Erinnerung (Keys). Du musst das Passwort neu eingeben. Das ist der Preis der Sicherheit.
|
||||
|
||||
---
|
||||
|
||||
**Version:** 2.0 (Debian 13 Verified)
|
||||
**Status:** Final
|
||||
**Tags:** #Security #Debian13 #Mate #DBus #ZeroTrust
|
||||
|
||||
---
|
||||
|
||||
**Navigation:**
|
||||
[← Zurück: Alle Themen](crumbpages-doktor.sh) | [Weiter: Tanz am Kernel (Bash Hacks)](crumbpage-20-tanz-am-kernel.md)
|
||||
153
crumbpage-20-tanz-am-kernel.md
Normal file
153
crumbpage-20-tanz-am-kernel.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# 🐧 Crumbpage 20: Tanz am Kernel (Bashing the Shell)
|
||||
|
||||
**Subtitle:** *Dein Cockpit, deine Regeln.*
|
||||
**Pfad:** 20 von X
|
||||
**Schwierigkeit:** ⭐⭐⭐ (3/5)
|
||||
**Zeit:** Lebenslang
|
||||
**Voraussetzungen:** [Environment](crumbpage-14-environment.md), [Editoren](crumbpage-04-editoren.md)
|
||||
|
||||
> *"Die Shell ist kein Programm. Sie ist eine Lebenseinstellung."*
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Spaceship Lackierung (Der Visual-Mod)
|
||||
|
||||
Wir haben jetzt ein Raumschiff (Debian 13), aber es sieht noch aus wie ein Karton.
|
||||
Lass uns Farben mischen. In der `.bashrc` definieren wir unsere Palette.
|
||||
|
||||
### Die Farb-Masken
|
||||
|
||||
```bash
|
||||
# ~/.bashrc - Color Definitions
|
||||
export RED="\[\033[0;31m\]"
|
||||
export GREEN="\[\033[0;32m\]"
|
||||
export YELLOW="\[\033[1;33m\]"
|
||||
export BLUE="\[\033[0;34m\]"
|
||||
export PURPLE="\[\033[0;35m\]"
|
||||
export CYAN="\[\033[0;36m\]"
|
||||
export NC="\[\033[0m\]" # No Color
|
||||
```
|
||||
|
||||
### Der Prompt (PS1)
|
||||
|
||||
Der String `PS1` bestimmt, was vor dem Cursor steht.
|
||||
Standard: `\u@\h:\w\$` (User@Host:Path$)
|
||||
|
||||
**Admin-Style (Rot bei Root):**
|
||||
```bash
|
||||
if [ "$EUID" -eq 0 ]; then
|
||||
PS1="${RED}\u@\h${NC}:${BLUE}\w${NC}# "
|
||||
else
|
||||
PS1="${GREEN}\u@\h${NC}:${BLUE}\w${NC}$ "
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Syntax-Fallen: Warum schreit meine Shell?
|
||||
|
||||
Du hast heute gekämpft. Hier sind die Narben und was wir daraus gelernt haben.
|
||||
|
||||
### 1. Das "Eckige Klammern" Trauma
|
||||
Bash ist extrem pingelig mit Leerzeichen.
|
||||
|
||||
**Falsch (Error: command not found):**
|
||||
```bash
|
||||
if [$a = $b]; then ...
|
||||
```
|
||||
Die Shell sucht nach einem Programm namens `[$a`.
|
||||
|
||||
**Richtig:**
|
||||
```bash
|
||||
if [ "$a" = "$b" ]; then ...
|
||||
```
|
||||
Die Klammer `[` ist tatsächlich ein **Befehl** (Alias für `test`). Und Befehle brauchen Leerzeichen zu ihren Argumenten.
|
||||
|
||||
### 2. Ampersand Roulette: `&` vs. `&&`
|
||||
|
||||
Ein kleiner Unterschied, der Prozesse tötet oder Zombies erschafft.
|
||||
|
||||
- `befehl1 && befehl2`: Mach 2 **nur wenn** 1 erfolgreich war (AND).
|
||||
- `befehl1 & befehl2`: Starte 1 im **Hintergrund** und starte sofort 2 (Parallel).
|
||||
|
||||
**Die Falle:**
|
||||
`script.sh & && ssh-add` -> Syntax Error.
|
||||
Das `&&` erwartet einen Befehl davor, aber das `&` hat den Befehl schon in den Hintergrund geschickt (Ende der Befehlskette).
|
||||
|
||||
**Lösung:**
|
||||
Klammern oder Semikolon.
|
||||
`(script.sh &) && ssh-add` (Subshell)
|
||||
|
||||
### 3. EOF und das "Heredoc"
|
||||
Wenn du Code dynamisch schreibst (`cat << EOF`), darf **kein Leerzeichen** nach dem `EOF` (End Marker) stehen. Sonst wartet Bash für immer auf das "echte" EOF.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Mechanik: Symlinks & /dev/null
|
||||
|
||||
### Das schwarze Loch (`/dev/null`)
|
||||
Alles, was dorthin geht, verschwindet. Perfekt für nervige Fehlermeldungen.
|
||||
|
||||
```bash
|
||||
# Standard Output wegwerfen, Fehler anzeigen
|
||||
befehl > /dev/null
|
||||
|
||||
# Alles wegwerfen (Ruhe im Karton)
|
||||
befehl > /dev/null 2>&1
|
||||
```
|
||||
|
||||
### Symlinks bearbeiten
|
||||
Ein Symlink (`ln -s`) ist nur ein Wegweiser.
|
||||
Wenn du ihn bearbeitest (`nano linkname`), bearbeitest du das **Ziel**.
|
||||
Wenn du das Ziel löschst, zeigt der Link ins Leere ("Dangling Symlink").
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Funktionen vs. Aliases
|
||||
|
||||
Aliases sind gut für Abkürzungen (`aliasll='ls -l'`). Für Logik brauchst du Funktionen.
|
||||
|
||||
### Der Reload-Trick
|
||||
Nach dem Editieren der `.bashrc` musst du dich nicht ausloggen.
|
||||
|
||||
```bash
|
||||
# In ~/.bashrc
|
||||
function reload() {
|
||||
source ~/.bashrc
|
||||
echo "♻️ Umgebung neu geladen."
|
||||
}
|
||||
```
|
||||
Jetzt reicht ein `reload`.
|
||||
|
||||
### Der "Killer" (Prozess-Management)
|
||||
|
||||
Wie vom User heute gefordert: Eine Funktion, um Hintergrund-Scripte gezielt zu stoppen.
|
||||
|
||||
```bash
|
||||
function killscript() {
|
||||
PATTERN="$1"
|
||||
if [ -z "$PATTERN" ]; then echo "Welches Script?"; return; fi
|
||||
|
||||
# pkill -f sucht im vollen Befehlsnamen
|
||||
pkill -f "$PATTERN" && echo "💀 $PATTERN wurde beendet." || echo "Nichts gefunden."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🦉 Crystal Owl's Weisheit
|
||||
|
||||
> *"Ein guter Admin schreibt keine Befehle, er komponiert sie."*
|
||||
|
||||
Deine `.bashrc` wächst mit dir. Was heute nützlich ist, fliegt morgen raus. Das ist okay. Es ist dein Werkzeugkasten. Halte ihn sauber, aber habe keine Angst vor neuen Tools.
|
||||
|
||||
---
|
||||
|
||||
**Version:** 1.0
|
||||
**Status:** Ready
|
||||
**Tags:** #Bash #Config #KernelDance #Syntax
|
||||
|
||||
---
|
||||
|
||||
**Navigation:**
|
||||
[← Zurück: Agent Lockdown](crumbpage-19-agent-lockdown.md) | [Startseite](crumbpages-doktor.sh)
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 🦉 Crumbpages Doktor v2 - Der Wald-Sanitäter für dein Repo
|
||||
# 🦉 Crumbpages Doktor v2.0-RC3 - Der Wald-Sanitäter für dein Repo
|
||||
# Mit .env Support und spezialisierten Shells
|
||||
|
||||
# Farben für schöne Ausgabe
|
||||
@@ -218,6 +218,13 @@ export PS1="\[\033[0;31m\](🔐 Remote) \u@\h:\w$ \[\033[0m\]"
|
||||
export SSH_USER="$CRUMB_SSH_USER"
|
||||
export SCP_TARGET="$CRUMB_SCP_TARGET"
|
||||
|
||||
# Paranoid Mode: Clear keys when this shell exits
|
||||
trap 'echo "🧹 Cleaning up keys..."; ssh-add -D 2>/dev/null' EXIT
|
||||
|
||||
# Watchdog Control Paths
|
||||
WATCHDOG_PID="$HOME/.ssh-agent-watchdog.pid"
|
||||
WATCHDOG_PAUSE="$HOME/.ssh-agent-watchdog.pause"
|
||||
|
||||
function remote_help() {
|
||||
echo "User: \$SSH_USER | Target: \$SCP_TARGET"
|
||||
echo ""
|
||||
@@ -225,6 +232,62 @@ function remote_help() {
|
||||
echo " crumbupload <file> -> SCP file to target"
|
||||
echo " my_keys -> List local public keys"
|
||||
echo " ssh_config -> Edit SSH config"
|
||||
echo " watchdog status -> Check Agent Watchdog"
|
||||
echo " watchdog off -> Pause Watchdog (for large transfers)"
|
||||
echo " watchdog on -> Resume Watchdog"
|
||||
}
|
||||
|
||||
function watchdog() {
|
||||
CMD="\$1"
|
||||
case "\$CMD" in
|
||||
status)
|
||||
PID_RUNNING=false
|
||||
if [ -f "\$WATCHDOG_PID" ] && kill -0 \$(cat "\$WATCHDOG_PID") 2>/dev/null; then
|
||||
PID_RUNNING=true
|
||||
PID=\$(cat "\$WATCHDOG_PID")
|
||||
elif pgrep -f "ssh-agent-guard.sh" > /dev/null; then
|
||||
PID_RUNNING=true
|
||||
PID=\$(pgrep -f "ssh-agent-guard.sh" | head -n 1)
|
||||
# Fix PID file if missing but running
|
||||
echo "\$PID" > "\$WATCHDOG_PID"
|
||||
elif pgrep -f "ssh-agent-screenlock" > /dev/null; then
|
||||
PID_RUNNING=true
|
||||
PID=\$(pgrep -f "ssh-agent-screenlock" | head -n 1)
|
||||
fi
|
||||
|
||||
if [ "\$PID_RUNNING" = true ]; then
|
||||
if [ -f "\$WATCHDOG_PAUSE" ]; then
|
||||
echo "⚠️ Watchdog läuft (PID \$PID), ist aber PAUSIERT (Deep Work)."
|
||||
else
|
||||
echo "✅ Watchdog läuft und ist scharf (PID \$PID)."
|
||||
fi
|
||||
else
|
||||
echo "❌ Watchdog Script läuft nicht."
|
||||
fi
|
||||
|
||||
# Check Agent Socket
|
||||
SOCKET="\$HOME/.ssh/agent.sock"
|
||||
if [ -S "\$SOCKET" ]; then
|
||||
echo "✅ SSH Agent Socket gefunden (\$SOCKET)."
|
||||
# Optional: Count keys
|
||||
KEY_COUNT=\$(SSH_AUTH_SOCK=\$SOCKET ssh-add -l 2>/dev/null | wc -l | tr -d ' ')
|
||||
echo " -> Geladene Keys: \$KEY_COUNT"
|
||||
else
|
||||
echo "❌ Kein SSH Agent Socket gefunden."
|
||||
fi
|
||||
;;
|
||||
off|pause)
|
||||
touch "\$WATCHDOG_PAUSE"
|
||||
echo "⏸️ Watchdog pausiert. Bildschirmsperre tötet den Agent jetzt NICHT."
|
||||
;;
|
||||
on|resume)
|
||||
rm -f "\$WATCHDOG_PAUSE"
|
||||
echo "▶️ Watchdog wieder aktiv. Zero Trust re-enabled."
|
||||
;;
|
||||
*)
|
||||
echo "Usage: watchdog {status|off|on}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
function crumbupload() {
|
||||
@@ -236,6 +299,7 @@ alias my_keys="ls -l ~/.ssh/*.pub"
|
||||
alias ssh_config="nano ~/.ssh/config"
|
||||
|
||||
echo ""
|
||||
echo "⚠️ Paranoid Mode: Closing this shell clears ssh-agent keys!"
|
||||
remote_help
|
||||
EOF
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
DNS Report für branko.de (2025-12-10_19-53)
|
||||
========================================
|
||||
A Records:
|
||||
81.169.145.93
|
||||
---
|
||||
A Records:
|
||||
81.169.145.93
|
||||
---
|
||||
MX Records:
|
||||
5 smtpin.rzone.de.
|
||||
---
|
||||
SOA Records:
|
||||
docks17.rzone.de. hostmaster.strato-rz.de. 2022062321 86400 7200 604800 300
|
||||
---
|
||||
TXT Records: LEER
|
||||
---
|
||||
TRACE:
|
||||
NS a.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS b.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS c.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS d.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS e.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS f.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS g.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS h.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS i.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS j.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS k.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS l.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
NS m.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
RRSIG NS 8 0 518400 20251223050000 20251210040000 61809 . Ro3x6l136NQLdoU5tLg1c6mHOjs10+HJkx4dnDxjWQ+2GbXQ/6gGL4i0 Y7cpha7GB9/RnVFOHvzvv+rrlAWwSc7/dVzOWao36XC/QWlameyY9Umi rbUdYmE8R1OEYFKIsnConMQzYhyPjJGi7E878r7UTyuuxKYQ6XGCAPGz E/ZGSAX7NXCcqYVwfOCBXPc+NPQuCnLuXEXNBsbYbp3HB6lOIORKptCY AzqIgc763uE1Xk5uE2j2oSg2qaOG8JMAXBp7uDdDscLdZBvYJfFuiDRg mQhbGZnlxq9/9JAqfwSAF6u9ccFja/pWLSDHw9mB0zZ2kaMbTjeL0r5A n0uiIw== from server fe80::2eea:dcff:fecd:194a%7 in 5 ms.
|
||||
A 81.169.145.93 from server 2607:f1c0:fe:53:185:132:34:143 in 12 ms.
|
||||
@@ -1,36 +0,0 @@
|
||||
DNS Report für gmail.de (2025-12-10_19-53)
|
||||
========================================
|
||||
A Records:
|
||||
142.250.185.229
|
||||
---
|
||||
A Records:
|
||||
142.251.39.229
|
||||
---
|
||||
MX Records:
|
||||
0 .
|
||||
---
|
||||
SOA Records:
|
||||
ns1.google.com. dns-admin.google.com. 842151538 900 900 1800 60
|
||||
---
|
||||
TXT Records:
|
||||
"v=spf1 -all"
|
||||
---
|
||||
TRACE:
|
||||
NS b.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS c.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS d.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS e.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS f.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS g.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS h.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS i.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS j.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS k.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS l.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS m.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
NS a.root-servers.net. from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
RRSIG NS 8 0 518400 20251223050000 20251210040000 61809 . Ro3x6l136NQLdoU5tLg1c6mHOjs10+HJkx4dnDxjWQ+2GbXQ/6gGL4i0 Y7cpha7GB9/RnVFOHvzvv+rrlAWwSc7/dVzOWao36XC/QWlameyY9Umi rbUdYmE8R1OEYFKIsnConMQzYhyPjJGi7E878r7UTyuuxKYQ6XGCAPGz E/ZGSAX7NXCcqYVwfOCBXPc+NPQuCnLuXEXNBsbYbp3HB6lOIORKptCY AzqIgc763uE1Xk5uE2j2oSg2qaOG8JMAXBp7uDdDscLdZBvYJfFuiDRg mQhbGZnlxq9/9JAqfwSAF6u9ccFja/pWLSDHw9mB0zZ2kaMbTjeL0r5A n0uiIw== from server fe80::2eea:dcff:fecd:194a%7 in 4 ms.
|
||||
A 108.177.119.19 from server 2001:4860:4802:34::a in 26 ms.
|
||||
A 108.177.119.83 from server 2001:4860:4802:34::a in 26 ms.
|
||||
A 108.177.119.17 from server 2001:4860:4802:34::a in 26 ms.
|
||||
A 108.177.119.18 from server 2001:4860:4802:34::a in 26 ms.
|
||||
69
ssh-agent-guard.sh
Normal file
69
ssh-agent-guard.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
# ~/.local/bin/ssh-agent-guard.sh
|
||||
|
||||
LOG_FILE="$HOME/.ssh-agent-screenlock.log"
|
||||
SOCKET_PATH="$HOME/.ssh/agent.sock"
|
||||
PID_FILE="$HOME/.ssh-agent-watchdog.pid"
|
||||
PAUSE_FILE="$HOME/.ssh-agent-watchdog.pause"
|
||||
|
||||
# 1. Singleton Check: Nur ein Wächter erlaubt
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
old_pid=$(cat "$PID_FILE")
|
||||
kill -0 "$old_pid" 2>/dev/null && kill "$old_pid"
|
||||
fi
|
||||
echo $$ > "$PID_FILE"
|
||||
|
||||
# 2. Cleanup Trap (Aufräumen bei Exit)
|
||||
cleanup() { rm -f "$PID_FILE"; exit 0; }
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"; }
|
||||
|
||||
restart_agent() {
|
||||
# "Deep Work" Check: Darf ich töten?
|
||||
if [ -f "$PAUSE_FILE" ]; then
|
||||
log "SKIP: Deep Work Mode aktiv. Agent überlebt."
|
||||
return
|
||||
fi
|
||||
|
||||
log "🔒 LOCK: Killing Agent..."
|
||||
|
||||
# Kill existing agents
|
||||
if [ -n "$SSH_AGENT_PID" ]; then kill "$SSH_AGENT_PID" 2>/dev/null; fi
|
||||
pkill -u "$USER" ssh-agent
|
||||
|
||||
# Clean Environment
|
||||
unset SSH_AUTH_SOCK SSH_AGENT_PID
|
||||
rm -f "$SOCKET_PATH"
|
||||
|
||||
# Respawn & Bind to fixed socket
|
||||
eval "$(ssh-agent -a "$SOCKET_PATH" -s)" >/dev/null
|
||||
|
||||
# Save Environment for others
|
||||
echo "export SSH_AUTH_SOCK=$SOCKET_PATH" > "$HOME/.ssh/agent-environment"
|
||||
echo "export SSH_AGENT_PID=$SSH_AGENT_PID" >> "$HOME/.ssh/agent-environment"
|
||||
|
||||
log "✨ RESPAWN: Neuer Agent (PID: $SSH_AGENT_PID)"
|
||||
}
|
||||
|
||||
# 3. MATE Hardening: Sofort sperren, keine Grace-Period
|
||||
gsettings set org.mate.screensaver lock-enabled true
|
||||
gsettings set org.mate.screensaver lock-delay 0
|
||||
|
||||
# Init: Sofort einmal ausführen, damit der Key-Store definiert ist
|
||||
if [ ! -f "$HOME/.ssh/agent-environment" ]; then
|
||||
log "INIT: Starte initialen Agent..."
|
||||
restart_agent
|
||||
fi
|
||||
|
||||
log "Watchdog gestartet (PID $$). Warte auf Lock-Events..."
|
||||
|
||||
# 4. Der DBus Loop
|
||||
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" 2>/dev/null |
|
||||
while read -r line; do
|
||||
if echo "$line" | grep -q "boolean true"; then
|
||||
# EVENT: Screen Locked -> Kill Agent
|
||||
mate-screensaver-command --lock 2>/dev/null # Double Tap
|
||||
restart_agent
|
||||
fi
|
||||
done
|
||||
99
ssh-agent-screenlock_v4.sh
Executable file
99
ssh-agent-screenlock_v4.sh
Executable file
@@ -0,0 +1,99 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# SSH-Agent Neustart beim Bildschirmschoner (MATE Desktop)
|
||||
# Dieses Script startet den ssh-agent neu, wenn der Bildschirm gesperrt wird
|
||||
#
|
||||
|
||||
LOG_FILE="$HOME/.ssh-agent-screenlock.log"
|
||||
SOCKET_PATH="$HOME/.ssh/agent.sock"
|
||||
|
||||
# Check for existing instance
|
||||
pid_file="$HOME/.ssh-agent-watchdog.pid"
|
||||
if [ -f "$pid_file" ]; then
|
||||
old_pid=$(cat "$pid_file")
|
||||
if kill -0 "$old_pid" 2>/dev/null; then
|
||||
echo "Watchdog läuft bereits (PID: $old_pid). Beende alte Instanz..."
|
||||
kill "$old_pid"
|
||||
fi
|
||||
fi
|
||||
echo $$ > "$pid_file"
|
||||
|
||||
STOP_LOCK="$HOME/.ssh-agent-watchdog.pause"
|
||||
|
||||
log_message() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
restart_ssh_agent() {
|
||||
# Check if we are "paused" for large transfers
|
||||
if [ -f "$STOP_LOCK" ]; then
|
||||
log_message "SKIP: Bildschirm gesperrt, aber 'Deep Work' Modus aktiv (Pause-File gefunden)."
|
||||
return
|
||||
fi
|
||||
|
||||
log_message "Bildschirm gesperrt - SSH-Agent wird neu gestartet"
|
||||
|
||||
# Alte ssh-agent Prozesse beenden
|
||||
if [ -n "$SSH_AGENT_PID" ]; then
|
||||
kill "$SSH_AGENT_PID" 2>/dev/null
|
||||
log_message "SSH-Agent PID $SSH_AGENT_PID beendet"
|
||||
fi
|
||||
|
||||
# Alle ssh-agent Prozesse des aktuellen Users beenden
|
||||
pkill -u "$USER" ssh-agent
|
||||
|
||||
# SSH-Agent Umgebungsvariablen löschen
|
||||
unset SSH_AUTH_SOCK
|
||||
unset SSH_AGENT_PID
|
||||
|
||||
# Alten Socket entfernen, falls vorhanden
|
||||
rm -f "$SOCKET_PATH"
|
||||
|
||||
# Neuen ssh-agent starten und direkt an fixen Pfad binden
|
||||
# -a: bind address (socket path)
|
||||
eval "$(ssh-agent -a "$SOCKET_PATH" -s)" > /dev/null 2>&1
|
||||
|
||||
# Check if agent started successfully
|
||||
if [ -z "$SSH_AGENT_PID" ]; then
|
||||
log_message "FEHLER: SSH-Agent konnte nicht gestartet werden"
|
||||
return
|
||||
fi
|
||||
|
||||
# Umgebungsvariablen in Datei speichern für andere Terminals
|
||||
# Dateiname angepasst an .bashrc des Users: ~/.ssh/agent-environment
|
||||
cat > "$HOME/.ssh/agent-environment" <<EOF
|
||||
export SSH_AUTH_SOCK=$SOCKET_PATH
|
||||
export SSH_AGENT_PID=$SSH_AGENT_PID
|
||||
EOF
|
||||
|
||||
log_message "Neuer SSH-Agent gestartet (PID: $SSH_AGENT_PID, Socket: $SOCKET_PATH)"
|
||||
}
|
||||
|
||||
# Cleanup bei Script-Ende
|
||||
cleanup() {
|
||||
rm -f "$pid_file"
|
||||
log_message "Watchdog beendet."
|
||||
exit 0
|
||||
}
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
# Sicherstellen, dass der Bildschirmschoner auch wirklich sperrt
|
||||
gsettings set org.mate.screensaver lock-enabled true 2>/dev/null
|
||||
# Grace-Period abschalten (Sofort sperren)
|
||||
gsettings set org.mate.screensaver lock-delay 0 2>/dev/null
|
||||
log_message "Bildschirm-Sperre erzwungen (lock-enabled true, lock-delay 0)"
|
||||
|
||||
log_message "Watchdog gestartet (PID $$)."
|
||||
|
||||
# Auf MATE Screensaver Events hören
|
||||
dbus-monitor --session "type='signal',interface='org.mate.ScreenSaver',member='ActiveChanged'" 2>/dev/null |
|
||||
while read -r line; do
|
||||
if echo "$line" | grep -q "boolean true"; then
|
||||
# Sofort sperren anfordern, falls noch nicht geschehen
|
||||
mate-screensaver-command --lock 2>/dev/null
|
||||
restart_ssh_agent
|
||||
|
||||
# TODO: Idee - Terminal Hintergrund ändern via DBus (sehr spezifisch für Mate Terminal)
|
||||
# Experimentell: gsettings set org.mate.terminal.profile:/org/mate/terminal/profiles/default/ background-color '#000000'
|
||||
fi
|
||||
done
|
||||
Reference in New Issue
Block a user