# Лабораторная работа 2
## Часть 1. Настройка межсетвеого экрана в Linux-системах
### Цель работы

Получить практические навыки настройки межсетевого экрана (фаервола), а также настройки переадресации сетевых соединений и трансляции адресов (NAT). 

### 1. Теоретическая часть
**Брандмауэр** - это система или группа систем, реализующих правила управления доступом между двумя сетями. Фактические средства, с помощью которых это достигается, весьма различны, но в принципе брандмауэр можно рассматривать как пару механизмов: один для блокирования передачи информации, а другой, - для пропуска информации. Некоторые брандмауэры уделяют больше внимания блокировке передачи информации, другие - ее пропуску. Важно понимать, что конфигурация брандмауэра, как механизма обеспечения выполнения определенных правил, определяет правила для всех систем, которые он защищает.

### 1.1	 Работа *IPTABLES*. Основные понятия

При описании выполняемых команд приняты следующие обозначения:
- `#` - если перед командой стоит данный знак, это означает, что команда должна выполняться от имени пользователя root (суперпользователь)
- `$` - если перед командой стоит данный знак, это означает, что команда должна выполняться от имени обычного пользователя.

Обработка пакетов осуществляется согласно определенным правилам. Каждое правило - это строка, содержащая в себе критерии определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила задаются в командной строке так:

```sh 
# iptables [-t table] command [match] [target/jump]         
```

Если в правило не включается спецификатор [-t table], то по умолчанию предполагается использование таблицы filter, если же предполагается использование другой таблицы, то это требуется указать явно. Спецификатор таблицы так же можно указывать в любом месте строки правила, однако более или менее стандартом считается указание таблицы в начале правила. Можно использовать следующие таблицы: 
- Таблица **nat** используется главным образом для преобразования сетевых адресов (*Network Address Translation*). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам; 
- Таблица **mangle** используется для внесения изменений в заголовки пакетов. Примером может служить изменение поля `TTL`, `TOS` или `MARK`; 
- Таблица **filter** используется главным образом для фильтрации пакетов. Для примера, здесь мы можем выполнить `DROP`, `LOG`, `ACCEPT` или `REJECT` без каких либо ограничений, которые имеются в других таблицах; 

Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, то команда всегда должна стоять первой. Команда определяет действие **iptables**, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п. Ниже перечислены команды **iptables**:
- `-A`, `--append` - добавление нового правила в конец заданной цепочки; 
- `-D`, `--delete` - удаление правила из цепочки. Команда имеет два формата записи, первый - когда задается критерий сравнения с опцией -D, второй - порядковый номер правила; 
- `-R`, `--replace` - замена одного правила другим; 
- `-I`, `--insert` - вставка нового правила в цепочку. Число, следующее за именем цепочки, задает номер для вставляемого правила; 
- `-L`, `--list` - вывод списка правил в заданной цепочке. Если имя цепочки не указывается, то выводится список правил для всех цепочек; 
- `-F`, `--flush` - сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках; 
- `-Z`, `--zero` - обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки; 
- `-N`, `--new-chain` - создание новой цепочки с заданным именем в заданной таблице;
- `-X`, `--delete-chain` - удаление заданной цепочки из заданной таблицы. Удаляемая цепочка не должна иметь правил, а также ссылок на нее из других цепочек. Если имя цепочки не указано, то будут удалены все цепочки заданной таблицы кроме встроенных; 
- `-P`, `--policy` - определение политики «по-умолчанию» для заданной цепочки. Политика «по-умолчанию» определяет действие, применяемое к пакетам, не попавшим под действие ни одного из правил в цепочке;
- `-E`, `--rename-chain` - переименование пользовательской цепочки.

Раздел **match** задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет. Здесь мы можем указать самые разные критерии - IP-адрес источника пакета или сети, IP-адрес места назначения, порт, протокол, сетевой интерфейс и т.д. Рассмотрим общие критерии. Общие критерии допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения.
- `-p`, `--protocol` - тип протокола. Примерами протоколов могут быть `TCP`, `UDP` и `ICMP` (список протоколов можно посмотреть в файле */etc/protocols*), а также ключевое слово `ALL`; 
- `-s`, `-src`, `--source` - IP-адрес(а) источника пакета. Может указываться как единственный IP-адрес, так и в виде address/mask, например как `192.168.0.0/255.255.255.0`,или `192.168.0.0/24`. Символ `!`, установленный перед адресом, означает логическое отрицание; 
- `-d`, `-dst`, `--destination` - IP-адрес(а) получателя. Имеет синтаксис схожий с критерием `-source`; 
- `-i`, `--in-interface` - интерфейс, с которого получен пакет. При отсутствии этого критерия предполагается любой интерфейс; 
- `-o`, `--out-interface` - имя выходного интерфейса. Критерий допускается использовать только в цепочках OUTPUT, FORWARD и POSTROUTING, в противном случае будет генерироваться сообщение об ошибке; 
- `-f`, `--fragment` - правило распространяется на все фрагменты фрагментированного пакета, кроме первого; 
- `-m limit` - устанавливает предельное число пакетов в единицу времени, которое способно пропустить правило; 
- `--dport`, `¬-destination-port` - порт или диапазон портов, на который адресован пакет;

