Spec-Zone.ru › Varnish

Протокол VCLI — Скриптинг интерфейса командной строки

Использование Varnish CLI в качестве API предоставляет ряд возможностей.

Во-первых: vcli.h содержит магические числа.

Во-вторых: если вы используете varnishadm для подключения к varnishd в целях API, используйте аргумент -p, чтобы получить режим «pass».

В режиме «pass» или при прямых подключениях к командной строке (подробнее ниже), первая строка ответа всегда имеет длину ровно 13 байт, включая символ новой строки, и содержит два числа: код состояния и количество байт в «теле» ответа:

200␣19␣␣␣␣␣␣␤
PONG␣1613397488␣1.0

Это делает парсинг ответа однозначным, даже в таких случаях, когда ответ не заканчивается символом новой строки.

Библиотека varnishapi содержит функции для реализации основ протокола командной строки. Для более подробной информации см. файл include vcli.h.

Локальные и удаленные подключения к командной строке

Процесс varnishd получает команды командной строки через TCP-соединения, которые требуют аутентификации по предварительно разделенному ключу (см. ниже), но не обеспечивают конфиденциальности.

«Отсутствие конфиденциальности» означает, что если вы настраиваете эти TCP-соединения для работы через сеть, любой, кто может перехватывать пакеты, сможет увидеть ваши команды командной строки. Если вам нужна конфиденциальность, используйте ssh для запуска varnishadm или для туннелирования TCP-соединения.

По умолчанию varnishd привязывается к localhost и просит ядро назначить случайный номер порта. Результирующий адрес прослушивания сохраняется в общей памяти, где программа varnishadm его находит.

Вы можете настроить varnishd для прослушивания определенного адреса с помощью аргумента -T, это также будет записано в общую память, поэтому varnishadm продолжает работать:

# Bind to internal network
varnishd -T 192.168.10.21:3245

Вы также можете настроить varnishd на активное открытие TCP-соединения с другой программой-«контроллером» с помощью аргумента -M.

Наконец, при запуске в «отладочном режиме» с аргументом -d, varnishd останется в фоновом режиме и превратит stdin/stdout в подключение к командной строке.

Аутентификация подключений к командной строке

Подключения к командной строке varnishd аутентифицируются с помощью схемы аутентификации «предварительно разделенного ключа», где другая сторона должна доказать, что знает содержимое секретного файла, который использует varnishd.

Им не обязательно читать один и тот же файл на конкретном компьютере; они могут прочитать совершенно другой файл на другом компьютере или получить секрет с сервера.

Имя файла можно настроить с помощью опции -S, и varnishd записывает имя в общую память, чтобы varnishadm мог его найти.

В минимальном варианте varnishd должен иметь возможность читать файл, но помимо этого его можно ограничить любым образом.

Поскольку важен не сам файл, а только его содержимое, вы можете сделать файл недоступным для всех и вместо этого поместить копию файла в домашние каталоги авторизованных пользователей.

Файл считывается только в момент выполнения команды командной строки auth, и содержимое не кэшируется в varnishd, поэтому вы можете изменять его так часто, как вам нужно.

Аутентифицированное сеанс выглядит так:

critter phk> telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
107 59
ixslvvxrgkjptxmcgnnsdxsvdmvfympg

Authentication required.

auth 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
200 279
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
FreeBSD,13.0-CURRENT,amd64,-jnone,-sdefault,-sdefault,-hcritbit
varnish-trunk revision 89a558e56390d425c52732a6c94087eec9083115

Type 'help' for command list.
Type 'quit' to close CLI session.
Type 'start' to launch worker process.

Код состояния CLI 107 указывает на необходимость аутентификации. Первые 32 символа текста ответа — это запрос «ixsl…mpg». Запрос генерируется случайным образом для каждого подключения к командной строке и меняется каждый раз, когда отправляется 107.

Для вычисления аутентификатора «455c…c89a» должен использоваться самый последний отправленный запрос.

Аутентификатор вычисляется путем применения функции SHA256 к следующей последовательности байтов:

  • Строка запроса
  • Символ новой строки (0x0a)
  • Содержимое секретного файла
  • Строка запроса
  • Символ новой строки (0x0a)

и вывода полученного дайджеста в нижнем регистре в шестнадцатеричном формате.

В приведенном выше примере секретный файл содержит foo\n, и, следовательно:

critter phk> hexdump secret
00000000  66 6f 6f 0a                                       |foo.|
00000004
critter phk> cat > tmpfile
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
foo
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
^D
critter phk> hexdump -C tmpfile
00000000  69 78 73 6c 76 76 78 72  67 6b 6a 70 74 78 6d 63  |ixslvvxrgkjptxmc|
00000010  67 6e 6e 73 64 78 73 76  64 6d 76 66 79 6d 70 67  |gnnsdxsvdmvfympg|
00000020  0a 66 6f 6f 0a 69 78 73  6c 76 76 78 72 67 6b 6a  |.foo.ixslvvxrgkj|
00000030  70 74 78 6d 63 67 6e 6e  73 64 78 73 76 64 6d 76  |ptxmcgnnsdxsvdmv|
00000040  66 79 6d 70 67 0a                                 |fympg.|
00000046
critter phk> sha256 tmpfile
SHA256 (tmpfile) = 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a
critter phk> openssl dgst -sha256 < tmpfile
455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a

Файл исходного кода lib/libvarnish/cli_auth.c содержит полезную функцию, которая вычисляет ответ, имея открытый дескриптор файла секретного файла и строку запроса.

См. также:

  • varnishadm
  • varnishd
  • VCL

Copyright © 2006 Verdens Gang AS
Copyright © 2006–2020 Varnish Software AS
Licensed under the BSD-2-Clause License.
https://varnish-cache.org/docs/7.4/reference/cli_protocol.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API