From c373e8f5d9acfe42a7f963f8c40fb362b82453b9 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 26 Mar 2026 09:18:16 +0300 Subject: [PATCH] lab4 --- lab4/README.md | 569 ++++++++++++++++++++++++++++++++++++++ lab4/lab4.md | 69 +++++ lab4/stand.mmd | 27 ++ report/img/lab4-stand.png | Bin 0 -> 46963 bytes report/report.tex | 277 ++++++++++++++++++- 5 files changed, 941 insertions(+), 1 deletion(-) create mode 100644 lab4/README.md create mode 100644 lab4/lab4.md create mode 100644 lab4/stand.mmd create mode 100644 report/img/lab4-stand.png 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 0000000000000000000000000000000000000000..725a5a6483c10ce0464f2d8fbec2ffd0f681e10a GIT binary patch literal 46963 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 E4@D+`n*aa+ literal 0 HcmV?d00001 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}