Add complete French (fr) and Chinese (zh) translations for all documentation: - Root files: README, CHANGELOG, SECURITY, BETA-RELEASE - docs/: All 16 core documentation files - DOCS/: All 19 deep-dive documents including embedded/ and archive/ - package/secubox/: All 123+ package READMEs - Misc: secubox-tools/, scripts/, EXAMPLES/, config-backups/, streamlit-apps/ Total: 346 translation files created Each file includes language switcher links for easy navigation between English, French, and Chinese versions. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
246 lines
11 KiB
Markdown
246 lines
11 KiB
Markdown
# Punk Exposure Engine
|
|
|
|
> **Langues**: [English](PUNK-EXPOSURE.md) | Francais | [中文](PUNK-EXPOSURE.zh.md)
|
|
|
|
## Vision
|
|
|
|
Chaque noeud SecuBox est une **station generative** — il decouvre ce qui tourne localement et offre un flux unifie pour rendre n'importe quel service accessible via tous les canaux disponibles : Tor .onion, DNS/HTTPS classique, maillage P2P, ou les trois a la fois.
|
|
|
|
Trois verbes definissent le workflow :
|
|
|
|
- **Peek** — Scanner, decouvrir, observer. Qu'est-ce qui tourne ? Qu'est-ce qui est expose ? Quels domaines sont mappes ? Quels pairs sont en ligne ?
|
|
- **Poke** — Cibler un service. Choisir les canaux d'exposition. Configurer le flux de liaison.
|
|
- **Emancipate** — Activer. Le service devient accessible. Les enregistrements DNS sont crees, les certificats sont emis, les adresses .onion sont generees, les pairs du maillage sont notifies.
|
|
|
|
## Architecture
|
|
|
|
```
|
|
EMANCIPATE
|
|
|
|
|
+----------------+----------------+
|
|
| | |
|
|
Tor Layer DNS/SSL Layer Mesh Layer
|
|
(.onion) (HTTPS+ACME) (P2P peers)
|
|
| | |
|
|
tor-shield haproxyctl secubox-p2p
|
|
hidden svc + dns-provider-api + gossip sync
|
|
+ acme.sh
|
|
|
|
|
DNS Provider APIs
|
|
(OVH, Gandi, Cloudflare)
|
|
|
|
|
A/AAAA/CNAME records
|
|
created programmatically
|
|
```
|
|
|
|
## Composants
|
|
|
|
### Existants (deja construits)
|
|
|
|
| Composant | Package | Ce qu'il fait |
|
|
|-----------|---------|--------------|
|
|
| Scanner de services | `secubox-app-exposure` | Scan `netstat` enrichi avec noms UCI/Docker/processus |
|
|
| Exposition Tor | `secubox-app-tor` + `secubox-app-exposure` | `tor_add()` cree le repertoire hidden service + entree torrc |
|
|
| Exposition SSL/HAProxy | `secubox-app-haproxy` + `secubox-app-exposure` | `ssl_add()` cree le backend HAProxy + vhost + certificat ACME |
|
|
| Certificats ACME | `secubox-app-haproxy` | `acme.sh` avec validation HTTP-01 webroot via port 8402 |
|
|
| Gestionnaire VHost | `luci-app-vhost-manager` | CRUD vhost Nginx avec ACME + templates |
|
|
| Maillage P2P | `secubox-p2p` | Decouverte mDNS, maillage WireGuard, registre de services, chaine gossip |
|
|
| Master-Link | `secubox-master-link` | Onboarding hierarchique de noeuds avec tokens HMAC + audit blockchain |
|
|
| Registre de services | `luci-app-service-registry` | Agregation des services a travers le maillage, health checks, page d'accueil |
|
|
| Tableau de bord Exposure | `luci-app-exposure` | Vue KISS mono-table : scan + toggles Tor/SSL par service |
|
|
|
|
### Manquants (a construire)
|
|
|
|
| Composant | Objectif | Priorite |
|
|
|-----------|---------|----------|
|
|
| **API fournisseur DNS** | Gestion programmatique des enregistrements DNS (OVH, Gandi, Cloudflare) | **Haute** |
|
|
| **ACME DNS-01** | Certificats wildcard + domaines sans acces port 80 | **Haute** |
|
|
| **Flux Poke unifie** | Action unique pour exposer un service sur tous les canaux | Moyenne |
|
|
| **Agregation Peek** | Vue combinee : scan local + pairs maillage + enregistrements DNS + Tor | Moyenne |
|
|
| **Orchestrateur Emancipate** | Activation multi-canaux atomique avec rollback | Moyenne |
|
|
|
|
## Integration API Fournisseur DNS
|
|
|
|
### Conception
|
|
|
|
Nouveau package : `secubox-app-dns-provider`
|
|
|
|
```
|
|
package/secubox/secubox-app-dns-provider/
|
|
files/etc/config/dns-provider # UCI: type fournisseur, cles API, zone
|
|
files/etc/init.d/dns-provider # (optionnel) cron pour sync enregistrements
|
|
files/usr/sbin/dnsctl # CLI: record add/rm/list/sync
|
|
files/usr/lib/secubox/dns/ # Adaptateurs fournisseurs
|
|
ovh.sh # API OVH (app key + secret + consumer key)
|
|
gandi.sh # Gandi LiveDNS (cle API)
|
|
cloudflare.sh # Cloudflare (token API + zone ID)
|
|
```
|
|
|
|
### Config UCI
|
|
|
|
```uci
|
|
config dns_provider 'main'
|
|
option enabled '1'
|
|
option provider 'ovh' # ovh | gandi | cloudflare
|
|
option zone 'example.com' # zone DNS geree
|
|
|
|
config ovh 'ovh'
|
|
option endpoint 'ovh-eu' # ovh-eu | ovh-ca | ovh-us
|
|
option app_key ''
|
|
option app_secret ''
|
|
option consumer_key ''
|
|
|
|
config gandi 'gandi'
|
|
option api_key ''
|
|
|
|
config cloudflare 'cloudflare'
|
|
option api_token ''
|
|
option zone_id ''
|
|
```
|
|
|
|
### Commandes dnsctl
|
|
|
|
```
|
|
dnsctl list # Lister tous les enregistrements DNS de la zone
|
|
dnsctl add A myservice 1.2.3.4 # Creer enregistrement A
|
|
dnsctl add CNAME blog mycdn.net # Creer CNAME
|
|
dnsctl rm A myservice # Supprimer enregistrement
|
|
dnsctl sync # Synchroniser vhosts locaux vers enregistrements DNS
|
|
dnsctl verify myservice.example.com # Verifier propagation DNS
|
|
```
|
|
|
|
### Integration acme.sh DNS-01
|
|
|
|
Une fois que `dnsctl` fonctionne, activer les challenges DNS-01 dans `haproxyctl cert add` :
|
|
|
|
```sh
|
|
# Actuel (HTTP-01 uniquement):
|
|
acme.sh --issue -d "$domain" --webroot /var/www/acme-challenge
|
|
|
|
# Nouveau (DNS-01 via fournisseur):
|
|
provider=$(uci -q get dns-provider.main.provider)
|
|
case "$provider" in
|
|
ovh)
|
|
export OVH_END_POINT=$(uci -q get dns-provider.ovh.endpoint)
|
|
export OVH_APPLICATION_KEY=$(uci -q get dns-provider.ovh.app_key)
|
|
export OVH_APPLICATION_SECRET=$(uci -q get dns-provider.ovh.app_secret)
|
|
export OVH_CONSUMER_KEY=$(uci -q get dns-provider.ovh.consumer_key)
|
|
acme.sh --issue -d "$domain" --dns dns_ovh
|
|
;;
|
|
gandi)
|
|
export GANDI_LIVEDNS_KEY=$(uci -q get dns-provider.gandi.api_key)
|
|
acme.sh --issue -d "$domain" --dns dns_gandi_livedns
|
|
;;
|
|
cloudflare)
|
|
export CF_Token=$(uci -q get dns-provider.cloudflare.api_token)
|
|
export CF_Zone_ID=$(uci -q get dns-provider.cloudflare.zone_id)
|
|
acme.sh --issue -d "$domain" --dns dns_cf
|
|
;;
|
|
esac
|
|
```
|
|
|
|
Cela debloque les **certificats wildcard** (`*.example.com`) et les domaines derriere des firewalls sans port 80.
|
|
|
|
## Le Flux Emancipate
|
|
|
|
Quand un utilisateur poke un service et choisit "Emancipate", l'orchestrateur execute tous les canaux selectionnes de maniere atomique :
|
|
|
|
```
|
|
L'utilisateur selectionne : Gitea (port 3001) → Emancipate [Tor + DNS + Mesh]
|
|
|
|
1. Canal Tor:
|
|
secubox-exposure tor add gitea 3001 80
|
|
→ adresse .onion generee
|
|
|
|
2. Canal DNS:
|
|
dnsctl add A gitea <public-ip>
|
|
haproxyctl vhost add gitea.example.com 3001
|
|
haproxyctl cert add gitea.example.com --dns
|
|
→ HTTPS actif sur gitea.example.com
|
|
|
|
3. Canal Mesh:
|
|
secubox-p2p publish gitea 3001 "Gitea"
|
|
gossip_sync
|
|
→ Tous les pairs du maillage decouvrent le service
|
|
|
|
4. Mise a jour du registre:
|
|
Registre de services rafraichi
|
|
Page d'accueil regeneree
|
|
Tableau de bord Exposure affiche les trois badges
|
|
```
|
|
|
|
### Rollback en cas d'echec
|
|
|
|
Si un canal echoue, les canaux precedemment completes ne sont pas demontes — ils restent actifs. L'echec est signale, et l'utilisateur peut reessayer ou supprimer des canaux individuels via les toggles du tableau de bord Exposure.
|
|
|
|
## Peek : Ce Qui Existe Aujourd'hui
|
|
|
|
Le tableau de bord Exposure actuel (`luci-app-exposure/services.js`) implemente deja Peek :
|
|
|
|
- Scanne tous les ports en ecoute via `netstat -tlnp`
|
|
- Enrichit avec les vrais noms depuis uhttpd, streamlit, Docker, configs glances
|
|
- Reference croisee des hidden services Tor par port backend
|
|
- Reference croisee des vhosts HAProxy par port backend
|
|
- Affiche des interrupteurs toggle pour Tor et SSL par service
|
|
|
|
### Ce dont Peek a besoin ensuite
|
|
|
|
- **Colonne enregistrements DNS** : Montrer quels services ont des enregistrements DNS A/CNAME via `dnsctl list`
|
|
- **Colonne visibilite Mesh** : Montrer quels services sont publies aux pairs du maillage
|
|
- **Vue multi-noeuds** : Agreger les services de tous les pairs du maillage (deja disponible via `secubox-p2p get_shared_services`)
|
|
|
|
## Poke : Ce Qui Existe Aujourd'hui
|
|
|
|
Les interrupteurs toggle dans le tableau de bord Exposure sont deja des actions "Poke" :
|
|
|
|
- Toggle Tor ON → modal → nom du service + port onion → Activer
|
|
- Toggle SSL ON → modal → nom du service + domaine → Activer
|
|
|
|
### Ce dont Poke a besoin ensuite
|
|
|
|
- **Toggle DNS** : Troisieme colonne toggle pour la gestion des enregistrements DNS
|
|
- **Bouton Emancipate** : Action unique "Exposer partout" par service
|
|
- **Selection du fournisseur** : Choisir quelle zone DNS/fournisseur pour le domaine
|
|
|
|
## Points d'Integration avec les Packages Existants
|
|
|
|
| Package | Integration | Direction |
|
|
|---------|------------|-----------|
|
|
| `secubox-app-exposure` | Scan Peek + ajout/suppression Tor/SSL | Deja fonctionnel |
|
|
| `secubox-app-haproxy` | Vhost HAProxy + certificat ACME | Deja fonctionnel |
|
|
| `secubox-app-tor` | Cycle de vie hidden service | Deja fonctionnel |
|
|
| `secubox-p2p` | Publication service + gossip sync | Ajouter appel RPC `publish` |
|
|
| `luci-app-exposure` | Tableau de bord : ajouter colonne DNS + bouton Emancipate | Extension frontend |
|
|
| `secubox-app-dns-provider` | **NOUVEAU** : CRUD enregistrements DNS via APIs fournisseurs | A construire |
|
|
| `luci-app-dns-provider` | **NOUVEAU** : Config LuCI pour identifiants fournisseur | A construire |
|
|
|
|
## Ordre d'Implementation
|
|
|
|
1. **`secubox-app-dns-provider`** — Outil CLI + config UCI + adaptateurs fournisseurs (OVH d'abord)
|
|
2. **DNS-01 dans haproxyctl** — Connecter `dnsctl` au flux ACME comme alternative a HTTP-01
|
|
3. **`luci-app-dns-provider`** — Frontend LuCI pour configuration fournisseur
|
|
4. **Colonne DNS du tableau de bord Exposure** — Ajouter toggle DNS + integration `dnsctl`
|
|
5. **Flux Emancipate** — Orchestrateur unifie dans `secubox-exposure emancipate`
|
|
6. **Integration publication Mesh** — Connecter `secubox-p2p publish` a Emancipate
|
|
|
|
## Convention de Nommage
|
|
|
|
Le projet utilise des metaphores punk/DIY :
|
|
|
|
| Terme | Signification | Equivalent technique |
|
|
|------|---------|---------------------|
|
|
| **Peek** | Decouvrir, scanner, observer | `secubox-exposure scan` + registre de services |
|
|
| **Poke** | Cibler, configurer, viser | Interrupteurs toggle + config modal |
|
|
| **Emancipate** | Activer, liberer, exposer | Activation multi-canaux atomique |
|
|
| **Station** | Un noeud SecuBox | Un appareil OpenWrt executant le maillage |
|
|
| **Generative** | Chaque station peut creer de nouveaux endpoints | Apps Docker + canaux d'exposition |
|
|
|
|
## Considerations de Securite
|
|
|
|
- Cles API fournisseur DNS stockees dans UCI avec ACL restreint
|
|
- Cles privees ACME dans `/etc/acme/` avec permissions 600
|
|
- Cles hidden service Tor dans `/var/lib/tor/` proprietaire tor:tor
|
|
- Le flux Emancipate n'expose jamais les services 127.0.0.1 uniquement (garde dans le scan)
|
|
- Enregistrements DNS crees uniquement pour les services que l'utilisateur Poke explicitement
|
|
- Le rollback ne supprime PAS automatiquement — l'utilisateur doit explicitement retirer l'exposition
|