решение модуля 3

Модуль 3 — Инструкция (проверенная)

Пометки [ИЗМ] — параметры, которые могут меняться в варианте.
Не меняются: домен au-team.irpo, IP-адреса, порты проброса (8080, 2026), интерфейсы (ens1, ens2, gre1, vlan100/200/999), hostname’ы, DNS-имена *.au-team.irpo, БД (web/P@ssw0rd/webdb), учётные данные Ansible, пользователи (импорт из Users.csv — префиксы/количество из модуля B).


1. Таблица замены @@псевдонимов@@

Скопируйте таблицу. Заполните колонку «Ваше значение» по листу задания. Затем Ctrl+H → «Заменить всё» для каждого @@…@@.

Порядок замены: сначала @@IPSEC_PSK@@ (используется в обоих роутерах), потом все остальные.

ПсевдонимОбразецВаше значениеПунктПримечание
@@CA_DAYS@@90п.2Срок сертификата ЦС
@@CERT_DAYS@@30п.2Срок сертификатов web/docker
@@CA_CN@@ca.au-team.irpoп.2CommonName ЦС (менять только если в задании другой)
@@IPSEC_PSK@@P@ssw0rdп.3Pre-shared key IPsec
@@F2B_MAXRETRY@@3п.9Попыток до бана
@@F2B_BANTIME@@1mп.9Время бана
@@LOG_MINSIZE@@10Mп.6Мин. размер лога для ротации
@@BACKUP_USER@@irpoadminп.10Пользователь Кибер Бэкапа
@@BACKUP_PASS@@P@ssw0rdп.10Пароль Кибер Бэкапа

Инварианты (что НЕ меняют):

  • IP-адресация: 172.16.1.10 (HQ-RTR), 172.16.2.10 (BR-RTR), 192.168.1.10 (HQ-SRV), 192.168.2.10 (HQ-CLI), 192.168.3.10 (BR-SRV), 172.16.1.1 (ISP→HQ), 172.16.2.1 (ISP→BR)
  • Порты проброса: 8080 (веб), 2026 (SSH). Внутренний порт SSH — всегда 2026
  • Интерфейсы роутеров: ens1 (ISP), ens2 (LAN), gre1 (туннель), vlan100/200/999
  • GRE-туннель: 192.168.5.1/30 (HQ), 192.168.5.2/30 (BR)
  • Hostname’ы: hq-rtr.au-team.irpo, br-rtr.au-team.irpo, hq-srv.au-team.irpo, br-srv.au-team.irpo
  • DNS-имена: web.au-team.irpo, docker.au-team.irpo, mon.au-team.irpo
  • БД: пользователь web, пароль P@ssw0rd, база webdb, сокет /var/lib/mysql/mysql.sock
  • NFS: сервер 192.168.1.10:/raid/nfs, клиент /mnt/nfs
  • Ansible inventory: HQ-SRV, HQ-CLI, HQ-RTR, BR-RTR
  • Имена пакетов, имена сервисов, пути к конфигам

2. Список ВМ и что настраивается

ВМIPПунктыЧто делаем
BR-SRV192.168.3.101, 6, 7, 8Импорт пользователей, клиент логов, node_exporter + DNS, Ansible
HQ-SRV192.168.1.102, 5, 6, 7, 9ЦС, CUPS, сервер логов, Prometheus+Grafana, fail2ban
ISP172.16.1.12nginx HTTPS + сертификаты
HQ-RTR172.16.1.103, 4, 6IPsec, файервол, rsyslog-клиент
BR-RTR172.16.2.103, 4, 6IPsec, файервол, rsyslog-клиент
HQ-CLI192.168.2.102, 5КриптоПро, доверие ЦС, CUPS-клиент

3. Команды

3.1. BR-SRV — Импорт пользователей (п.1)

# Additional.iso уже на sr0
mount /dev/sr0 /mnt
iconv -f UTF-8 -t UTF-8//IGNORE /mnt/Users.csv > /root/Users_fixed.csv
umount /mnt