Значение **target** указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно заставить ядро передать пакет в другую цепочку правил, «сбросить» пакет и забыть про него, выдать на источник сообщение об ошибке и т.п. Ниже приведен список действий:
- `ACCEPT` - пакет прекращает движение по цепочке (и всем вызвавшим цепочкам, если текущая цепочка была вложенной) и считается принятым; 
- `DNAT` - используется для преобразования адреса места назначения в IP заголовке пакета.Если пакет подпадает под критерий правила, выполняющего `DNAT`, то этот пакет, и все последующие пакеты из этого же потока, будут подвергнуты преобразованию адреса назначения и переданы на требуемое устройство, хост или сеть; 
- `DROP` - действие «сбрасывает» пакет. "Сброшенные" пакеты прекращают свое движение полностью; 
- `LOG` служит для журналирования отдельных пакетов и событий. В журнал могут заноситься заголовки IP пакетов и другая интересующая информация; 
- `MARK` используется для установки меток на определенные пакеты. Действие может выполняться в пределах таблицы **mangle**; 
- `QUEUE` - ставит пакет в очередь на обработку пользовательскому процессу. Оно может быть использовано для нужд учета, проксирования или дополнительной фильтрации пакетов; 
- `REDIRECT` - выполняет перенаправление пакетов и потоков на другой порт той же ЭВМ; 
- `REJECT` - используется, как правило, в тех же самых ситуациях, что и `DROP`, но в отличие от нее, команда 'REJECT` выдает сообщение об ошибке на хост, передавший пакет; 
- `RETURN` - прекращает движение пакета по текущей цепочке правил и производит возврат в вызывающую цепочку, если текущая цепочка была вложенной, или, если текущая цепочка лежит на самом верхнем уровне (например, `INPUT`), то к пакету будет применена политика *«по-умолчанию»*; 
- `SNAT` - используется для преобразования сетевых адресов, т.е. изменение исходящего IP адреса в IP заголовке пакета; 
- `TOS` используется для установки битов в поле *Type of Service* IP заголовка. Поле `TOS` содержит 8 бит, которые используются для маршрутизации пакетов; 
- `TTL` используется для изменения содержимого поля *Time To Live* в IP заголовке; 
- `ULOG` предоставляет возможность журналирования пакетов в пользовательское пространство. Оно заменяет традиционное действие `LOG`, базирующееся на системном журнале.

### 2.	Практическая часть
**Описание задачи**: требуется защитить web-сервер. Необходимо разрешить доступ к портам 80 и 22 и сделать перенаправление вызова с порта 8080 на 80. При попытке обратится к портам сервера, не описанным в операционной системе (ОС) как сервис, следует отказывать в обслуживании. При попытке обратится к портам, описанным в системе как сервисы, следует отказывать в обслуживании и заносить данные об этом в журнал. Для выполнения задания необходима следующая последовательность действий.

### 2.1	Определение политики по умолчанию
Определение политики по умолчанию для цепочек с учетом того, что все порты системы для должны быть закрыты для внешнего пользователя. Поскольку осуществляется фильтрация пакетов, их обработка будет производится в таблице **filter**. Используем ключ `–P` чтобы задать политику по умолчанию. Зададим правило для входящих пакетов (цепочка `INPUT`). Действие для обработки политики по умолчанию `LOG` (журналирование запроса). Поскольку политика по умолчанию определяется для всех портов, критерии проверки опускаются. 

```ssh
# iptables -P INPUT ACCEPT
# iptables -A INPUT -j LOG
```

Определим также политику «по-умолчанию» для исходящих пакетов с разрешением всем исходящим IP-пакетам беспрепятственно проходить фильтрацию. Для определения заданной политики по умолчанию необходимо выполнить в консоли

```ssh
# iptables –P OUTPUT ACCEPT         
```

### 2.2 Добавление правил для портов 22 и 80
Осуществляется командой, в которой для заданных критериев применено действие ACCEPT, то есть пакет будет пропущен брэндмауэром.

```ssh
# iptables –A INPUT –p tcp ––dport 22 –j ACCEPT
# iptables –A INPUT –p tcp ––dport 80 –j ACCEPT
```

