Модуль 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 | п.2 | CommonName ЦС (менять только если в задании другой) | |
@@IPSEC_PSK@@ | P@ssw0rd | п.3 | Pre-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-SRV | 192.168.3.10 | 1, 6, 7, 8 | Импорт пользователей, клиент логов, node_exporter + DNS, Ansible |
| HQ-SRV | 192.168.1.10 | 2, 5, 6, 7, 9 | ЦС, CUPS, сервер логов, Prometheus+Grafana, fail2ban |
| ISP | 172.16.1.1 | 2 | nginx HTTPS + сертификаты |
| HQ-RTR | 172.16.1.10 | 3, 4, 6 | IPsec, файервол, rsyslog-клиент |
| BR-RTR | 172.16.2.10 | 3, 4, 6 | IPsec, файервол, rsyslog-клиент |
| HQ-CLI | 192.168.2.10 | 2, 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
Далее выполняйте согласно скриншотам


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

Здесь надо настроить:
- устройство (HQ-SRV)
- Имя плана
- Выбор критерия для бекапа
- Выбор пути, что будет бекапиться
- Куда будет сохраняться
При выборе соответствующего пункта надо будет указать параметр по заданию. скриншоты представлены далее



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


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


В планах запустите бекап папки etc (БД не копируйте, очень долго обрабатывает)
4. Типичные ошибки
| Ошибка | Решение |
|---|---|
strongSwan: no shared key found | secret.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:631 → Listen 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