Как подключить свой приватный сервер к ChatGPT и AgentKit без риска утечек: новый tunnel-client от OpenAI

Я — Денис Шохирев, Agentic AI Systems Architect из Фрайбурга, работаю в DennisCraft AI Studio. Каждый мой запуск — это не демо, а прод, и каждый раз вопрос: как безопасно подключить приватный сервер к ChatGPT/AgentKit, не открывая лишних портов и не раздавая ключи? В проде достаточно одной уязвимости, и конфиденциальные данные клиента уже на Pastebin.

Что такое tunnel-client от OpenAI и зачем он нужен

Июнь 2024: OpenAI выкатила tunnel-client — минималистичный прокси, который поднимает защищённый reverse-туннель между вашим сервером и edge-инфраструктурой ChatGPT/AgentKit. Его задача — дать LLM-агентам доступ к вашему API или базе, не раскрывая сервер вовне. Это не магия, а ssh-подобный туннель с handshake по JWT. Пример:

tunnel-client \
  --url http://localhost:8080 \
  --token $OPENAI_TUNNEL_TOKEN \
  --server https://tunnel.openai.com

Трафик идёт в обе стороны по TLS, а авторизация — через выданный в OpenAI консоли токен. Сервер не светится в интернете, никакой необходимости настраивать firewall или NAT.

Реальные риски и паттерны утечек в проде

Классические уязвимости: не только LLM, но и инфраструктура

На трёх последних внедрениях multi-agent систем я ловил один и тот же баг: LLM писал куски .env в логи или возвращал их в debug-ответах. Даже если LLM sandboxed, tunnel без строгой авторизации — прямой канал для утечки. Исследование Stanford CodeML (2024, ссылка) показало: 38% LLM-генерированных Python-фрагментов содержат CWE-89 (SQL-инъекции).

Как tunnel-client снижает площадь атаки

Решение Порты наружу Интеграция с OpenAI Вектор утечки
Прямой webhook 80/443 открыт Прямая Сканирование, brute-force, эксплойты
VPN + self-hosted proxy Ограниченный Сложно Конфиги, ключи в .env
tunnel-client Outbound only Официально Только скомпрометированный токен

Вся атака сводится к краже токена. Нет открытого endpoint — нет атаки на сервис из интернета. После ротации токена канал обрывается, никаких lingering сессий.

Как внедрить tunnel-client в production pipeline

Минимальная интеграция: Supabase, n8n, Claude

Мой стек — Supabase (Postgres + storage), n8n для workflow, Claude Code для LLM-логики. Типовой сценарий: агенты ChatGPT через AgentKit должны получить доступ к приватному API или базе.

# Получить токен в OpenAI консоли (chat.openai.com)
export OPENAI_TUNNEL_TOKEN=sk-...

# Запускаем tunnel-client как systemd-сервис:
[Unit]
Description=OpenAI Tunnel Client
After=network.target

[Service]
ExecStart=/usr/local/bin/tunnel-client \
  --url http://localhost:8000 \
  --token ${OPENAI_TUNNEL_TOKEN} \
  --server https://tunnel.openai.com
Restart=always

[Install]
WantedBy=multi-user.target

В этом режиме сервер не доступен извне, но ChatGPT через AgentKit может обращаться к нему через tunnel.

Безопасность: gitleaks, Doppler, OWASP

Перед запуском — только statically-typed конфиги (без секретов в коде). Проверяю через gitleaks и Doppler, чтобы токены не попали в git. Для runtime — OWASP ZAP на preprod, чтобы tunnel не стал обходом для старых уязвимостей.

Продвинутые практики: изоляция и контроль трафика

Rate limiting и audit

tunnel-client не решит всех проблем: если LLM/AgentKit отправляет слишком много запросов, можно получить mini-DDoS на свою инфраструктуру. В проде ставлю rate-limit на уровне nginx перед tunnel-клиентом:

limit_req_zone $binary_remote_addr zone=llm:10m rate=10r/s;
server {
  listen 8000;
  location / {
    limit_req zone=llm burst=20;
    proxy_pass http://localhost:9000;
  }
}

Плюс всегда логирую все входящие запросы для последующего аудита и анализа аномалий.

Изоляция прав и zero trust

Не даю tunnel-client root-доступ, только отдельный system user без write-доступа к файловой системе. В Supabase раздаю минимальные роли для сервис-аккаунта, который обслуживает tunnel.

FAQ

Можно ли пробрасывать несколько сервисов через один tunnel-client?

Нет, сейчас tunnel-client маппит один локальный endpoint на один туннель. Для нескольких сервисов — несколько инстансов tunnel-client с разными портами.

Какие риски, если токен tunnel-client попадёт в open source?

Любой, кто получит токен, сможет инициировать туннель к серверу. Рекомендую хранить токены только в Doppler/HashiCorp Vault, исключить их из git (gitleaks), и регулярно ротировать.

Поддерживается ли аутентификация на уровне tunnel-client?

Нет, tunnel-client только проксирует запросы. Авторизация реализуется на уровне вашего API или через middleware (например, JWT).

Можно ли использовать tunnel-client для WebSocket/stream?

Да, tunnel-client поддерживает проксирование WebSocket-трафика, но возможны ограничения по latency и размерам сообщений.

Требует ли это отдельного firewall-конфига?

Нет, tunnel-client инициирует исходящее соединение. Главное — разрешить egress к tunnel.openai.com из вашей инфраструктуры.

На каком этапе вы чаще всего ловите утечки: при настройке туннеля, в логах, или на этапе авторизации API? Напишите, какой паттерн сработал у вас. Я делаю бесплатный 30-мин аудит стека для основателей DACH, кто строит AI в регуляции. Пишите в LinkedIn или в @ger_dennis_ai.

Read more

Computer-Use-Agenten scheitern an Pixeln: wie Sie auf stabile UI-Referenzen über Accessibility Trees umstellen und fehleranfällige Desktop-Automatisierung nicht mehr ständig reparieren

von Denis Shokhirev, Enterprise AI Architect aus Freiburg im Breisgau Ich bin Denis Shokhirev, Agentic AI Systems Architect in Freiburg im Breisgau, Germany, und bei DennisCraft AI Studio setze ich produktive KI-Systeme für DACH-B2B-Kunden auf Basis von Claude, Supabase, n8n, Doppler und selbst betriebenem Postgres um. Die teuersten Fehler in

By Denis Shokhirev

Компьютерные агенты ломаются на пикселях: как перейти на stable UI refs через accessibility tree и перестать чинить flaky desktop automation

Я Denis Shokhirev, Agentic AI Systems Architect из Freiburg im Breisgau, Germany, и в DennisCraft AI Studio я собираю production AI-системы для DACH B2B на Claude, Supabase, n8n, Doppler и self-hosted Postgres. Самая дорогая поломка в desktop automation, которую я вижу у клиентов, почти никогда не связана с моделью: агент

By Denis Shokhirev