Подключение защищаемого веб-приложения к WAF

Цель

Настроить проксирование HTTP и HTTPS трафика к защищаемому приложению через WAF.

Предпосылки

  1. WAF, установленный в режиме обратного прокси;

  2. Защищаемое веб-приложение, доступное с WAF. Везде ниже по тексту app_ip – его адрес, app_port - порт. Ниже предлагается использовать уязвимое приложение dvwa на том же сервере, где установлен WAF. Вместо него можно использовать любое другое веб-приложение;

  3. SSH-клиент (например, Putty).

Результат

Успешным выполнением данной работы является проксирование транзакций к защищаемому приложению через WAF.

Подготовка защищаемого веб-приложения

  1. Установка веб-приложения DVWA на сервер WAF.

sudo docker pull vulnerables/web-dvwa
  1. Запуск веб-приложения на порту 8080.

sudo docker run --rm -d -p 8080:80 --name dvwa vulnerables/web-dvwa

Для приложения DVWA:

app_ip = 127.0.0.1

app_port = 8080 login: admin password: password

  1. Для доступа к веб-приложению по имени dvwa необходимо добавить в файле hosts (клиентской машины) строчку для локального разрешения доменного имени: IP_WAF dvwa

Файл hosts находится по следующим путям:

На Unix системах - /etc/hosts

На Windows системах - C:\Windows\System32\drivers\etc\hosts

Порядок действий

  1. Общие настройки (опционально)

    1. Увеличить ограничение на размер загружаемых файлов в /etc/ibatyr-nginx/user/http.conf.

      client_max_body_size 1024m;
      
    2. Добавить адрес(а) вышестоящего HTTP-прокси сервера в доверенные адреса в /etc/ibatyr-nginx/user/http.conf.

      set_real_ip_from proxy_ip_address;
      
    3. Отключить LRB-CACHE в /etc/ibatyr-nginx/user/server.conf.

      set $LRB_CACHE 0;
      
  2. Проксирование HTTP трафика.

    1. Подключиться по ssh (putty) к серверу WAF.

    2. Убедиться, что с сервера WAF есть сетевой доступ к защищаемому приложению.

      curl -vk http://app_ip:app_port
      
    3. Удалить созданный по умолчанию конфигурационный файл ibatyr-nginx.

      sudo rm /etc/ibatyr-nginx/sites-enabled/default
      
    4. Открыть на изменение конфигурационный файл ibatyr-nginx в любом текстовом редакторе с правами суперпользователя. Например,

      sudo vim /etc/ibatyr-nginx/sites-enabled/dvwa
      
    5. Ввести настройки проксирования HTTP трафика до бекенда защищаемого приложения. Пример содержимого файла конфигурации:

      server {
          include static/server.conf;
          listen 80;
          server_name dvwa;
      
          # ibatyr WAF configuration.
          set $BACKEND http://app_ip:app_port;
      
          location / {
              include static/waf.conf;
          }
      }
      
    6. После внесения изменений необходимо проверить корректность внесенных изменений и, убедившись, что ошибок нет, применить конфигурацию ibatyr-nginx.

      sudo ibatyr-nginx test
      sudo ibatyr-nginx reload
      
    7. Если нет ошибок, после загрузки новой конфигурации должен быть открыт порт, на котором сервис ibatyr-nginx слушает входящие соединения от клиентов веб-приложения. На рисунке 1 представлен пример вывода команды ss -4lnt.

image1

Рисунок 1 - Вывод команды

  1. Для проверки проделанных настроек можно выполнить запрос к WAF при помощи браузера либо консольного веб-клиента curl. Пример запроса, выполненного в командной строке сервера WAF.

    curl -H"host:dvwa" -v localhost
    
  2. Для диагностики неполадок см. ПРИЛОЖЕНИЕ 1. Рекомендации по диагностике неполадок сетевых подключений.

  1. Терминирование HTTPS трафика (опционально)

    1. Создать папку для хранения сертификатов и ключей.

      sudo mkdir /etc/ibatyr-nginx/ssl
      
    2. Сгенерировать или получить от владельца приложения ключ и сертификат для терминирования SSL. Пример команды для генерации ключа и самоподписанного сертификата.

      openssl req -x509 -newkey rsa:4096 -keyout key.pem -nodes -out cert.pem -days 365
      

      На рисунке 2 представлен вывод данной команды.

image2

Рисунок 2 - Вывод команды

  1. Поместить ключ и сертификат в созданную папку.

    sudo mv cert.pem key.pem /etc/ibatyr-nginx/ssl
    
  2. Создать еще один файл конфигурации ibatyr-nginx.

    sudo vim /etc/ibatyr-nginx/sites-enabled/dvwa_ssl
    

    Пример содержимого файла конфигурации:

    server {
        include static/server.conf;
        listen 443 ssl;
        ssl_certificate /etc/ibatyr-nginx/ssl/cert.pem;
        ssl_certificate_key /etc/ibatyr-nginx/ssl/key.pem;
        server_name dvwa;
    
        # iBatyr WAF configuration.
        set $BACKEND http://app_ip:app_port;
    
        location / {
            include static/waf.conf;
        }
    }
    
  3. Применить конфигурацию.

    sudo systemctl reload ibatyr-nginx.service
    
  4. Проверить доступность приложения через WAF.

    curl -k -v -H"host: dvwa" https://localhost:443
    
  5. Для диагностики неполадок см. ПРИЛОЖЕНИЕ 1. Рекомендации по диагностике неполадок сетевых подключений.

ПРИЛОЖЕНИЕ 1. Рекомендации по диагностике неполадок сетевых подключений

Если приложение через WAF недоступно, рекомендуется проверить корректность следующих аспектов:

  1. Сетевая адресация.

ip a
  1. Разрешение имен.

host example.com
  1. Маршрутизация.

ip ro
  1. Доступность приложения напрямую.

curl -v http://example.com
curl -k -v https://example.com
  1. Состояние сервиса ibatyr-nginx.

sudo systemctl status ibatyr-nginx.service
  1. Перечень открытых портов.

ss -lnt
sudo ss -4lntp
  1. Наличие ошибок в журнале сервиса ibatyr-nginx.

sudo journalctl -xefu ibatyr-nginx
  1. Наличие ошибок в конфигурации ibatyr-nginx.

sudo ibatyr-nginx test
  1. Ссылка на описание того, как nginx разбирает запросы (если есть проблемы с указанием имени веб-приложения в конфигурации nginx).

http://nginx.org/ru/docs/http/request_processing.html