cat > /root/import_users.sh << 'SCRIPT'
#!/bin/bash
while IFS=';' read -r first last role phone ou street zip city country pass; do
    [[ -z "$first" ]] && continue
    username="${first:0:1}$last"
    username="${username,,}"
    samba-tool user create "$username" "$pass" \ 
        --given-name="$first" --surname="$last"  \
        --job-title="$role" --telephone-number="$phone"
    if [[ -n "$ou" ]]; then
        samba-tool ou create "OU=$ou" 2>/dev/null
        samba-tool user move "$username" "OU=$ou" 2>/dev/null
    fi
done < /root/Users_fixed.csv
SCRIPT
chmod +x /root/import_users.sh
bash /root/import_users.sh

Пока пользователи импортируются, делайте дальше

3.2. HQ-SRV — Центр сертификации (п.2)

apt-get install -y openssl-gost-engine
control openssl-gost enabled

# Ключ и сертификат ЦС (ГОСТ 2012) [ИЗМ: days, CN]
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:TCB -out ca.key
openssl req -new -x509 -md_gost12_256 -days @@CA_DAYS@@ -key ca.key -out ca.crt \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=AU-Team/CN=@@CA_CN@@"

# Сертификат web.au-team.irpo [ИЗМ: days]
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out web.au-team.irpo.key
openssl req -new -md_gost12_256 -key web.au-team.irpo.key -out web.au-team.irpo.csr \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=AU-Team/CN=web.au-team.irpo"
openssl x509 -req -in web.au-team.irpo.csr -CA ca.crt -CAkey ca.key \
    -CAcreateserial -out web.au-team.irpo.crt -days @@CERT_DAYS@@

# Сертификат docker.au-team.irpo [ИЗМ: days]
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out docker.au-team.irpo.key
openssl req -new -md_gost12_256 -key docker.au-team.irpo.key -out docker.au-team.irpo.csr \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=AU-Team/CN=docker.au-team.irpo"
openssl x509 -req -in docker.au-team.irpo.csr -CA ca.crt -CAkey ca.key \
    -CAcreateserial -out docker.au-team.irpo.crt -days @@CERT_DAYS@@

# Передать сертификаты на ISP (на ISP должен быть включен sshd)
scp *.crt *.key root@172.16.1.1:/etc/nginx/

# Доверие на HQ-CLI: скопировать ca.crt через NFS
cp ca.crt /raid/nfs/

3.3. ISP — nginx HTTPS (п.2)

# Сертификаты должны быть в /etc/nginx/ (скопированы с HQ-SRV)

apt-get install -y openssl-gost-engine
control openssl-gost enabled

cat > /etc/nginx/sites-available.d/default.conf << 'EOF'
server {
    listen 80;
    server_name web.au-team.irpo;
    return 301 https://$host$request_uri;
}
server {
    listen 80;
    server_name docker.au-team.irpo;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name web.au-team.irpo;
    ssl_certificate /etc/nginx/web.au-team.irpo.crt;
    ssl_certificate_key /etc/nginx/web.au-team.irpo.key;
    ssl_ciphers GOST2012-KUZNYECHIK-KUZNYECHIKOMAC;
    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://172.16.1.10:8080;
    }
}
server {
    listen 443 ssl;
    server_name docker.au-team.irpo;
    ssl_certificate /etc/nginx/docker.au-team.irpo.crt;
    ssl_certificate_key /etc/nginx/docker.au-team.irpo.key;
    ssl_ciphers GOST2012-KUZNYECHIK-KUZNYECHIKOMAC;
    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass http://172.16.2.10:8080;
    }
}
EOF
systemctl restart nginx

3.4. HQ-CLI — КриптоПро + доверие ЦС (п.2)

# Доверие сертификату ЦС (ca.crt уже в /mnt/nfs/)
cp /mnt/nfs/ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

