Files
ssh-cert-login/README.md
2026-03-03 19:48:07 +00:00

153 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSH-Zertifikats-Login mit zentraler CA
Dieses Projekt ermöglicht eine einfache und sichere Anmeldung per SSH auf mehreren Servern über kurzzeitige, von einer zentralen Zertifizierungsstelle (CA) signierte SSH-Zertifikate.
---
## Features
- Zentrale SSH CA zur Signierung temporärer SSH-Schlüssel
- Automatisches Erzeugen und Signieren von SSH-Keys
- Interaktive Auswahl der Ziel-VM, des Benutzers und der Zertifikatsgültigkeit über `gum`
- Logging aller wichtigen Aktionen (Konsole + Logdatei)
- Schutz der privaten CA-Schlüssel durch zentrale Signatur-VM
- Flexible Erweiterbarkeit
---
## Verzeichnisstruktur
```
.
├── log/ # Logs und Logging-Script
│ ├── logging.sh
│ └── ssh-cert-login.log
├── temp_keys/ # Temporäre SSH-Schlüssel werden hier erzeugt
├── login.sh # Hauptscript für Zertifikatserstellung und SSH-Login
├── remote_sign.sh # Remote-Skript auf der CA-VM zur Signatur
├── .gitignore # Git Ignore für Logs, temporäre Keys, etc.
└── README.md # Diese Datei
```
---
## Voraussetzungen
- Bash unter Linux/macOS
- `ssh` und `ssh-keygen`
- `scp` für Dateiübertragungen
- `gum` (https://github.com/charmbracelet/gum) für das interaktive Terminal-Menü
- Zugriff auf eine CA-VM mit privatem CA-Key und dem `remote_sign.sh` Script
- SSH-Key für Anmeldung an der CA-VM (`id_ca` o.ä.)
### Hinweis zur CA-Authentifizierung
Das Skript prüft automatisch, ob der SSH-Private-Key `ca_key.pub` (Standardpfad: `~/.ssh/ca_key.pub`) vorhanden ist.
Dieser Schlüssel wird zur Authentifizierung auf der CA-VM benötigt, um die Signaturanfrage abzusenden. Muss lokal per ssh-keygen erstellt und mit ssh-copy-id auf die CA übertragen werden.
Falls die Datei nicht vorhanden ist, bricht das Skript mit einer Fehlermeldung ab.
👉 **Lösung:** Stelle sicher, dass sich dein Private Key `id_ca` im richtigen Verzeichnis befindet und per `chmod 600 ~/.ssh/id_ca` korrekt geschützt ist. Optional kannst du den Pfad im Skript `login.sh` anpassen, falls du einen anderen Schlüssel verwenden möchtest.
---
## Installation
1. `gum` installieren:
```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install gum
```
2. Alle Skripte und Verzeichnisse in ein Git-Repository klonen oder kopieren
3. CA-VM korrekt konfigurieren (privater CA-Key, `remote_sign.sh`)
4. `login.sh` ausführbar machen:
```bash
chmod +x login.sh
```
5. Log-Verzeichnis anlegen (falls nicht vorhanden):
```bash
mkdir -p log
```
6. Im Log-Verzeichnis die Datei rotate.cfg anlegen, meist mit diesen Parametern:
```bash
/var/log/my_app/*.log {
daily
rotate 7
compress
missingok
notifempty
dateext
}
```
---
## Nutzung
Starte das Login-Skript:
```bash
./login.sh
```
- Wähle die Ziel-VM aus der Liste
- Wähle den SSH-Benutzer (vordefiniert oder eigene Eingabe)
- Wähle die Gültigkeitsdauer des Zertifikats
- Das Skript generiert einen temporären SSH-Key, sendet den Public Key zur CA, holt das signierte Zertifikat zurück und startet die SSH-Verbindung zum Ziel
---
## Sicherheitshinweise
- Der private CA-Schlüssel sollte ausschließlich auf der CA-VM gespeichert und geschützt werden
- Temporäre SSH-Keys sind nur kurz gültig (Standard 5 Minuten)
- Logdateien enthalten keine privaten Schlüssel, aber Pfadangaben und Benutzerinformationen vor unberechtigtem Zugriff schützen
---
## Lizenz
MIT License (oder nach Wunsch anpassen)
---
## Kontakt
Bei Fragen oder Problemen gerne melden!
---
**Viel Erfolg mit deinem zentralen SSH-Zertifikats-Login!**
---
## Gum installieren (falls nicht vorhanden)
Falls `gum` noch nicht installiert ist, kannst du es direkt von GitHub beziehen:
```bash
# Neueste Version ermitteln
GUM_VERSION=$(curl -s https://api.github.com/repos/charmbracelet/gum/releases/latest | grep tag_name | cut -d '"' -f 4)
# Download für Linux x86_64
curl -L "https://github.com/charmbracelet/gum/releases/download/${GUM_VERSION}/gum_${GUM_VERSION#v}_Linux_x86_64.tar.gz" -o gum.tar.gz
# Entpacken
tar -xzf gum.tar.gz
# Nach /usr/local/bin verschieben
sudo install gum /usr/local/bin
# Testen
gum --version
```
Alternativ findest du alle Releases unter:
👉 https://github.com/charmbracelet/gum/releases