# Макаров Дмитрий Владиславович - WEB basic. Web Application Firewall
[toc]
## 1. Настройка инфраструктуры и установка nginx
### Сетевые конфигурации
После установки nginx был настроен конфигурационный файл. **Машинка с WAF** настроена как прокси для **web server**. В файл добавлены следующие строки:
```
proxy_pass http://192.168.116.143:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
```
---

---
Сетевая конфигурация **WAF машины**
---

---
Сетевая конфигурация **web server**
---

---
### Установка последней версии nginx
Проведём обновления в операционной системе **WAF**
`sudo apt update && sudo apt upgrade -y`
---

---
Добавим репозиторий с **MAINLINE** версией **nginx** и обновим индексы репозиториев
`sudo add-apt-repository ppa:ondrej/nginx-mainline -y && sudo apt update`
---

---
Проведём установку **nginx**
`sudo apt install nginx-core nginx-common nginx nginx-full`
---

---
#### Добавление исходного кода nginx в репозиторий
По умолчанию исходный код не устанавливается при установке **PPA**. Нам нужно вручную включить это, чтобы загрузить исходный код **Nginx** для компиляции **Modsecurity** позже.
Сначала откроем файл конфигурации в `/etc/apt/sources.list.d` с помощью nano, как показано ниже:
`sudo nano /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list`
---

---
Далее раскомментируем вторую строчку
---

---
Затем обновляем репозитории
---

---
#### Загрузка Nginx Source
Нам потребуется загрузить исходный код **Nginx**, чтобы скомпилировать **динамический модуль ModSecurity**. Для этого вам потребуется скачать исходный пакет и сохранить его в каталоге `/etc/local/src/nginx`.
Создим местоположение следующим образом:
`sudo mkdir /usr/local/src/nginx && cd /usr/local/src/nginx`
---

---
Назначим разрешения для каталога
`sudo chown username:username /usr/local/src/ -R`
---

---
Загрузим исходный пакет
`sudo apt install dpkg-dev -y && sudo apt source nginx`
---

---
Ошибку в конце загрузки можно проигнорировать.
Убеждимся, что файлы скачались. Для этого вводим команду `ls`
---

---
Затем проверяем версию приложения `nginx -v`
---

---
## 2. Установка WAF (ModSecurity 3)
### Установка libmodsecurity3 для ModSecurity
Пакет **libmodsecurity3** – это фактическая часть WAF, выполняющая **HTTP-фильтрацию** для ваших веб-приложений. В **Ubuntu 20.04** мы можем установить его из репозитория **Ubuntu 20.04** по умолчанию. Однако это не рекомендуется, как и в большинстве **LTS-версий**, и часто отстает. Вместо этого мы будем компилировать его из гораздо более современного источника следующим образом.
Сперва клонируем с **Github**, так как у нас не установлен **git**, нам нужно будет выполнить следующую команду:
`sudo apt install git -y`
---

---
Затем клонируем **GIT**-репозиторий **libmodsecurity3** следующим образом:
`sudo git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/`
---

---
Теперь идём в следующую директорию
`cd /usr/local/src/ModSecurity/`
---

---
Для компиляции нужно установить следующие зависимости
`sudo apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libpcre3 libpcre3-dev libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen -y`
---

---
Теперь, чтобы закончить, установим следующие подмодули **GIT** следующим образом:
`git submodule init`
---

---
Затем обновим подмодули:
`git submodule update`
---

---
### Создание среды ModSecurity
Следующим шагом теперь является создание среды. Используем следующую команду:
`./build.sh`
---

---
Затем запустим команду конфигурации:
`./configure`
---

---
Теперь, когда мы создали и настроили среду для **libmodsecurity3**, пришло время скомпилировать ее с помощью команды *make*.
`make`
---

---
После компиляции исходного кода запустим команду установки в своем терминале:
`sudo make install`
---

---
### Установка ModSecurity-nginx Connector
Установим **ModSecurity-nginx Connector**. Это точка соединения между **nginx** и **libmodsecurity.** Это компонент, который взаимодействует между Nginx и ModSecurity **(libmodsecurity3)**.
Как и в предыдущем шаге по клонированию репозитория **libmodsecurity3**, нам потребуется снова клонировать репозиторий коннектора с помощью следующей команды:
`sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/`
---

---
Затем переместися в исходный каталог **nginx** следующим образом:
`cd /usr/local/src/nginx/nginx-1.23.1`
---

---
Теперь запустим команду в терминале Ubuntu, чтобы установить необходимые зависимости:
`sudo apt build-dep nginx && sudo apt install uuid-dev -y`
---

---
Далее мы скомпилируем модуль **ModSecurity-nginx Connector** только с флагом **--with-compat** следующим образом:
`sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx`
---

---
Теперь создадим динамические модули с помощью следующей команды:
`sudo make modules`
---

---
Затем, находясь в исходном каталоге Nginx, используем следующую команду, чтобы переместить только что созданный динамический модуль, сохраненный в папке `objs/ngx_http_modsecurity_module.so`, и скопировать его в каталог `/usr/share/nginx/modules`.
`sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/`
---

---
### Загружаем и настраиваем ModSecurity-nginx Connector с помощью Nginx
Теперь, когда мы скомпилировали динамический модуль и разместили его соответствующим образом, нам нужно отредактировать файл конфигурации `/etc/nginx/nginx.conf`, чтобы заставить **ModSecurity** работать с нашим веб-сервером **nginx**.
Во-первых, нам нужно указать **load_module** и путь к нашему модулю безопасности.
Откроем **nginx.conf** в nano:
`sudo nano /etc/nginx/nginx.conf`
---

---
Затем добавим следующую строку в файл вверху:
`load_module modules/ngx_http_modsecurity_module.so;`
---

