Добавить в корзинуПозвонить
Найти в Дзене

настройка dhcp alt linux 2026

# Информация по сети ### Схема сети: <details> <summary>НАЖМИ</summary> <img width="541" height="532" alt="image" src="https://github.com/user-attachments/assets/e9735d52-ddad-4bfa-8791-efee06bacbbe" /> </details> ### Таблица устройств: | Название устройства | ОС | FQDN | |:-|:-|:-| | ISP (интерфейс в сторону HQ-RTR) | Alt Server | isp.au-team.irpo | | ISP (интерфейс в сторону BR-RTR) | Alt Server | isp.au-team.irpo | | HQ-RTR | EcoRouter/Alt | hq-rtr.au-team.irpo | | BR-RTR | EcoRouter/Alt | br-rtr.au-team.irpo | | HQ-SRV | Alt Server | hq-srv.au-team.irpo | | BR-SRV | Alt Server | br-srv.au-team.irpo | | HQ-CLI | Alt Workstation| hq-cli.au-team.irpo | | Название устройства | IP-адрес | |:-|:-| | ISP - HQ-RTR | 172.16.1.1/28 | | ISP - BR-RTR | 172.16.2.1/28| | ISP - Internet | dhcp | | HQ-RTR - ISP | 172.16.1.2/28 | | BR-RTR - ISP | 172.16.2.2/28 | |HQ-RTR - LAN | 192.168.1.1/26 | |BR-RTR - LAN | 192.168.2.1/28 | |HQ-SRV | 192.168.1.62/26 | |BR-SRV | 192.168.2.14/28 | | HQ-CLI | 192

# Информация по сети

### Схема сети:

<details>

<summary>НАЖМИ</summary>

<img width="541" height="532" alt="image" src="https://github.com/user-attachments/assets/e9735d52-ddad-4bfa-8791-efee06bacbbe" />

</details>

### Таблица устройств:

| Название устройства | ОС | FQDN |

|:-|:-|:-|

| ISP (интерфейс в сторону HQ-RTR) | Alt Server | isp.au-team.irpo |

| ISP (интерфейс в сторону BR-RTR) | Alt Server | isp.au-team.irpo |

| HQ-RTR | EcoRouter/Alt | hq-rtr.au-team.irpo |

| BR-RTR | EcoRouter/Alt | br-rtr.au-team.irpo |

| HQ-SRV | Alt Server | hq-srv.au-team.irpo |

| BR-SRV | Alt Server | br-srv.au-team.irpo |

| HQ-CLI | Alt Workstation| hq-cli.au-team.irpo |

| Название устройства | IP-адрес |

|:-|:-|

| ISP - HQ-RTR | 172.16.1.1/28 |

| ISP - BR-RTR | 172.16.2.1/28|

| ISP - Internet | dhcp |

| HQ-RTR - ISP | 172.16.1.2/28 |

| BR-RTR - ISP | 172.16.2.2/28 |

|HQ-RTR - LAN | 192.168.1.1/26 |

|BR-RTR - LAN | 192.168.2.1/28 |

|HQ-SRV | 192.168.1.62/26 |

|BR-SRV | 192.168.2.14/28 |

| HQ-CLI | 192.168.1.3/26 |

# Модуль 1

## Произведите базовую настройку устройств

<details>

<summary>ЗАДАНИЕ</summary>

Произведите базовую настройку устройств:

• Настройте имена устройств согласно топологии. Используйте полное доменное имя

• На всех устройствах необходимо сконфигурировать IPv4:

• IP-адрес должен быть из приватного диапазона, в случае, если сеть локальная, согласно RFC1918

• Локальная сеть в сторону HQ-SRV(VLAN 100) должна вмещать не более 32 адресов

• Локальная сеть в сторону HQ-CLI(VLAN 200) должна вмещать не менее 16 адресов

• Локальная сеть для управления(VLAN 999) должна вмещать не более 8 адресов

• Локальная сеть в сторону BR-SRV должна вмещать не более 16 адресов

• Сведения об адресах занесите в таблицу 2, в качестве примера используйте Прил_3_О1_КОД 09.02.06-3-2026-М1

</details>

<details>

<summary>НАЖМИ</summary>

Зайти под рута можно с помощью команды:

```

sudo su - или sudo -i

```

На не настроенных виртуалках зайти под рута можно только с помощью смены консоли (ctrl+alt+f2) или с помощью команды:

```

su

```

### Команда su дает лишь полномочия рута, но находимся мы после ввода данной команды все еще под обычным юзером, что ограничивает наш функционал

• Настройте имена устройств согласно топологии. Используйте полное

доменное имя

```

cd /etc

vim hostname

```

### У Linux есть несколько виртуальных консолей, которые переключаются по Ctrl+Alt+F*.

Если не нужна графика можно отключить ее автозагрузку:

```

systemctl set-default multi-user.target

```

Для включения:

```

systemctl set-default graphical.target

```

Запустить графику можно через команду:

```

startx

```

</details>

## На всех устройствах необходимо сконфигурировать IPv4

<details>

<summary>ЗАДАНИЕ</summary>

• IP-адрес должен быть из приватного диапазона, в случае, если сеть

локальная, согласно RFC1918 (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12)

• Локальная сеть в сторону HQ-SRV(VLAN 100) должна вмещать не

более 32 адресов

• Локальная сеть в сторону HQ-CLI(VLAN 200) должна вмещать не

менее 16 адресов

• Локальная сеть для управления(VLAN 999) должна вмещать не

более 8 адресов

• Локальная сеть в сторону BR-SRV должна вмещать не более 16

адресов

• Сведения об адресах занесите в таблицу 2, в качестве примера

используйте Прил_3_О1_КОД 09.02.06-3-2026-М1

</details>

<details>

<summary>НАЖМИ</summary>

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

```

ip link show

```

Далее необходимо создать директорию по пути

```

mkdir /etc/net/ifaces/ens36

mkdir /etc/net/ifaces/ens37

mkdir /etc/net/ifaces/ens38

```

### не забываем про ipv4address(ip адрес) и ipv4route (шлюз)

Скопировать Options можно из ens33:

```

cp /etc/net/ifaces/ens33/options /etc/net/ifaces/ens37/options

```

Для выхода в интернет (ISP):

<img width="270" height="159" alt="image" src="https://github.com/user-attachments/assets/a8606f4f-b1dd-40bb-8e09-348c927a063c" />

Для локалки:

<img width="245" height="148" alt="image" src="https://github.com/user-attachments/assets/729d645d-c53c-4f88-bf1d-37cbf12e3596" />

ipv4address:

<img width="178" height="81" alt="image" src="https://github.com/user-attachments/assets/0614dc79-f4d1-4072-a885-0d84ad72a7f0" />

ipv4route(на HQ-RTR и BR-RTR тоже настраиваем):

<img width="223" height="27" alt="image" src="https://github.com/user-attachments/assets/6af8381c-3ec2-4a49-9efe-2d3cf6ac7eb3" />

Для того чтобы при перезапуске не сбрасывался адреса устройства необходимо в директории /etc/systemd/system создать файл сервиса:

1) network-restart.timer:

```

cd /etc/systemd/system

cat > /etc/systemd/system/network-restart.timer << 'EOF'

[Unit]

Description=Restart Network Timer

[Timer]

OnStartupSec=10s

Unit=network-restart.service

[Install]

WantedBy=timers.target

EOF

cat > /etc/systemd/system/network-restart.service << 'EOF'

[Unit]

Description=Restart Network Service

[Service]

Type=oneshot

ExecStart=/bin/systemctl restart network

[Install]

WantedBy=multi-user.target

EOF

```

Необходимо удалить лишние пробелы из файла:

<img width="854" height="629" alt="image" src="https://github.com/user-attachments/assets/f3600880-ed55-411c-ba35-6cec5399d96d" />

Чтобы запустить службу прописываем:

```

systemctl enable network-restart.timer

```

Прописываем днс на всех адаптера - файл /etc/net/ifaces/ens33/resolv.conf:

```

nameserver 8.8.8.8

```

### Итоговая таблица:

| Имя устройства | IP-адрес | Шлюз по умолчанию |

|:-|:-|:-|

| BR-SRV | 192.168.2.14/28 | 192.168.2.1 |

| BR-RTR | 172.16.2.2/28 | 172.16.2.1 |

| BR-RTR | 192.168.1.2/28 | - |

| HQ-RTR | 172.16.1.2/28 | 172.16.1.1 |

| HQ-RTR | 192.168.1.1/26 | - |

| HQ-SRV | 192.168.1.62/26 | 192.168.1.1 |

| HQ-CLI | DHCP/192.168.1.3/26 | 192.168.1.1 |

| ISP | 172.16.1.1/28 | - |

| ISP | 172.16.2.1/28 | - |

| ISP | dhcp | - |

</details>

## Настройте доступ к сети Интернет, на маршрутизаторах ISP, HQ-RTR, BR-RTR

<details>

<summary>ЗАДАНИЕ</summary>

Настройте адресацию на интерфейсах:

• Интерфейс, подключенный к магистральному провайдеру, получает

адрес по DHCP

• Настройте маршрут по умолчанию, если это необходимо

• Настройте интерфейс, в сторону HQ-RTR, интерфейс подключен к сети

172.16.1.0/28

• Настройте интерфейс, в сторону BR-RTR, интерфейс подключен к сети

172.16.2.0/28

• На ISP настройте динамическую сетевую трансляцию портов для

доступа к сети Интернет HQ-RTR и BR-RTR.

</details>

<details>

<summary>НАЖМИ</summary>

Откройте файл /etc/sysctl.conf и добавьте строку:

```

net.ipv4.ip_forward=1

```

Отредактируйте строчку в файле /etc/net/sysctl.conf:

```

net.ipv4.ip_forward=1

```

Пропишите команду для настройки динамической трансляции адресов (ens33 - смотрит в WAN, ens37 - LAN):

```

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables -A FORWARD -i ens37 -o ens33 -j ACCEPT

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sysctl -p

```

Далее необходимо сохранить настройки:

```

mkdir /etc/iptables

iptables-save>/etc/iptables/rules.v4

```

Для того чтобы после перезагрузки роутера не сбрасывались настройки необходимо прописать systemd-юнит (директория /etc/systemd/system)

iptables-restore.service:

```

cd /etc/systemd/system

cat > /etc/systemd/system/iptables-restore.service << 'EOF'

[Unit]

Description=Restore iptables rules

Before=network.target

[Service]

Type=oneshot

ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4

[Install]

WantedBy=multi-user.target

EOF

```

### Убираем пробелы как в предыдущем пункте.

Далее необходимо включить юнит:

```

systemctl enable iptables-restore.service

systemctl start iptables-restore.service

```

Далее необходимо запустить iptables:

```

systemctl enable iptables

systemctl start iptables

```

Если не запустился, то вставляем в конфиг /etc/sysconfig/iptables минимальную конфигурацию и пытаемся опять запустить:

```

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

COMMIT

*nat

:PREROUTING ACCEPT [0:0]

:INPUT ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

COMMIT

```

Если iptables не запускается проверяем файл конфигурации на ошибки:

```

iptables-restore -t /etc/sysconfig/iptables

```

Если интернет на хостах не появился, еще раз прописываем:

```

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

```

</details>

## Создайте локальные учетные записи

<details>

<summary>ЗАДАНИЕ</summary>

Создайте пользователя remote_user на HQ-SRV и BR-SRV

• Пароль пользователя sshuser с паролем P@ssw0rd

• Идентификатор пользователя 2026

• Пользователь sshuser должен иметь возможность запускать sudo без

ввода пароля

• Создайте пользователя net_admin на маршрутизаторах HQ-RTR и BR

RTR

• Пароль пользователя net_admin с паролем P@ssw0rd

• При настройке ОС на базе Linux, запускать sudo без ввода пароля

• При настройке ОС отличных от Linux пользователь должен обладать

максимальными привилегиями.

</details>

<details>

<summary>НАЖМИ</summary>

### HQ-SRV и BR-SRV

Создаем пользователя remote_user с идентификатором 2026:

```

useradd -u 2026 remote_user

```

Идентификатор можно посмотреть с помощью команды id remote_user, либо в файле /etc/passwd

Задаем пароль:

```

passwd remote_user

```

Добавляем в группу sudo:

```

usermod -aG wheel remote_user

```

Для того чтобы при выполнении команды sudo не запрашивался пароль необходимо отредактировать файл /etc/sudoers. Вписываем:

```

remote_user ALL=(ALL) NOPASSWD: ALL

```

### HQ-RTR и BR-RTR

Создаем пользователя net_admin:

```

useradd net_admin

```

Задаем пароль:

```

passwd net_admin

```

Добавляем в группу sudo:

```

usermod -aG wheel net_admin

```

Для того чтобы при выполнении команды sudo не запрашивался пароль необходимо отредактировать файл /etc/sudoers. Вписываем:

```

net_admin ALL=(ALL) NOPASSWD: ALL

```

</details>

## Настройте коммутацию в сегменте HQ (VLAN. Не делал):

<details>

<summary>ЗАДАНИЕ</summary>

Трафик HQ-SRV должен принадлежать VLAN 100

• Трафик HQ-CLI должен принадлежать VLAN 200

• Предусмотреть возможность передачи трафика управления в VLAN 999

• Реализовать на HQ-RTR маршрутизацию трафика всех указанных VLAN

с использованием одного сетевого адаптера ВМ/физического порта

• Сведения о настройке коммутации внесите в отчёт

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем nmtui:

```

apt-get install NetworkManager-tui

```

По необходимости прописываем днс в /etc/net/ifaces/ens33/resolv.conf

```

nameserver 8.8.8.8

```

Запускаем nmtui:

```

systemctl start NetworkManager

systemctl status NetworkManager

```

Настройки для VLAN100 на HQ-RTR:

<img width="739" height="553" alt="image" src="https://github.com/user-attachments/assets/dd101b5b-d419-493f-8f4b-e8a0ea870f8b" />

На клиенте редачим файл /etc/net/interfaces:

