# CA-Gen-Server Dokumentation

> Stand: 2026-04-14 | Version 1.0

## Uebersicht

Der **CA-Gen-Server** ist der einzige Server im PKI-System, der private CA-Keys (`*_key.pem`) besitzt. Er generiert alle CA-Zertifikate fuer saemtliche 7 Stages (business + services) und synchronisiert die oeffentlichen Dateien zum Public Repository.

**Wichtig:** Private Keys verlassen niemals diesen Server!

## Server-Details

| Eigenschaft | Wert |
|-------------|------|
| **Hostname** | `db-cert-generate` |
| **IPv4** | `49.12.179.94` |
| **Subnetz** | `49.12.179.94/26` (Broadcast: `49.12.179.127`) |
| **Standort** | Hetzner Colocation DC4-NBG (Nuernberg) |
| **OS** | Ubuntu 24.04.3 LTS |
| **Kernel** | 6.8.0-88-generic |
| **CPU** | 4 Cores |
| **RAM** | 7.8 GB |
| **Disk** | 250 GB (ca. 19 GB belegt) |

## Zugriff

### SSH via Cloudflare Tunnel (einziger Zugangsweg)

Der Server ist **ausschliesslich** ueber einen Cloudflare Tunnel erreichbar. Direkter SSH-Zugriff von aussen ist nicht moeglich.

```
Internet → Cloudflare Zero Trust → Tunnel → 127.0.0.1:22 → SSH (blueits)
```

- **Cloudflared-Version:** 2025.11.1
- **Tunnel-Service:** systemd (`cloudflared.service`), laeuft seit Server-Neustart
- **SSH-Auth:** Password-Authentifizierung (fuer Cloudflare Tunnel erforderlich)
- **User:** `blueits` (SSH-Login, sudo-berechtigt)

### Firewall (UFW)

```
Default: deny (incoming), allow (outgoing), disabled (routed)
```

Kein Port ist von aussen geoeffnet - der gesamte Zugriff laeuft ueber den Cloudflare Tunnel.

### Kein VLAN-Zugriff

Der CA-Gen-Server ist **nicht** Teil des Hetzner Cloud VLANs (10.0.0.0/16). Er hat:
- Keinen Zugriff auf die 5 mTLS-Proxy-Server (10.0.0.2 - 10.0.0.6)
- Keine SSH-Keys oder SSH-Config fuer die mTLS-Server
- Keine Netzwerkroute ins VLAN

Dies ist **beabsichtigt** - der CA-Gen-Server soll isoliert bleiben, damit private Keys nicht versehentlich uebertragen werden.

## Installierte Dienste

| Dienst | Version | Funktion |
|--------|---------|----------|
| **cloudflared** | 2025.11.1 | Cloudflare Tunnel fuer SSH-Zugriff |
| **wazuh-agent** | 4.14.4 | Security Monitoring (SIEM) |
| **cfssl** | 1.6.5 | Certificate Signing (Cloudflare SSL) |
| **cfssljson** | 1.6.5 | JSON-Output fuer cfssl |
| **OpenSSL** | 3.0.13 | Zertifikats-Operationen |
| **PHP** | 8.3.6 | API-Endpoints (sign-csr, retrieve-ca, etc.) |
| **Apache** | (via PHP) | Webserver fuer API-Endpoints |

## Pfade und Repositories

### Privates Repository: `/var/www/html`

```
/var/www/html/
├── prd/ca/          # Production CA-Keys + Zertifikate
├── abn/ca/          # Abnormal/Dev CA-Keys + Zertifikate
├── int/ca/          # Integration CA-Keys + Zertifikate
├── tst/ca/          # Test CA-Keys + Zertifikate
├── pen/ca/          # Penetration CA-Keys + Zertifikate
├── pres/ca/         # Presentation CA-Keys + Zertifikate
├── lup/ca/          # Lookup CA-Keys + Zertifikate
├── */sign-csr-*.php # CSR-Signing API pro Stage
├── create-ca-certificate.sh  # Einzelne CA generieren
├── create-ca-batch.sh        # Alle 26 CAs fuer ein Jahr
├── PERMISSIONS.sh             # Berechtigungen setzen
├── create-backup.sh           # TAR-Backup erstellen
├── RESTORE.sh                 # Backup wiederherstellen
├── sync-to-public.sh          # Sync → /srv/pki-public
└── CLAUDE.md                  # Claude Code Anweisungen
```

