Веб-терминал
Веб-терминал — это экспериментальный браузерный интерфейс, предоставляющий интерактивный сеанс 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:
Это позволяет избежать передачи учетных данных в URL-параметрах запроса или в заголовках Authorization, добавленных к запросу upgrade, где они могут попасть в историю браузера, журналы доступа сервера и журналы обратного прокси. URL-параметры, HTTP Basic и заголовки X-ClickHouse-User/X-ClickHouse-Key в запросе upgrade намеренно не используются /webterminal.
Недействительные учетные данные приводят к тому, что сервер закрывает WebSocket с кодом 1008; интерфейс браузера повторно запрашивает учетные данные.
Как выглядит сеанс
После аутентификации сервер запускает clickhouse-client, подключённый к псевдотерминалу, и передаёт его ввод и вывод по WebSocket. Сеанс поддерживает все возможности clickhouse-client, включая:
- Подсветку синтаксиса.
- Автодополнение.
- Многострочные запросы.
- Историю команд (хранится на стороне сервера в течение сеанса).
Для отрисовки терминала используется xterm.js. Все ресурсы отдаются непосредственно из бинарного файла ClickHouse — никакие сторонние CDN не используются.
Интеграция с /play
Веб-интерфейс SQL /play встраивает веб-терминал как докируемую панель. Включайте и выключайте его значком терминала на боковой панели или нажатием клавиши ~, когда редактор запросов пуст. При загрузке страница /play проверяет доступность /webterminal и скрывает элементы управления терминалом, если конечная точка недоступна (например, когда не включена экспериментальная настройка).
Соображения безопасности
Веб-терминал предоставляет интерактивный сеанс, похожий на shell, любому, кто может пройти аутентификацию через HTTP-конечную точку ClickHouse, поэтому здесь действуют те же предостережения, что и для HTTP-протокола:
- Всегда используйте HTTPS для
/webterminalв недоверенных средах, чтобы защитить учетные данные и трафик сеанса. - Ограничивайте доступ на сетевом уровне (межсетевой экран, обратный прокси или конфигурация
listen_host) так же, как вы ограничиваете доступ к HTTP-протоколу. - Конечная точка проверяет соответствие заголовка
OriginзначениюHost, чтобы снизить риск перехвата WebSocket-запросов между источниками; если TLS завершается на внешнем прокси, настройте обратные прокси соответствующим образом. - За обратным прокси, завершающим TLS, соединение с ClickHouse на стороне upstream использует обычный
http, хотя браузер работает черезhttps, поэтому строгая проверка same-origin будет отклонять легитимные соединения. Для таких развертываний задайтеwebterminal_allowed_originsкак список полных origins, разделенных запятыми, которым разрешено открывать WebSocket-сеансы; если этот параметр не пуст, он заменяет проверку same-origin по умолчанию. Пример:<webterminal_allowed_origins>https://example.com,https://app.example.com:8443</webterminal_allowed_origins>.
Обработчик также проверяет соответствие протоколу WebSocket согласно RFC 6455: немаскированные клиентские фреймы, зарезервированные коды операций, слишком большие или фрагментированные управляющие фреймы, а также зарезервированные биты RSV отклоняются с кодами закрытия protocol-error.
Доступность на платформах
Обработчик компилируется на всех платформах, поддерживаемых ClickHouse. Слой псевдотерминала, используемый встроенным модулем запуска clickhouse-client, реализован поверх переносимых примитивов POSIX (posix_openpt/grantpt/unlockpt), с отдельной реализацией для Linux, использующей потокобезопасный ptsname_r. Ссылки на /webterminal на стартовой странице ClickHouse и в /play автоматически скрываются, когда конечная точка недоступна (например, если allow_experimental_webterminal не включён).