diff --git a/lab4/README.md b/lab4/README.md new file mode 100644 index 0000000..393316b --- /dev/null +++ b/lab4/README.md @@ -0,0 +1,569 @@ +Сетевые адаптеры: + +Adapter 1: NAT + +для выхода в интернет (DNS, HTTP) + +Adapter 2: Internal Network + +имя: intnet +для связи с VM2 + + +sudo vim /etc/netplan/01-netcfg.yaml + +network: + version: 2 + ethernets: + enp0s3: # NAT + dhcp4: true + enp0s8: # internal + addresses: [192.168.100.1/24] + +network: + version: 2 + ethernets: + enp0s3: # NAT + dhcp4: true + enp0s8: # internal + addresses: [192.168.100.2/24] + + +sudo chmod 600 /etc/netplan/01-netcfg.yaml +sudo netplan apply + + + + +sudo iptables -F +sudo iptables -X +sudo iptables -t nat -F + + + +Ниже — учебная инструкция **только для настройки и проверки iptables**, без шагов про установку ОС, VirtualBox, netplan и утилит. Будем исходить из твоего текущего стенда: + +* `firewall-host` — защищаемый хост, IP `192.168.100.1` +* `external-client` — внешний клиент, IP `192.168.100.2` +* у обеих машин есть NAT-интерфейс `enp0s3` +* внутренний интерфейс — `enp0s8` +* SSH к обеим машинам у тебя уже работает через проброс портов VirtualBox на `127.0.0.1:40001` и `127.0.0.1:40002` + +Политика лабы: разрешить loopback, DNS, ping наружу, ping к защищаемому хосту только с одного IP, HTTP/HTTPS, а всё остальное запретить. Это прямо соответствует тексту задания. + +--- + +# 2. Сначала разрешаем SSH, чтобы не отрезать себе доступ + +Так как ты подключаешься к `firewall-host` по SSH, нужно **до включения блокировки** разрешить входящие SSH-подключения. + +В твоём случае подключение приходит на саму Ubuntu-машину уже **после NAT VirtualBox**, то есть для Linux это обычный входящий TCP на порт `22`. + +Выполни на `firewall-host`: + +```bash +sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT +``` + +Пояснение: + +* `-A INPUT` — добавить правило в конец цепочки `INPUT`, которая обрабатывает пакеты, входящие на этот хост. +* `-p tcp` — правило относится только к протоколу TCP. +* `--dport 22` — порт назначения 22, то есть SSH-сервер. +* `-j ACCEPT` — разрешить такой трафик. + +Теперь разрешим ответы сервера по уже установленному SSH-соединению: + +```bash +sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT +``` + +Пояснение: + +* `-A OUTPUT` — добавить правило в цепочку `OUTPUT`, то есть для пакетов, исходящих с этого хоста. +* `-p tcp` — правило касается TCP. +* `--sport 22` — исходный порт 22; это ответы SSH-сервера клиенту. +* `-j ACCEPT` — разрешить. + +Такой вариант рабочий, но в Linux обычно лучше использовать правило состояний соединений. Поэтому следующим шагом мы добавим его тоже. + +--- + +# 3. Разрешаем уже установленные и связанные соединения + +Это одно из самых важных правил. Оно позволяет не расписывать вручную каждый ответный пакет. + +```bash +sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +``` + +Пояснение: + +* `-A INPUT` — правило для входящих пакетов. +* `-m conntrack` — подключить модуль отслеживания состояний соединений. +* `--ctstate ESTABLISHED,RELATED` — матчить пакеты: + + * `ESTABLISHED` — относящиеся к уже установленному соединению; + * `RELATED` — связанные с уже существующим соединением. +* `-j ACCEPT` — разрешить. + +И аналогично для исходящих: + +```bash +sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +``` + +Пояснение: + +* здесь то же самое, но для исходящих пакетов. + +Это правило особенно важно для: + +* SSH-сессии, в которой ты уже сидишь; +* ответов от DNS-сервера; +* ответов от HTTP/HTTPS-серверов; +* ответов на ping. + +--- + +# 4. Разрешаем loopback + +Loopback — это локальное взаимодействие внутри самой ОС через интерфейс `lo`. По условию лабы его нужно разрешить. + +```bash +sudo iptables -A INPUT -i lo -j ACCEPT +``` + +Пояснение: + +* `-i lo` — входящий интерфейс `lo`, то есть loopback. +* `-j ACCEPT` — разрешить. + +```bash +sudo iptables -A OUTPUT -o lo -j ACCEPT +``` + +Пояснение: + +* `-o lo` — исходящий интерфейс `lo`. +* `-j ACCEPT` — разрешить. + +--- + +# 5. Разрешаем DNS + +По условию нужно разрешить взаимодействие с DNS-сервером. Обычно DNS-запросы идут по UDP на порт `53`. Иногда может использоваться и TCP 53, поэтому для учебной работы лучше разрешить оба варианта. + +## UDP DNS + +```bash +sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT +``` + +Пояснение: + +* `-A OUTPUT` — правило для исходящих запросов. +* `-p udp` — DNS чаще всего использует UDP. +* `--dport 53` — порт назначения 53, стандартный порт DNS. +* `-j ACCEPT` — разрешить. + +```bash +sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT +``` + +Пояснение: + +* `-A INPUT` — правило для входящих ответов. +* `-p udp` — протокол UDP. +* `--sport 53` — исходный порт удалённого DNS-сервера равен 53. +* `-j ACCEPT` — разрешить. + +## TCP DNS + +```bash +sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT +``` + +Пояснение: + +* TCP используется реже, но может понадобиться для больших DNS-ответов или специальных случаев. + +```bash +sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT +``` + +Пояснение: + +* разрешает входящие TCP-ответы от DNS-сервера. + +--- + +# 6. Разрешаем HTTP и HTTPS + +По заданию нужно разрешить доступ к любым внешним серверам по HTTP/HTTPS. + +## HTTP + +```bash +sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT +``` + +Пояснение: + +* `-p tcp` — HTTP работает по TCP. +* `--dport 80` — порт назначения 80, стандартный HTTP. +* правило разрешает открывать веб-страницы по HTTP. + +```bash +sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT +``` + +Пояснение: + +* разрешает входящие ответы от HTTP-сервера, у которого исходный порт 80. + +## HTTPS + +```bash +sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT +``` + +Пояснение: + +* порт 443 — стандартный HTTPS. + +```bash +sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT +``` + +Пояснение: + +* разрешает входящие ответы от HTTPS-сервера. + +--- + +# 7. Разрешаем ping наружу + +По заданию нужно разрешить использование `ping` для проверки достижимости любых компьютеров во внешней сети. Для `ping` используется протокол ICMP. Конкретно запрос — это `echo-request`, ответ — `echo-reply`. + +```bash +sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT +``` + +Пояснение: + +* `-p icmp` — правило для протокола ICMP. +* `--icmp-type echo-request` — ICMP-пакеты типа “эхо-запрос”, то есть сам ping-запрос. +* `-j ACCEPT` — разрешить отправку. + +```bash +sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT +``` + +Пояснение: + +* `echo-reply` — ответ на ping. +* правило разрешает принимать ответы на отправленные запросы. + +--- + +# 8. Разрешаем ping к защищаемому хосту только с одного адреса + +По заданию защищаемый хост должен отвечать на ping только от одного конкретного внешнего адреса. В твоём стенде таким адресом будет `192.168.100.2`, то есть `external-client`. + +```bash +sudo iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT +``` + +Пояснение: + +* `-p icmp` — ICMP. +* `--icmp-type echo-request` — входящий ping-запрос. +* `-s 192.168.100.2` — источник должен быть именно `192.168.100.2`. +* `-d 192.168.100.1` — адрес назначения — защищаемый хост. +* `-j ACCEPT` — разрешить. + +```bash +sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT +``` + +Пояснение: + +* это правило разрешает отправку ответа ping именно этому клиенту. +* `-s 192.168.100.1` — источник ответа, сам firewall-host. +* `-d 192.168.100.2` — получатель ответа, только разрешённый клиент. + +--- + +# 9. Только теперь включаем политику DROP по умолчанию + +Когда все разрешающие правила уже стоят, можно включить запрет всего остального. + +```bash +sudo iptables -P INPUT DROP +``` + +Пояснение: + +* `-P` — установить политику по умолчанию для цепочки. +* `INPUT` — цепочка входящих пакетов. +* `DROP` — все пакеты, которые не подошли ни под одно разрешающее правило, будут отбрасываться. + +```bash +sudo iptables -P OUTPUT DROP +``` + +Пояснение: + +* то же самое для исходящих пакетов. + +```bash +sudo iptables -P FORWARD DROP +``` + +Пояснение: + +* цепочка `FORWARD` нужна для транзитных пакетов через хост. +* в этой лабораторной маршрутизатор делать не требуется, поэтому безопасно оставить `DROP`. + +--- + +# 10. Проверяем, что SSH не отвалился + +Сразу после установки политик выполни: + +```bash +sudo iptables -L -n -v --line-numbers +``` + +Пояснение: + +* убедись, что правила SSH, loopback, DNS, HTTP/HTTPS и ICMP стоят в списке. +* также удобно смотреть счётчики пакетов: если SSH работает, у соответствующих правил будут увеличиваться значения. + +Открой **вторую SSH-сессию** к `firewall-host`: + +```bash +ssh -p 40001 arity@127.0.0.1 +``` + +Пояснение: + +* это контрольная проверка. +* пока первая сессия ещё жива, ты проверяешь, что новое подключение тоже проходит. +* если вторая сессия открылась, значит SSH точно не заблокирован. + +--- + +# 11. Проверка правил по заданию + +## Проверка DNS + +На `firewall-host`: + +```bash +nslookup example.com +``` + +Пояснение: + +* `nslookup` отправляет DNS-запрос серверу имён. +* если команда возвращает IP-адрес сайта, значит DNS разрешён. + +## Проверка HTTP + +```bash +curl http://example.com +``` + +Пояснение: + +* `curl` делает HTTP-запрос к веб-серверу. +* если приходит HTML-ответ, правило HTTP работает. + +## Проверка HTTPS + +```bash +curl https://example.com +``` + +Пояснение: + +* то же самое, но по HTTPS на порт 443. + +## Проверка ping наружу + +```bash +ping -c 4 8.8.8.8 +``` + +Пояснение: + +* `ping` — утилита проверки достижимости узла. +* `-c 4` — отправить только 4 запроса, а не бесконечно. +* `8.8.8.8` — внешний IP-адрес. +* если ответы приходят, исходящий ping разрешён. + +## Проверка ping к защищаемому хосту с разрешённого адреса + +На `external-client`: + +```bash +ping -c 4 192.168.100.1 +``` + +Пояснение: + +* клиент `192.168.100.2` должен успешно пинговать `firewall-host`, потому что именно этот источник разрешён. + +## Проверка блокировки лишнего трафика + +Например, попробуй на `firewall-host`: + +```bash +nc -vz example.com 22 +``` + +Пояснение: + +* `nc` — netcat, утилита для проверки TCP/UDP-подключений. +* `-v` — подробный режим. +* `-z` — не передавать данные, а только проверить возможность подключения. +* `example.com 22` — попытка открыть TCP-соединение на порт 22. +* так как доступ наружу разрешён только для DNS, HTTP, HTTPS и ping, это подключение должно не пройти. + +Если `nc` не установлен, можно проверить другим способом, но ты писал, что инструменты уже есть, так что, скорее всего, всё нормально. + +--- + +# 12. Контроль трафика через tcpdump + +По заданию нужно показать прохождение пакетов через `tcpdump`. + +Общий просмотр трафика: + +```bash +sudo tcpdump -i any -n +``` + +Пояснение: + +* `tcpdump` — сниффер пакетов. +* `-i any` — слушать все интерфейсы сразу. +* `-n` — не преобразовывать адреса в имена. + +Просмотр только ICMP: + +```bash +sudo tcpdump -i any -n icmp +``` + +Пояснение: + +* фильтр `icmp` покажет только ping-трафик. + +Просмотр DNS: + +```bash +sudo tcpdump -i any -n port 53 +``` + +Пояснение: + +* `port 53` — показать DNS-пакеты. + +Просмотр HTTP/HTTPS: + +```bash +sudo tcpdump -i any -n 'tcp port 80 or tcp port 443' +``` + +Пояснение: + +* кавычки нужны, чтобы shell корректно передал выражение целиком. +* `or` — логическое “или”. +* выражение показывает трафик к HTTP и HTTPS. + +Просмотр SSH: + +```bash +sudo tcpdump -i any -n tcp port 22 +``` + +Пояснение: + +* поможет убедиться, что SSH-пакеты действительно проходят через фильтр. + +--- + +# 13. Сохранение правил + +Когда убедишься, что всё работает, сохрани конфигурацию: + +```bash +sudo netfilter-persistent save +``` + +Пояснение: + +* `netfilter-persistent` сохраняет текущие правила iptables, чтобы они восстановились после перезагрузки. + +Можно дополнительно сохранить в файл: + +```bash +sudo iptables-save > ~/iptables-lab4.rules +``` + +Пояснение: + +* это текстовый дамп всех правил. +* удобно приложить к отчёту или использовать для восстановления. + +--- + +# 14. Готовый набор команд в правильном порядке + +Ниже — тот же порядок, но компактным блоком, чтобы ты мог выполнять по шагам: + +```bash +sudo iptables-save > ~/iptables-before-lab.rules + +sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT + +sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT + +sudo iptables -A INPUT -i lo -j ACCEPT +sudo iptables -A OUTPUT -o lo -j ACCEPT + +sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT +sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT + +sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT + +sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT +sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT + +sudo iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT +sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT + +sudo iptables -P INPUT DROP +sudo iptables -P OUTPUT DROP +sudo iptables -P FORWARD DROP +``` + +--- + +# 16. Что написать в учебном смысле про SSH как “дополнение” + +Можно формулировать так: + +> В базовом задании SSH не входит в перечень разрешённого трафика, однако для сохранения удалённого доступа к стенду было добавлено дополнительное правило, разрешающее входящие TCP-соединения на порт 22 защищаемого хоста. Правило было установлено до включения политик DROP по умолчанию, чтобы не потерять административный доступ к системе. + +Это хорошо звучит и по сути верно. diff --git a/lab4/lab4.md b/lab4/lab4.md new file mode 100644 index 0000000..636d6a5 --- /dev/null +++ b/lab4/lab4.md @@ -0,0 +1,69 @@ +# Защита информации, 2026 + +## Практическая работа №4 +**по дисциплине «Защита информации»** + +**Тема работы:** «Межсетевое экранирование» +**Преподаватель:** Силиненко А.В. +**Email:** a_silinenko@mail.ru + +## 1. Цель работы +Получение базовых знаний по настройке межсетевого экрана (МЭ) в ОС Linux/MacOS. + +## 2. Задачи практической работы +### 2.1. +Изучение МЭ iptables или любого другого, обеспечивающего выполнение задания. + +### 2.2. +Реализация заданной политики доступа. + +## 3. Ход практической работы +### 3.1. +Установить или убедиться в наличии iptables. + +### 3.2. +Изучить МЭ iptables, в том числе: +- установка МЭ; +- принципы и порядок обработки пакетов, основные цепочки (таблицы) обработки; +- действия по умолчанию; +- возможные параметры правил фильтрации. + +### 3.3. +Изучить команды вывода таблиц фильтрации, добавления, редактирования и удаления правил фильтрации. + +### 3.4. +Реализовать следующую политику доступа: +- разрешить локальное взаимодействие через интерфейс loopback; +- разрешить взаимодействие с DNS-сервером; +- разрешить использование утилиты ping для проверки достижимости компьютеров с любыми IP-адресами во внешней сети; +- разрешить использование утилиты ping для проверки достижимости защищаемого хоста только с конкретного адреса внешней сети; +- разрешить доступ по протоколам HTTP/HTTPS к любым внешним серверам; +- блокировать все пакеты, не удовлетворяющие указанным выше условиям. + +Правила политики доступа должны содержать (там, где это уместно): +- IP-адрес (сеть) источника; +- IP-адрес (сеть) приемника; +- транспортный протокол; +- для протоколов TCP и UDP: порт приемника; +- для протокола ICMP: тип и код сообщения. + +### 3.5. +Произвести проверку корректности реализации заданной политики, используя программы ping, nslookup (или аналоги), web-браузер. + +Также убедиться, что весь трафик, кроме разрешенного, блокируется. + +### 3.6. +Проконтролировать прохождение пакетов утилитой tcpdump. + +## 4. Требования к отчету +### 4.1. +В разделе отчета, посвященному данной работе, должны быть приведены: +- актуальность темы работы в контексте курса; +- цели и задачи работы; +- схема стенда, в т.ч. защищаемый компьютер с МЭ, внешняя сеть, DNS-сервер(а), IP-адреса хостов; +- принципы обработки пакетов в цепочках (таблицах) iptables; +- примеры команд добавления правил фильтрации; +- набор правил фильтрации, реализующий заданную политику доступа; +- проверку реализованной политики – демонстрацию примеров пропуска разрешенного трафика и блокировки запрещенного; +- пример контроля трафика (вывод tcpdump) при проверках реализованной политики; +- выводы по проделанной работе. diff --git a/lab4/stand.mmd b/lab4/stand.mmd new file mode 100644 index 0000000..3da8268 --- /dev/null +++ b/lab4/stand.mmd @@ -0,0 +1,27 @@ +graph TB + subgraph host["Хост-машина"] + subgraph fw["firewall-host (защищаемый хост, iptables)"] + fw_lo["lo: 127.0.0.1/8"] + fw_nat["enp0s3 (NAT)
10.0.2.15/24"] + fw_int["enp0s8 (Internal)
192.168.100.1/24"] + end + subgraph ec["external-client (внешний клиент)"] + ec_nat["enp0s3 (NAT)
10.0.2.15/24"] + ec_int["enp0s8 (Internal)
192.168.100.2/24"] + end + end + + fw_int <--->|"Internal Network (intnet)
192.168.100.0/24"| ec_int + + inet["Интернет
(DNS: 10.0.2.3, HTTP/HTTPS,
ICMP: 8.8.8.8 и др.)"] + fw_nat -->|"NAT"| inet + + style fw fill:#e8f4e8,stroke:#2d7d2d,stroke-width:2px + style ec fill:#e8e8f4,stroke:#2d2d7d,stroke-width:2px + style host fill:#f9f9f9,stroke:#999,stroke-width:1px + style inet fill:#fff3e0,stroke:#e65100,stroke-width:2px + style fw_lo fill:#fff,stroke:#666 + style fw_nat fill:#fff,stroke:#666 + style fw_int fill:#fff,stroke:#666 + style ec_nat fill:#fff,stroke:#666 + style ec_int fill:#fff,stroke:#666 diff --git a/report/img/lab4-stand.png b/report/img/lab4-stand.png new file mode 100644 index 0000000..725a5a6 Binary files /dev/null and b/report/img/lab4-stand.png differ diff --git a/report/report.tex b/report/report.tex index dade2aa..665cd17 100755 --- a/report/report.tex +++ b/report/report.tex @@ -177,6 +177,7 @@ \item Практическая работа №1. Анализ уязвимостей программного обеспечения. Данная практическая работа посвящена анализу уязвимостей программного обеспечения с использованием Банка данных угроз безопасности информации ФСТЭК России~\cite{fstec-bdu}. В ходе выполнения работы предусмотрено изучение структуры разделов «Угрозы» и «Уязвимости», а также поиск уязвимостей по заданным критериям. Особое внимание уделяется выявлению уязвимостей, соответствующих используемым версиям операционных систем личных устройств, и рассмотрению возможных мер по их устранению. \item Практическая работа №2. Разработка и исследование системы аутентификации и авторизации. Данная практическая работа посвящена разработке системы доступа пользователей к конфиденциальным данным и исследованию стойкости паролей к атаке методом грубой силы. В ходе выполнения работы реализованы утилита управления пользователями, утилита доступа к конфиденциальным данным и программа перебора паролей, а также проведено экспериментальное исследование зависимости времени взлома от длины пароля. \item Практическая работа №3. Реализация моделей дискреционного и мандатного управления доступом. Данная практическая работа посвящена расширению системы из работы №2 путём реализации моделей DAC (дискреционный доступ) и MAC (мандатный доступ) на основе модели Белла–Лападулы. + \item Практическая работа №4. Межсетевое экранирование средствами \texttt{iptables}. Данная практическая работа посвящена настройке межсетевого экрана в Linux, формированию политики фильтрации сетевого трафика и экспериментальной проверке пропуска разрешённых соединений и блокировки запрещённых пакетов с использованием \texttt{tcpdump}. \end{enumerate} \newpage @@ -683,6 +684,278 @@ secret.txt:2 В ходе практической работы №3 на базе системы из работы №2 реализованы модели дискреционного и мандатного управления доступом. DAC реализован через список доступа (ACL) с владельцами объектов и командой \texttt{grant} для произвольного назначения прав. MAC реализован на основе модели Белла–Лападулы с тремя уровнями меток и проверкой свойств <<нет чтения сверху>> и <<нет записи вниз>>. Режимы проверки (BOTH, DAC\_ONLY, MAC\_ONLY) позволяют гибко настраивать систему; переключение доступно только администратору (root). Полученный опыт демонстрирует принципиальные различия между дискреционным и мандатным подходами к управлению доступом и их практическую реализацию в информационных системах. +\newpage +\section{Межсетевое экранирование средствами iptables} + +\subsection{Актуальность темы} + +Межсетевое экранирование является одним из базовых механизмов сетевой защиты информационных систем. Локальный хостовый межсетевой экран позволяет минимизировать поверхность атаки, явно разрешая только необходимый трафик и блокируя все остальные соединения по принципу <<запрещено всё, что не разрешено>>. Практическая настройка \texttt{iptables} в рамках курса <<Защита информации>> позволяет закрепить представление о пакетной фильтрации, ролях цепочек \texttt{INPUT}, \texttt{OUTPUT}, \texttt{FORWARD} и о проверке работоспособности правил на реальном стенде. + +\subsection{Цели и задачи работы} + +Цель работы: получение базовых знаний по настройке межсетевого экрана в ОС Linux и реализация заданной политики доступа. + +Задачи работы: +\begin{enumerate} + \item Изучить межсетевой экран \texttt{iptables}: принципы обработки пакетов, основные цепочки, действия по умолчанию, параметры правил фильтрации. + \item Развернуть лабораторный стенд на базе виртуальных машин VirtualBox. + \item Реализовать заданную политику доступа: разрешить loopback, DNS, исходящий ping, входящий ping только от конкретного адреса, HTTP/HTTPS; заблокировать всё остальное. + \item Проверить корректность реализации политики. + \item Проконтролировать прохождение пакетов утилитой \texttt{tcpdump}. +\end{enumerate} + +\subsection{Схема стенда} + +Стенд реализован на базе двух виртуальных машин VirtualBox с ОС Ubuntu Server 22.04. Каждая машина имеет два сетевых адаптера: +\begin{itemize} + \item \textbf{Adapter~1 (NAT)} --- доступ в Интернет (DNS, HTTP/HTTPS, ICMP); + \item \textbf{Adapter~2 (Internal Network <>)} --- изолированная сеть \texttt{192.168.100.0/24} для связи между машинами. +\end{itemize} + +Схема стенда представлена на рисунке~\ref{fig:lab4-topology}, адресация узлов --- в таблице~\ref{tab:lab4-addr}. + +\begin{figure}[H] + \centering + \includegraphics[width=0.85\linewidth]{img/lab4-stand.png} + \caption{Схема лабораторного стенда} + \label{fig:lab4-topology} +\end{figure} + +\begin{table}[H] +\centering +\caption{Адресация узлов стенда} +\label{tab:lab4-addr} +\begin{tabularx}{\textwidth}{l l l X} +\toprule +Узел & Интерфейс & IP-адрес & Назначение \\ +\midrule +\multirow{2}{*}{firewall-host} & enp0s3 (NAT) & 10.0.2.15/24 & Доступ в Интернет \\ + & enp0s8 (intnet) & 192.168.100.1/24 & Внутренняя сеть \\ +\midrule +\multirow{2}{*}{external-client} & enp0s3 (NAT) & 10.0.2.15/24 & Доступ в Интернет \\ + & enp0s8 (intnet) & 192.168.100.2/24 & Внутренняя сеть \\ +\bottomrule +\end{tabularx} +\end{table} + +DNS-запросы обрабатываются службой \texttt{systemd-resolved} (\texttt{127.0.0.53}), перенаправляющей их DNS-серверу NAT-шлюза VirtualBox (\texttt{10.0.2.3}). Управление виртуальными машинами осуществлялось по SSH через проброс портов VirtualBox. + +\subsection{Принципы обработки пакетов в \texttt{iptables}} + +Утилита \texttt{iptables} организует правила фильтрации в виде таблиц и цепочек. В работе использовалась таблица \texttt{filter} (по умолчанию), содержащая три встроенные цепочки: +\begin{itemize} + \item \texttt{INPUT} --- входящие пакеты, адресованные локальным процессам; + \item \texttt{OUTPUT} --- исходящие пакеты локальных процессов; + \item \texttt{FORWARD} --- транзитные пакеты (маршрутизация). +\end{itemize} + +Пакет последовательно сравнивается с правилами цепочки. При совпадении выполняется действие: \texttt{ACCEPT} (пропустить), \texttt{DROP} (молча отбросить) или \texttt{REJECT} (отбросить с уведомлением). Если ни одно правило не сработало, применяется политика по умолчанию. + +Модуль \texttt{conntrack} позволяет отслеживать состояния соединений. Правило с параметром \texttt{-{}-ctstate ESTABLISHED,RELATED} пропускает ответные пакеты уже установленных соединений без необходимости создания отдельных правил для каждого обратного направления. + +\subsection{Реализация политики фильтрации} + +Перед настройкой все существующие правила были сброшены: +\begin{verbatim} +sudo iptables -F && sudo iptables -X +sudo iptables -t nat -F && sudo iptables -t mangle -F +\end{verbatim} + +Примеры команд добавления правил: + +Разрешение loopback-трафика (\texttt{-i~lo} --- входящий интерфейс loopback): +\begin{verbatim} +sudo iptables -A INPUT -i lo -j ACCEPT +\end{verbatim} + +Разрешение DNS-запросов (\texttt{-p~udp}, порт~53): +\begin{verbatim} +sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT +\end{verbatim} + +Разрешение входящего ping только от конкретного адреса (\texttt{-{}-icmp-type echo-request} --- тип~8, параметры \texttt{-s} и \texttt{-d} --- адреса источника и назначения): +\begin{verbatim} +sudo iptables -A INPUT -p icmp --icmp-type echo-request \ + -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT +\end{verbatim} + +Полный набор правил, реализующий заданную политику доступа: + +{\footnotesize +\begin{verbatim} +# SSH (для сохранения удалённого доступа к стенду) +sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT +# Уже установленные и связанные соединения +sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +# Loopback +sudo iptables -A INPUT -i lo -j ACCEPT +sudo iptables -A OUTPUT -o lo -j ACCEPT +# DNS (UDP и TCP, порт 53) +sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT +sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 53 -j ACCEPT +# HTTP и HTTPS +sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT +sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT +sudo iptables -A INPUT -p tcp --sport 443 -j ACCEPT +# Исходящий ping +sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT +sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT +# Входящий ping только от 192.168.100.2 +sudo iptables -A INPUT -p icmp --icmp-type echo-request \ + -s 192.168.100.2 -d 192.168.100.1 -j ACCEPT +sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply \ + -s 192.168.100.1 -d 192.168.100.2 -j ACCEPT +# Политики по умолчанию +sudo iptables -P INPUT DROP +sudo iptables -P OUTPUT DROP +sudo iptables -P FORWARD DROP +\end{verbatim} +} + +Правило для SSH не входит в задание, но необходимо для сохранения удалённого доступа; оно добавлено до включения политик \texttt{DROP}. + +Итоговое состояние таблицы \texttt{filter} (\texttt{iptables -L -n -v -{}-line-numbers}): + +{\scriptsize +\begin{verbatim} +Chain INPUT (policy DROP 0 packets, 0 bytes) +num pkts bytes target prot in source destination +1 162 10124 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 +2 10 760 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED +3 0 0 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0 +4 0 0 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp spt:53 +5 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:53 +6 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:80 +7 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:443 +8 0 0 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 0 +9 0 0 ACCEPT icmp * 192.168.100.2 192.168.100.1 icmptype 8 + +Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) + +Chain OUTPUT (policy DROP 4 packets, 304 bytes) +num pkts bytes target prot out source destination +1 119 21028 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp spt:22 +2 0 0 ACCEPT all * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED +3 0 0 ACCEPT all lo 0.0.0.0/0 0.0.0.0/0 +4 0 0 ACCEPT udp * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 +5 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 +6 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 +7 0 0 ACCEPT tcp * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 +8 0 0 ACCEPT icmp * 0.0.0.0/0 0.0.0.0/0 icmptype 8 +9 0 0 ACCEPT icmp * 192.168.100.1 192.168.100.2 icmptype 0 +\end{verbatim} +} + +\subsection{Проверка реализованной политики} + +\textbf{DNS.} Команда \texttt{nslookup} на firewall-host успешно разрешает имена: + +{\footnotesize +\begin{verbatim} +$ nslookup example.com +Server: 127.0.0.53 +Address: 127.0.0.53#53 + +Non-authoritative answer: +Name: example.com +Address: 104.18.26.120 +Name: example.com +Address: 104.18.27.120 +\end{verbatim} +} + +\textbf{HTTP/HTTPS.} Утилита \texttt{curl} успешно получает ответ от внешнего сервера как по HTTP, так и по HTTPS: + +{\footnotesize +\begin{verbatim} +$ curl http://example.com +Example Domain +... + +$ curl https://example.com +Example Domain +... +\end{verbatim} +} + +\textbf{Исходящий ping.} Защищаемый хост пингует внешние адреса: + +{\footnotesize +\begin{verbatim} +$ ping -c 4 8.8.8.8 +PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. +64 bytes from 8.8.8.8: icmp_seq=1 ttl=255 time=12.0 ms +64 bytes from 8.8.8.8: icmp_seq=2 ttl=255 time=11.9 ms +64 bytes from 8.8.8.8: icmp_seq=3 ttl=255 time=11.3 ms +64 bytes from 8.8.8.8: icmp_seq=4 ttl=255 time=11.4 ms + +--- 8.8.8.8 ping statistics --- +4 packets transmitted, 4 received, 0% packet loss +\end{verbatim} +} + +\textbf{Входящий ping от разрешённого адреса.} С external-client (\texttt{192.168.100.2}) ping проходит: + +{\footnotesize +\begin{verbatim} +arity@external-client:~$ ping -c 4 192.168.100.1 +64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.433 ms +64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.369 ms +64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.440 ms +64 bytes from 192.168.100.1: icmp_seq=4 ttl=64 time=0.398 ms + +--- 192.168.100.1 ping statistics --- +4 packets transmitted, 4 received, 0% packet loss +\end{verbatim} +} + +\textbf{Блокировка запрещённого трафика.} Попытка TCP-соединения на порт~22 внешнего сервера не проходит (исходящий TCP разрешён только на порты 53, 80, 443): + +{\footnotesize +\begin{verbatim} +$ nc -vz example.com 22 +(нет ответа, соединение заблокировано, прервано по Ctrl+C) +\end{verbatim} +} + +\subsection{Контроль трафика средствами \texttt{tcpdump}} + +Для подтверждения прохождения пакетов использовалась утилита \texttt{tcpdump}. Ниже приведён вывод при выполнении \texttt{ping} от external-client к firewall-host: + +{\footnotesize +\begin{verbatim} +$ sudo tcpdump -i any -n icmp +18:26:20.960046 enp0s8 In IP + 192.168.100.2 > 192.168.100.1: + ICMP echo request, id 2, seq 1, length 64 +18:26:20.960119 enp0s8 Out IP + 192.168.100.1 > 192.168.100.2: + ICMP echo reply, id 2, seq 1, length 64 +18:26:21.990542 enp0s8 In IP + 192.168.100.2 > 192.168.100.1: + ICMP echo request, id 2, seq 2, length 64 +18:26:21.990587 enp0s8 Out IP + 192.168.100.1 > 192.168.100.2: + ICMP echo reply, id 2, seq 2, length 64 +... +8 packets captured +\end{verbatim} +} + +На интерфейсе \texttt{enp0s8} видны входящие ICMP echo-request от \texttt{192.168.100.2} и исходящие echo-reply, что подтверждает работу правила входящего ping от разрешённого адреса. + +Аналогичным образом были зафиксированы DNS-пакеты (\texttt{sudo tcpdump -i any -n port 53}): запрос от \texttt{127.0.0.1} к \texttt{127.0.0.53} через loopback, перенаправление к \texttt{10.0.2.3} через \texttt{enp0s3} и получение ответа. При выполнении \texttt{curl http://example.com} вывод \texttt{tcpdump} с фильтром \texttt{tcp port 80} зафиксировал трёхстороннее TCP-рукопожатие (SYN, SYN-ACK, ACK), HTTP-запрос \texttt{GET / HTTP/1.1} и ответ \texttt{HTTP/1.1 200 OK}, подтверждая корректную работу правила для порта~80. + +\subsection{Выводы} + +В ходе практической работы №4 на стенде из двух виртуальных машин VirtualBox настроена политика межсетевого экранирования средствами \texttt{iptables}. Реализована схема с политикой \texttt{DROP} по умолчанию и разрешающими правилами для loopback, DNS, исходящего ping, входящего ping от адреса \texttt{192.168.100.2} и HTTP/HTTPS. Экспериментальная проверка подтвердила пропуск разрешённого трафика и блокировку соединений, не описанных в политике. Анализ трафика утилитой \texttt{tcpdump} продемонстрировал соответствие наблюдаемой сетевой активности заданным правилам фильтрации. + + \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение} @@ -693,6 +966,8 @@ secret.txt:2 В ходе выполнения практической работы №3 на базе системы из работы №2 реализованы модели дискреционного (DAC) и мандатного (MAC) управления доступом. DAC реализован через список доступа с владельцами объектов и командой выдачи прав; MAC — на основе модели Белла–Лападулы с тремя уровнями меток конфиденциальности. Реализация демонстрирует принципиальные различия между подходами и их практическое применение. +В ходе выполнения практической работы №4 на стенде из двух виртуальных машин VirtualBox настроена политика межсетевого экранирования средствами \texttt{iptables}. Реализованы правила фильтрации, разрешающие loopback-трафик, DNS, ICMP и HTTP/HTTPS, а все прочие соединения блокируются. Корректность работы правил подтверждена тестовыми соединениями и анализом пакетов утилитой \texttt{tcpdump}. + \newpage \printbibliography[heading=bibintoc] @@ -746,4 +1021,4 @@ secret.txt:2 \addcontentsline{toc}{section}{Приложение 8} \lstinputlisting{../lab3/setup.sh} -\end{document} \ No newline at end of file +\end{document}