
Un auditor di sicurezza per le configurazioni di Tailscale. Analizza la tua tailnet alla ricerca di configurazioni errate, controlli di accesso eccessivamente permissivi e violazioni delle best practice di sicurezza.
Un auditor di sicurezza per le configurazioni Tailscale. Tailsnitch analizza la tua tailnet alla ricerca di 57 misconfigurazioni, controlli di accesso eccessivamente permissivi e violazioni delle best practice di sicurezza.
# 1. Imposta le credenziali API Tailscale
export TS_API_KEY="tskey-api-..."
# 2. Esegui l'audit
tailsnitch
# 3. Mostra solo i risultati ad alta gravità
tailsnitch --severity high
# 4. Correggi alcuni problemi ~interattivamente~ modalità yolo
tailsnitch --fix
Scarica l'ultima release da GitHub Releases.
Utenti macOS: Rimuovi l'attributo di quarantena dopo il download:
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 supporta due metodi di autenticazione. OAuth è preferito quando entrambi sono configurati.
I client OAuth forniscono accesso con ambiti definiti e verificabile che non scade quando i dipendenti lasciano l'azienda.
export TS_OAUTH_CLIENT_ID="..."
export TS_OAUTH_CLIENT_SECRET="tskey-client-..."
Crea un client OAuth su: https://login.tailscale.com/admin/settings/oauth
Ambiti richiesti per audit in sola lettura:
all:read copre tutto. Concessione degli ambiti singolarmente:
| Ambito | Utilizzato per |
|---|---|
policy_file:read | File policy della tailnet — ACL-, NET-, SSH-* |
devices:core:read | Elenco dispositivi — DEV-, NET-, ACL-011 |
dns:read | Configurazione DNS — DNS-001, DEV-007 |
auth_keys:read | Chiavi di autenticazione macchina — AUTH-*, ACL-011 |
feature_settings:read | Impostazioni tailnet — DEV-008, DEV-009, DEV-014 |
logs:network:read | Impostazione registrazione flusso di rete — LOG-001 |
networking_settings:read | Impostazione certificato HTTPS — NET-004 |
log_streaming:read | Destinazioni streaming log — LOG-002 |
webhooks:read | Endpoint webhook — LOG-005, LOG-012 |
oauth_keys:read | Client OAuth — LOG-006 |
users:read | Ruoli e stato utenti — USER-001, LOG-006 |
account_settings:read | Contatto di sicurezza — LOG-011 |
devices:posture_attributes:read | Integrazioni posture — DEV-014 |
Qualsiasi ambito che tralasci influisce solo sui controlli che ne hanno bisogno: quei controlli segnalano di non aver potuto leggere l'impostazione anziché superare.
AUTH-005 e AUTH-006 leggono le identità federate della tailnet, che la console
amministrativa chiama credenziali di trust. Arrivano dallo stesso elenco di chiavi delle
chiavi di autenticazione, quindi ci si aspetta che auth_keys:read le copra. Ciò non è stato
confermato su una tailnet live. Se l'elenco delle chiavi non può essere letto, entrambi i controlli
segnalano "non valutato" anziché superare. Se un ambito mancante restituisce un errore o
restituisce invece l'elenco con le identità filtrate non è confermato; se
filtra silenziosamente, AUTH-005 segnalerebbe che non esistono credenziali di trust e
AUTH-006 non troverebbe nulla da controllare.
Ambiti aggiuntivi per la modalità di correzione:
devices:core - Elimina dispositivi, modifica tag (richiede selezione tag)auth_keys - Elimina chiavi di autenticazioneDEV-010 e DEV-012 segnalano Tailnet Lock, che l'API Tailscale non
espone come impostazione della tailnet. I dispositivi bloccati da esso sono visibili tramite
l'API, ma determinare se il lock è abilitato richiede la CLI locale tailscale,
che legge il daemon sulla macchina che esegue tailsnitch. Quando si esegue l'audit di un'altra
tailnet con --tailnet, considera quella parte del risultato di conseguenza. Usa
--tailscale-path se il binario si trova in una posizione non standard.
Le chiavi API operano come l'utente che le ha create ed ereditano i permessi di quell'utente.
export TS_API_KEY="tskey-api-..."
Crea una chiave API su: https://login.tailscale.com/admin/settings/keys
# Esegui audit completo
tailsnitch
# Mostra anche i controlli superati (verbose)
tailsnitch --verbose
# Output come JSON per l'elaborazione
tailsnitch --json
# Audita una tailnet specifica (quando il client OAuth ha accesso a più tailnet)
tailsnitch --tailnet mycompany.com
# Mostra solo problemi critici e ad alta gravità
tailsnitch --severity high
# Filtra per categoria
tailsnitch --category access # Problemi ACL
tailsnitch --category auth # Autenticazione e chiavi
tailsnitch --category device # Sicurezza dispositivi
tailsnitch --category network # Esposizione di rete
tailsnitch --category ssh # Regole SSH
tailsnitch --category log # Registrazione e amministrazione
# Esegui solo controlli specifici
tailsnitch --checks ACL-001,AUTH-001,DEV-010
tailsnitch --checks stale-devices,tailnet-lock-not-enabled
# Elenca tutti i controlli disponibili
tailsnitch --list-checks
La modalità di correzione ti consente di rimediare ai problemi direttamente tramite l'API Tailscale:
# Modalità di correzione interattiva
tailsnitch --fix
# Anteprima di cosa verrebbe corretto (prova a secco)
tailsnitch --fix --dry-run
# Auto-selezione delle correzioni sicure (richiede comunque conferma)
tailsnitch --fix --auto
# Disabilita la registrazione audit delle azioni di correzione
tailsnitch --fix --no-audit-log
Elementi correggibili tramite API:
| Controllo | Azione |
|---|---|
| AUTH-001, AUTH-002, AUTH-003 | Elimina chiavi di autenticazione |
| DEV-002 | Rimuovi tag dai dispositivi utente |
| DEV-004 | Elimina dispositivi obsoleti |
| DEV-005 | Autorizza dispositivi in attesa |
La modalità di correzione fornisce anche collegamenti diretti alla console amministrativa per i problemi che richiedono intervento manuale.
Genera report di prove per audit SOC 2 con mappature dei Criteri Comuni (CC):
# Esporta come JSON
tailsnitch --soc2 json > soc2-evidence.json
# Esporta come CSV (per fogli di calcolo)
tailsnitch --soc2 csv > soc2-evidence.csv
Il report SOC 2 include:
Esempio di output CSV:
resource_type,resource_id,resource_name,check_id,check_title,cc_codes,status,details,tested_at
device,node123,prod-server,DEV-001,Tagged devices with key expiry disabled,CC6.1;CC6.3,PASS,Tags: [tag:server] key expiry enabled,2025-01-05T10:30:00Z
key,tskey-auth-xxx,tskey-auth-xxx,AUTH-001,Reusable auth keys exist,CC6.1;CC6.2;CC6.3,FAIL,Reusable key expires in 45 days,2025-01-05T10:30:00Z
Crea un file .tailsnitch-ignore per sopprimere i risultati per rischi noti e accettati:
# .tailsnitch-ignore
# Ignora controlli informativi
ACL-008 # Non usiamo intenzionalmente i gruppi
ACL-009 # Gli ACL legacy vanno bene per il nostro caso d'uso
# Ignora controlli medi specifici con giustificazione
DEV-006 # I dispositivi esterni sono appaltatori approvati
LOG-001 # I log di flusso richiedono il piano Enterprise
# Ignora un singolo elemento all'interno di un controllo, invece di silenziare l'intero controllo
ACL-011:tag:monitoring # ampio di proposito; ogni altro tag viene comunque controllato
AUTH-001:tskey-auth-xxxx # ruota automaticamente tramite CI, tracciato in TICKET-123