```

auto ens33

iface ens33 inet manual

up ip link set ens33 up

auto ens33.100

iface ens33.100 inet static

address 192.168.1.30/27

gateway 192.168.1.1

dns-nameservers 8.8.8.8

vlan-raw-device ens33

```

</details>

## Настройте безопасный удаленный доступ на серверах HQ-SRV и BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Для подключения используйте порт 2026

• Разрешите подключения исключительно пользователю sshuser

• Ограничьте количество попыток входа до двух

• Настройте баннер «Authorized access only».

</details>

<details>

<summary>НАЖМИ</summary>

Создаем пользователя для ssh:

```

useradd -m -s /bin/bash sshuser

passwd sshuser

```

Редактируем конфиг /etc/openssh/sshd_config(можно либо просто вписать эти строчки, либо найти и раскоментить их, в теории они все должны быть в конфиге):

```

Port 2026

AllowUsers sshuser

MaxAuthTries 2

Banner /etc/openssh/banner

PermitRootLogin no

Protocol 2

```

Создаем баннер по пути который указывали в конфиге: /etc/openssh/banner:

```

***********************************************

* Authorized access only *

* VHOD TOL'KO DLYA KRUTIH *

***********************************************

```

Прописываем правила для ssh в iptables на всех роутерах:

```

iptables -A INPUT -p tcp --dport 2026 -j ACCEPT

sysctl -p

iptables-save>/etc/iptables/rules.v4

```

Проверяем конфиг на ошибки:

```

sshd -t

```

Если ошибок нет запускаем sshd:

```

systemctl restart sshd

```

Добавляем ssh на новый порт в автозагрузку SELinux (для альта обычно не нужно, но на всякий пропишем):

```

semanage port -a -t ssh_port_t -p tcp 2026 2>/dev/null || true

```

Подключаемся:

```

ssh -p 2026 sshuser@192.168.1.62

```

</details>

## Между офисами HQ и BR, на маршрутизаторах HQ-RTR и BR-RTR необходимо сконфигурировать ip туннель

<details>

<summary>ЗАДАНИЕ</summary>

На выбор технологии GRE или IP in IP

• Сведения о туннеле занесите в отчёт.

</details>

<details>

<summary>НАЖМИ</summary>

Создаем директорию для туннеля:

```

mkdir /etc/net/ifaces/tun1

```

Редактируем файл /etc/net/ifaces/tun1/options следующим образом (HQ-RTR):

```

TUNLOCAL=172.16.1.2

TUNREMOTE=172.16.2.2

TUNTYPE=gre

TYPE=iptun

TUNTTL=64

TUNMTU=1476

TUNOPTIONS='ttl 64'

DISABLE=no

```

BR-RTR:

```

TUNLOCAL=172.16.2.2

TUNREMOTE=172.16.1.2

TUNTYPE=gre

TYPE=iptun

TUNTTL=64

TUNMTU=1476

TUNOPTIONS='ttl 64'

DISABLE=no

```

Здесь TUNLOCAL - IP адресс адаптера в сторону ISP на настраиваемом роутере, TUNREMOTE на другом роутере.

Задаем IP адрес:

```

echo 10.10.10.1/30 > /etc/net/ifaces/tun1/ipv4address

```

Перезагружаем сеть:

```

systemctl restart network

```

</details>

## Обеспечьте динамическую маршрутизацию на маршрутизаторах HQ-RTR и BR-RTR

<details>

<summary>ЗАДАНИЕ</summary>

сети одного офиса должны быть доступны из другого

офиса и наоборот. Для обеспечения динамической маршрутизации

используйте link state протокол на усмотрение участника:

• Разрешите выбранный протокол только на интерфейсах ip туннеля

• Маршрутизаторы должны делиться маршрутами только друг с другом

• Обеспечьте защиту выбранного протокола посредством парольной

защиты

• Сведения о настройке и защите протокола занесите в отчёт.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем frr:

```

apt-get install frr -y

```

Включаем OSPF в конфиге /etc/frr/daemons:

<img width="863" height="684" alt="image" src="https://github.com/user-attachments/assets/889ab48a-5ad0-45ea-ae7e-e93045da4910" />

Запускаем frr:

```

systemctl enable --now frr

```

Переходим в консоль frr:

```

vtysh

```

Настраиваем настройки в терминале:

```

conf t

router ospf

passive-interface default

network 192.168.1.0/26 area 0

network 192.168.2.0/28 area 0

network 10.10.10.0/30 area 0

area 0 authentication

exit

```

Настраиваем интерфейсы(туннель)(все там же):

```

interface tun1

no ip ospf network broadcast

no ip ospf passive

ip ospf authentication

ip ospf authentication-key password

exit

do wr

```

Перезапускаем frr:

```

systemctl restart frr

```

Проверяем конфиг /etc/frr/frr.conf:

<img width="995" height="654" alt="image" src="https://github.com/user-attachments/assets/2b8595f1-2102-46b9-bea6-acf70527605a" />

Проверить можно либо пингом либо:

```

vtysh

show ip ospf route

```

<img width="498" height="220" alt="image" src="https://github.com/user-attachments/assets/f7df5030-7a98-4561-a69c-ba35601ba708" />

## Настраиваем доступ к ISP:

Прописываем маршруты на ISP:

```

echo "192.168.1.0/26 via 172.16.1.2" > /etc/net/ifaces/ens38/ipv4route

echo "192.168.2.0/28 via 172.16.2.2" > /etc/net/ifaces/ens37/ipv4route

```

Прописываем Iptables на HQ-RTR, BR-RTR:

```

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables -t nat -A POSTROUTING -o ens33 ! -d 172.16.0.0/12 -j MASQUERADE

iptables-save > /etc/iptables/rules.v4

```

</details>

## Настройка динамической трансляции адресов маршрутизаторах HQ-RTR и BR-RTR

<details>

<summary>НАЖМИ</summary>

### Делали раннее, если не делали, то настройки как на ISP

</details>

## Настройте протокол динамической конфигурации хостов для сети в сторону HQ-CLI

<details>

<summary>ЗАДАНИЕ</summary>

Настройте нужную подсеть

• В качестве сервера DHCP выступает маршрутизатор HQ-RTR

• Клиентом является машина HQ-CLI

• Исключите из выдачи адрес маршрутизатора

• Адрес шлюза по умолчанию – адрес маршрутизатора HQ-RTR

• Адрес DNS-сервера для машины HQ-CLI – адрес сервера HQ-SRV

• DNS-суффикс – au-team.irpo

• Сведения о настройке протокола занесите в отчёт.

</details>

<details>

<summary>НАЖМИ</summary>

Указываем сетевой интерфейс, через который будет работать DHCP-сервер:

```

vim /etc/sysconfig/dhcpd

```

<img width="567" height="147" alt="image" src="https://github.com/user-attachments/assets/cd9ea117-b1f3-43e2-afa7-785c9851fbd5" />

В директории /etc/dhcp/ создаем файл dhcpd.conf:

```

cd /etc/dhcp/

cp dhcpd.conf.example dhcpd.conf

```

Редактируем файл dhcpd.conf следующим образом:

<img width="564" height="204" alt="image" src="https://github.com/user-attachments/assets/e7392380-c2cd-48a2-8484-c4701e7ce6ca" />

Перезагружаем службу:

```

systemctl restart dhcpd

```

Чтобы служба включалась после перезапуска устройства можно добавить ее в systemd юнит следующим образом(редактируется служба /etc/systemd/system/network-restart.service):

