
Инструмент аудита безопасности для конфигураций Tailscale. Сканирует ваш tailnet на наличие неправильных конфигураций, излишне разрешительных политик доступа и нарушений лучших практик безопасности.
Аудитор безопасности для конфигураций Tailscale. Tailsnitch сканирует вашу tailnet на наличие 50+ неправильных конфигураций, излишне разрешительных контролей доступа и нарушений лучших практик безопасности.
# 1. Установите учётные данные API Tailscale
export TS_API_KEY="tskey-api-..."
# 2. Запустите аудит
tailsnitch
# 3. Просмотр только проблем высокой степени серьёзности
tailsnitch --severity high
# 4. Исправление некоторых проблем ~интерактивный~ yolo-режим
tailsnitch --fix
Загрузите последний релиз с GitHub Releases.
Пользователи macOS: Снимите атрибут карантина после загрузки:
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 поддерживает два метода аутентификации. OAuth предпочтителен, если настроены оба.
OAuth-клиенты предоставляют ограниченный, аудируемый доступ, который не истекает при увольнении сотрудников.
export TS_OAUTH_CLIENT_ID="..."
export TS_OAUTH_CLIENT_SECRET="tskey-client-..."
Создайте OAuth-клиент по адресу: https://login.tailscale.com/admin/settings/oauth
Необходимые разрешения для аудита только на чтение:
all:read (проще всего), или по отдельности:policy_file:read — ACL-политикаdevices:core:read — список устройствdns:read — конфигурация DNSauth_keys:read — ключи аутентификации (для проверок AUTH)Дополнительные разрешения для режима исправления:
devices:core — удаление устройств, изменение тегов (требует выбора тегов)auth_keys — удаление ключей аутентификацииAPI-ключи действуют от имени пользователя, который их создал, и наследуют его разрешения.
export TS_API_KEY="tskey-api-..."
Создайте API-ключ по адресу: https://login.tailscale.com/admin/settings/keys
# Полный аудит
tailsnitch
# Показать также проходящие проверки (подробно)
tailsnitch --verbose
# Вывод в формате JSON для обработки
tailsnitch --json
# Аудит конкретной tailnet (если OAuth-клиент имеет доступ к нескольким)
tailsnitch --tailnet mycompany.com
# Показать только критические и проблемы высокой степени серьёзности
tailsnitch --severity high
# Фильтр по категории
tailsnitch --category access # Проблемы ACL
tailsnitch --category auth # Аутентификация и ключи
tailsnitch --category device # Безопасность устройств
tailsnitch --category network # Сетевая экспозиция
tailsnitch --category ssh # Правила SSH
tailsnitch --category log # Логирование и администрирование
# Запустить только определённые проверки
tailsnitch --checks ACL-001,AUTH-001,DEV-010
tailsnitch --checks stale-devices,tailnet-lock-not-enabled
# Список всех доступных проверок
tailsnitch --list-checks
Режим исправления позволяет устранять проблемы напрямую через API Tailscale:
# Интерактивный режим исправления
tailsnitch --fix
# Предварительный просмотр того, что будет исправлено (сухой прогон)
tailsnitch --fix --dry-run
# Автовыбор безопасных исправлений (всё равно требует подтверждения)
tailsnitch --fix --auto
# Отключение аудита действий исправления
tailsnitch --fix --no-audit-log
Исправляемые через API элементы:
| Проверка | Действие |
|---|---|
| AUTH-001, AUTH-002, AUTH-003 | Удалить ключи аутентификации |
| AUTH-004 | Заменить на эфемерные ключи |
Режим исправления также предоставляет прямые ссылки на консоль администрирования для проблем, требующих ручного вмешательства.
Создание отчётов с доказательствами для аудитов SOC 2 с привязкой к общим критериям (CC):
# Экспорт в JSON
tailsnitch --soc2 json > soc2-evidence.json
# Экспорт в CSV (для электронных таблиц)
tailsnitch --soc2 csv > soc2-evidence.csv
Отчёт SOC 2 включает:
Пример вывода 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
Создайте файл .tailsnitch-ignore, чтобы скрыть результаты для известных принятых рисков:
# .tailsnitch-ignore
# Игнорировать информационные проверки
ACL-008 # Мы намеренно не используем группы
ACL-009 # Устаревшие ACL подходят для нашего случая
# Игнорировать определённые проверки средней степени серьёзности с обоснованием
DEV-006 # Внешние устройства — одобренные подрядчики
LOG-001 # Журналы потоков требуют тарифа Enterprise
Расположение файла игнорирования (проверяется по порядку):
.tailsnitch-ignore в текущей директории~/.tailsnitch-ignore в домашней директории# Использовать конкретный файл игнорирования
tailsnitch --ignore-file /path/to/ignore
# Отключить обработку файла игнорирования
tailsnitch --no-ignore
# Экспорт полного отчёта
tailsnitch --json > audit.json
# Извлечение непройденных проверок в TSV
tailsnitch --json | jq -r '
.suggestions
| map(select(.pass == false))
| .[]
| [.id, .title, .severity, .remediation]
| @tsv
' > findings.tsv
# Сводка по степени серьёзности
tailsnitch --json | jq '
.suggestions
| map(select(.pass == false))
| group_by(.severity)
| map({severity: .[0].severity, count: length})
'
# Список критических/высоких проблем со ссылками в админку
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 выполняет 52 проверки безопасности по 7 категориям. Подробное описание каждой проверки см. в docs/CHECKS.md.
Проверки конфигурации логирования, настроек DNS, ролей пользователей и элементов, требующих ручной проверки.
+=====================================================================+
| TAILSNITCH SECURITY AUDIT |
| Tailnet: example.com |
| Версия: 1.0.0 (сборка: abc123) |
+=====================================================================+
Используется файл игнорирования: .tailsnitch-ignore (3 правила)
=== КОНТРОЛЬ ДОСТУПА ===================================================
[CRITICAL] ACL-001: Активна политика «разрешить всё» по умолчанию
В вашей ACL-политике отсутствует поле 'acls'. Tailscale применяет
политику «разрешить всё» по умолчанию, предоставляя всем устройствам
полный доступ.
Исправление:
Определите явные правила ACL, следуя принципу наименьших привилегий.
Источник: https://tailscale.com/kb/1192/acl-samples
----------------------------------------------------------------------
=== АУТЕНТИФИКАЦИЯ И КЛЮЧИ ============================================
[HIGH] AUTH-001: Существуют повторно используемые ключи аутентификации
Обнаружено 2 повторно используемых ключа аутентификации. При компрометации
они могут быть использованы для добавления нескольких устройств.
Подробности:
- Ключ tskey-auth-xxx (истекает через 45 дней)
- Ключ tskey-auth-yyy (истекает через 89 дней)
Исправление:
Храните повторно используемые ключи в менеджере секретов. Предпочитайте
одноразовые ключи.
Источник: https://tailscale.com/kb/1085/auth-keys
----------------------------------------------------------------------
СВОДКА
======================================================================
Critical: 1 High: 3 Medium: 5 Low: 2 Info: 8
Всего результатов: 19 | Пройдено: 33
Проверки Tailnet Lock (DEV-010, DEV-012) требуют локального CLI tailscale и выполняются относительно демона локальной машины. При аудите удалённой tailnet через --tailnet эти проверки отражают локальный статус, а не аудируемой tailnet.
# Укажите путь к пользовательскому бинарнику tailscale при необходимости
tailsnitch --tailscale-path /opt/tailscale/bin/tailscale
Запускайте Tailsnitch в конвейерах CI/CD для выявления регрессий безопасности:
# Пример для GitHub Actions
- name: Аудит безопасности Tailscale
env:
TS_OAUTH_CLIENT_ID: ${{ secrets.TS_OAUTH_CLIENT_ID }}
TS_OAUTH_CLIENT_SECRET: ${{ secrets.TS_OAUTH_CLIENT_SECRET }}
run: |
tailsnitch --json > audit.json
# Ошибка, если существуют проблемы критической или высокой степени серьёзности
if tailsnitch --severity high --json | jq -e '.summary.critical + .summary.high > 0' > /dev/null; then
echo "Обнаружены проблемы критической или высокой степени серьёзности!"
tailsnitch --severity high
exit 1
fi
MIT
Рекомендации см. в CONTRIBUTING.md.
| DEV-002 | Удалить теги с устройств пользователей |
| DEV-004 | Удалить устаревшие устройства |
| DEV-005 | Авторизовать ожидающие устройства |
| Флаг | Описание |
|---|
--json | Вывод в формате JSON |
--severity | Фильтр по минимальной степени серьёзности: critical, high, medium, low, info |
--category | Фильтр по категории: access, auth, network, ssh, log, device, dns |
--checks | Запуск определённых проверок (идентификаторы или слагы через запятую) |
--list-checks | Вывести список всех доступных проверок и выйти |
--tailnet | Указать tailnet для аудита (по умолчанию: из API-ключа) |
--verbose | Показывать также проходящие проверки |
--fix | Включить интерактивный режим исправления |
--auto | Автовыбор безопасных исправлений (требует --fix) |
--dry-run | Предварительный просмотр действий исправления без выполнения (требует --fix) |
--no-audit-log | Отключить аудит действий исправления |
--soc2 | Экспорт доказательств SOC 2: json или csv |
--tailscale-path | Путь к CLI tailscale (для проверок Tailnet Lock) |
--ignore-file | Путь к файлу игнорирования |
--no-ignore | Отключить обработку файла игнорирования |
--version | Показать информацию о версии |
| ID | Проверка | Риск |
|---|
| ACL-001 | Политика «разрешить всё» по умолчанию | Все устройства имеют неограниченный доступ |
| ACL-002 | Неправильная конфигурация SSH autogroup:nonroot | SSH от имени любого пользователя не root |
| ACL-006 | tagOwners слишком широкие | Эскалация привилегий через теги |
| ACL-007 | Использование autogroup:danger-all | Доступ предоставлен внешним пользователям |
| ID | Проверка | Риск |
|---|
| AUTH-001 | Повторно используемые ключи аутентификации | Неограниченное добавление устройств при краже |
| AUTH-002 | Ключи аутентификации с долгим сроком действия | Увеличенное окно экспозиции |
| AUTH-003 | Предварительно авторизованные ключи | Обход одобрения устройств |
| DEV-001 | Помеченные устройства без истечения срока ключа | Бессрочный доступ |
| DEV-002 | Устройства пользователей с тегами | Сохраняются после удаления пользователя |
| DEV-010 | Tailnet Lock отключён | Нет защиты от кражи ключей |
| DEV-012 | Ожидающие подписи Tailnet Lock | Неподписанные узлы требуют проверки |
| NET-001 | Экспозиция Funnel | Доступ из публичного интернета |
| NET-003 | Граница доверия маршрутизатора подсети | Незашифрованный трафик в локальной сети |
| SSH-002 | Root SSH без режима проверки | Не требуется повторная аутентификация |
| ID | Проверка | Риск |
|---|
| ACL-004 | Использование autogroup:member | Внешние пользователи включены |
| ACL-005 | Настроены AutoApprovers | Обход одобрения маршрутов |
| AUTH-004 | Неэфемерные ключи CI/CD | Накопление устаревших устройств |
| DEV-003 | Устаревшие клиенты | Потенциальные уязвимости |
| DEV-004 | Устаревшие устройства | Неиспользуемая поверхность атаки |
| DEV-005 | Неавторизованные устройства | Очередь ожидания одобрения |
| DEV-007 | Чувствительные имена машин | Раскрытие в CT-логах |
| DEV-009 | Конфигурация одобрения устройств | Может быть не включена |
| NET-004 | Раскрытие HTTPS в CT-логах | Имена машин публичны |
| NET-005 | Видимость трафика на выходном узле | Оператор видит весь трафик |
| NET-006 | Экспозиция Serve | Локальные сервисы видны в tailnet |
| SSH-003 | Раскрытие интерфейса Recorder | Сессии видны в сети |