---
Теперь добавим следующий код в раздел **HTTP {}** следующим образом:
`modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;`
---

---
Нам нужно будет создать каталог для хранения файлов конфигурации и будущих правил, **OWASP CRS** для руководства.
Используйте следующую команду, чтобы создать каталог `/etc/nginx/modsec` следующим образом:
`sudo mkdir /etc/nginx/modsec/`
Теперь нам нужно скопировать образец файла конфигурации **ModSecurity** обратно из нашего клонированного каталога **GIT**:
`sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf`
---

---
Используя **nano** в **Ubuntu**, откроем файл `modsecurity.conf` следующим образом:
`sudo nano /etc/nginx/modsec/modsecurity.conf`
По умолчанию в конфигурации ModSecurity механизм правил указан как **(DetectionOnly)**, который, другими словами, запускает ModSecurity и обнаруживает все вредоносные действия, но не блокирует и не блокирует и не регистрирует все отмеченные им **HTTP-транзакции**. Это следует использовать только в том случае, если у нас много ложных срабатываний или мы увеличили настройки уровня безопасности до экстремального уровня и проверяете, не возникают ли какие-либо ложные срабатывания.
Чтобы изменить это поведение на **(включено)**, найдём следующее:
`SecRuleEngine DetectionOnly`
Изменим строку на эту, чтобы включить ModSecurity:
`SecRuleEngine On`
---

---
Теперь нам нужно найти следующее:
```
# Log everything we know about a transaction.
SecAuditLogParts ABIJDEFHZ
```
Это неправильно, и это нужно изменить. Изменим строку на следующее:
`SecAuditLogParts ABCEFHJKZ`
---

---
Сохраняем файл.
Следующая часть — создать следующий файл **modsec-config.conf**.
Используем следующую команду, чтобы создать файл и открыть его:
`sudo nano /etc/nginx/modsec/modsec-config.conf`
Оказавшись внутри файла, добавим следующую строку:
`Include /etc/nginx/modsec/modsecurity.conf`
---

---
Наконец, скопируем файл ModSecurity **unicode.mapping** следующим образом:
`sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/`
---

---
Теперь, прежде чем двигаться дальше, мы должны протестировать службу **Nginx** с помощью следующей команды терминала:
`sudo nginx -t`
Така как мы всё настроили правильно, мы получили следующий вывод:
```
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
Чтобы изменения вступили в силу, перезапустите службу **Nginx** с помощью команды **systemctl**:
`sudo systemctl restart nginx`
---

---
## 3. Настройка WAF c детектом OWASP top 10
**ModSecurity** сам по себе не защищает наш веб-сервер, и нам нужны правила. Одним из самых известных, уважаемых и хорошо известных набром правил является **OWASP CRS**. Эти правила наиболее широко используются среди веб-серверов и других **WAF**, и большинство других подобных систем основывают большинство своих правил на этой **CRS**. Установка этого набора правил автоматически предоставит нам отличный источник защиты от большинства новых угроз в Интернете, обнаруживая злоумышленников и блокируя их.
Используя **команду wget**, загрузим архив **OWASP CRS 3.3.2** следующим образом:
`wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip`
---

---
Проверим, установлен ли у нас пакет Unzip.
`sudo dnf install unzip -y`
---

---
Теперь разархивируем архив **master.zip** следующим образом:
`sudo unzip v3.3.2.zip -d /etc/nginx/modsec`
---

---
Как и прежде с конфигурацией ***modsecurity.conf***, **OWASP CRS** поставляется с образцом файла конфигурации, который необходимо переименовать. Лучше всего использовать **команду cp** и сохранить резервную копию.
`sudo cp /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf`
---

---
Чтобы включить правила, снова откроем `/etc/nginx/modsec/modsec-config.conf` в **nano**:
`sudo nano /etc/nginx/modsec/modsec-config.conf`
Добавим следующие две дополнительные строки:
```
Include /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.2/rules/*.conf
```
---

---
Сохраним файл.
Как и прежде, протестируем любые новые дополнения к вашему сервису **Nginx**, прежде чем запускать его:
`sudo nginx -t`
Убеждаемся, что всё в порядке и перезапускаем службу Nginx, чтобы изменения вступили в силу:
`sudo systemctl restart nginx`
---

---
**OWASP CRS** имеет довольно много опций, настройки по умолчанию, тем не менее, из коробки сразу защитят большинство серверов, ==не навредив== нашим реальным посетителям и хорошим **SEO-ботам**.
Откроем файл **CRS-setup.conf** следующим образом:
`sudo nano /etc/nginx/modsec/coreruset-3.4-dev/crs-setup.conf`
Отсюда мы можем изменить большинство настроек OWASP CRS.
---

---

---
## 4. Три атаки из списка OWASP top 10
### SQL Injection
Пробуем обойти вход системы, как делали это в предыдущей практике.
В окно логина пишем следующее
`administrator'--`
Пароль не имеет значения.
Правила срабатывают
---

---
Проверяем логи
---

---
### XSS
В следущей атаки попытаемся оставить отзыва на сайте, вписав туда следующий **алерт-скрипт**
`<script>alert(1)</script>`
Правила срабатывают
---

---
Проверяем логи
---

---
### Path traseval
Пробуем изменить параметр пути, включив режим перехвата в Burp Suite добравшись до файла `passwd` следующим образом:
`../../../etc/passwd`
---

---
В HTTP hispory видим ответ **403** на запрос
Правила срабатывают
---

---
Проверяем логи
---

---
### RCE (дополнительно)
Выполним команду `whoami`, чтобы определить имя текущего пользователя, включив режим перехвата в **Burp Suite**
---

---
Проверяем логи
Правила срабатывают
(https://)
---

---