clickhouse-client через WebSocket. Он доступен через любой HTTP-порт ClickHouse по пути /webterminal.
Веб-терминал — экспериментальная возможность и по умолчанию отключён; см. раздел Включение возможности ниже.
Включение возможности
/webterminal управляется настройкой сервера allow_experimental_webterminal. Если для этой настройки установлено значение false (по умолчанию), запросы к /webterminal возвращают HTTP-статус 403 Forbidden.
Чтобы включить её, добавьте в конфигурацию сервера следующее:
/webterminal на любом HTTP-порту ClickHouse (например, http://localhost:8123/webterminal), чтобы открыть терминал.
Аутентификация
Session и контроля доступа, что и в HTTP-протоколе, однако учетные данные передаются по уже установленному WebSocket-соединению, а не через HTTP-запрос Upgrade. После завершения рукопожатия WebSocket браузер отправляет первое сообщение в формате JSON:
Authorization, добавляемых к запросу на upgrade, откуда они могут попасть в историю браузера, журналы доступа сервера и журналы обратного прокси. Параметры URL, HTTP Basic и заголовки X-ClickHouse-User/X-ClickHouse-Key в запросе на upgrade намеренно не используются /webterminal.
Недействительные учетные данные приводят к тому, что сервер закрывает WebSocket с кодом 1008; интерфейс браузера снова запрашивает учетные данные.
Как выглядит сеанс
clickhouse-client, подключённый к псевдотерминалу, и передаёт его ввод и вывод через WebSocket. Сеанс поддерживает все возможности clickhouse-client, включая:
- Подсветку синтаксиса.
- Автодополнение.
- Многострочные запросы.
- Историю команд (хранится на стороне сервера в течение сеанса).
Интеграция с /play
/play встраивает веб-терминал в виде прикрепляемой панели. Его можно включать и выключать с помощью значка терминала на боковой панели или нажатием клавиши ~, когда редактор запросов пуст. При загрузке страница /play определяет доступность /webterminal и скрывает элементы управления терминалом, если конечная точка недоступна (например, когда экспериментальный параметр не включен).
Вопросы безопасности
- Всегда предоставляйте
/webterminalпо HTTPS в недоверенных средах, чтобы защитить учетные данные и трафик сеанса. - Ограничивайте доступ на сетевом уровне (с помощью межсетевого экрана, обратного прокси или настройки
listen_host) так же, как вы ограничиваете доступ к HTTP-протоколу. - Конечная точка сверяет заголовок
OriginсHost, чтобы снизить риск захвата WebSocket-соединения между разными источниками; если вы завершаете TLS на внешнем прокси, настройте обратные прокси соответствующим образом. - Если используется обратный прокси с завершением TLS, вышестоящее соединение с ClickHouse будет обычным
http, хотя браузер используетhttps, поэтому строгая проверка same-origin будет отклонять легитимные соединения. Для таких развертываний задайтеwebterminal_allowed_originsкак разделенный запятыми список полных источников, которым разрешено открывать WebSocket-сеансы; если этот параметр не пуст, он заменяет проверку same-origin по умолчанию. Пример:<webterminal_allowed_origins>https://example.com,https://app.example.com:8443</webterminal_allowed_origins>.
Доступность платформы
clickhouse-client, реализован поверх переносимых примитивов POSIX (posix_openpt/grantpt/unlockpt), а для Linux предусмотрен отдельный путь с использованием потокобезопасного ptsname_r. Ссылки на /webterminal на главной странице ClickHouse и в /play автоматически скрываются, если конечная точка недоступна (например, когда allow_experimental_webterminal не включен).