Перейти к содержанию

Настройка и запуск воркспейса с ограничениями белого списка на доступ к API и вкладкам панели администратора воркспейса

Описание функционала

Данный функционал реализован в версиях воркспейса 9.200.70.482

Упрощённо, логика работы следующая:

  • С помощью манифеста описываются параметры Regex паттерны URL и сети в CIDR формате (до CIDR /8)
  • Порядок заполнения манифеста влияет на последовательность применения ограничений
  • Так же есть возможность ограничить доступ к вкладкам API если пользователь не авторизован на воркспейсе

Конфигурирование

Для включения функционала, необходимо на выключенном воркспейсе отредактировать манифест, добавив в блок workspace.web блок locationFirewall, очистить блок container.ports, настроить работу ip-tables

Для корректной работы данного функционала, необходимо настроить работу iptables вместо использования redir:

Смотрим существующие сетевые интерфейсы хоста командой:

sudo ip link
Выбираем тот, по которому будут подключаться клиенты и вставляем в параметр -i в команды:
sudo iptables -t nat -A PREROUTING -i <название_интерфейса> -p tcp --dport 80 -j DNAT --to-destination 10.0.3.15:80
sudo iptables -t nat -A PREROUTING -i <название_интерфейса> -p tcp --dport 443 -j DNAT --to-destination 10.0.3.15:443
Пример:
sudo iptables -t nat -A PREROUTING -i ens18 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.15:80
sudo iptables -t nat -A PREROUTING -i ens18 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.15:443
Дополнительно можно сделать сохранение настроек после перезапуска машины, пример на основе Ubuntu:

Первый способ:

sudo apt update
sudo apt install iptables-persistent
sudo netfilter-persistent save

Второй способ

sudo iptables-save > /etc/iptables/rules.v4
sudo ip6tables-save > /etc/iptables/rules.v6

Пример заполненного манифеста:

 "workspace": {
    "id": "<WORKSPACE_ID>",
    "name": "<WORKSPACE_NAME>",
    "web": {
      "url": "<WORKSPACE_URL>",
      "ssl": {
        "cert": "<PATH_TO_BUNDLE>",
        "key": "<PATH_TO_KEY>"
      },
      "locationFirewall": [
        {
          "allowedPathPatterns": ["#^/api/v1/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["10.0.0.0/8"]
        },
        {
          "allowedPathPatterns": ["#^/admin/server-status/dashboard/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["192.0.0.0/8"]
        },
        {
          "allowedPathPatterns": ["#^/admin/server-status/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["217.23.138.0/24", "68.23.0.0/16"]
        },
        {
          "allowedPathPatterns": ["#^/admin/models/backups/trash/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["192.168.1.0/24"]
        },
        {
          "allowedPathPatterns": ["#^/admin/models/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["192.168.1.0/24", "68.23.0.0/16"]
        },
        {
          "allowedPathPatterns": ["#^/admin/requests/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["217.23.138.0/24", "192.168.1.0/24"]
        },
        {
          "allowedPathPatterns": ["#^/admin/api-services/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["1.23.38.0/24"]
        },
        {
          "allowedPathPatterns": ["#^/admin/.*$#"],
          "anonymous": false,
          "allowedNetworks": ["10.0.0.0/8"]
        }
      ]
    },

Важно обращать внимание на порядок заполнения белого списка. Если поставить самый верхний уровень ссылки i.e. "#^/admin/.*$#" в начало блока - то все последующие за ним правила, для страниц панели администратора то есть "#^/admin/models/backups/trash/.*$#" применяться не будут. Поэтому необходимо заполнять список в обратном порядке.

Пример последовательности введения ограничений: /admin/models/backups/trash/ -> /admin/models/backups/ -> /admin/models/ -> /admin/

Описание параметров

"allowedPathPatterns" - Regex-шаблон адреса к которому применяются правила. Тип - строка, массив.

"anonymous" - переключение доступности страницы в не авторизованном режиме. False - для просмотра страницы Необходима авторизация, True - для просмотра страницы авторизация не нужна. Тип - boolean.

"allowedNetworks" - Разрешённые сети, в формате CIDR, от 1.0.0.0/8 до 1.2.3.4/32 (формат 0.0.0.0/0 не поддерживается). Тип - строка, массив.