Konfiguration

Konfiguration

SSH-Frontière verwendet eine TOML-Datei zur Deklaration von Domänen, Aktionen, Zugriffsebenen, Argumenten und Authentifizierungstoken.

Speicherort

Standardpfad: /etc/ssh-frontiere/config.toml

Überschreibung (nach Priorität):

  1. --config <path> in der command=-Zeile von authorized_keys
  2. Umgebungsvariable SSH_FRONTIERE_CONFIG
  3. Standardpfad

Empfohlene Berechtigungen: root:forge-runner 640 (Gruppe an das verwendete Dienstkonto anpassen).

Dateistruktur

[global]                              # Allgemeine Einstellungen
[domains.<id>]                        # Funktionale Domänen
  [domains.<id>.actions.<id>]         # Autorisierte Aktionen
    [domains.<id>.actions.<id>.args]  # Benannte Argumente (optional)
[auth]                                # RBAC-Authentifizierung (optional)
  [auth.tokens.<id>]                  # Token mit Secret, Stufe und Tags

Abschnitt [global]

SchlüsselTypStandardBeschreibung
log_fileStringerforderlichPfad zur JSON-Logdatei
default_timeoutInteger300Standard-Timeout in Sekunden
max_stdout_charsInteger65536Stdout-Limit (64 KB)
max_stderr_charsInteger16384Stderr-Limit (16 KB)
max_output_charsInteger131072Globales Hard-Limit (128 KB)
max_stream_bytesInteger10485760Streaming-Volumenlimit (10 MB)
timeout_sessionInteger3600Session-Keepalive-Timeout
max_auth_failuresInteger3Auth-Versuche vor Lockout
ban_commandString""IP-Ban-Befehl (Platzhalter {ip})
log_commentsBoolfalseClient-#-Zeilen protokollieren
expose_session_idBoolfalseSitzungs-UUID im Banner anzeigen

Die Schlüssel log_level, default_level und mask_sensitive werden vom Parser für Abwärtskompatibilität akzeptiert, aber nicht mehr verwendet.

Abschnitt [domains]

Eine Domäne ist ein funktionaler Bereich (z.B. forgejo, infra, notify). Jede Domäne enthält autorisierte Aktionen.

[domains.forgejo]
description = "Git-Forge-Infrastruktur"

[domains.forgejo.actions.backup-config]
description = "Konfiguration sichern"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"
max_body_size = 65536       # Body-Limit (64 KB, optional)

Jede Aktion akzeptiert folgende Schlüssel: description (erforderlich), level (erforderlich), execute (erforderlich), timeout (optional, überschreibt global), tags (optional), max_body_size (optional, Standard 65536 Bytes).

Vertrauensstufen

Strikte Hierarchie: read < ops < admin

StufeVerwendung
readNur lesen: healthcheck, status, list
opsRoutineoperationen: backup, deploy, restart
adminAlle Aktionen + Administration

Argumente

Argumente werden als TOML-Dictionary deklariert:

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }
FeldTypBeschreibung
typeString"enum" oder "string"
valuesListeErlaubte Werte (für enum)
defaultStringStandardwert (macht das Argument optional)
sensitiveBoolWenn true, in Logs maskiert
freeBoolWenn true, akzeptiert jeden Wert ohne Einschränkung

Platzhalter in execute

PlatzhalterBeschreibung
{domain}Domänenname (immer verfügbar)
{arg_name}Wert des entsprechenden Arguments

Sichtbarkeits-Tags

Tags filtern den Zugang zu Aktionen horizontal. Eine Aktion ohne Tags ist für alle zugänglich. Eine Aktion mit Tags ist nur für Identitäten zugänglich, deren Tags mindestens einen gemeinsamen Tag haben.

[domains.forgejo.actions.deploy]
# ...
tags = ["forgejo", "deploy"]

Abschnitt [auth] (optional)

RBAC-Authentifizierung ermöglicht Rechteeskalation über Challenge-Response:

[auth]
challenge_nonce = false              # true = Anti-Replay-Nonce-Modus

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="   # Base64-kodiertes Secret
level = "ops"                               # Gewährte Stufe
tags = ["forgejo"]                          # Sichtbarkeits-Tags

Das Secret muss mit b64: prefixed und base64-kodiert sein. Um ein Secret zu generieren:

echo -n "mein-zufaelliges-secret" | base64
# bWVpbi16dWZhZWxsaWdlcy1zZWNyZXQ=

Validierung beim Laden

Die Konfiguration wird bei jedem Laden vollständig validiert (Fail-fast). Bei Fehler beendet sich das Programm mit Code 129. Validierungen:

Vollständiges Beispiel

[global]
log_file = "/var/log/ssh-frontiere/commands.json"
default_timeout = 300
max_stdout_chars = 65536
max_stderr_chars = 16384
max_output_chars = 131072
timeout_session = 3600
max_auth_failures = 3

[domains.forgejo]
description = "Git-Forge-Infrastruktur"

[domains.forgejo.actions.backup-config]
description = "Forgejo-Konfiguration sichern"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"

[domains.forgejo.actions.deploy]
description = "Deployment mit Versions-Tag"
level = "ops"
timeout = 300
execute = "sudo /usr/local/bin/deploy.sh {domain} {tag}"

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }

[domains.infra]
description = "Server-Infrastruktur"

[domains.infra.actions.healthcheck]
description = "Dienst-Gesundheitsprüfung"
level = "read"
timeout = 30
execute = "/usr/local/bin/healthcheck.sh"

[auth]
challenge_nonce = false

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="
level = "ops"
tags = ["forgejo"]

Für einen detaillierten Guide mit allen Anwendungsfällen, siehe den vollständigen Konfigurationsguide im Repository.


Weiter: Deployment — in Produktion nehmen.