# КриптоПро (из Additional.iso)
apt-get install -y newt52
mount /dev/sr1 /mnt
cp /mnt/linux-amd64.tgz /tmp/
cd /tmp && tar xzf linux-amd64.tgz
cd linux-amd64 && chmod +x install_gui.sh
./install_gui.sh
# В установщике: оставить галочку «Импортировать сертификаты ОС»

# Проверка
trust list | grep -i "au-team" || echo "не найден"

3.5. HQ-RTR — IPsec + файервол + rsyslog (п.3, 4, 6)

# Модули ядра (обязательно!)
cat > /etc/modules-load.d/ipsec.conf << 'EOF'
xfrm_user
esp4
xfrm_algo
EOF
modprobe xfrm_user esp4 xfrm_algo
apt-get install -y strongswan nftables rsyslog tcpdump

# IPsec [ИЗМ: PSK]
# ВАЖНО: start_action = start только на HQ-RTR. BR-RTR — без start_action (иначе гонка duplicate IKE_SA).
# remote.id = IP собеседника, secret.id = СВОЙ IP
cat > /etc/strongswan/swanctl/swanctl.conf << 'EOF'
connections {
    gre-ipsec {
        local_addrs = 172.16.1.10
        remote_addrs = 172.16.2.10
        local {
            auth = psk
        }
        remote {
            auth = psk
            id = 172.16.2.10
        }
        children {
            gre-child {
                mode = transport
                local_ts = 172.16.1.10/32[gre]
                remote_ts = 172.16.2.10/32[gre]
                start_action = start
            }
        }
    }
}
secrets {
    ike-psk {
        id = 172.16.1.10
        secret = "@@IPSEC_PSK@@"
    }
}
EOF
systemctl enable --now strongswan
swanctl --load-all

# Файервол: запреты только на ens1 (ISP), всё остальное открыто
# ВАЖНО: писать в nftables.nft (не firewall.conf!) — systemd грузит именно его
cat > /etc/nftables/nftables.nft << 'EOF'
flush ruleset
table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept
        iifname ens1 tcp dport 8080 dnat to 192.168.1.10:80
        iifname ens1 tcp dport 2026 dnat to 192.168.1.10:2026
    }
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept
        oifname ens1 masquerade
    }
}
table inet filter {
    chain input {
        type filter hook input priority filter; policy accept
        iif ens1 jump from-isp
        accept
    }
    chain from-isp {
        ct state established,related accept
        icmp type { echo-request, echo-reply } accept
        udp dport { 500, 4500 } accept
        ip protocol esp accept
        udp dport 123 accept
        tcp dport 22 accept
        drop
    }
    chain forward {
        type filter hook forward priority filter; policy accept
        iif ens1 jump fwd-from-isp
        accept
    }
    chain fwd-from-isp {
        ct state established,related accept
        tcp dport { 80, 443, 8080, 2026 } accept
        udp dport 53 accept
        drop
    }
}
EOF
nft -f /etc/nftables/nftables.nft
systemctl enable nftables

# Rsyslog-клиент
echo 'module(load="imuxsock")' > /etc/rsyslog.d/input.conf
echo '*.warning @192.168.1.10:514' > /etc/rsyslog.d/forward.conf
mkdir -p /etc/systemd/system/rsyslog.service.d
echo -e "[Service]nType=simple" > /etc/systemd/system/rsyslog.service.d/override.conf
systemctl daemon-reload
systemctl enable --now rsyslog

3.6. BR-RTR — IPsec + файервол + rsyslog (п.3, 4, 6)

# Модули ядра (обязательно!)
cat > /etc/modules-load.d/ipsec.conf << 'EOF'
xfrm_user
esp4
xfrm_algo
EOF
modprobe xfrm_user esp4 xfrm_algo
apt-get install -y strongswan nftables rsyslog tcpdump