![image](https://github.com/user-attachments/assets/e929cbfd-2d7e-49c1-9a27-db636dfb165c)

</details>

## Настройте инфраструктуру разрешения доменных имён для офисов HQ и BR

<details>

<summary>ЗАДАНИЕ</summary>

Основной DNS-сервер реализован на HQ-SRV

• Сервер должен обеспечивать разрешение имён в сетевые адреса

устройств и обратно в соответствии с таблицей 3

• В качестве DNS сервера пересылки используйте любой общедоступный

DNS сервер(77.88.8.7, 77.88.8.3 или другие)

</details>

<details>

<summary>НАЖМИ</summary>

Для начала необходимо отредактировать файл /etc/bind/options.conf:

```

listen-on { any; };

allow-query { any; };

```

```

systemctl restart network

```

Автозагрузка bind:

```

systemctl enable --now bind

```

Создаем прямую и обратную зону в /etc/bind/local.conf:

<img width="419" height="380" alt="image" src="https://github.com/user-attachments/assets/30bc355d-2f79-4716-a1ba-2d9f28f82a3a" />

Копируем дефолты:

```

cp /etc/bind/zone/{localhost,au-team.db}

cp /etc/bind/zone/127.in-addr.arpa /etc/bind/zone/1.168.192.in-addr.arpa.db

cp /etc/bind/zone/127.in-addr.arpa /etc/bind/zone/2.168.192.in-addr.arpa.db

```

Назначаем права:

```

chown root:named /etc/bind/zone/au-team.db

chown root:named /etc/bind/zone/1.168.192.in-addr.arpa.db

chown root:named /etc/bind/zone/2.168.192.in-addr.arpa.db

```

Настраиваем зону прямого просмотра /etc/bind/zone/au-team.db:

<img width="744" height="838" alt="image" src="https://github.com/user-attachments/assets/d6cb5a8a-96eb-4fe2-9559-647291c82d28" />

Настраиваем зону обратного просмотра /etc/bind/zone/1.168.192.in-addr.arpa.db:

<img width="758" height="845" alt="image" src="https://github.com/user-attachments/assets/4de28e52-66cc-4077-9ee8-fdbbd67084aa" />

Настраиваем зону обратного просмотра /etc/bind/zone/2.168.192.in-addr.arpa.db:

<img width="746" height="841" alt="image" src="https://github.com/user-attachments/assets/af184b7a-0496-4aca-a4e6-112a84e5d511" />

### ВАЖНО!!! Я добавил в зону прямого просмотра все устройства кроме ISP и сделал обратные зоны для всех устройств в подсетях 1.0 и 2.0.

Проверяем зоны:

```

named-checkconf -z

```

<img width="496" height="159" alt="image" src="https://github.com/user-attachments/assets/0d8a0f2e-da92-4e53-982e-a32460b5a80d" />

В файле /etc/hosts прописываем адрес сервера:

```

192.168.1.62 hq-srv.au-team.irpo hq-srv

```

<img width="863" height="690" alt="image" src="https://github.com/user-attachments/assets/edb3b0c9-a488-42db-9857-be7dfe9e338c" />

Чтобы днс заработал на клиентах необходимо добавить адрес сервера в resolv.conf. Это делается разными способами и зависит по всей видимости от типа ОС (сервер/воркстейшн) и (почему-то) от наличия графики. Конечной целью будет привести файл /etc/resolv.conf к следующему виду:

<img width="469" height="192" alt="image" src="https://github.com/user-attachments/assets/b0a24ce9-da6f-44b2-a966-a352c0568fbe" />

Это можно сделать разными способами:

### 1 способ:

В /etc/net/ifaces/ens33/resolv.conf прописываем:

```

search au.team.irpo

nameserver 192.168.1.62

```

И так делаем во всех интерфейсах (на HQ-SRV добавляем еще 8.8.8.8 или другой резолвер)

Перезагружаем сеть:

```

systemctl restart network

```

Если адрес сервера не появился то просто удаляем /etc/resolv.conf и прописываем туда тоже самое что и в resolv.conf на интерфейсах:

```

rm resolv.conf

rm resolv.conf~

```

### 2 способ (чаще работает):

В /etc может лежать файлик resolvconf.conf (как показывает практика работает он на ОС без графики). В нем указываем следующее:

<img width="1006" height="702" alt="image" src="https://github.com/user-attachments/assets/ab594bf8-3399-45b1-b5ad-89537df1cdf7" />

</details>

## Настройте часовой пояс на всех устройствах согласно месту проведения экзамена

<details>

<summary>НАЖМИ</summary>

Задавать часовой пояс будем с помощью утилию timedatetcl:

```

timedatectl set-timezone Europe/Moscow

timedatectl

```

Сами зоны расположены по пути /usr/share/zoneinfo/

</details>

# Модуль 2

## Настройте контроллер домена Samba DC на сервере BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Имя домена au-team.irpo

• Введите в созданный домен машину HQ-CLI

• Создайте 5 пользователей для офиса HQ: имена пользователей формата

hquser№ (например hquser1, hquser2 и т.д.)

• Создайте группу hq, введите в группу созданных пользователей

• Убедитесь, что пользователи группы hq имеют право

аутентифицироваться на HQ-CLI

• Пользователи группы hq должны иметь возможность повышать

привилегии для выполнения ограниченного набора команд: cat, grep, id.

Запускать другие команды с повышенными привилегиями пользователи

группы права не имеют.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем необходимые пакеты:

```

apt-get update && apt-get install task-samba-dc samba-client samba-winbind krb5-kinit -y

```

Переименовываем старый конфиг:

```

mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

```

Создаем домен:

```

samba-tool domain provision --use-rfc2307 --interactive

```

| Настройка | Значение|

|:-|:-|

|Realm | AU-TEAM.IRPO |

| Domain | AU-TEAM |

| Server Role | dc |

| DNS backend | SAMBA_INTERNAL |

|DNS forwarder | 192.168.1.62 |

| Administrator password | P@ssw0rd |

Скопируем файл кербероса в системную директорию:

```

cp /var/lib/samba/private/krb5.conf /etc/

```

Выключаем bind:

```

systemctl stop bind

systemctl disable bind

```

Запускаем самбу (сначала нужно ребутнуть сервер, иначе будут ошибки):

```

systemctl unmask samba

systemctl enable --now samba

```

Открываем порты в iptables (на роутерах):

```

iptables -A INPUT -p tcp -m multiport --dports 53,88,135,139,389,445,464,636 -j ACCEPT

iptables -A INPUT -p udp -m multiport --dports 53,88,123,137,138,389,464 -j ACCEPT

iptables-save > /etc/iptables/rules.v4

```

Проверяем домен на работоспособность:

```

samba-tool domain level show

samba-tool user list

```

<img width="701" height="268" alt="image" src="https://github.com/user-attachments/assets/c49c16db-22df-416f-92cb-d8f7a5d93565" />

Создаем группу hq:

```

samba-tool group add hq

```

Создаеми юзеров:

```

for i in {1..5}; do

samba-tool user create hquser$i 'P@ssw0rd'

samba-tool group addmembers hq hquser$i

done

```

Проверяем группу:

```

samba-tool group listmembers hq

```

<img width="428" height="111" alt="image" src="https://github.com/user-attachments/assets/8d022e52-ef35-4bc3-b473-9dc2cd3ba69a" />

### Далее необходимо завести машины в домен:

Проверяем /etc/resolv.conf:

```

search au-team.irpo

nameserver 192.168.2.14

nameserver 192.168.1.62

```

Проверяем доступность:

```

ping au-team.irpo

nslookup _ldap._tcp.au-team.irpo

```

Устанавливаем пакеты (Если при установке выбрали все что связано с доменами, то не нужно, если нет графики, то нужно):

```

apt-get install realmd sssd sssd-tools adcli krb5-workstation samba-common-tools

```

Заходим в центр управления системой:

<img width="724" height="475" alt="image" src="https://github.com/user-attachments/assets/585bda4f-6b83-4850-88ad-6258d6c5913c" />

Ищем кнопку аутентификация:

<img width="1233" height="704" alt="image" src="https://github.com/user-attachments/assets/81c96671-a630-4ab7-a3c5-52997d9acb4c" />

Вводим все как на скрине в Active Directory и жмем кнопку применить снизу, система попросит ввести учетку админа домена

<img width="699" height="243" alt="image" src="https://github.com/user-attachments/assets/a3d20dfd-2e58-4297-8f1f-111efa25542c" />

### на устройствах без графики:

После установки пакетов обнаруживаем домен:

```

realm discover au-team.irpo

```

Заходим в домен:

```

realm join -U Administrator au-team.irpo

```

### Настраиваем группу hq на hq-cli:

Задаем права на sudo:

```

chown root:root /usr/bin/sudo

chmod 4755 /usr/bin/sudo

ls -l /usr/bin/sudo

```

Вывод должен быть следующий:

<img width="487" height="44" alt="image" src="https://github.com/user-attachments/assets/26a66c8c-591e-47c4-bc9d-9f31fa7c308b" />

!!!Нужно обратить вниманию на букву s на 4 позиции!!!

Проверяем пути к командам:

```

which cat grep id

```

Редактируем /etc/sudoers:

```

%hq ALL=(ALL) /usr/bin/cat, /bin/grep, /usr/bin/id

```

Заходим под hquser1:

```

su - hquser1

```

Проверяем команды:

```

sudo cat /etc/hostname

sudo grep root /etc/passwd

sudo id

```

Если не работает, то в /etc/sudoers прописываем другие настройки (предыдущую строчку удалить):

```

Cmnd_Alias HQ_COMMANDS = /bin/cat, /bin/grep, /usr/bin/id

%hq ALL=(ALL) HQ_COMMANDS

```

</details>

## Сконфигурируйте файловое хранилище на сервере HQ-SRV

<details>

<summary>ЗАДАНИЕ</summary>

При помощи двух подключенных к серверу дополнительных дисков

размером 1 Гб сконфигурируйте дисковый массив уровня 0

• Имя устройства – md0, при необходимости конфигурация массива

размещается в файле /etc/mdadm.conf

• Создайте раздел, отформатируйте раздел, в качестве файловой системы

используйте ext4

• Обеспечьте автоматическое монтирование в папку /raid

</details>

<details>

<summary>НАЖМИ</summary>

Подключаем диски через Vmware:

<img width="342" height="310" alt="image" src="https://github.com/user-attachments/assets/36c77e6f-324c-475c-8cfd-dc4909c79dca" />

Устанавливаем mdadm:

```

apt-get install mdadm -y

```

Смотрим какие диски у нас имеются:

```

lsblk

```

<img width="619" height="147" alt="image" src="https://github.com/user-attachments/assets/c927e347-a2a6-41cf-a2ef-5d9dea7bb214" />

Далее создаем разделы у дисков:

```

cfdisk /dev/sdb

```

Выбираем gpt:

<img width="757" height="520" alt="image" src="https://github.com/user-attachments/assets/e6fda1aa-29c7-4b1c-b612-1fd0b35ef848" />

Жмем кнопку New:

<img width="1069" height="744" alt="image" src="https://github.com/user-attachments/assets/6d22b1a9-4e9a-4cb6-b68a-d3769d30f8e8" />

Выбираем максимальный размер:

<img width="1097" height="741" alt="image" src="https://github.com/user-attachments/assets/138f761c-3aab-4471-9556-db7347c3e6c9" />

Записываем изменения (рулить в утилите на стрелочки):

<img width="1096" height="750" alt="image" src="https://github.com/user-attachments/assets/5953107b-1436-4179-b8f1-bfc79883e76f" />

Полностью прописываем yes:

<img width="877" height="276" alt="image" src="https://github.com/user-attachments/assets/d7c400f2-fb05-4cf7-a307-fda30e30a49a" />

По итогу должно получиться так:

<img width="633" height="201" alt="image" src="https://github.com/user-attachments/assets/7ae1694f-065c-479d-92cc-def149e2df1b" />

Создаем массив md0 0 уровня:

```

mdadm --create --verbose /dev/md0 -l 0 -n 2 /dev/sdb1 /dev/sdc1

```

Проверяем:

<img width="656" height="213" alt="image" src="https://github.com/user-attachments/assets/b1c550d2-5b0b-43a1-8466-aaa8559a87eb" />

Создаем таблицу раздела:

```

mkfs -t ext4 /dev/md0

```

Сохраняем конфигураци:

```

mdadm --detail --scan --verbose /dev/md0 > /etc/mdadm.conf

```

Монтируем массив:

```

echo '/dev/md0 /raid ext4 defaults 0 0' >> /etc/fstab

mkdir /raid

mount /dev/md0 /raid

```

Проверяем массив:

```

df -h

cat /proc/mdstat

```

<img width="749" height="213" alt="image" src="https://github.com/user-attachments/assets/e4cab274-eae9-4971-bbbc-4ff5427228c7" />

<img width="436" height="107" alt="image" src="https://github.com/user-attachments/assets/cd69c065-0d88-4f8d-af22-d437c081fd42" />

</details>

## Настройте сервер сетевой файловой системы (nfs) на HQ-SRV

<details>

<summary>ЗАДАНИЕ</summary>

В качестве папки общего доступа выберите /raid/nfs, доступ для чтения и записи исключительно для сети в сторону HQ-CLI

• На HQ-CLI настройте автомонтирование в папку /mnt/nfs

• Основные параметры сервера отметьте в отчёте

</details>

<details>

<summary>НАЖМИ</summary>

### На сервере:

Создаем папку в /raid:

```

mkdir /raid/nfs

```

Скачиваем nfs:

```

apt-get install nfs-utils

```

В файле /etc/exports добавляем строчку:

```

/raid/nfs 192.168.1.0/26(rw,sync,no_root_squash,subtree_check)

```

Запускаем nfs:

```

systemctl enable --now nfs-server

```

Проверяем появилась ли папка:

```

exportfs

```

<img width="271" height="62" alt="image" src="https://github.com/user-attachments/assets/491f2649-93c5-4de1-91ed-91636d116fbd" />

Если не появилась - еще раз ребутаем nfs.

### На клиенте:

Устанавливаем nfs:

```

nfs-utils

```

Создаем папку:

```

mkdir /mnt/nfs

```

Монтируем папку:

```

mount -t nfs 192.168.1.62:/raid/nfs /mnt/nfs

```

Настраиваем автоматическое монтирование:

```

echo '192.168.1.62:/raid/nfs /mnt/nfs nfs auto 0 0 ' >> /etc/fstab

```

</details>

## Настройте службу сетевого времени на базе сервиса chrony на маршрутизаторе ISP

<details>

<summary>ЗАДАНИЕ</summary>

Вышестоящий сервер ntp на маршрутизаторе ISP - на выбор участника

• Стратум сервера - 5

• В качестве клиентов ntp настройте: HQ-SRV, HQ-CLI, BR-RTR, BR-SRV.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем Chrony:

```

apt-get install chrony -y

```

Редактируем Файл /etc/chrony.conf:

```

server 127.0.0.1 iburst prefer

local stratum 5

allow 192.168.1.0/26

allow 192.168.2.0/28

```

Должно выглядеть так:

<img width="852" height="228" alt="image" src="https://github.com/user-attachments/assets/14fe6b26-2773-47d9-afcd-d3155e7efc76" />

Перезазгружаем Chrony:

```

systemctl restart chronyd

```

### На клиенте:

Устанавливаем Chrony:

```

apt-get install chrony -y

```

Редачим /etc/chrony.conf (192.168.189.131 - IP на ISP который смотрит в сеть):

```

server 192.168.189.131 iburst

```

Перезапускаем Chrony:

```

systemctl restart chronyd

```

Проверяем:

```

chronyc sources

```

Если стратум не 5, то можно попробовать поставить ntp вместо chrony:

```

apt-get install ntp

vim /etc/ntp.conf

```

Указываем:

```

server 127.127.1.0

server ntp2.vniiftri.ru iburst

fudge 127.127.1.0 stratum 5

restrict 192.168.11.0 mask 255.255.255.0 nomodify notrap

restrict 192.168.33.0 mask 255.255.255.0 nomodify notrap

```

Запускаем и проверяем:

```

systemctl enable ntp

systemctl start ntp

ntpq -p

```

</details>

## Сконфигурируйте ansible на сервере BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Сформируйте файл инвентаря, в инвентарь должны входить HQ-SRV, HQ-CLI, HQ-RTR и BR-RTR

• Рабочий каталог ansible должен располагаться в /etc/ansible

• Все указанные машины должны без предупреждений и ошибок отвечать

pong на команду ping в ansible посланную с BR-SRV.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем Ansible:

```

apt-get install ansible -y

```

Генерируем ключи для беспарольной авторизации, которые будут расположены в /home/sshuser/.ssh:

```

ssh-keygen

```

Отправляем открытый ключ на другие хосты (Для начала необходимо настроить ssh где не настроен):

```

ssh-copy-id -p 2026 sshuser@192.168.1.62

ssh-copy-id -p 2026 sshuser@192.168.1.3

ssh-copy-id -p 2026 sshuser@192.168.2.1

ssh-copy-id -p 2026 sshuser@192.168.1.1

```

Создаем файл инвентаря и вносим туда хосты /etc/ansible/hosts:

```

[hq]

HQ-SRV ansible_host=192.168.1.62 ansible_port=2026 ansible_user=sshuser ansible_python_interpreter=/usr/bin/python3

HQ-CLI ansible_host=192.168.1.3 ansible_port=2026 ansible_user=sshuser ansible_python_interpreter=/usr/bin/python3

HQ-RTR ansible_host=192.168.1.1 ansible_port=2026 ansible_user=sshuser ansible_python_interpreter=/usr/bin/python3 ansible_connection=local

[br]

BR-RTR ansible_host=192.168.2.1 ansible_port=2026 ansible_user=sshuser ansible_python_interpreter=/usr/bin/python3

```

### Если будут возникать ошибки формата как на скрине, то каждому хосту прописываем параметр ansible_connection=local:

<img width="1703" height="525" alt="image" src="https://github.com/user-attachments/assets/6ca8ad75-4aa3-4d79-951a-e93fb83f14c0" />

Редактируем конфиг /etc/ansible/ansible.cfg:

```

[defaults]

interpreter_python=auto_silent

log_path = /home/sshuser/ansible.log

```

Проверяем работоспособность:

```

ansible all -m ping

```

</details>

## Разверните веб приложение в docker на сервере BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Средствами docker должен создаваться стек контейнеров с веб приложением и базой данных

• Используйте образы site_latestи mariadb_latestрасполагающиеся в директории docker в образе Additional.iso

• Основной контейнер testapp должен называться tespapp

• Контейнер с базой данных должен называться db

• Импортируйте образы в docker, укажите в yaml файле параметры подключения к СУБД, имя БД - testdb, пользователь testс паролем P@ssw0rd, порт приложения 8080, при необходимости другие параметры

• Приложение должно быть доступно для внешних подключений через порт 8080

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем Docker:

```

apt-get install docker-ce docker-compose -y

```

Запускаем Docker:

```

systemctl enable --now docker

```

Прооверяем работоспособность:

```

docker run hello-world

```

Создаем директорию для монтирования образа:

```

mkdir -p /mnt/iso

```

Создаем site_latest:

```

mkdir -p ~/docker-site

cd ~/docker-site

```

Создаем файл index.php и прописываем в нем:

```

<?php

echo "<h1>Test Application</h1>";

echo "<h2>Connection to Database:</h2>";

$host = getenv('DB_HOST') ?: 'db';

$dbname = getenv('DB_NAME') ?: 'testdb';

$user = getenv('DB_USER') ?: 'test';

$pass = getenv('DB_PASSWORD') ?: 'P@ssw0rd';

try {

$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);

echo "<p style='color: green;'>Connected to MariaDB successfully!</p>";

// Create test table

$pdo->exec("CREATE TABLE IF NOT EXISTS test (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255))");

echo "<p>Test table created/checked</p>";

// Insert test data

$stmt = $pdo->prepare("INSERT INTO test (message) VALUES (?)");

$stmt->execute(['Hello from Docker!']);

echo "<p>Test data inserted</p>";

// Read test data

$result = $pdo->query("SELECT * FROM test");

echo "<h3>Database entries:</h3><ul>";

while ($row = $result->fetch()) {

echo "<li>" . htmlspecialchars($row['message']) . "</li>";

}

echo "</ul>";

} catch (PDOException $e) {

echo "<p style='color: red;'>Connection failed: " . $e->getMessage() . "</p>";

}

echo "<p>App port: " . (getenv('APP_PORT') ?: '8080') . "</p>";

phpinfo();

?>

```

Создаем Dockerfile и прописываем в нем:

```

FROM php:7.4-apache

# Install PHP extensions for MariaDB/MySQL

RUN docker-php-ext-install pdo_mysql mysqli

# Copy application files

COPY index.php /var/www/html/

COPY info.php /var/www/html/

# Set working directory

WORKDIR /var/www/html

# Configure Apache

RUN a2enmod rewrite

# Expose port

EXPOSE 8080

# Modify apache to use port 8080

RUN sed -i 's/80/8080/g' /etc/apache2/sites-available/000-default.conf

RUN sed -i 's/80/8080/g' /etc/apache2/ports.conf

# Start Apache

CMD ["apache2-foreground"]

```

Создаем info.php и прописываем в нем:

```

<?php

phpinfo();

?>

```

Собираем образ веб-приложения:

```

docker build -t site_latest .

```

Скачиваем MariaDB:

```

docker pull mariadb:10.5

```

Создаем образ:

```

docker tag mariadb:10.5 mariadb_latest

```

Создаем docker-compose.yml командой:

```

cat > docker-compose.yml << 'EOF'

version: '3.8'

services:

db:

image: mariadb_latest

container_name: db

restart: unless-stopped

environment:

MYSQL_ROOT_PASSWORD: rootpassword

MYSQL_DATABASE: testdb

MYSQL_USER: test

MYSQL_PASSWORD: P@ssw0rd

volumes:

- db_data:/var/lib/mysql

networks:

- app_network

ports:

- "3306:3306"

testapp:

image: site_latest

container_name: tespapp

restart: unless-stopped

depends_on:

- db

environment:

DB_HOST: db

DB_PORT: 3306

DB_NAME: testdb

DB_USER: test

DB_PASSWORD: P@ssw0rd

APP_PORT: 8080

ports:

- "8080:8080"

networks:

- app_network

networks:

app_network:

driver: bridge

volumes:

db_data:

EOF

```

Проверяем что образы созданы:

```

docker images | grep -E "site_latest|mariadb_latest"

```

Проверяем конфиг (должен вывестись сам конфиг):

```

docker compose config

```

Запускаем контейнеры:

```

docker compose up -d

docker compose up -d testapp

```

Если ловим такую ошибку, то делаем следующее:

<img width="1704" height="133" alt="image" src="https://github.com/user-attachments/assets/c45fcc5d-cebd-44d7-8827-871d57d0e686" />

Смотрим чем занят порт и убиваем процесс (и желательно выключить службу которая занимает порт, иначе при перезагрузке ничего не заработает):

```

netstat -tulpn | grep 8080

ss -tulpn | grep 8080

lsof -i :8080

kill -9 2847

```

<img width="826" height="52" alt="image" src="https://github.com/user-attachments/assets/366965e8-5d81-459f-a2db-b8ba92552d27" />

Удаляем контейнер:

```

docker rm -f tespapp

```

Останавливаем контейнеры:

```

docker compose down

```

Проверяем порт еще раз:

```

ss -tulpn | grep 8080

```

Запускаем заново и смотрим:

```

docker compose up -d

docker compose ps

```

<img width="1236" height="200" alt="image" src="https://github.com/user-attachments/assets/49ab6451-9061-4f77-bcfc-7786362be832" />

Проверяем работоспособность:

<img width="1716" height="917" alt="image" src="https://github.com/user-attachments/assets/daf0a120-40ed-4aa6-b350-4f375d9f621c" />

Для того чтобы другие хосты увидели данное творение необходимо настроить iptables на BR-SRV:

```

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

iptables -t mangle -F

iptables -t mangle -X

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

iptables-save > /etc/sysconfig/iptables

mkdir /etc/iptables

iptables-save > /etc/iptables/rules.v4

iptables -L -n -v

```

Перезапускаем Docker и проверяем правила:

```

systemctl restart docker

iptables -L DOCKER -n -v

iptables -t nat -L DOCKER -n -v

iptables -L INPUT -n -v | grep -E "8080|8081"

```

<img width="1081" height="249" alt="image" src="https://github.com/user-attachments/assets/204b1b80-3a80-42c7-ab2f-993374c0d54b" />

### Для теста я поднимал еще один контейнер на 8081 порту, у вас его быть не должно и можно даже правило для него не создавать и не проверять ничего для этого порта

<img width="861" height="71" alt="image" src="https://github.com/user-attachments/assets/f97bdfb7-a4bd-4ae7-8292-765a7263d787" />

Перезапускаем контейнер:

```

docker compose down

docker compose up -d

```

Проверяем на других хостах (либо через браузер http://192.168.2.14:8080):

```

curl -v http://192.168.2.14:8080

```

</details>

## Разверните веб приложениена сервере HQ-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Используйте веб-сервер apache

• В качестве системы управления базами данных используйте mariadb

• Файлы веб приложения и дамп базы данных находятся в директории web образа Additional.iso

• Выполните импорт схемы и данных из файла dump.sql в базу данных webdb

• Создайте пользователя webс паролем P@ssw0rd и предоставьте ему права доступа к этой базе данных

• Файлы index.php и директорию images скопируйте в каталог веб сервера apache

• В файле index.php укажите правильные учётные данные для подключения к БД

• Запустите веб сервер и убедитесь в работоспособности приложения

• Основные параметры отметьте в отчёте

</details>

<details>

<summary>НАЖМИ</summary>

### Если есть ISO файл:

Создаем директорию для монтирования:

```

mkdir -p /mnt/iso

```

Монтируем ISO-образ (нужно знать путь к Additional.iso):

```

mount -o loop /путь/к/Additional.iso /mnt/iso

```

Копируем директорию web:

```

cp -r /mnt/iso/web ~/

```

Проверяем содержимое:

```

ls -la ~/web/

```

Размонтируем ISO:

```

umount /mnt/iso

```

### Если ISO нет:

Создаем директорию:

```

mkdir -p ~/web

cd ~/web

```

Создаем dump.sql (дамп базы данных) командой:

```

cat > ~/web/dump.sql << 'EOF'

CREATE DATABASE IF NOT EXISTS webdb;

USE webdb;

CREATE TABLE IF NOT EXISTS users (

id INT AUTO_INCREMENT PRIMARY KEY,

username VARCHAR(50) NOT NULL UNIQUE,

email VARCHAR(100),

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

CREATE TABLE IF NOT EXISTS products (

id INT AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(100) NOT NULL,

price DECIMAL(10,2),

description TEXT,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

CREATE TABLE IF NOT EXISTS test (

id INT AUTO_INCREMENT PRIMARY KEY,

message VARCHAR(255),

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

INSERT INTO users (username, email) VALUES

('admin', 'admin@example.com'),

('user1', 'user1@example.com'),

('user2', 'user2@example.com');

INSERT INTO products (name, price, description) VALUES

('Product 1', 19.99, 'First test product'),

('Product 2', 29.99, 'Second test product'),

('Product 3', 39.99, 'Third test product');

INSERT INTO test (message) VALUES

('Hello from HQ-SRV!'),

('Database connection successful'),

('Test entry 3');

EOF

```

Создание Index.php(главная страница приложения) командой:

```

cat > ~/web/index.php << 'EOF'

<!DOCTYPE html>

<html>

<head>

<title>Web Application on HQ-SRV</title>

<style>

body { font-family: Arial; margin: 40px; background: #f5f5f5; }

.container { max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }

h1 { color: #333; border-bottom: 2px solid #4CAF50; padding-bottom: 10px; }

.success { color: #4CAF50; font-weight: bold; }

.error { color: #f44336; font-weight: bold; }

table { border-collapse: collapse; width: 100%; margin: 20px 0; }

th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }

th { background: #4CAF50; color: white; }

img { max-width: 200px; margin: 10px; border: 1px solid #ddd; border-radius: 5px; }

.info { background: #e3f2fd; padding: 10px; border-radius: 5px; margin: 10px 0; }

</style>

</head>

<body>

<div class="container">

<h1>Web Application on HQ-SRV (192.168.1.62)</h1>

<div class="info">

<h3>Server Information:</h3>

<p><strong>Hostname:</strong> <?php echo gethostname(); ?></p>

<p><strong>Server IP:</strong> 192.168.1.62</p>

<p><strong>Date:</strong> <?php echo date('Y-m-d H:i:s'); ?></p>

<p><strong>PHP Version:</strong> <?php echo phpversion(); ?></p>

</div>

<h2>Database Connection</h2>

<?php

$host = 'localhost';

$dbname = 'webdb';

$user = 'web';

$pass = 'P@ssw0rd';

try {

$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);

echo "<p class='success'>✓ Connected to MariaDB successfully!</p>";

// Show tables

$stmt = $pdo->query("SHOW TABLES");

$tables = $stmt->fetchAll(PDO::FETCH_COLUMN);

if (count($tables) > 0) {

echo "<h3>Tables in database:</h3>";

echo "<table><tr><th>Table Name</th></tr>";

foreach ($tables as $table) {

echo "<tr><td>$table</td></tr>";

}

echo "</table>";

// Show data from test table

$stmt = $pdo->query("SELECT * FROM test ORDER BY created_at DESC LIMIT 5");

$data = $stmt->fetchAll();

if (count($data) > 0) {

echo "<h3>Recent test entries:</h3>";

echo "<table><tr><th>ID</th><th>Message</th><th>Created</th></tr>";

foreach ($data as $row) {

echo "<tr><td>{$row['id']}</td><td>{$row['message']}</td><td>{$row['created_at']}</td></tr>";

}

echo "</table>";

}

}

} catch (PDOException $e) {

echo "<p class='error'>✗ Connection failed: " . $e->getMessage() . "</p>";

}

?>

<h2>Images Gallery</h2>

<div>

<?php

$image_dir = 'images';

if (is_dir($image_dir)) {

$images = glob($image_dir . "/*.{jpg,jpeg,png,gif}", GLOB_BRACE);

if (count($images) > 0) {

foreach ($images as $image) {

echo "<img src='$image' alt='Gallery image'>";

}

} else {

echo "<p>No images found. Creating sample images...</p>";

mkdir($image_dir, 0755, true);

}

} else {

echo "<p>Creating images directory...</p>";

mkdir($image_dir, 0755, true);

}

?>

</div>

</div>

</body>

</html>

EOF

```

Создаем директорию Image и файлы в ней:

```

mkdir -p ~/web/images

echo "Sample image 1" > ~/web/images/image1.txt

echo "Sample image 2" > ~/web/images/image2.txt

```

Устанавливаем необходимое ПО:

```

apt-get update && apt-get install apache2 mariadb-server mariadb-client php8.2 php8.2-mysqli php8.2-mysqlnd apache2-mod_php8.2 php8.2-pdo php8.2-pdo_mysql -y

```

Запускаем MariaDB:

```

systemctl enable --now mariadb

```

Настраиваем безопасность:

```

mysql_secure_installation

```

Ответы:

```

Enter current password for root: [Enter] (просто нажать Enter)

Switch to unix_socket authentication: n

Change the root password? n (или y если хотите установить пароль)

Remove anonymous users? y

Disallow root login remotely? y

Remove test database and access to it? y

Reload privilege tables now? y

```

Заходим в MySql:

```

mysql -u root -p

```

Настраиваем БД:

```

CREATE DATABASE IF NOT EXISTS webdb;

USE webdb;

SOURCE /root/web/dump.sql;

CREATE USER 'web'@'localhost' IDENTIFIED BY 'P@ssw0rd';

GRANT ALL PRIVILEGES ON webdb.* TO 'web'@'localhost';

FLUSH PRIVILEGES;

SHOW DATABASES;

SELECT User, Host FROM mysql.user WHERE User='web';

SHOW TABLES;

SELECT * FROM test;

EXIT;

```

Вывод:

<img width="570" height="662" alt="image" src="https://github.com/user-attachments/assets/0484765a-03b8-400b-8bb9-cb5a5a29ade6" />

Проверяем, что пользователь web может подключиться:

```

mysql -u web -p'P@ssw0rd' -e "SHOW DATABASES;"

mysql -u web -p'P@ssw0rd' -D webdb -e "SHOW TABLES;"

```

<img width="612" height="262" alt="image" src="https://github.com/user-attachments/assets/a40681bd-88e6-4f84-9571-c1d49af64204" />

Настраиваем апач, Проверяем текущий DocumentRoot:

```

httpd2 -S | grep -i "documentroot"

```

<img width="1034" height="54" alt="image" src="https://github.com/user-attachments/assets/751ecc0f-6ac9-408c-8729-84c217476130" />

Создаем директорию htdocs (если её нет) и копируем туда файлы для приложения:

```

mkdir -p /etc/httpd2/htdocs

cp /root/web/index.php /etc/httpd2/htdocs/

cp -r /root/web/images /etc/httpd2/htdocs/

echo "<?php phpinfo(); ?>" > /etc/httpd2/htdocs/info.php

echo "<?php echo 'OK'; ?>" > /etc/httpd2/htdocs/simple.php

```

Устанавливаем владельца и права:

```

chown -R apache:apache /etc/httpd2/htdocs/

find /etc/httpd2/htdocs/ -type d -exec chmod 755 {} \;

find /etc/httpd2/htdocs/ -type f -exec chmod 644 {} \;

```

Проверяем наличие модуля PHP в Apache:

```

ls -la /etc/httpd2/conf/mods-available/ | grep php

```

<img width="682" height="67" alt="image" src="https://github.com/user-attachments/assets/d48694e1-01e6-4fed-971d-61571d91e86f" />

Включаем модуль (создаем симлинки):

```

ln -sf /etc/httpd2/conf/mods-available/mod_php8.2.load /etc/httpd2/conf/mods-enabled/

ln -sf /etc/httpd2/conf/mods-available/mod_php8.2.conf /etc/httpd2/conf/mods-enabled/

```

Проверяем активные конфиги:

```

ls -la /etc/httpd2/conf/sites-enabled/

```

<img width="910" height="127" alt="image" src="https://github.com/user-attachments/assets/c2d4c6b8-5453-48cb-a4ed-10e4d514a8a9" />

Редактируем основной конфиг:

```

vim /etc/httpd2/conf/sites-available/default.conf

```

```

DocumentRoot "/etc/httpd2/htdocs"

<Directory /etc/httpd2/htdocs>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

</Directory>

```

<img width="907" height="578" alt="image" src="https://github.com/user-attachments/assets/8dfbd5b4-c3a4-4467-bf47-87fb37eb9ff3" />

Проверяем конфигурацию:

```

httpd2 -t

```

Если Syntax OK, перезапускаем:

```

systemctl restart httpd2

```

Проверяем статус:

```

systemctl status httpd2 --no-pager | head -10

```

### Все дальнейшие проверки можно через браузер делать

Проверяем простой PHP файл (Должны увидеть: OK):

```

curl http://localhost/simple.php

```

Проверяем информацию о PHP:

```

curl http://localhost/info.php | head -20

```

Создадим тестовый файл для проверки БД:

```

cat > /etc/httpd2/htdocs/db-test.php << 'EOF'

<?php

$host = 'localhost';

$dbname = 'webdb';

$user = 'web';

$pass = 'P@ssw0rd';

echo "<h1>Database Connection Test</h1>";

try {

$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

echo "<p style='color:green'>✓ Connected to database successfully!</p>";

$stmt = $pdo->query("SELECT VERSION()");

$version = $stmt->fetch();

echo "<p>MySQL Version: " . $version[0] . "</p>";

$stmt = $pdo->query("SHOW TABLES");

echo "<h3>Tables:</h3><ul>";

while ($row = $stmt->fetch()) {

echo "<li>" . $row[0] . "</li>";

}

echo "</ul>";

} catch (PDOException $e) {

echo "<p style='color:red'>✗ Connection failed: " . $e->getMessage() . "</p>";

}

?>

EOF

chown apache:apache /etc/httpd2/htdocs/db-test.php

```

Проверим его:

```

curl http://localhost/db-test.php

```

Настраиваем Iptables (под вопросом насколько нужно):

```

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

mkdir /etc/iptables

iptables-save > /etc/iptables/rules.v4

```

### По итогу должно получиться следующее (на других узлах тоже должно работать):

<img width="1716" height="920" alt="image" src="https://github.com/user-attachments/assets/421813e1-f0a5-48cb-af14-ac494d56d56b" />

<img width="1718" height="916" alt="image" src="https://github.com/user-attachments/assets/6be2eb0b-f86e-4b69-98ea-c04f2885035f" />

<img width="1716" height="914" alt="image" src="https://github.com/user-attachments/assets/b3d37a35-86f7-4527-aca4-33c7a8b7feea" />

<img width="1718" height="915" alt="image" src="https://github.com/user-attachments/assets/53d0f0dd-c17f-46b0-a9cc-4db720fe7384" />

<img width="1718" height="960" alt="image" src="https://github.com/user-attachments/assets/f60a68a0-f17d-4dec-bc94-1797fd39652a" />

</details>

## На маршрутизаторах сконфигурируйте статическую трансляцию портов

<details>

<summary>ЗАДАНИЕ</summary>

• Пробросьте порт 8080в порт приложения testapp BR-SRV на маршрутизаторе BR-RTR, для обеспечения работы приложения testapp извне

• Пробросьте порт 8080в порт веб приложения на HQ-SRV на маршрутизаторе HQ-RTR, для обеспечения работы веб приложения извне

• Пробросьте порт 2026на маршрутизаторе HQ-RTR в порт 2026сервера HQ-SRV, для подключения к серверу по протоколу ssh из внешних сетей

• Пробросьте порт 2026на маршрутизаторе BR-RTR в порт 2026сервера BR-SRV, для подключения к серверу по протоколу ssh из внешних сетей.

</details>

<details>

<summary>НАЖМИ</summary>

На BR-RTR:

```

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8080 -j DNAT --to-destination 192.168.2.14:8080

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 2026 -j DNAT --to-destination 192.168.2.14:2026

sysctl -p

iptables-save > /etc/iptables/rules.v4

```

На HQ-RTR:

```

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.62:8080

iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 2026 -j DNAT --to-destination 192.168.1.62:2026

sysctl -p

iptables-save > /etc/iptables/rules.v4

```

Проверяем ssh на HQ-CLI (должны подключиться к BR-SRV):

```

ssh -p 2026 sshuser@172.16.2.2

```

</details>

## Настройте веб-сервер nginx как обратный прокси-сервер на ISP

<details>

<summary>ЗАДАНИЕ</summary>

При обращении по доменному имени web.au-team.irpo у клиента должно открываться веб приложение на HQ-SRV

• При обращении по доменному имени docker.au-team.irpo клиента должно открываться веб приложение testapp

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем nginx:

```

apt-get install nginx -y

```

Запускаем:

```

systemctl enable --now nginx

```

Создаем /etc/nginx/sites-available.d/proxy.conf:

```

server {

listen 80;

server_name web.au-team.irpo;

location / {

proxy_pass http://192.168.1.62:80;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

server {

listen 80;

server_name docker.au-team.irpo;

location / {

proxy_pass http://192.168.2.14:8080;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

```

Включаем:

```

ln -s /etc/nginx/sites-available.d/proxy.conf /etc/nginx/sites-enabled.d/

```

Проверяем и перезапускаем:

```

nginx -t

systemctl restart nginx

```

На клиентах добавляем строчку в /etc/hosts:

```

192.168.189.131 web.au-team.irpo docker.au-team.irpo

```

### Должно получиться так:

<img width="1721" height="949" alt="image" src="https://github.com/user-attachments/assets/8eb0e1c3-0b27-4ad5-8247-2e5bd164175b" />

<img width="1718" height="951" alt="image" src="https://github.com/user-attachments/assets/3e9ae7fd-29c0-43d5-9350-53b20178918a" />

### Если не открывается что то, то скорее всего порт занят на ISP, проверяем порты и убиваем процессы:

```

ss -tlnp | grep :8080

```

<img width="831" height="162" alt="image" src="https://github.com/user-attachments/assets/2f8a938c-be92-466c-b917-16da0efdc73e" />

</details>

## На маршрутизаторе ISP настройте web-based аутентификацию

<details>

<summary>ЗАДАНИЕ</summary>

При обращении к сайту web.au-team.irpo клиенту должно быть предложено ввести аутентификационные данные

• В качестве логина для аутентификации выберите WEBс паролем P@ssw0rd

• Выберите файл /etc/nginx/.htpasswd в качестве хранилища учётных записей

• При успешной аутентификации клиент должен перейти на веб сайт.

</details>

<details>

<summary>НАЖМИ</summary>

Создаем файл .htpasswd с пользователем WEB:

```

htpasswd -bc /etc/nginx/.htpasswd WEB P@ssw0rd

```

Проверяем содержимое файла:

```

cat /etc/nginx/.htpasswd

```

Устанавливаем владельца и права:

```

chown root:root /etc/nginx/.htpasswd

chmod 644 /etc/nginx/.htpasswd

```

Редактируем конфигурацию /etc/nginx/sites-available.d/proxy.conf:

```

server {

listen 80;

server_name web.au-team.irpo;

access_log /var/log/nginx/web.au-team.irpo.access.log;

error_log /var/log/nginx/web.au-team.irpo.error.log;

location / {

auth_basic "Restricted Access - Please Login";

auth_basic_user_file /etc/nginx/.htpasswd;

proxy_pass http://192.168.1.62;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header Authorization $http_authorization;

proxy_pass_header Authorization;

proxy_connect_timeout 60s;

proxy_send_timeout 60s;

proxy_read_timeout 60s;

}

}

```

Создаем симлинк в sites-enabled.d:

```

ln -s /etc/nginx/sites-available.d/proxy.conf /etc/nginx/sites-enabled.d/

```

Проверяем синтаксис и перезапускаем nginx:

```

nginx -t

systemctl restart nginx

```

Включаем форвардинг пакетов:

```

echo 1 > /proc/sys/net/ipv4/ip_forward

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

```

Настраиваем iptables:

```

iptables -t nat -A PREROUTING -p tcp --dport 80 -d 192.168.131.189 -j DNAT --to-destination 192.168.1.62:80

iptables -t nat -A PREROUTING -p tcp --dport 80 -d 172.16.1.1 -j DNAT --to-destination 192.168.1.62:80

iptables -t nat -A PREROUTING -p tcp --dport 80 -d 172.16.2.1 -j DNAT --to-destination 192.168.1.62:80

iptables -A FORWARD -p tcp -d 192.168.1.62 --dport 80 -j ACCEPT

iptables -A FORWARD -p tcp -s 192.168.1.62 --sport 80 -j ACCEPT

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables-save > /etc/iptables/rules.v4

```

</details>

## Удобным способом установите приложение Яндекс Браузер на HQ-CLI

<details>

<summary>ЗАДАНИЕ</summary>

Установку браузера отметьте в отчёте.

</details>

<details>

<summary>НАЖМИ</summary>

### Установка через терминал:

```

apt-get update && apt-get install yandex-browser-stable

```

### Установка через менеджер пакетов:

<img width="1265" height="840" alt="image" src="https://github.com/user-attachments/assets/2cdfee3c-f0aa-417f-ab6a-64475f4dbd81" />

</details>

# Модуль 3

## Выполните импорт пользователей в домен au-team.irpo

<details>

<summary>ЗАДАНИЕ</summary>

В качестве файла источника выберите файл users.csv располагающийся в образе Additional.iso

• Пользователи должны быть импортированы со своими паролями и другими атрибутами

• Убедитесь, что импортированные пользователи могут войти на машину HQ-CLI

</details>

<details>

<summary>НАЖМИ</summary>

Проверяем что домен работает и получаем билет если не получали:

```

systemctl status samba

samba-tool domain level show

kinit administrator@AU-TEAM.IRPO

klist

```

Создаем users.csv (если нет)(ПРОБЕЛОВ БЫТЬ НЕ ДОЛЖНО):

```

cat > /tmp/users.csv << 'EOF'

login,password,givenname,surname,department,mail

ivanov,P@ssw0rd,Ivan,Ivanov,IT,ivan.ivanov@au-team.irpo

petrov,P@ssw0rd,Petr,Petrov,Sales,petr.petrov@au-team.irpo

sidorov,P@ssw0rd,Sidor,Sidorov,HR,sidor.sidorov@au-team.irpo

smirnova,P@ssw0rd,Anna,Smirnova,Finance,anna.smirnova@au-team.irpo

kuznetsov,P@ssw0rd,Nikolai,Kuznetsov,IT,nikolai.kuznetsov@au-team.irpo

popova,P@ssw0rd,Elena,Popova,Marketing,elena.popova@au-team.irpo

volkov,P@ssw0rd,Alexey,Volkov,Sales,alexey.volkov@au-team.irpo

sokolov,P@ssw0rd,Dmitry,Sokolov,IT,dmitry.sokolov@au-team.irpo

morozova,P@ssw0rd,Olga,Morozova,HR,olga.morozova@au-team.irpo

novikov,P@ssw0rd,Michael,Novikov,Finance,michael.novikov@au-team.irpo

EOF

```

Создаем скрипт для импорта юзеров /root/import_users.sh:

```

#!/bin/bash

# Colors

RED='\033[0;31m'

GREEN='\033[0;32m'

YELLOW='\033[1;33m'

BLUE='\033[0;34m'

CYAN='\033[0;36m'

NC='\033[0m'

# Configuration

INPUT_FILE="/tmp/users.csv"

DOMAIN="au-team.irpo"

SEPARATOR=","

LOG_FILE="/var/log/import_users_$(date +%Y%m%d_%H%M%S).log"

PASSWORD="P@ssw0rd"

log() {

echo -e "$1" | tee -a "$LOG_FILE"

}

clear

log "${BLUE}========================================${NC}"

log "${BLUE} IMPORT USERS TO DOMAIN au.team ${NC}"

log "${BLUE}========================================${NC}"

log "${GREEN}Password for all users: ${YELLOW}${PASSWORD}${NC}"

log "${GREEN}Mode: ${YELLOW}NO password change required${NC}"

log "${BLUE}----------------------------------------${NC}"

if [ "$EUID" -ne 0 ]; then

log "${RED}Error: Run as root${NC}"

exit 1

fi

if ! command -v samba-tool &> /dev/null; then

log "${RED}Error: samba-tool not found${NC}"

exit 1

fi

if [ ! -f "$INPUT_FILE" ]; then

log "${RED}Error: File $INPUT_FILE not found${NC}"

exit 1

fi

HEADER=$(head -1 "$INPUT_FILE")

if [[ "$HEADER" != *"login"* ]]; then

log "${YELLOW}Warning: Invalid file structure${NC}"

log "Header: $HEADER"

log "Expected: login,givenname,surname,department,mail"

read -p "Continue? (y/n): " -n 1 -r

echo

if [[ ! $REPLY =~ ^[Yy]$ ]]; then

exit 1

fi

fi

log "${GREEN}All checks passed${NC}"

log "Input file: ${CYAN}$INPUT_FILE${NC}"

log "Log file: ${CYAN}$LOG_FILE${NC}"

log "${BLUE}----------------------------------------${NC}"

TOTAL=0

SUCCESS=0

FAILED=0

SKIPPED=0

START_TIME=$(date +%s)

EXISTING_USERS=$(samba-tool user list)

tail -n +2 "$INPUT_FILE" | while IFS="$SEPARATOR" read -r login givenname surname department mail

do

TOTAL=$((TOTAL + 1))

login=$(echo "$login" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

givenname=$(echo "$givenname" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

surname=$(echo "$surname" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

department=$(echo "$department" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

mail=$(echo "$mail" | tr -d '\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

if [ -z "$login" ]; then

log "${YELLOW}Line $TOTAL: skipped (empty login)${NC}"

SKIPPED=$((SKIPPED + 1))

continue

fi

if [ -z "$givenname" ]; then

givenname="$login"

fi

if [ -z "$surname" ]; then

surname="-"

fi

if [ -z "$mail" ]; then

mail="${login}@${DOMAIN}"

fi

if [ -z "$department" ]; then

department="Users"

fi

log "${BLUE}[$TOTAL]${NC} Processing: ${CYAN}$login${NC} ($givenname $surname) [$department]"

if echo "$EXISTING_USERS" | grep -q "^$login$"; then

log "${YELLOW} User $login already exists, skipping${NC}"

SKIPPED=$((SKIPPED + 1))

continue

fi

samba-tool user create "$login" "$PASSWORD" \

--given-name="$givenname" \

--surname="$surname" \

--mail-address="$mail" \

--department="$department" \

--login-shell="/bin/bash" \

--home-drive="H:" \

--home-directory="\\\\${DOMAIN}\\users\\$login" >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then

log "${GREEN} Created: $login (password: $PASSWORD)${NC}"

SUCCESS=$((SUCCESS + 1))

samba-tool group addmembers "Domain Users" "$login" &>/dev/null

samba-tool user setpassword "$login" --newpassword="$PASSWORD" >> "$LOG_FILE" 2>&1

if [ "$department" != "Users" ] && [ -n "$department" ]; then

if samba-tool group list | grep -q "^$department$"; then

samba-tool group addmembers "$department" "$login" &>/dev/null

log " Added to group: $department"

fi

fi

else

log "${RED} Failed to create $login${NC}"

FAILED=$((FAILED + 1))

fi

sleep 0.5

done

END_TIME=$(date +%s)

DURATION=$((END_TIME - START_TIME))

log "${BLUE}========================================${NC}"

log "${GREEN}IMPORT COMPLETED${NC}"

log "${BLUE}----------------------------------------${NC}"

log "Duration: ${CYAN}${DURATION} sec${NC}"

log "Total processed: ${CYAN}$TOTAL${NC}"

log "Successfully created: ${GREEN}$SUCCESS${NC}"

log "Skipped: ${YELLOW}$SKIPPED${NC}"

log "Failed: ${RED}$FAILED${NC}"

log "${BLUE}----------------------------------------${NC}"

log "Log saved: ${CYAN}$LOG_FILE${NC}"

log "${BLUE}========================================${NC}"

if [ $SUCCESS -gt 0 ]; then

echo ""

log "${GREEN}Last created users:${NC}"

samba-tool user list | tail -$(( SUCCESS > 5 ? 5 : SUCCESS )) | while read user; do

echo " $user"

done

fi

if [ $SUCCESS -gt 0 ]; then

echo ""

log "${GREEN}Password status:${NC}"

samba-tool user list | tail -$(( SUCCESS > 3 ? 3 : SUCCESS )) | while read user; do

if samba-tool user show "$user" | grep -q "user must change password: FALSE"; then

log " $user: OK"

else

log " $user: WARNING"

fi

done

fi

```

Выполняем:

```

chmod +x /root/import_users.sh

/root/import_users.sh

```

### Если нужно удалить юзеров можем сделать скрипт на удаление /root/delete_users.sh:

```

#!/bin/bash

INPUT_FILE="/tmp/users.csv"

SEPARATOR=","

LOG_FILE="/var/log/delete_users_$(date +%Y%m%d_%H%M%S).log"

if [ "$EUID" -ne 0 ]; then

echo "Run as root"

exit 1

fi

if [ ! -f "$INPUT_FILE" ]; then

echo "File $INPUT_FILE not found"

exit 1

fi

echo "WARNING: This will delete users from domain!"

echo "Press Ctrl+C to cancel or ENTER to continue"

read

TOTAL=0

DELETED=0

FAILED=0

NOT_FOUND=0

EXISTING_USERS=$(samba-tool user list)

tail -n +2 "$INPUT_FILE" | while IFS="$SEPARATOR" read -r login rest

do

TOTAL=$((TOTAL + 1))

login=$(echo "$login" | tr -d '\r' | xargs)

if [ -z "$login" ]; then

continue

fi

echo "[$TOTAL] Processing: $login"

if echo "$EXISTING_USERS" | grep -q "^$login$"; then

samba-tool user delete "$login" >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then

echo " -> Deleted: $login"

DELETED=$((DELETED + 1))

else

echo " -> Error deleting: $login"

FAILED=$((FAILED + 1))

fi

else

echo " -> Not found: $login"

NOT_FOUND=$((NOT_FOUND + 1))

fi

sleep 0.5

done

echo "==================================="

echo "DELETE COMPLETED"

echo "Total processed: $TOTAL"

echo "Deleted: $DELETED"

echo "Not found: $NOT_FOUND"

echo "Failed: $FAILED"

echo "Log: $LOG_FILE"

```

Выполняем:

```

chmod +x /root/delete_users.sh

/root/delete_users.sh

```

</details>

## Выполните настройку центра сертификации на базе HQ-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Необходимо использовать отечественные алгоритмы шифрования

• Сертификаты выдаются на 30дней

• Обеспечьте доверие сертификату для HQ-CLI

• Выдайте сертификаты веб серверам

• Перенастройте ранее настроенный реверсивный прокси nginx на протокол https

• При обращении к веб серверам https://web.au-team.irpo и https://docker.au-team.irpo у браузера клиента не должно возникать предупреждений.

</details>

<details>

<summary>НАЖМИ</summary>

Создаем структуру CA в домашней директории:

```

cd ~

mkdir -p ~/ca/{certs,crl,newcerts,private}

chmod 700 ~/ca/private

touch ~/ca/index.txt

echo 1000 > ~/ca/serial

```

Редачим конфиг /var/lib/ssl/openssl.cnf:

<img width="663" height="892" alt="image" src="https://github.com/user-attachments/assets/1d5eab13-0e47-4855-8481-efd711c2d501" />

<img width="704" height="835" alt="image" src="https://github.com/user-attachments/assets/660ab021-aa65-46e3-b3c7-f3842010b084" />

Проверяем конфиг:

```

openssl version -d

openssl ciphers -v

```

Создаем и проверяем корневой сертификат СА (вводить построчно):

```

cd ~/ca

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \

-out private/ca.key.pem

chmod 400 private/ca.key.pem

openssl req -x509 -new -key private/ca.key.pem \

-days 30 -sha256 \

-subj "/C=RU/ST=Moscow/L=Moscow/O=MyCompany/CN=HQ-CA/emailAddress=admin@au-team.irpo" \

-out certs/ca.cert.pem

openssl x509 -in certs/ca.cert.pem -text -noout | grep -E "Issuer:|Subject:|Not Before|Not After"

```

Создаем сертификаты для HQ-SRV и BR-SRV:

```

cd ~/ca

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \

-out private/web.au-team.irpo.key.pem

chmod 400 private/web.au-team.irpo.key.pem

openssl req -new -key private/web.au-team.irpo.key.pem \

-subj "/C=RU/ST=Moscow/L=Moscow/O=MyCompany/CN=web.au-team.irpo/emailAddress=admin@au-team.irpo" \

-out web.au-team.irpo.csr

openssl x509 -req -in web.au-team.irpo.csr \

-CA certs/ca.cert.pem -CAkey private/ca.key.pem \

-CAcreateserial -out certs/web.au-team.irpo.cert.pem \

-days 30 -sha256

openssl verify -CAfile certs/ca.cert.pem certs/web.au-team.irpo.cert.pem

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \

-out private/docker.au-team.irpo.key.pem

chmod 400 private/docker.au-team.irpo.key.pem

openssl req -new -key private/docker.au-team.irpo.key.pem \

-subj "/C=RU/ST=Moscow/L=Moscow/O=MyCompany/CN=docker.au-team.irpo/emailAddress=admin@au-team.irpo" \

-out docker.au-team.irpo.csr

openssl x509 -req -in docker.au-team.irpo.csr \

-CA certs/ca.cert.pem -CAkey private/ca.key.pem \

-CAcreateserial -out certs/docker.au-team.irpo.cert.pem \

-days 30 -sha256

openssl verify -CAfile certs/ca.cert.pem certs/docker.au-team.irpo.cert.pem

```

Устанавливаем сертификат на HQ-SRV:

```

mkdir -p /etc/apache2/ssl

cp ~/ca/certs/web.au-team.irpo.cert.pem /etc/apache2/ssl/

cp ~/ca/private/web.au-team.irpo.key.pem /etc/apache2/ssl/

cp ~/ca/certs/ca.cert.pem /etc/apache2/ssl/

a2enmod ssl

```

Подгатавливаем и отправляем архивы для BR-SRV и ISP:

```

cd ~/ca

tar -czf docker_certs.tar.gz certs/docker.au-team.irpo.cert.pem private/docker.au-team.irpo.key.pem certs/ca.cert.pem

scp -P 2026 docker_certs.tar.gz sshuser@192.168.2.14:/tmp/

tar -czf isp_certs.tar.gz certs/ca.cert.pem

scp isp_certs.tar.gz sshuser@192.168.189.131:/tmp/

cp /root/ca/certs/web.au-team.irpo.cert.pem /home/sshuser/

cp /root/ca/private/web.au-team.irpo.key.pem /home/sshuser/

cp /root/ca/certs/docker.au-team.irpo.cert.pem /home/sshuser/

cp /root/ca/private/docker.au-team.irpo.key.pem /home/sshuser/

chown sshuser:sshuser /home/sshuser/*.pem

```

На BR-SRV распаковываем:

```

cd /tmp

tar -xzf docker_certs.tar.gz

mkdir -p /etc/nginx/ssl

cp certs/docker.au-team.irpo.cert.pem /etc/nginx/ssl/

cp certs/ca.cert.pem /etc/nginx/ssl/

cp private/docker.au-team.irpo.key.pem /etc/nginx/ssl/

chmod 644 /etc/nginx/ssl/*.pem

chmod 600 /etc/nginx/ssl/docker.au-team.irpo.key.pem

ls -la /etc/nginx/ssl/

```

На ISP распаковываем:

```

cd /tmp

tar -xzf isp_certs.tar.gz

mkdir -p /etc/nginx/ssl

cp certs/ca.cert.pem /etc/nginx/ssl/

scp -P 2026 sshuser@192.168.1.62:/home/sshuser/web.au-team.irpo.cert.pem /tmp/

scp -P 2026 sshuser@192.168.1.62:/home/sshuser/web.au-team.irpo.key.pem /tmp/

scp -P 2026 sshuser@192.168.1.62:/home/sshuser/docker.au-team.irpo.cert.pem /tmp/

scp -P 2026 sshuser@192.168.1.62:/home/sshuser/docker.au-team.irpo.key.pem /tmp/

cp /tmp/web.au-team.irpo.cert.pem /etc/nginx/ssl/

cp /tmp/web.au-team.irpo.key.pem /etc/nginx/ssl/

cp /tmp/docker.au-team.irpo.cert.pem /etc/nginx/ssl/

cp /tmp/docker.au-team.irpo.key.pem /etc/nginx/ssl/

```

На ISP редактируем nginx /etc/nginx/sites-available.d/proxy.conf:

```

server {

listen 80;

server_name web.au-team.irpo;

return 301 https://$host$request_uri;

}

server {

listen 443 ssl;

server_name web.au-team.irpo;

ssl_certificate /etc/nginx/ssl/web.au-team.irpo.cert.pem;

ssl_certificate_key /etc/nginx/ssl/web.au-team.irpo.key.pem;

ssl_trusted_certificate /etc/nginx/ssl/ca.cert.pem;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

location / {

proxy_pass http://192.168.1.62:80;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

server {

listen 80;

server_name docker.au-team.irpo;

return 301 https://$host$request_uri;

}

server {

listen 443 ssl;

server_name docker.au-team.irpo;

ssl_certificate /etc/nginx/ssl/docker.au-team.irpo.cert.pem;

ssl_certificate_key /etc/nginx/ssl/docker.au-team.irpo.key.pem;

ssl_trusted_certificate /etc/nginx/ssl/ca.cert.pem;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

location / {

proxy_pass http://192.168.2.14:80;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

```

Устанавливаем доверие для HQ-CLI (На HQ-SRV):

```

cp ~/ca/certs/ca.cert.pem ~/ca/certs/CA-HQ.crt

scp -P 2026 ~/ca/certs/CA-HQ.crt sshuser@192.168.1.3:/tmp/

```

Получаем сертификат на HQ-CLI:

```

cp /tmp/CA-HQ.crt /etc/pki/ca-trust/source/anchors/

update-ca-trust

```

Проверяем:

```

curl -I https://web.au-team.irpo
curl -I
https://docker.au-team.irpo
openssl s_client -connect web.au-team.irpo:443 -showcerts < /dev/null 2>/dev/null | openssl x509 -text | grep -E "Issuer:|Subject:|Not Before|Not After"

```

</details>

## Перенастройте ip-туннель с базового до уровня туннеля, обеспечивающего шифрование трафика

<details>

<summary>ЗАДАНИЕ</summary>

Настройте защищенный туннель между HQ-RTR и BR-RTR

• Внесите необходимые изменения в конфигурацию динамической маршрутизации, протокол динамической маршрутизации должен возобновить работу после перенастройки туннеля

• Выбранное программное обеспечение, обоснование его выбора и его основные параметры, изменения в конфигурации динамической маршрутизации отметьте в отчёте.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем Strongswan:

```

apt-get install strongswan

```

Редачим конфиг /etc/strongswan/ipsec.conf:

### HQ-RTR

```

config setup

charondebug="ike 2, knl 2, cfg 2"

conn gre-tunnel

left=172.16.1.2

leftid=172.16.1.2

right=172.16.2.2

rightid=172.16.2.2

type=transport

keyexchange=ikev2

authby=secret

esp=aes256-sha256-modp2048

ikelifetime=24h

lifetime=8h

dpddelay=10s

dpdtimeout=30s

dpdaction=restart

auto=start

```

### BR-RTR:

```

config setup

charondebug="ike 2, knl 2, cfg 2"

conn gre-tunnel

left=172.16.2.2

leftid=172.16.2.2

right=172.16.1.2

rightid=172.16.1.2

type=transport

keyexchange=ikev2

authby=secret

esp=aes256-sha256-modp2048

ikelifetime=24h

lifetime=8h

dpddelay=10s

dpdtimeout=30s

dpdaction=restart

auto=start

```

Создаем файл с ключом на обоих роутерах:

```

: PSK "very_strong_secret_key_change_this_123456"

```

Добавляем строчку в файл /etc/strongswan/ipsec.secrets:

```

172.16.1.2 172.16.2.2 : PSK "TestPassword123"

```

Изменяем права к файлу:

```

chmod 600 /etc/strongswan/ipsec.secrets

chown root:root /etc/strongswan/ipsec.secrets

```

Настраиваем Iptables на обоих роутерах:

```

iptables -I INPUT -i tun1 -p gre -j ACCEPT

iptables -I OUTPUT -o tun1 -p gre -j ACCEPT

iptables -I INPUT -i tun1 -p udp --dport 500 -j ACCEPT

iptables -I INPUT -i tun1 -p udp --dport 4500 -j ACCEPT

iptables -I INPUT -i tun1 -p esp -j ACCEPT

iptables -I INPUT -i tun1 -p ah -j ACCEPT

iptables-save > /etc/iptables/rules.v4

```

Настраиваем OSPF:

### HQ-RTR:

```

vtysh

configure terminal

interface tun1

ip ospf network point-to-point

ip ospf hello-interval 10

ip ospf dead-interval 40

router ospf

network 10.10.10.0/30 area 0

network 192.168.1.0/26 area 0

do wr

```

### BR-RTR:

```

vtysh

configure terminal

interface tun1

ip ospf network point-to-point

ip ospf hello-interval 10

ip ospf dead-interval 40

router ospf

network 10.10.10.0/30 area 0

network 192.168.2.0/28 area 0

do wr

```

Перезапускаем сервисы и проверяем:

```

systemctl restart frr

systemctl enable strongswan-starter

systemctl start strongswan-starter

systemctl status strongswan-starter

ipsec status

```

<img width="780" height="108" alt="image" src="https://github.com/user-attachments/assets/1918b0cb-fc96-4fc5-bfc5-f33d9bfad6b9" />

</details>

## Настройте межсетевой экран на маршрутизаторах HQ-RTR и BR-RTR на сеть в сторону ISP

<details>

<summary>ЗАДАНИЕ</summary>

Обеспечьте работу протоколов http, https, dns, ntp, icmp или дополнительных нужных протоколов

• Запретите остальные подключения из сети Интернет во внутреннюю сеть.

</details>

<details>

<summary>НАЖМИ</summary>

Настраиваем Iptables на HQ-RTR:

```

iptables -F

iptables -X

iptables -t nat -F

iptables -t mangle -F

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

iptables -I INPUT 1 -m conntrack --ctstate INVALID -j DROP

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i ens37 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i ens33 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i ens37 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i ens37 -p tcp --dport 2026 -j ACCEPT

iptables -A INPUT -i tun1 -p 89 -j ACCEPT

iptables -A INPUT -i tun1 -p icmp --icmp-type echo-request -j ACCEPT

iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j DROP

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -i ens37 -o tun1 -j ACCEPT

iptables -A FORWARD -i tun1 -o ens37 -j ACCEPT

iptables -A FORWARD -i ens37 -o ens33 -j ACCEPT

iptables -A FORWARD -i tun1 -o ens37 -p tcp --dport 80 -d 192.168.1.62 -j ACCEPT

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables-save > /etc/iptables/rules.v4

```

Настраиваем Iptables на BR-RTR:

```

iptables -F

iptables -X

iptables -t nat -F

iptables -t mangle -F

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

iptables -I INPUT 1 -m conntrack --ctstate INVALID -j DROP

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i ens37 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i ens33 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i ens37 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i ens37 -p tcp --dport 2026 -j ACCEPT

iptables -A INPUT -i tun1 -p 89 -j ACCEPT

iptables -A INPUT -i tun1 -p icmp --icmp-type echo-request -j ACCEPT

iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j DROP

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -i ens37 -o tun1 -j ACCEPT

iptables -A FORWARD -i tun1 -o ens37 -j ACCEPT

iptables -A FORWARD -i ens37 -o ens33 -j ACCEPT

iptables -A FORWARD -i tun1 -o ens37 -p tcp --dport 8080 -d 192.168.2.14 -j ACCEPT

iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE

iptables-save > /etc/iptables/rules.v4

```

</details>

## Настройте принт-сервер cups на сервере HQ-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Опубликуйте виртуальный pdf-принтер

• На клиенте HQ-CLI подключите виртуальный принтер как принтер по умолчанию.

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем cups:

```

apt-get update && apt-get install cups cups-pdf

```

Создаем группу и добавляем туда юзера (после этого необходимо перелогиниться):

```

groupadd -r lpadmin

usermod -aG lpadmin $USER

```

Проверяем что драйвер доступен:

```

lpinfo --make-and-model "PDF" -m

```

Настраиваем доступ в консоль и запускаем cups:

```

cupsctl --remote-admin

systemctl restart cups

systemctl enable cups

systemctl status cups

```

Открываем в браузере (login - root, passwd - toor):

```

http://localhost:631/admin

```

Жмем:

<img width="1718" height="869" alt="image" src="https://github.com/user-attachments/assets/8e91bc3d-f36b-4f85-837a-b25b09461407" />

<img width="684" height="459" alt="image" src="https://github.com/user-attachments/assets/06e67cab-4496-41df-a5b3-8353d0e9d294" />

<img width="829" height="421" alt="image" src="https://github.com/user-attachments/assets/adac98ae-99ca-4a5b-9d5f-f01b6f4ca840" />

<img width="658" height="632" alt="image" src="https://github.com/user-attachments/assets/62ec747f-d6d4-4c9d-b04f-18c82063d1b7" />

<img width="920" height="629" alt="image" src="https://github.com/user-attachments/assets/290ecc0a-fc4d-41f8-833d-4592f7dba7a0" />

Назначаем принтер по умолчанию:

```

lpadmin -d Virtual_PDF

lpstat -d

```

Редактируем /etc/cups/cups-pdf.conf:

```

Меняем Out ${DESKTOP} на:

Out /root/PDF

```

Создаем директорию и перезапускаем cups:

```

mkdir -p /root/PDF

chmod 755 /root/PDF

systemctl restart cups

```

Проводим тестовую печать:

```

echo "Test print job" > ~/test.txt

lp -d Virtual_PDF ~/test.txt

ls -la /root/PDF/

```

### Должен появится файл test_job.pdf

На HQ-CLI устанавливаем cups:

```

apt-get update && apt-get install cups cups-filters cups-pk-helper

```

Создаем директорию для печати:

```

mkdir -p ~/.cups

chmod 755 ~/.cups

echo "ServerName 192.168.1.62" > ~/.cups/client.conf

chmod 644 ~/.cups/client.conf

ls -la ~/.cups/

cat ~/.cups/client.conf

```

Проверяем доступность:

```

curl -I http://192.168.1.62:631

lpstat -s

```

Устанавливаем как принтер по умолчанию:

```

lpoptions -d Virtual_PDF

lpstat -d

```

Проводим тестовую печать:

```

echo "Remote print test from HQ-CLI" > ~/remote-test.txt

lp -d Virtual_PDF ~/remote-test.txt

lpstat -o

```

Проверяем что файл появился:

```

ls /root/PDF

```

### Если не сработало можно попробовать сделать следующее:

HQ-SRV:

```

apt-get update

apt-get install cups cups-pdf

usermod -aG lpadmin $USER

sed -i 's|^Out .*|Out /var/spool/cups-pdf/${USER}|' /etc/cups/cups-pdf.conf

cat > /etc/cups/cupsd.conf << 'EOF'

Port 631

Listen 0.0.0.0:631

<Location />

Order allow,deny

Allow localhost

Allow 192.168.1.0/26

Allow All

AuthType None

Satisfy Any

</Location>

<Location /printers>

Order allow,deny

Allow localhost

Allow 192.168.1.0/26

AuthType None

Satisfy Any

</Location>

<Location /printers/Virtual_PDF>

Order allow,deny

Allow localhost

Allow 192.168.1.0/26

AuthType None

Satisfy Any

</Location>

EOF

lpadmin -x Virtual_PDF 2>/dev/null

lpadmin -p Virtual_PDF -v cups-pdf:/ -E -o printer-is-shared=true

lpadmin -d Virtual_PDF

systemctl restart cups

systemctl enable cups

systemctl status cups

lpstat -p Virtual_PDF -d

```

На HQ-CLI:

```

apt-get update

apt-get install cups-client

mkdir -p ~/.cups

echo "ServerName 192.168.1.62" > ~/.cups/client.conf

chmod 644 ~/.cups/client.conf

lpstat -h 192.168.1.62 -s

lpoptions -h 192.168.1.62 -d Virtual_PDF

lpstat -d

echo "test HQ-CLI" > ~/test-print.txt

lp -h 192.168.1.62 -d Virtual_PDF ~/test-print.txt

```

Проверяем на сервере:

```

find / -name "*.pdf" -mmin -5 2>/dev/null

ls -la /var/spool/cups-pdf/ANONYMOUS/

file /var/spool/cups-pdf/ANONYMOUS/test-print.txt.pdf

```

### Возможные ошибки

Если клиент не видит принтер:

```

rm -rf ~/.cups ~/.cache/cups

mkdir -p ~/.cups

echo "ServerName 192.168.1.62" > ~/.cups/client.conf

lpstat -h 192.168.1.62 -s

```

Если печать не создает PDF:

```

tail -f /var/log/cups/error_log

ls -la /var/spool/cups-pdf/

ls -la /root/PDF/

```

Если ошибка "Запрещено":

```

grep -i "authtype" /etc/cups/cupsd.conf

iptables -F

```

Результаты проверки:

```

# На сервере

lpstat -p Virtual_PDF -d

# На клиенте

lpstat -h 192.168.1.62 -s

# Созданный PDF-файл

ls -la /var/spool/cups-pdf/ANONYMOUS/

```

</details>

## Реализуйте логирование при помощи rsyslog на устройствах HQ-RTR, BR-RTR, BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Сервер сбора логов расположен на HQ-SRV, убедитесь, что сервер не является клиентом самому себе

• Приоритет сообщений должен быть не ниже warning

• Все журналы должны находиться в директории /opt. Для каждого устройства должна выделяться своя поддиректория, которая совпадает с именем машины

• Реализуйте ротацию собранных логов на сервере HQ-SRV:

• Ротируются все логи, находящиеся в директории и поддиректориях /opt

• Ротация производится один раз в неделю

• Логи необходимо сжимать

• Минимальный размер логов для ротации – 10МБ.

</details>

<details>

<summary>НАЖМИ</summary>

### Настраиваем HQ-SRV:

Устанавливаем rsyslog:

```

apt-get update && apt-get install rsyslog -y

```

Создаем файл для загрузки модулей:

```

cat > /etc/rsyslog.d/00-modules.conf << 'EOF'

module(load="imudp")

module(load="imtcp")

EOF

```

Настраиваем прием логов:

```

cat > /etc/rsyslog.d/01-inputs.conf << 'EOF'

input(type="imudp" port="514" ruleset="remote")

input(type="imtcp" port="514" ruleset="remote")

EOF

```

Настраиваем шаблоны и правила:

```

cat > /etc/rsyslog.d/10-remote-rules.conf << 'EOF'

template(name="RemotePerHostLogs" type="string"

string="/opt/%HOSTNAME%/%programname%.log")

ruleset(name="remote") {

action(type="omfile" dynaFile="RemotePerHostLogs"

dirCreateMode="0755" fileCreateMode="0644")

}

EOF

```

Очищаем старые конфиги:

```

rm -f /etc/rsyslog.d/debug*.conf 2>/dev/null

rm -f /etc/rsyslog.d/backup 2>/dev/null

rm -f /etc/rsyslog.d/*.bak 2>/dev/null

rm -f /etc/rsyslog.d/*~ 2>/dev/null

```

Создаем директорию для логов:

```

mkdir -p /opt

chmod 755 /opt

```

Проверяем и запускаем rsyslog:

```

rsyslogd -N1

systemctl restart rsyslog

systemctl status rsyslog --no-pager -l

netstat -tulpn | grep 514

```

<img width="875" height="69" alt="image" src="https://github.com/user-attachments/assets/9638c587-5455-46e3-90aa-0c927c4c1ff0" />

### Настраиваем BR-RTR, BR-SRV, HQ-RTR:

### Возможно придется добавить правило в iptables на роутерах:

```

iptables -t nat -L PREROUTING -n -v | grep 514

iptables -I FORWARD -s 192.168.2.14 -d 192.168.1.62 -p udp --dport 514 -j ACCEPT

iptables -I FORWARD -s 192.168.1.62 -d 192.168.2.14 -p udp --sport 514 -j ACCEPT

iptables -I FORWARD -p tcp --dport 514 -j ACCEPT

iptables -I FORWARD -p udp --dport 514 -j ACCEPT

iptables-save > /etc/iptables/rules.v4

```

Устанавливаем rsyslog:

```

apt-get update && apt-get install rsyslog -y

```

Редачим конфиг:

```

cat > /etc/rsyslog.conf << 'EOF'

# rsyslog configuration file

#### MODULES ####

module(load="imuxsock")

module(load="imklog")

#### GLOBAL DIRECTIVES ####

global(workDirectory="/var/spool/rsyslog")

#### RULES ####

# Local logs

*.info;mail.none;authpriv.none;cron.none /var/log/messages

authpriv.* /var/log/secure

mail.* /var/log/maillog

cron.* /var/log/cron

*.emerg :omusrmsg:*

# Send all logs to central server

*.* @@192.168.1.62:514

EOF

```

Проверяем и запускаем rsyslog:

```

rsyslogd -N1

systemctl restart rsyslog

systemctl enable rsyslog

systemctl status rsyslog --no-pager -l

```

Проверяем отправку:

```

logger -p user.warning "Test WARNING from $(hostname) $(date)"

logger -p user.crit "Test CRIT from $(hostname) $(date)"

logger -p user.info "Test INFO (SHOULD NOT ARRIVE) from $(hostname) $(date)"

```

### На сервере должна появится директория в /opt и там файлы с логами:

<img width="960" height="251" alt="image" src="https://github.com/user-attachments/assets/b9f5358f-72e5-4c68-81a3-6f1cafe623ef" />

Настраиваем ротацию:

```

cat > /etc/logrotate.d/central-logs << 'EOF'

/opt/*/*.log {

weekly

rotate 4

size 10M

compress

delaycompress

missingok

notifempty

create 0644 root root

sharedscripts

postrotate

systemctl kill -s HUP rsyslog > /dev/null 2>&1 || true

endscript

}

EOF

```

Проверяем конфиг:

```

logrotate -d /etc/logrotate.d/central-logs

logrotate -f /etc/logrotate.d/central-logs

```

<img width="1218" height="789" alt="image" src="https://github.com/user-attachments/assets/b8be42d8-c9ca-4d55-a902-26fff68bc3fc" />

<img width="596" height="838" alt="image" src="https://github.com/user-attachments/assets/73a9de9e-4ad9-46ef-9a3b-15eb100ab76e" />

Проверяем ротацию:

```

ls -la /opt/br-srv/

logrotate -f /etc/logrotate.d/central-logs

ls -la /opt/br-srv/*.gz 2>/dev/null

```

Добавляем в крон:

```

ls -la /etc/cron.daily/ | grep logrotate

echo "0 0 * * 0 /usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1" >> /var/spool/cron/root

crontab -l

```

### Проверяем все:

```

ls -la /opt/

ls -la /opt/br-srv/

```

На любом клиенте:

```

logger -p user.info "INFO message (SHOULD NOT ARRIVE)"

logger -p user.warning "WARNING message (SHOULD ARRIVE)"

logger -p user.err "ERR message (SHOULD ARRIVE)"

```

На сервере:

```

logrotate -f /etc/logrotate.d/central-logs

```

<img width="679" height="245" alt="image" src="https://github.com/user-attachments/assets/ca00cb7c-f6be-4298-9177-69cffd27bb89" />

</details>

## На сервере HQ-SRV реализуйте мониторинг устройств с помощью открытого программного обеспечения

<details>

<summary>ЗАДАНИЕ</summary>

Обеспечьте доступность по URL - http://mon.au-team.irpo для сетей офиса HQ, внесите изменения в инфраструктуру разрешения доменных имён

• Мониторить нужно устройства HQ-SRV и BR-SRV

• В мониторинге должны визуально отображаться нагрузка на ЦП, объем занятой ОП и основного накопителя

• Логин и пароль для службы мониторинга admin P@ssw0rd

• Организуйте доступ к мониторингу для HQ-CLI, без внешнего доступа

• Выбор программного обеспечения, основание выбора и основные параметры с указанием порта, на котором работает мониторинг, отметьте в отчёте

</details>

<details>

<summary>НАЖМИ</summary>

Добавляем DNS записи на HQ-SRV и HQ-CLI:

HQ-SRV:

```

echo "127.0.0.1 mon.au-team.irpo" >> /etc/hosts

```

HQ-CLI:

```

echo "192.168.1.62 mon.au-team.irpo" >> /etc/hosts

```

### Будем использовать prometheus с grafana:

### HQ-SRV:

Создаем пользователя для сервисов:

```

useradd --no-create-home --shell /bin/false prometheus

useradd --no-create-home --shell /bin/false node_exporter

```

Скачиваем Prometheus:

```

cd /tmp

curl -LO https://github.com/prometheus/prometheus/releases/download/v2.55.1/prometheus-2.55.1.linux-amd64.tar.gz
tar -xvf prometheus-2.55.1.linux-amd64.tar.gz

mv prometheus-2.55.1.linux-amd64 /opt/prometheus

```

Создаем директорию:

```

mkdir -p /opt/prometheus/data

chown -R prometheus:prometheus /opt/prometheus

```

Конфигурируем Prometheus:

```

cat > /opt/prometheus/prometheus.yml << 'EOF'

global:

scrape_interval: 15s

evaluation_interval: 15s

scrape_configs:

- job_name: 'prometheus'

static_configs:

- targets: ['localhost:9090']

- job_name: 'hq-srv'

static_configs:

- targets: ['192.168.1.62:9100']

labels:

instance: 'hq-srv'

group: 'servers'

- job_name: 'br-srv'

static_configs:

- targets: ['192.168.2.14:9100']

labels:

instance: 'br-srv'

group: 'servers'

EOF

chown prometheus:prometheus /opt/prometheus/prometheus.yml

```

Создаем systemd юнит:

```

cat > /etc/systemd/system/prometheus.service << 'EOF'

[Unit]

Description=Prometheus

After=network.target

[Service]

User=prometheus

Group=prometheus

Type=simple

ExecStart=/opt/prometheus/prometheus \

--config.file=/opt/prometheus/prometheus.yml \

--storage.tsdb.path=/opt/prometheus/data \

--web.console.templates=/opt/prometheus/consoles \

--web.console.libraries=/opt/prometheus/console_libraries

[Install]

WantedBy=multi-user.target

EOF

```

Устанавливаем node_exporter:

```

cd /tmp

curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz

mv node_exporter-1.8.2.linux-amd64 /opt/node_exporter

chown -R node_exporter:node_exporter /opt/node_exporter

```

Создаем systemd юнит для node_exporter:

```

cat > /etc/systemd/system/node_exporter.service << 'EOF'

[Unit]

Description=Node Exporter

After=network.target

[Service]

User=node_exporter

Group=node_exporter

Type=simple

ExecStart=/opt/node_exporter/node_exporter

[Install]

WantedBy=multi-user.target

EOF

```

Запускаем Prometheus и Node_Exporter:

```

systemctl daemon-reload

systemctl enable prometheus node_exporter

systemctl start prometheus node_exporter

systemctl status prometheus --no-pager -l

systemctl status node_exporter --no-pager -l

netstat -tulpn | grep -E "9090|9100"

```

### BR-SRV:

Создаем пользователя:

```

useradd --no-create-home --shell /bin/false node_exporter

```

Устанавливаем node_exporter:

```

cd /tmp

curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz

mv node_exporter-1.8.2.linux-amd64 /opt/node_exporter

chown -R node_exporter:node_exporter /opt/node_exporter

```

Создаем systemd юнит:

```

cat > /etc/systemd/system/node_exporter.service << 'EOF'

[Unit]

Description=Node Exporter

After=network.target

[Service]

User=node_exporter

Group=node_exporter

Type=simple

ExecStart=/opt/node_exporter/node_exporter

[Install]

WantedBy=multi-user.target

EOF

```

Запускаем node_exporter:

```

systemctl daemon-reload

systemctl enable node_exporter

systemctl start node_exporter

systemctl status node_exporter --no-pager -l

netstat -tulpn | grep 9100

```

### HQ-SRV:

Устанавливаем Grafana:

```

apt-get update && apt-get install shadow-utils fontconfig -y

wget https://dl.grafana.com/oss/release/grafana-11.2.0.linux-amd64.tar.gz
tar -zxvf grafana-11.2.0.linux-amd64.tar.gz

mv grafana-v11.2.0 /opt/grafana

```

Создаем пользователя:

```

useradd --no-create-home --shell /bin/false grafana

chown -R grafana:grafana /opt/grafana

```

Создаем systemd юнит для grafana:

```

cat > /etc/systemd/system/grafana.service << 'EOF'

[Unit]

Description=Grafana

After=network.target

[Service]

User=grafana

Group=grafana

Type=simple

ExecStart=/opt/grafana/bin/grafana-server -homepath /opt/grafana

[Install]

WantedBy=multi-user.target

EOF

```

Конфигурируем grafana:

```

cat > /opt/grafana/conf/custom.ini << 'EOF'

[server]

http_port = 3000

domain = mon.au-team.irpo

root_url = http://mon.au-team.irpo:3000

[auth]

disable_login_form = false

[auth.anonymous]

enabled = false

[security]

admin_user = admin

admin_password = P@ssw0rd

EOF

chown grafana:grafana /opt/grafana/conf/custom.ini

```

Запускаем grafana:

```

systemctl daemon-reload

systemctl enable grafana

systemctl start grafana

systemctl status grafana --no-pager -l

netstat -tulpn | grep 3000

```

На HQ-CLI добавляем dns запись:

```

echo "192.168.1.62 mon.au-team.irpo" >> /etc/hosts

```

Открываем графану по адресу mon.au-team.irpo:3000

```

login:admin

password:P@ssw0rd

```

Заходим сюда:

<img width="1719" height="885" alt="image" src="https://github.com/user-attachments/assets/43b845cc-e553-4486-a2d9-929c64a529d2" />

Жмем Add data source и выбираем prometheus:

<img width="1716" height="923" alt="image" src="https://github.com/user-attachments/assets/9c8ca5af-de67-4fab-8bbb-3e9ad72b10e8" />

Вбиваем сюда http://localhost:9090

<img width="1710" height="855" alt="image" src="https://github.com/user-attachments/assets/213ed10d-702e-42c0-b7bb-408028809a8c" />

Внизу жмем save & test:

<img width="1078" height="243" alt="image" src="https://github.com/user-attachments/assets/b1d74848-0899-4fed-8193-62052b2d99ea" />

Жмем на + в правом верхнем углу, import dashboard:

<img width="1715" height="876" alt="image" src="https://github.com/user-attachments/assets/1de00880-1e70-4119-84ce-21268e878119" />

Вводим 1860 в поле и нажимаем Load:

<img width="1715" height="873" alt="image" src="https://github.com/user-attachments/assets/52dd0029-63ef-4904-8708-de47f8c535f4" />

Жмем import:

<img width="1716" height="875" alt="image" src="https://github.com/user-attachments/assets/12574dcf-98eb-4015-970c-bec7211e57ff" />

Должно получиться так:

<img width="1718" height="878" alt="image" src="https://github.com/user-attachments/assets/f8b9b3e5-09fa-4277-ae8d-356801821119" />

Настраиваем iptables на hq-rtr:

```

iptables -I INPUT -p tcp --dport 9090 -s 192.168.1.0/26 -j ACCEPT

iptables -I INPUT -p tcp --dport 9090 -j DROP

iptables -I INPUT -p tcp --dport 3000 -s 192.168.1.0/26 -j ACCEPT

iptables -I INPUT -p tcp --dport 3000 -j DROP

iptables -I INPUT -p tcp --dport 9100 -s 192.168.2.14 -j ACCEPT

iptables-save > /etc/iptables/rules.v4

```

</details>

## Реализуйте механизм инвентаризации машин HQ-SRV и HQ-CLI через Ansible на BR-SRV

<details>

<summary>ЗАДАНИЕ</summary>

Плейбук должен собирать информацию о рабочих местах:

• Имя компьютера

• IP-адрес компьютера

• Плейбук, должен быть размещен в директории /etc/ansible, отчёты в поддиректории PC-INFO, в формате .yml. Файлы должны называется именем компьютера, который был инвентаризирован

• Файл плейбука располагается в образе Additional.iso в директории playbook

</details>

<details>

<summary>НАЖМИ</summary>

Возможно придется прокинуть ключи для рута на машины по аналогии с настройкой ansible во 2 модуле:

```

ssh-keygen

ssh-copy-id -p 2026 sshuser@192.168.1.62

ssh-copy-id -p 2026 sshuser@192.168.1.3

ssh-copy-id -p 2026 sshuser@192.168.2.1

ssh-copy-id -p 2026 sshuser@192.168.1.1

```

Создаем плейбук:

```

vim /etc/ansible/inventory-pc.yml

```

Вставляем (тут важны пробелы в строчках, как файл должен выглядеть скрин ниже):

```

---

- name: Collect PC Information

hosts: 192.168.1.3, 192.168.1.62

gather_facts: yes

tasks:

- name: Create PC-INFO directory

local_action:

module: file

path: /etc/ansible/PC-INFO

state: directory

mode: '0755'

- name: Generate PC report

local_action:

module: copy

content: |

hostname: {{ ansible_hostname }}

ip_address: {{ ansible_default_ipv4.address }}

dest: "/etc/ansible/PC-INFO/{{ ansible_hostname }}.yml"

```

<img width="1709" height="845" alt="image" src="https://github.com/user-attachments/assets/c3c5965f-be15-4c2d-8ce9-5695dbe17aef" />

<img width="628" height="431" alt="image" src="https://github.com/user-attachments/assets/a9835584-f5f2-4ece-97a6-a088aaa56a7e" />

Создаем директорию для отчетов:

```

mkdir -p /etc/ansible/PC-INFO

```

Запускаем:

```

cd /etc/ansible

ansible-playbook inventory-pc.yml

```

Получаем:

<img width="934" height="684" alt="image" src="https://github.com/user-attachments/assets/5beee67f-8573-44a0-a4cb-4570d54964b0" />

Проверяем:

```

ls -la /etc/ansible/PC-INFO/

cat /etc/ansible/PC-INFO/*.yml

```

</details>

## На HQ-SRV настройте программное обеспечение fail2ban для защиты ssh

<details>

<summary>ЗАДАНИЕ</summary>

Укажите порт ssh

• При 3 неуспешных авторизациях адрес атакующего попадает в бан

• Бан производится на 1минуту

</details>

<details>

<summary>НАЖМИ</summary>

Устанавливаем fail2ban:

```

apt-get update && apt-get install fail2ban -y

```

Создаем конфиг:

```

cat > /etc/fail2ban/jail.local << 'EOF'

[DEFAULT]

bantime = 60

findtime = 600

maxretry = 3

banaction = iptables-multiport

banaction_allports = iptables-allports

protocol = tcp

[sshd]

enabled = true

port = 2026

logpath = /var/log/secure

backend = systemd

EOF

```

Проверяем синтаксис и запускаем:

```

fail2ban-client -t

systemctl enable --now fail2ban

systemctl status fail2ban

```

Проверяем работоспособность:

```

fail2ban-client status sshd

```

<img width="621" height="181" alt="image" src="https://github.com/user-attachments/assets/2d3876a2-4f89-437c-94db-3b4bdfb79ab3" />

В конфиге ssh убираем ограничение на заход только через sshuser и убираем количество попыток входа /etc/openssh/sshd_config (да, это противоречит заданию из 1 модуля, но кого это волнует):

```

#AllowUsers sshuser

#MaxAuthTries 2

```

С другого компьютера пробуем неудачно зайти через ssh:

```

ssh -p 2026 user@192.168.1.62

```

На сервере проверяем что IP банится:

```

fail2ban-client status sshd

fail2ban-client banned

```

Снять бан можно командой:

```

fail2ban-client set sshd unbanip 192.168.2.14

```

</details>