### 2.3 Добавление правила для порта 8080. Переадресация с порта 8080 на порт 80
Поскольку происходит преобразование адреса назначения, используем таблицу **nat**. Критерии для применения этого правила: `–p tcp ––dport 8080`. Изменение получателя осуществляется в цепочке `PREROUTING`. Правило для переадресации – `REDIRECT`, которое имеет дополнительный ключ для определения порта переадресации `––to-ports`. Зададим перенаправление на порт `80`. Таким образом для определения последнего правила, необходимо ввести в командной строке:

```ssh
# iptables -t nat -I PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
```

После выполнения команд правила для цепочек сформированы и необходимо осуществить проверку правильности их занесения и работы. Просмотреть созданные правила для всех цепочек можно после выполнения команды:

```ssh
# iptables –S
# iptables –t nat -S
```

Пример первой выполненной команды:

```ssh
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -j LOG
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
-A TCP -p tcp -m tcp --dport 80 -j ACCEPT
```

Проверка правильности настройки защиты web-сервера на основе **iptables** осуществляется проведением проверки доступных для подключения портов на сервере. Для получения открытых для подключения портов следует воспользоваться сканером портов **nmap** и выполнить следующую инструкция в командной строке.

Проверьте, что на компьютере установлен nmap, выполнив команду:

```ssh
$ nmap
```

Если система выдала ошибку, что такой программы нет, необходимо установить nmap:

```ssh
# apt-get update
# apt-get install nmap
```

Запуск команды сканирования портов:

```ssh
$ nmap localhost
```

Вывод команды покажет какие порты на данный момент открыты в системе. Пример:

```ssh
Starting Nmap 7.01 ( https://nmap.org ) at 2017-10-10 04:54 PDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000065s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
```

Для сброса настроек iptables в изначальное состояние:

```ssh
# iptables –F
# iptables –t nat -F
```

### 3.	Задание
Необходимо сделать перенаправление вызова с соответствующих портов. 

Для начала потребуется установить дополнительные пакеты

```ssh
apt-get update
apt install -y screen python3-pip
pip install simple-http-server
```

Утилита `screen` позволяет создавать независимые окна терминала:
- `screen -S name` - создание окна терминала с идентификатором `name` и переход в него;
- `screen -r name` - переход в окно терминала `name`;
- `screen kill name` - удаление окна терминала `name`;
- `screen -ls` - список созданных окон.

Комбинация клавиш `Ctrl+A+D` выйти в главное окно терминала.

Для проверки доступа по указанному порту, в новом окне терминала выполните следующую команду (вместо слова `port` укажите номер порта, согласно варианту):

```ssh
$ screen -S server
$ python –m http.server port
```

После запуска команды, в браузере необходимо проверить доступность вашего сервера, для этого наберите строку ip_adress:port (к примеру 127.0.0.1:8081 для первого варианта). Или обратиться можно на внешний интерфейс, его можно узнать, выполнив команду
$ ifconfig

В браузере вы увидите страничку с файловой системой:

 

Это означает, что порт открыт и вы можете получить доступ к запущенному Web-server. После запуска запустите команду nmap и посмотрите, какие порты открыты сейчас.

После внесения правила перенаправления, проверьте доступность вашего сервера в браузере, перейдя по адресу: ip_adress:redirect_port (к примеру, 127.0.0.1:81 для второго варианта.)

Повторно запустите команду nmap и проверьте вывод.


Варианты:
№ Бригады	Порт доступа	Порт с которого перенаправляются запросы	Порт на которые перенаправляются запросы
Бригада 1	8081	8081	80
Бригада 2	8079	8079	81
Бригада 3	8078	8078	82
Бригада 4	8077	8077	83
Бригада 5	8076	8076	84
Бригада 6	8075	8075	85
Бригада 7	8074	8074	86
Бригада 8	8073	8073	87
Бригада 9	8072	8072	88
Бригада 10	8071	8071	89




Лабораторная работа разделена на две части:
1. [Подсистема разграничения доступа в ОС Linux](assets/lab1-1.pdf)
2. [Создание криптографических ключей и управление ими](assets/lab1-2.pdf)

Выполняются лабораторные работы на сервере:
```sh
10.5.143.103:PORT
```
Порт подключения у каждого студента индивидуальный:

- [A-01м-22](assets/A-01m-22.pdf)
- [A-02м-22](assets/A-02m-22.pdf)

<details>
    <summary>*алгоритм выполнения пункта 2.1 из второй части лабораторной работы</summary>
    <image src="assets/Example%202.1.jpg">
</details>


### Содержание отчёта:
- Титульный лист
- "Выполнение 1 части"
    - Краткое описание проделанной работы
    - Скриншоты результатов выполнения нижеперечисленных команд в домашнем каталоге пользователя student и их описание
        ```sh
        ps aux
        find ~ -ls
        ```
- "Выполнение 2 части"
    - Скриншот успешной авторизации с помощью PuTTY (ПК -> Сервер) и описание к нему
    - Скриншот успешной авторизации с помощью SSH (Свой сервер -> Сервер соседа) и описание к нему