Инструкция модуля 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 → «Заменить всё» для каждого @@…@@.

ПсевдонимОбразецВаше значениеПунктПримечание
@@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Время бана
@@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, 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 (если sshd на ISP запущен)
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]
# 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), всё остальное открыто
cat > /etc/nftables/firewall.conf << '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/firewall.conf
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]
# 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]
                start_action = start
            }
        }
    }
}
secrets {
    ike-psk {
        id = 172.16.2.10
        secret = "@@IPSEC_PSK@@"
    }
}
EOF
systemctl enable --now strongswan
swanctl --load-all

# Файервол
cat > /etc/nftables/firewall.conf << '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/firewall.conf
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

# Ротация: еженедельно, сжатие, мин. 10MB
cat > /etc/logrotate.d/remote-logs << 'EOF'
/opt/*/syslog.log {
    weekly
    rotate 4
    compress
    minsize 10M
    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)
# Вручную отредактировать /etc/cups/cupsd.conf, секции:
#   <Location />          → Order allow,deny / Allow all
#   <Location /admin>     → Allow all
#   <Location /admin/conf> → Allow all

systemctl enable --now 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 @@BACKUP_USER@@
echo '@@BACKUP_USER@@:@@BACKUP_PASS@@' | chpasswd
gpasswd -a @@BACKUP_USER@@ wheel

# Подключение к БД в веб-интерфейсе Кибер Бэкапа:
#   Тип: MySQL/MariaDB
#   Способ: Unix socket
#   Сокет: /var/lib/mysql/mysql.sock
#   Пользователь: web
#   Пароль: P@ssw0rd
#   База: webdb

# === HQ-CLI ===
mkdir -p /backup
# Установить агент, указать /backup как хранилище

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

ОшибкаРешение
strongSwan: no shared key foundsecret.id = свой IP, remote.id = чужой IP. Не путать!
strongSwan: missing secret / invalid value for: authБлоки local {} и remote {} — каждый на отдельных строках, не в одну строку с ;
strongSwan: SAS пустой, пинг идётmodprobe esp4 — модуль не загружен
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