- **Git Branch:** `master`
- **Git Remote:** Keiner (nur lokal)
- **Enthaelt:** Private Keys (`*_key.pem`), Backups, vollstaendige PKI

### Public Repository: `/srv/pki-public`

```
/srv/pki-public/
├── docs/            # Dokumentation (diese Datei)
├── tests/           # Test-Suite
├── health/          # Globaler Health-Endpoint
├── */health/        # Stage-spezifische Health-Endpoints
└── CLAUDE.md        # Claude Code Anweisungen (public)
```

- **Git Branch:** `pki-public`
- **Git Remote:** `https://github.com/REDITS-GmbH/cert-pki.git`
- **Enthaelt:** Nur oeffentliche Dateien (keine Keys, keine Backups)

### Synchronisierung

```
/var/www/html (privat)
      │
      │ sync-to-public.sh (exkludiert *_key.pem, backups/)
      ▼
/srv/pki-public (public)
      │
      │ git push
      ▼
GitHub: REDITS-GmbH/cert-pki (Branch: pki-public)
```

## Abgrenzung zu den mTLS-Proxy-Servern

| Eigenschaft | CA-Gen-Server | mTLS-Proxy (5x) |
|-------------|---------------|------------------|
| **Hostname** | db-cert-generate | Cert-Server-{0,1}-{NBG,FSN,HEL} |
| **Netzwerk** | Colocation (isoliert) | Hetzner Cloud VLAN 10.0.0.0/16 |
| **Private Keys** | Ja | Nein |
| **Funktion** | CA generieren, CSR signieren | mTLS terminieren, Proxy zu Workers |
| **SSH intern** | Nur Cloudflare Tunnel | Untereinander via VLAN |
| **Repo-Pfad** | `/var/www/html` | `/root/projects/cert-pki` |
| **Lsyncd** | Nicht angebunden | Star-Topologie (Hub: 10.0.0.2) |
| **Claude Code** | Ja (via Cloudflare Tunnel) | Ja (via Cloudflare Tunnel + VLAN) |

## Claude Code auf diesem Server

Claude Code wird ueber Cloudflare Tunnel SSH aufgerufen. Die Sessions erscheinen in den Auth-Logs als Login von `127.0.0.1`:

```
sshd: Accepted password for blueits from 127.0.0.1
```

### Arbeitsverzeichnisse fuer Claude Code

- **PKI-Arbeit:** `cd /srv` oder `cd /srv/pki-public`
- **Private Repo:** `/var/www/html` (Vorsicht: enthaelt private Keys!)

### Einschraenkungen

- Kein Zugriff auf die 5 mTLS-Proxy-Server von hier aus
- Fuer Arbeiten an Apache/mTLS-Konfiguration → Claude Code auf Cert-Server-1-NBG (10.0.0.2) starten
- Lsyncd-Sessions werden **nicht** hierher synchronisiert

## Verwandte Dokumentation

- [INFRASTRUCTURE.md](INFRASTRUCTURE.md) - Uebersicht aller Server inkl. 5 mTLS-Proxy-Server
- [ARCHITECTURE.md](ARCHITECTURE.md) - System-Architektur und Request-Flow
- [DEPLOYMENT.md](DEPLOYMENT.md) - Deployment-Guide fuer mTLS-Infrastruktur

## Versionshistorie

| Version | Datum | Aenderung |
|---------|-------|-----------|
| 1.0 | 2026-04-14 | Initiale Dokumentation des CA-Gen-Servers |
