Spec-Zone.ru › Varnish

Безопасность прежде всего

Если вы единственный, кто работает с Varnish, или все вовлеченные лица обладают одинаковым уровнем доверия, можете пропустить эту главу. Мы защитили Varnish от всего, что может проникнуть через HTTP-сокет, насколько это возможно.

Если части вашей веб-инфраструктуры аутсорсинговые или разделены по административным линиям, вам необходимо подумать о безопасности.

Varnish предоставляет четыре уровня авторизации, приблизительно связанные с тем, как и где осуществляется контроль над Varnish:

  • Аргументы командной строки,
  • Интерфейс командной строки,
  • Программы VCL и
  • HTTP-запросы.

Аргументы командной строки

Основные решения по безопасности принимаются и определяются при запуске Varnish в виде аргументов командной строки, мы используем эту стратегию, чтобы сделать их неуязвимыми к последующей модификации.

Важные решения, которые необходимо принять:

  1. Кто должен иметь доступ к интерфейсу командной строки?
  2. Какие параметры они могут изменить?
  3. Будут ли разрешены встроенные программы на C?
  4. Будут ли ограничены VMOD?
  5. Как будут изолированы дочерние процессы?

Доступ к интерфейсу командной строки

Доступ к интерфейсу командной строки можно получить тремя способами.

varnishd можно настроить на прослушивание и предоставление подключений к интерфейсу командной строки по TCP-сокету. Вы можете привязать сокет практически к любому элементу, который будет принимать ядро:

-T 127.0.0.1:631
-T localhost:9999
-T 192.168.1.1:34
-T '[fe80::1]:8082'

По умолчанию это -T localhost:0, который выберет случайный номер порта, который varnishadm(8) может узнать из общей памяти.

Используя адрес «localhost», вы ограничиваете доступ к интерфейсу командной строки локальной машиной.

Вы также можете привязать порт интерфейса командной строки к IP-адресу, доступному в сети, и позволить другим машинам подключаться напрямую.

Это не обеспечивает конфиденциальности, т. е. команды интерфейса командной строки будут передаваться по сети как текстовые ASCII-строки без шифрования, но аутентификация -S/PSK требует, чтобы удаленный конец знал общий секрет.

В качестве альтернативы, вы можете привязать порт интерфейса командной строки к адресу «localhost» и предоставить удаленным пользователям доступ через защищенное подключение к локальной машине, используя ssh/VPN или аналогичное решение.

Если вы используете ssh, вы можете ограничить команды, которые каждый пользователь может выполнить, только varnishadm, или даже использовать обёртку скриптов над varnishadm, чтобы разрешить определенные команды интерфейса командной строки.

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

Подключение в этом случае также не защищено шифрованием, но удаленный конец должен все равно пройти аутентификацию с помощью -S/PSK.

Наконец, если вы запускаете varnishd с опцией «-d», вы получаете команду интерфейса командной строки на stdin/stdout, но поскольку вы запустили процесс, будет сложно предотвратить получение вами доступа к интерфейсу командной строки, не так ли?

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

По умолчанию интерфейс командной строки защищен простым, но эффективным методом аутентификации «Pre Shared Key», который не обеспечивает конфиденциальности (т. е. команды и ответы интерфейса командной строки не шифруются).

Способ работы -S/PSK очень прост: во время запуска создается файл с случайным содержимым, и этот файл доступен только пользователю, который запустил varnishd (или суперпользователю).

Для аутентификации и использования подключения к интерфейсу командной строки вам необходимо знать содержимое этого файла, чтобы ответить на криптографический запрос, который varnishd выдает, см. Аутентификация подключений CLI.

varnishadm использует все это для ограничения доступа, он будет работать только в том случае, если сможет прочитать секретный файл.

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

Хороший способ создания секретного файла:

dd if=/dev/random of=/etc/varnish_secret count=1

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

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

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

Если вы хотите отключить аутентификацию -S/PSK, укажите «-S» с пустым аргументом для varnishd:

varnishd [...] -S "" [...]

Параметры

Параметры можно установить из командной строки и сделать их «только для чтения» (используя «-r»), чтобы их нельзя было впоследствии изменить из интерфейса командной строки.

Практически любой параметр может полностью испортить вашу HTTP-службу, но некоторые из них могут нанести больше вреда, чем другие:

cc_command

Выполнение произвольных программ

vcc_allow_inline_c

Разрешение встроенного C в VCL, что позволит выполнить любой код C из VCL в Varnish.

Кроме того, вы можете проверить и заблокировать:

syslog_cli_traffic

Записывать все команды интерфейса командной строки в syslog(8), чтобы вы знали, что происходит.

vcc_unsafe_path

Ограничить VCL/VMOD до vcl_path и vmod_path

vmod_path

Директория (или список директорий, разделенных двоеточием), в которой Varnish будет искать модули. Это потенциально может быть использовано для загрузки вредоносных модулей в Varnish.

Интерфейс командной строки

Интерфейс командной строки в Varnish очень мощный, если у вас есть доступ к интерфейсу командной строки, вы можете сделать почти все с процессом Varnish.

Как описано выше, часть вреда можно ограничить, ограничив некоторые параметры, но это защитит только локальную файловую систему и операционную систему, это не защитит вашу HTTP-службу.

В настоящее время у нас нет способа ограничить определенные команды интерфейса командной строки для определенных подключений к интерфейсу командной строки. Один из способов достижения такого эффекта — «обернуть» весь доступ к интерфейсу командной строки в предварительно одобренные скрипты, которые используют varnishadm(1), чтобы отправить очищенные команды интерфейса командной строки и ограничить удаленного пользователя только этими скриптами, например, используя конфигурацию sshd(8).

Программы VCL

В коде VCL доступны два «опасных» механизма: VMOD и встроенный C.

Оба этих механизма позволяют выполнять произвольный код и, таким образом, позволят пользователю получить доступ к машине с привилегиями дочернего процесса.

Если varnishd запускается с правами root/суперпользователя, мы изолируем дочерний процесс, используя доступные в операционной системе средства, но если varnishd запускается не с правами root/суперпользователя, это невозможно. Нет, не спрашивайте меня, почему вам нужно быть суперпользователем, чтобы снизить привилегии дочернего процесса…

Встроенный C отключен по умолчанию с версии Varnish 4, поэтому, если вы не включите его, вам не нужно об этом беспокоиться.

Упомянутые выше параметры могут ограничить загрузку VMOD только из назначенной директории, ограничив программистов VCL предварительно одобренным подмножеством VMOD.

Если вы это сделаете, мы уверены, что ваша локальная система не может быть скомпрометирована кодом VCL.

HTTP-запросы

Мы приложили много усилий, чтобы сделать Varnish устойчивым к чему-либо, что приходит через сокет, где принимаются HTTP-запросы, и вам, как правило, не нужно дополнительно его защищать.

Оговорка состоит в том, что поскольку VCL — это язык программирования, который позволяет вам решить, что делать с HTTP-запросами, вы также можете решить сделать глупые и потенциально опасные вещи с ними, включая открытие себя для различных видов атак и подрывных действий.

Если у вас есть «административные» HTTP-запросы, например, запросы PURGE, мы настоятельно рекомендуем ограничить их до доверенных IP-адресов/сетей с помощью списков управления доступом (ACL) 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/users-guide/run_security.html

Spec-Zone.ru

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