# IPsec [ИЗМ: PSK]
# ВАЖНО: без start_action — туннель инициирует HQ-RTR, BR-RTR отвечает.
# remote.id = IP собеседника, secret.id = СВОЙ IP
cat > /etc/strongswan/swanctl/swanctl.conf << 'EOF'
connections {
    gre-ipsec {
        local_addrs = 172.16.2.10
        remote_addrs = 172.16.1.10
        local {
            auth = psk
        }
        remote {
            auth = psk
            id = 172.16.1.10
        }
        children {
            gre-child {
                mode = transport
                local_ts = 172.16.2.10/32[gre]
                remote_ts = 172.16.1.10/32[gre]
            }
        }
    }
}
secrets {
    ike-psk {
        id = 172.16.2.10
        secret = "@@IPSEC_PSK@@"
    }
}
EOF
systemctl restart strongswan
systemctl enable --now strongswan
swanctl --load-all

# Файервол
cat > /etc/nftables/nftables.nft << 'EOF'
flush ruleset
table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept
        iifname ens1 tcp dport 8080 dnat to 192.168.3.10:8080
        iifname ens1 tcp dport 2026 dnat to 192.168.3.10:2026
    }
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept
        oifname ens1 masquerade
    }
}
table inet filter {
    chain input {
        type filter hook input priority filter; policy accept
        iif ens1 jump from-isp
        accept
    }
    chain from-isp {
        ct state established,related accept
        icmp type { echo-request, echo-reply } accept
        udp dport { 500, 4500 } accept
        ip protocol esp accept
        udp dport 123 accept
        tcp dport 22 accept
        drop
    }
    chain forward {
        type filter hook forward priority filter; policy accept
        iif ens1 jump fwd-from-isp
        accept
    }
    chain fwd-from-isp {
        ct state established,related accept
        tcp dport { 80, 443, 8080, 2026 } accept
        udp dport 53 accept
        drop
    }
}
EOF
nft -f /etc/nftables/nftables.nft
systemctl enable nftables

# Rsyslog-клиент
echo 'module(load="imuxsock")' > /etc/rsyslog.d/input.conf
echo '*.warning @192.168.1.10:514' > /etc/rsyslog.d/forward.conf
systemctl enable --now rsyslog

3.7. HQ-SRV — Сервер логов (п.6)

apt-get install -y rsyslog

cat > /etc/rsyslog.d/server.conf << 'EOF'
module(load="imudp")
input(type="imudp" port="514")
$template RemoteLogs,"/opt/%HOSTNAME%/syslog.log"
*.warning ?RemoteLogs
& stop
EOF

mkdir -p /opt/hq-rtr /opt/br-rtr /opt/br-srv

mkdir -p /etc/systemd/system/rsyslog.service.d
echo -e "[Service]nType=simple" > /etc/systemd/system/rsyslog.service.d/override.conf
systemctl daemon-reload
systemctl enable --now rsyslog

