
Un auditor de seguridad para configuraciones de Tailscale. Escanea tu tailnet en busca de configuraciones incorrectas, controles de acceso excesivamente permisivos y violaciones de las mejores prácticas de seguridad.
Un auditor de seguridad para configuraciones de Tailscale. Tailsnitch escanea tu tailnet en busca de 57 malas configuraciones, controles de acceso excesivamente permisivos y violaciones de mejores prácticas de seguridad.
# 1. Configura tus credenciales de la API de Tailscale
export TS_API_KEY="tskey-api-..."
# 2. Ejecuta la auditoría
tailsnitch
# 3. Ve solo los hallazgos de severidad alta
tailsnitch --severity high
# 4. Corrige algunos problemas ~interactivamente~ modo yolo
tailsnitch --fix
Descarga la última versión desde GitHub Releases.
Usuarios de macOS: Elimina el atributo de cuarentena después de la descarga:
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 admite dos métodos de autenticación. Se prefiere OAuth cuando ambos están configurados.
Los clientes OAuth proporcionan acceso con alcance definido y auditable que no expira cuando los empleados se van.
export TS_OAUTH_CLIENT_ID="..."
export TS_OAUTH_CLIENT_SECRET="tskey-client-..."
Crea un cliente OAuth en: https://login.tailscale.com/admin/settings/oauth
Alcances requeridos para auditoría de solo lectura:
all:read lo cubre todo. Otorgar alcances individualmente:
| Alcance | Se usa para |
|---|---|
policy_file:read | Archivo de política del tailnet — ACL-, NET-, SSH-* |
devices:core:read | Lista de dispositivos — DEV-, NET-, ACL-011 |
dns:read | Configuración de DNS — DNS-001, DEV-007 |
auth_keys:read | Claves de autenticación de máquinas — AUTH-*, ACL-011 |
feature_settings:read | Configuración del tailnet — DEV-008, DEV-009, DEV-014 |
logs:network:read | Configuración de registro de flujo de red — LOG-001 |
networking_settings:read | Configuración de certificados HTTPS — NET-004 |
log_streaming:read | Destinos de transmisión de registros — LOG-002 |
webhooks:read | Endpoints de webhooks — LOG-005, LOG-012 |
oauth_keys:read | Clientes OAuth — LOG-006 |
users:read | Roles y estado de usuarios — USER-001, LOG-006 |
account_settings:read | Contacto de seguridad — LOG-011 |
devices:posture_attributes:read | Integraciones de postura — DEV-014 |
Cualquier alcance que omitas solo afecta a las comprobaciones que lo necesitan: esas comprobaciones informan que no pudieron leer la configuración en lugar de pasarla.
AUTH-005 y AUTH-006 leen las identidades federadas del tailnet, que la consola
de administración llama credenciales de confianza. Provienen de la misma lista de claves que las
claves de autenticación, por lo que se espera que auth_keys:read las cubra. Eso no se ha confirmado
contra un tailnet en vivo. Si la lista de claves no se puede leer, ambas comprobaciones informan
"no evaluado" en lugar de pasarla. Si un alcance faltante devuelve un error o
en su lugar devuelve la lista con las identidades filtradas no está confirmado; si
filtra silenciosamente, AUTH-005 informaría que no existen credenciales de confianza y
AUTH-006 no encontraría nada que comprobar.
Alcances adicionales para el modo de corrección:
devices:core - Eliminar dispositivos, modificar etiquetas (requiere selección de etiquetas)auth_keys - Eliminar claves de autenticaciónDEV-010 y DEV-012 informan sobre Tailnet Lock, que la API de Tailscale no
expone como una configuración del tailnet. Los dispositivos bloqueados por él son visibles a través de la
API, pero determinar si el bloqueo está habilitado necesita el CLI local tailscale,
que lee el daemon en la máquina que ejecuta tailsnitch. Al auditar otro
tailnet con --tailnet, trata esa parte del resultado en consecuencia. Usa
--tailscale-path si el binario está en una ubicación no estándar.
Las claves de API operan como el usuario que las creó y heredan los permisos de ese usuario.
export TS_API_KEY="tskey-api-..."
Crea una clave de API en: https://login.tailscale.com/admin/settings/keys
# Ejecuta auditoría completa
tailsnitch
# Muestra también las comprobaciones que pasan (verbose)
tailsnitch --verbose
# Salida como JSON para procesamiento
tailsnitch --json
# Audita un tailnet específico (cuando el cliente OAuth tiene acceso a varios)
tailsnitch --tailnet mycompany.com
# Solo muestra problemas críticos y de severidad alta
tailsnitch --severity high
# Filtrar por categoría
tailsnitch --category access # Problemas de ACL
tailsnitch --category auth # Autenticación y claves
tailsnitch --category device # Seguridad de dispositivos
tailsnitch --category network # Exposición de red
tailsnitch --category ssh # Reglas SSH
tailsnitch --category log # Registro y administración
# Ejecutar solo comprobaciones específicas
tailsnitch --checks ACL-001,AUTH-001,DEV-010
tailsnitch --checks stale-devices,tailnet-lock-not-enabled
# Listar todas las comprobaciones disponibles
tailsnitch --list-checks
El modo de corrección te permite remediar problemas directamente a través de la API de Tailscale:
# Modo de corrección interactivo
tailsnitch --fix
# Vista previa de lo que se corregiría (ejecución en seco)
tailsnitch --fix --dry-run
# Auto-seleccionar correcciones seguras (aún requiere confirmación)
tailsnitch --fix --auto
# Deshabilitar el registro de auditoría de las acciones de corrección
tailsnitch --fix --no-audit-log
Elementos corregibles por API:
| Comprobación | Acción |
|---|---|
| AUTH-001, AUTH-002, AUTH-003 | Eliminar claves de autenticación |
| DEV-002 | Eliminar etiquetas de dispositivos de usuario |
| DEV-004 | Eliminar dispositivos obsoletos |
| DEV-005 | Autorizar dispositivos pendientes |
El modo de corrección también proporciona enlaces directos a la consola de administración para problemas que requieren intervención manual.
Genera informes de evidencia para auditorías SOC 2 con mapeos de Criterios Comunes (CC):
# Exportar como JSON
tailsnitch --soc2 json > soc2-evidence.json
# Exportar como CSV (para hojas de cálculo)
tailsnitch --soc2 csv > soc2-evidence.csv
El informe SOC 2 incluye:
Ejemplo de salida 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 archivo .tailsnitch-ignore para suprimir hallazgos de riesgos aceptados conocidos:
# .tailsnitch-ignore
# Ignorar comprobaciones informativas
ACL-008 # Intencionalmente no usamos grupos
ACL-009 # Las ACL heredadas están bien para nuestro caso de uso
# Ignorar comprobaciones específicas de severidad media con justificación
DEV-006 # Los dispositivos externos son contratistas aprobados
LOG-001 # Los registros de flujo requieren el plan Enterprise