Модуль 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 | п.2 | CommonName ЦС (менять только если в задании другой) | |
@@IPSEC_PSK@@ | P@ssw0rd | п.3 | Pre-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-SRV | 192.168.3.10 | 1, 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 (если 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 found | secret.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: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