# Ротация: еженедельно, сжатие [ИЗМ: minsize]
cat > /etc/logrotate.d/remote-logs << 'EOF'
/opt/*/syslog.log {
    weekly
    rotate 4
    compress
    minsize @@LOG_MINSIZE@@
    missingok
    notifempty
    create 0644 root root
}
EOF

3.8. BR-SRV — Клиент логов (п.6)

apt-get install -y rsyslog
echo 'module(load="imuxsock")' > /etc/rsyslog.d/input.conf
echo '*.warning @192.168.1.10:514' > /etc/rsyslog.d/forward.conf
systemctl enable --now rsyslog

3.9. HQ-SRV — CUPS (п.5)

apt-get install -y cups cups-pdf

# Слушать на всех интерфейсах
sed -i 's/Listen localhost:631/Listen 631/' /etc/cups/cupsd.conf

# Привести Location к нужному виду (Allow all)
sed -i '/^<Location /admin/conf>$/,/</Location>/ s/Order allow,deny/Order allow,denyn  Allow all/' /etc/cups/cupsd.conf
sed -i '/^<Location /admin>$/,/</Location>/ s/Order allow,deny/Order allow,denyn  Allow all/' /etc/cups/cupsd.conf
sed -i '/^<Location />$/,/</Location>/ s/Order allow,deny/Order allow,denyn  Allow all/' /etc/cups/cupsd.conf

systemctl enable --now cups
systemctl restart cups

На HQ-CLI: Параметры → Принтеры → Сетевой, адрес 192.168.1.10 (ввести в поле поиска, без этого принтер не появится в списке).

3.10. Мониторинг — BR-SRV, затем HQ-SRV (п.7)

BR-SRV: node_exporter + DNS-запись

apt-get install -y prometheus-node_exporter
systemctl enable --now prometheus-node_exporter
# DNS: mon.au-team.irpo → 192.168.1.10
samba-tool dns add localhost au-team.irpo mon A 192.168.1.10 -UAdministrator%P@ssw0rd
HQ-SRV: Prometheus + Grafana + прокси
apt-get install -y grafana prometheus prometheus-node_exporter
systemctl enable --now prometheus-node_exporter grafana-server

cat > /etc/prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
      - targets:
          - "192.168.1.10:9100"
          - "192.168.3.10:9100"
EOF

systemctl enable --now prometheus

# Прокси через Apache: mon.au-team.irpo → Grafana :3000
a2enmod proxy
a2enmod proxy_http
cat > /etc/httpd2/conf/sites-available/mon.conf << 'EOF'
<VirtualHost *:80>
    ServerName mon.au-team.irpo
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
EOF
ln -sf /etc/httpd2/conf/sites-available/mon.conf /etc/httpd2/conf/sites-enabled/mon.conf
systemctl reload httpd2

# Grafana: чтобы не было "origin not allowed" при смене пароля
sed -i 's|;domain = localhost|domain = mon.au-team.irpo|' /etc/grafana/grafana.ini
sed -i 's|;root_url = %(protocol)s://%(domain)s:%(http_port)s/|root_url = http://mon.au-team.irpo/|' /etc/grafana/grafana.ini
sed -i 's|;allowed_origins =|allowed_origins = http://mon.au-team.irpo|' /etc/grafana/grafana.ini
systemctl restart grafana-server

На HQ-CLI открыть браузер:

  • http://mon.au-team.irpo → Grafana
  • Первый вход: admin / admin, задать новый пароль
  • Connections → Add data source → Prometheus, URL http://localhost:9090, Save & test
  • Dashboards → Import → ввести ID 11074 (Node Exporter Full) → покажет CPU/RAM/диск обоих серверов

3.11. BR-SRV — Ansible инвентаризация (п.8)

mkdir -p /etc/ansible/PC-INFO

cat > /etc/ansible/get_hostname_address.yml << 'EOF'
- name: Get_hostname
  hosts: HQ-SRV,HQ-CLI
  tasks:
    - name: Save hostname and IP
      copy:
        dest: "/etc/ansible/PC-INFO/{{ ansible_hostname }}.yml"
        content: |
          Hostname: {{ ansible_hostname }}
          IP_Address: {{ ansible_default_ipv4.address }}
      delegate_to: localhost
EOF

ansible-playbook /etc/ansible/get_hostname_address.yml

3.12. HQ-SRV — fail2ban защита SSH (п.9)

apt-get install -y fail2ban

# Локальный лог auth (нужен fail2ban)
echo 'module(load="imuxsock")' > /etc/rsyslog.d/input.conf
echo 'auth.* /var/log/auth.log' > /etc/rsyslog.d/authlog.conf
systemctl restart rsyslog

# Конфиг [ИЗМ: maxretry, bantime]
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
backend = auto

[sshd]
enabled = true
port = 2026
logpath = /var/log/auth.log
maxretry = @@F2B_MAXRETRY@@
bantime = @@F2B_BANTIME@@
EOF

systemctl enable --now fail2ban
fail2ban-client status sshd

3.13. Кибер Бэкап (п.10)

На HQ-SRV:

useradd -m irpoadmin
passwd irpoadmin
echo "192.168.2.10 hq-cli.au-team.irpo" >> /etc/hosts  #поставьте свой адрес HQ-CLI
sed -i 's/^skip-networking/# &/' /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf 2>/dev/null
systemctl restart mariadb
apt-get update && apt-get install kernel-source-6.12 kernel-headers-modules-6.12 gcc make -y
mount /dev/sr0 /mnt
bash /mnt/CyberBackup_18_64-bit.x86_64

Далее производится установка. выберите параметры как на скриншоте (выбор — пробел, выбор кнопки далее — tab). Все остальное по умолчанию

На HQ-CLI

В браузере откройте 192.168.1.10:9877 логин/пароль root/toor

Активируйте пробную лицензию

Создайте отдел irpo

В созданном отделе добавьте пользователя irpoadmin

Далее в root консоли HQ-CLI:

mkdir /backup

echo "192.168.1.10 hq-srv.au-team.irpo" >> /etc/hosts

update-kernel -y && reboot  

##Здесь сервер перезагрузится##

apt-get update && apt-get install kernel-source-6.12 kernel-headers-modules-6.12 gcc make -y

mount /dev/sr0 /mnt

 bash /mnt/CyberBackup_18_64-bit.x86_64

Далее выполняйте согласно скриншотам

Возвращаетесь обратно в веб-интерфейс для создания плана защиты

Здесь надо настроить:

  1. устройство (HQ-SRV)
  2. Имя плана
  3. Выбор критерия для бекапа
  4. Выбор пути, что будет бекапиться
  5. Куда будет сохраняться

При выборе соответствующего пункта надо будет указать параметр по заданию. скриншоты представлены далее

Здесь производится добавление узла для хранения данных, форма для входа появится после настройки

Здесь показан план бекапа БД. повторите согласно скриншотам

В планах запустите бекап папки etc (БД не копируйте, очень долго обрабатывает)


4. Типичные ошибки

ОшибкаРешение
strongSwan: no shared key foundsecret.id = свой IP, remote.id = чужой IP. Не путать!
strongSwan: missing secret / invalid value for: authБлоки local {} и remote {} — каждый на отдельных строках, не в одну строку с ;
strongSwan: SAS пустой, пинг идётmodprobe esp4 — модуль не загружен
IPsec не поднимается после перезагрузкиУбрать start_action на BR-RTR — гонка duplicate IKE_SA
Файервол сбрасывается после перезагрузкиПисать в /etc/nftables/nftables.nft, не firewall.conf
Rsyslog: не пишет локальные логиimuxsock выключен по умолчанию, нужен input.conf
Rsyslog сервер не запускаетсяType=simple через override.conf
fail2ban: Have not found any log fileНужен authlog.conf с auth.* /var/log/auth.log
CUPS: веб-интерфейс недоступенListen localhost:631Listen 631
Grafana: origin not allowedПрописать domain/root_url/allowed_origins в grafana.ini
Grafana: только один хостnode_exporter должны быть в отдельной job node в prometheus.yml
Кибер Бэкап: не подключается к БДИспользовать Unix socket /var/lib/mysql/mysql.sock, не TCP
Копипаст из Markdown портит --now и EOFОткрывать файл как Plain Text, не через preview

5. Проверка

# IPsec (HQ-RTR)
swanctl --list-sas | grep ESTABLISHED
ping -c 3 192.168.5.2
tcpdump -i ens1 -n -c 4 esp

# Файервол (HQ-RTR, BR-RTR)
nft list chain inet filter from-isp

# Rsyslog (HQ-SRV)
ls -la /opt/hq-rtr/syslog.log /opt/br-rtr/syslog.log /opt/br-srv/syslog.log

# Мониторинг (HQ-SRV)
curl -s http://localhost:9090/api/v1/targets | grep -oE '"health":"[^"]+"'

# fail2ban (HQ-SRV)
fail2ban-client status sshd

# CUPS (HQ-SRV)
lpstat -t | head -3

# Ansible (BR-SRV)
cat /etc/ansible/PC-INFO/*.yml