
Ein Sicherheitsprüfer für Tailscale-Konfigurationen. Durchsucht Ihr Tailnet nach Fehlkonfigurationen, zu permissiven Zugriffskontrollen und Verstößen gegen Sicherheitsbest Practices.
Ein Sicherheitsauditor für Tailscale-Konfigurationen. Tailsnitch scannt Ihr Tailnet auf über 50 Fehlkonfigurationen, zu permissive Zugriffskontrollen und Verstöße gegen Sicherheitsbest Practices.
# 1. Tailscale-API-Anmeldeinformationen festlegen
export TS_API_KEY="tskey-api-..."
# 2. Audit ausführen
tailsnitch
# 3. Nur Ergebnisse mit hohem Schweregrad anzeigen
tailsnitch --severity high
# 4. Probleme ~interaktiv~ im Yolo-Modus beheben
tailsnitch --fix
Laden Sie die neueste Version von GitHub Releases herunter.
macOS-Benutzer: Entfernen Sie nach dem Herunterladen das Quarantäneattribut:
sudo xattr -rd com.apple.quarantine tailsnitch
go install github.com/Adversis/tailsnitch@latest
git clone https://github.com/Adversis/tailsnitch.git
cd tailsnitch
go build -o tailsnitch .
Tailsnitch unterstützt zwei Authentifizierungsmethoden. OAuth wird bevorzugt, wenn beide konfiguriert sind.
OAuth-Clients bieten einen bereichsbezogenen, prüfbaren Zugriff, der nicht abläuft, wenn Mitarbeiter das Unternehmen verlassen.
export TS_OAUTH_CLIENT_ID="..."
export TS_OAUTH_CLIENT_SECRET="tskey-client-..."
Erstellen Sie einen OAuth-Client unter: https://login.tailscale.com/admin/settings/oauth
Erforderliche Bereiche für schreibgeschütztes Audit:
all:read (am einfachsten) oder einzeln:policy_file:read – ACL-Richtliniedevices:core:read – Gerätelistedns:read – DNS-Konfigurationauth_keys:read – Authentifizierungsschlüssel (für AUTH-Prüfungen)Zusätzliche Bereiche für den Korrekturmodus:
devices:core – Geräte löschen, Tags ändern (erfordert Tag-Auswahl)auth_keys – Authentifizierungsschlüssel löschenAPI-Schlüssel agieren als der Benutzer, der sie erstellt hat, und erben dessen Berechtigungen.
export TS_API_KEY="tskey-api-..."
Erstellen Sie einen API-Schlüssel unter: https://login.tailscale.com/admin/settings/keys
# Vollständiges Audit ausführen
tailsnitch
# Auch bestandene Prüfungen anzeigen (ausführlich)
tailsnitch --verbose
# Ausgabe als JSON zur Weiterverarbeitung
tailsnitch --json
# Ein bestimmtes Tailnet auditieren (wenn der OAuth-Client Zugriff auf mehrere hat)
tailsnitch --tailnet mycompany.com
# Nur kritische und hohe Probleme anzeigen
tailsnitch --severity high
# Nach Kategorie filtern
tailsnitch --category access # ACL-Probleme
tailsnitch --category auth # Authentifizierung & Schlüssel
tailsnitch --category device # Gerätesicherheit
tailsnitch --category network # Netzwerkexposition
tailsnitch --category ssh # SSH-Regeln
tailsnitch --category log # Protokollierung & Verwaltung
# Nur bestimmte Prüfungen ausführen
tailsnitch --checks ACL-001,AUTH-001,DEV-010
tailsnitch --checks stale-devices,tailnet-lock-not-enabled
# Alle verfügbaren Prüfungen auflisten
tailsnitch --list-checks
Der Korrekturmodus ermöglicht die direkte Behebung von Problemen über die Tailscale-API:
# Interaktiver Korrekturmodus
tailsnitch --fix
# Vorschau, was behoben würde (Probelauf)
tailsnitch --fix --dry-run
# Sichere Korrekturen automatisch auswählen (erfordert dennoch Bestätigung)
tailsnitch --fix --auto
# Audit-Protokollierung von Korrekturaktionen deaktivieren
tailsnitch --fix --no-audit-log
Über die API korrigierbare Elemente:
| Prüfung | Aktion |
|---|---|
| AUTH-001, AUTH-002, AUTH-003 | Authentifizierungsschlüssel löschen |
| AUTH-004 | Durch temporäre Schlüssel ersetzen |
Der Korrekturmodus bietet auch direkte Links zur Admin-Konsole für Probleme, die manuelles Eingreifen erfordern.
Erstellen Sie Nachweisberichte für SOC 2-Audits mit Common Criteria (CC)-Steuerungszuordnungen:
# Als JSON exportieren
tailsnitch --soc2 json > soc2-evidence.json
# Als CSV exportieren (für Tabellenkalkulationen)
tailsnitch --soc2 csv > soc2-evidence.csv
Der SOC 2-Bericht umfasst:
Beispiel-CSV-Ausgabe:
resource_type,resource_id,resource_name,check_id,check_title,cc_codes,status,details,tested_at
device,node123,prod-server,DEV-001,Getaggte Geräte mit deaktiviertem Schlüsselablauf,CC6.1;CC6.3,PASS,Tags: [tag:server] Schlüsselablauf aktiviert,2025-01-05T10:30:00Z
key,tskey-auth-xxx,tskey-auth-xxx,AUTH-001,Wiederverwendbare Authentifizierungsschlüssel vorhanden,CC6.1;CC6.2;CC6.3,FAIL,Wiederverwendbarer Schlüssel läuft in 45 Tagen ab,2025-01-05T10:30:00Z
Erstellen Sie eine .tailsnitch-ignore-Datei, um Ergebnisse für akzeptierte Risiken zu unterdrücken:
# .tailsnitch-ignore
# Informative Prüfungen ignorieren
ACL-008 # Wir verwenden absichtlich keine Gruppen
ACL-009 # Legacy-ACLs sind für unseren Anwendungsfall in Ordnung
# Bestimmte mittlere Prüfungen mit Begründung ignorieren
DEV-006 # Externe Geräte sind genehmigte Auftragnehmer
LOG-001 # Flow-Protokolle erfordern Enterprise-Plan
Speicherorte der Ignore-Datei (in dieser Reihenfolge geprüft):
.tailsnitch-ignore im aktuellen Verzeichnis~/.tailsnitch-ignore im Home-Verzeichnis# Eine bestimmte Ignore-Datei verwenden
tailsnitch --ignore-file /pfad/zur/ignore
# Verarbeitung der Ignore-Datei vollständig deaktivieren
tailsnitch --no-ignore
# Vollständigen Bericht exportieren
tailsnitch --json > audit.json
# Fehlgeschlagene Prüfungen als TSV extrahieren
tailsnitch --json | jq -r '
.suggestions
| map(select(.pass == false))
| .[]
| [.id, .title, .severity, .remediation]
| @tsv
' > findings.tsv
# Zusammenfassung nach Schweregrad
tailsnitch --json | jq '
.suggestions
| map(select(.pass == false))
| group_by(.severity)
| map({severity: .[0].severity, count: length})
'
# Kritische/hohe Probleme mit Admin-Links auflisten
tailsnitch --json | jq -r '
.suggestions
| map(select(.pass == false and (.severity == "CRITICAL" or .severity == "HIGH")))
| .[]
| "\(.id): \(.title)\n Fix: \(.fix.admin_url // "manual")\n"
'
Tailsnitch führt 52 Sicherheitsprüfungen in 7 Kategorien durch. Siehe docs/CHECKS.md für die detaillierte Dokumentation jeder Prüfung.
Prüfungen auf Protokollierungskonfiguration, DNS-Einstellungen, Benutzerrollen und manuelle Überprüfungspunkte.
+=====================================================================+
| TAILSNITCH SICHERHEITSAUDIT |
| Tailnet: example.com |
| Version: 1.0.0 (Build: abc123) |
+=====================================================================+
Verwendete Ignore-Datei: .tailsnitch-ignore (3 Regeln)
=== ZUGRIFFSKONTROLLEN ===================================================
[KRITISCH] ACL-001: Standardrichtlinie 'allow all' aktiv
Ihre ACL-Richtlinie enthält das Feld 'acls' nicht. Tailscale wendet
eine Standardrichtlinie 'allow all' an, die allen Geräten vollen Zugriff gewährt.
Abhilfe:
Definieren Sie explizite ACL-Regeln nach dem Prinzip der geringsten Privilegien.
Quelle: https://tailscale.com/kb/1192/acl-samples
----------------------------------------------------------------------
=== AUTHENTIFIZIERUNG & SCHLÜSSEL =============================================
[HOCH] AUTH-001: Wiederverwendbare Authentifizierungsschlüssel vorhanden
2 wiederverwendbare Authentifizierungsschlüssel gefunden. Diese können bei Kompromittierung
zum Hinzufügen mehrerer Geräte wiederverwendet werden.
Details:
- Schlüssel tskey-auth-xxx (läuft in 45 Tagen ab)
- Schlüssel tskey-auth-yyy (läuft in 89 Tagen ab)
Abhilfe:
Bewahren Sie wiederverwendbare Schlüssel in einem Secrets-Manager auf. Bevorzugen Sie Einmalschlüssel.
Quelle: https://tailscale.com/kb/1085/auth-keys
----------------------------------------------------------------------
ZUSAMMENFASSUNG
======================================================================
Kritisch: 1 Hoch: 3 Mittel: 5 Niedrig: 2 Info: 8
Gesamtergebnisse: 19 | Bestanden: 33
Tailnet-Lock-Prüfungen (DEV-010, DEV-012) erfordern die lokale tailscale-CLI und werden gegen den Daemon des lokalen Rechners ausgeführt. Bei der Überprüfung eines entfernten Tailnets über --tailnet spiegeln diese Prüfungen den lokalen Status wider, nicht das überprüfte Tailnet.
# Bei Bedarf benutzerdefinierten Tailscale-Binärpfad angeben
tailsnitch --tailscale-path /opt/tailscale/bin/tailscale
## CI/CD-Integration
Führen Sie Tailsnitch in CI/CD-Pipelines aus, um Sicherheitsregressionen zu erkennen:
```yaml
# GitHub Actions-Beispiel
- name: Tailscale-Sicherheit auditieren
env:
TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }}
TS_OAUTH_CLIENT_SECRET: ${{ secrets.TS_OAUTH_CLIENT_SECRET }}
run: |
tailsnitch --json > audit.json
# Fehlschlagen, wenn kritische oder hohe Probleme vorhanden sind
if tailsnitch --severity high --json | jq -e '.summary.critical + .summary.high > 0' > /dev/null; then
echo "Kritische oder hohe Probleme gefunden!"
tailsnitch --severity high
exit 1
fi
MIT
Siehe CONTRIBUTING.md für Richtlinien.
| DEV-002 | Tags von Benutzergeräten entfernen |
| DEV-004 | Veraltete Geräte löschen |
| DEV-005 | Ausstehende Geräte autorisieren |
| Flag | Beschreibung |
|---|
--json | Ausgabe als JSON |
--severity | Nach mindestens Schweregrad filtern: critical, high, medium, low, info |
--category | Nach Kategorie filtern: access, auth, network, ssh, log, device, dns |
--checks | Bestimmte Prüfungen ausführen (durch Komma getrennte IDs oder Slugs) |
--list-checks | Alle verfügbaren Prüfungen auflisten und beenden |
--tailnet | Tailnet festlegen, das auditiert werden soll (Standard: vom API-Schlüssel) |
--verbose | Auch bestandene Prüfungen anzeigen |
--fix | Interaktiven Korrekturmodus aktivieren |
--auto | Sichere Korrekturen automatisch auswählen (erfordert --fix) |
--dry-run | Korrekturaktionen ohne Ausführung in der Vorschau anzeigen (erfordert --fix) |
--no-audit-log | Audit-Protokollierung von Korrekturaktionen deaktivieren |
--soc2 | SOC 2-Nachweise exportieren: json oder csv |
--tailscale-path | Pfad zur Tailscale-CLI (für Tailnet-Lock-Prüfungen) |
--ignore-file | Pfad zur Ignore-Datei |
--no-ignore | Verarbeitung der Ignore-Datei deaktivieren |
--version | Versionsinformationen anzeigen |
| ID | Prüfung | Risiko |
|---|
| ACL-001 | Standardrichtlinie 'allow all' | Alle Geräte haben uneingeschränkten Zugriff |
| ACL-002 | SSH-autogroup:nonroot-Fehlkonfiguration | SSH als jeder Nicht-Root-Benutzer |
| ACL-006 | tagOwners zu weit gefasst | Privilegieneskalation über Tags |
| ACL-007 | Verwendung von autogroup:danger-all | Zugriff für externe Benutzer gewährt |
| ID | Prüfung | Risiko |
|---|
| AUTH-001 | Wiederverwendbare Authentifizierungsschlüssel | Unbegrenzte Gerätehinzufügungen bei Diebstahl |
| AUTH-002 | Langlaufende Authentifizierungsschlüssel | Erweitertes Expositionsfenster |
| AUTH-003 | Vorautorisierte Schlüssel | Umgehung der Gerätefreigabe |
| DEV-001 | Getaggte Geräte ohne Schlüsselablauf | Unbegrenzter Zugriff |
| DEV-002 | Benutzergeräte getaggt | Bleiben nach Entfernung des Benutzers bestehen |
| DEV-010 | Tailnet-Lock deaktiviert | Kein Schutz vor gestohlenen Schlüsseln |
| DEV-012 | Ausstehende Tailnet-Lock-Signaturen | Nicht signierte Knoten müssen überprüft werden |
| NET-001 | Funnel-Exposition | Öffentlicher Internetzugriff |
| NET-003 | Vertrauensgrenze des Subnet-Routers | Unverschlüsselter Verkehr im lokalen Netzwerk |
| SSH-002 | Root-SSH ohne Check-Modus | Keine erneute Authentifizierung erforderlich |
| ID | Prüfung | Risiko |
|---|
| ACL-004 | Verwendung von autogroup:member | Externe Benutzer eingeschlossen |
| ACL-005 | AutoApprovers konfiguriert | Umgehung der Routenfreigabe |
| AUTH-004 | Nicht-ephemere CI/CD-Schlüssel | Veraltete Geräte sammeln sich an |
| DEV-003 | Veraltete Clients | Potenzielle Schwachstellen |
| DEV-004 | Veraltete Geräte | Ungenutzte Angriffsfläche |
| DEV-005 | Nicht autorisierte Geräte | Ausstehende Freigabewarteschlange |
| DEV-007 | Vertrauliche Maschinennamen | CT-Log-Exposition |
| DEV-009 | Gerätefreigabekonfiguration | Möglicherweise nicht aktiviert |
| NET-004 | HTTPS-CT-Log-Exposition | Maschinennamen öffentlich |
| NET-005 | Sichtbarkeit des Exit-Node-Verkehrs | Betreiber sieht gesamten Verkehr |
| NET-006 | Serve-Exposition | Lokale Dienste im Tailnet |
| SSH-003 | Recorder-UI-Exposition | Sitzungen für Netzwerk sichtbar |