Как подключить свой приватный сервер к ChatGPT и AgentKit без риска утечек: новый tunnel-client от OpenAI
Я — Денис Шохирев, Agentic AI Systems Architect из Фрайбурга, работаю в DennisCraft AI Studio. Каждый мой запуск — это не демо, а прод, и каждый раз вопрос: как безопасно подключить приватный сервер к ChatGPT/AgentKit, не открывая лишних портов и не раздавая ключи? В проде достаточно одной уязвимости, и конфиденциальные данные клиента уже на Pastebin. Что такое tunnel-client от OpenAI и зачем он нужен Июнь 2024: OpenAI выкатила tunnel-client — минималистичный прокси, который поднимает защищён
Я — Денис Шохирев, 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.
Превратить процесс в систему, которая работает
Продакшн-качество, а не демо.