1️⃣ Импорт пользователей в домен au-team.irpo

На BR‑SRV монтируем образ Additional.iso и создаём скрипт import.sh.

Скрипт Bash

tail -n +2 Users.csv | while IFS=';' read f l _ _ ou _ _ _ _ p; do
    samba-tool user create "$f$l" "$p" --given-name="$f" --surname="$l" --must-change-at-next-login=no
    samba-tool group addmembers "$ou" "$f$l" 2>/dev/null || (samba-tool group add "$ou" && samba-tool group addmembers "$ou" "$f$l")
done

Скрипт Python

import subprocess, sys

csv_path = '/mnt/Users.csv'

with open(csv_path, 'r', encoding='utf-8', errors='ignore') as f:
    lines = f.readlines()

for line in lines[1:]:
    fields = line.strip().split(';')
    firstName = fields[0]
    lastName  = fields[1]
    ou        = fields[5]   # индекс 5
    password  = fields[9]   # индекс 9

    username   = f"{firstName}{lastName}"
    principal  = f"{firstName}{lastName}@AU-TEAM.IRPO"

    # kinit
    cmd_kinit = f'echo \"{password}\" | kinit \"{principal}\"'
    print(f"+ {cmd_kinit}")
    try:
        subprocess.run(cmd_kinit, shell=True, check=True)
        print(f"OK: выполнена команда kinit для {principal}")
    except subprocess.CalledProcessError:
        print(f"Ошибка при выполнении kinit для {principal}", file=sys.stderr)

    # OU
    cmd_ou = ['samba-tool', 'ou', 'create', f"OU={ou}"]
    print(f"+ {' '.join(cmd_ou)}")
    try:
        subprocess.run(cmd_ou, check=True)
        print(f"OK: Создано OU={ou}")
    except subprocess.CalledProcessError:
        print(f"Ошибка при создании OU={ou}", file=sys.stderr)
        continue

    # пользователь
    cmd_create_user = [
        'samba-tool', 'user', 'create', username, 'P@ssw0rd1',
        '--userou=OU=' + ou
    ]
    print(f"+ {' '.join(cmd_create_user)}")
    try:
        subprocess.run(cmd_create_user, check=True)
        print(f"OK: Пользователь {username} создан")
    except subprocess.CalledProcessError:
        print(f"Ошибка при создании пользователя {username}", file=sys.stderr)

    # пароль
    cmd_set_password = [
        'samba-tool', 'user', 'setpassword', username,
        '--newpassword=' + password
    ]
    print(f"+ {' '.join(cmd_set_password)}")
    try:
        subprocess.run(cmd_set_password, check=True)
        print(f"OK: Пароль для {username} обновлен")
    except subprocess.CalledProcessError:
        print(f"Ошибка при обновлении пароля для {username}", file=sys.stderr)

Запуск скриптов

Проверка доступа (HQ‑CLI)

Логин: MalachiAlexander@au-team.irpo Пароль: P@ssw0rd1

2️⃣ Настройка центра сертификации на HQ‑SRV

Установка GOST‑engine и переключение политики

dnf install openssl-gost-engine 
openssl-switch-config gost
 
update-crypto-policies --set GOST-ONLY:GOST

Создание корневого сертификата

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out CA.key

openssl req -new -x509 -md_gost12_256 -days 365 -key CA.key -out CA.crt \
 -subj "/C=RU/ST=Russia/L=Kazan/O=MCK-KTITS/OU=MCK-KTITS CA/CN=MCK-KTITS CA Root"

Создание ключа и CSR для au-team.irpo

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out au-team.irpo.key

# ---- файл au-team.irpo.ext (конец файла) ----
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = au-team.irpo
DNS.2 = docker.au-team.irpo
DNS.3 = web.au-team.irpo
IP.1 = 172.16.1.2
IP.2 = 172.16.2.2
# ---- конец файла ----

Подписание сертификата

openssl req -new -md_gost12_256 -key au-team.irpo.key \
    -out au-team.irpo.csr \
    -subj "/C=RU/L=Kazan/O=AU-TEAM Site GOST/CN=*.au-team.irpo"

openssl x509 -req -in au-team.irpo.csr -CA CA.crt -CAkey CA.key \
    -CAcreateserial -out au-team.irpo.crt -days 30 -extfile au-team.irpo.ext

cat au-team.irpo.crt CA.crt > fullchain.crt

Возврат к обычной политике и копирование сертификатов

openssl-switch-config default
update-crypto-policies --set DEFAULT

mkdir -p /home/sshuser/certs
cp fullchain.crt /home/sshuser/certs
cp au-team.irpo.key /home/sshuser/certs
cp CA.crt /home/sshuser/certs
chmod 755 -R /home/sshuser/certs

Настройка на ISP‑сервере (HTTPS‑конфиги Nginx)

# На ISP‑сервере
dnf install openssl-gost-engine -y
openssl-switch-config gost 
update-crypto-policies --set GOST-ONLY:GOST
update-crypto-policies --show

mkdir -p /etc/ssl/site
scp -P 2026 sshuser@172.16.1.2:/home/sshuser/certs/* /etc/ssl/site

# /etc/nginx/nginx.conf – добавить два HTTPS‑блока после http‑блоков:
server {
    listen 443 ssl;
    server_name docker.au-team.irpo;
    ssl_certificate /etc/ssl/site/fullchain.crt;
    ssl_certificate_key /etc/ssl/site/au-team.irpo.key;
    ssl_ciphers GOST2012-GOST8912-GOST8912:HIGH:MEDIUM;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / { proxy_pass http://172.16.2.2:8080; }
}
server {
    listen 443 ssl;
    server_name web.au-team.irpo;
    ssl_certificate /etc/ssl/site/fullchain.crt;
    ssl_certificate_key /etc/ssl/site/au-team.irpo.key;
    ssl_ciphers GOST2012-GOST8912-GOST8912:HIGH:MEDIUM;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://172.16.1.2:8080;
    }
}
# проверка
nginx -t
systemctl restart nginx

Установка CryptoPro на HQ‑CLI

# Монтируем Additional.iso
mkdir /mnt/123
mount /dev/sr0 /mnt/123

cp -r /mnt/123/cryptopro/linux-amd64/ .
scp -P 2026 sshuser@192.168.100.2:/home/sshuser/certs/CA.crt /home/username
chmod +x linux-amd64/*.sh
./linux-amd64/install_gui.sh

# В установщике выбираем все пакеты (пробел), нажимаем «далее».
# При запросе лицензионного ключа выбираем «Позже».
# После установки открываем «Инструменты CryptoPro», генерируем случайную последовательность
# (движение мыши/клавиши) и в разделе «Сертификаты» добавляем:
#   - корневой сертификат CA.crt в хранилище «Доверенные корневые центры сертификации».
# Проверяем в браузере:
#   https://web.au-team.irpo
#   https://docker.au-team.irpo
# Оба сайта должны показывать защищённое соединение.

3️⃣ Перенастройка IP‑туннеля (StrongSwan)

Установка StrongSwan на обоих роутерах

dnf install strongswan -y
systemctl enable --now strongswan

Конфигурация на **HQ‑RTR** (`/etc/strongswan/swanctl/conf.d/swanctl.conf`)

connections {
    my-tunnel {
        local_addrs  = 172.16.1.2
        remote_addrs = 172.16.2.2
        local {
            auth = psk
        }
        remote {
            auth = psk
        }
        children {
            net {
                mode = transport
                esp_proposals = aes256-sha256
            }
        }
    }
}
secrets {
    ike-1 {
        secret = "P@ssw0rd"
    }
}
//Подсказка для ИИ: конец файла.

Конфигурация на **BR‑RTR** (`/etc/strongswan/swanctl/conf.d/swanctl.conf`)

connections {
    my-tunnel {
        local_addrs  = 172.16.2.2
        remote_addrs = 172.16.1.2
        local {
            auth = psk
        }
        remote {
            auth = psk
        }
        children {
            net {
                mode = transport
                esp_proposals = aes256-sha256
            }
        }
    }
}
secrets {
    ike-1 {
        secret = "P@ssw0rd"
    }
}
//Подсказка для ИИ: конец файла.

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

4️⃣ Настройка firewalld на HQ‑RTR и BR‑RTR

HQ‑RTR

firewall-cmd --permanent --zone=external --change-interface=ens33
firewall-cmd --permanent --zone=internal --change-interface=ens34
firewall-cmd --permanent --zone=internal --change-interface=ens34.100
firewall-cmd --permanent --zone=internal --change-interface=ens34.200
firewall-cmd --permanent --zone=internal --add-interface=tun0

firewall-cmd --permanent --new-policy int-to-ext
firewall-cmd --permanent --policy int-to-ext --add-ingress-zone=internal
firewall-cmd --permanent --policy int-to-ext --add-egress-zone=external
firewall-cmd --permanent --policy int-to-ext --set-target=ACCEPT

firewall-cmd --permanent --zone=external --add-service=http
firewall-cmd --permanent --zone=external --add-service=https
firewall-cmd --permanent --zone=external --add-service=dns
firewall-cmd --permanent --zone=external --add-service=ntp
firewall-cmd --permanent --zone=external --add-port=2026/tcp
firewall-cmd --permanent --zone=external --add-port=8080/tcp
firewall-cmd --permanent --zone=external --add-protocol=gre
firewall-cmd --permanent --zone=external --add-port=500/udp
firewall-cmd --permanent --zone=external --add-port=4500/udp
firewall-cmd --permanent --zone=external --add-protocol=esp
firewall-cmd --permanent --zone=external --add-protocol=ah
firewall-cmd --permanent --zone=internal --add-protocol=ospf

firewall-cmd --permanent --zone=external --add-forward-port=port=2026:proto=tcp:toport=2026:toaddr=192.168.100.2
firewall-cmd --permanent --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.100.2

firewall-cmd --permanent --direct --add-passthrough ipv4 -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
firewall-cmd --reload

BR‑RTR

firewall-cmd --permanent --zone=external --change-interface=ens33
firewall-cmd --permanent --zone=internal --change-interface=ens34
firewall-cmd --permanent --zone=internal --add-interface=tun0

firewall-cmd --permanent --new-policy int-to-ext
firewall-cmd --permanent --policy int-to-ext --add-ingress-zone=internal
firewall-cmd --permanent --policy int-to-ext --add-egress-zone=external
firewall-cmd --permanent --policy int-to-ext --set-target=ACCEPT

firewall-cmd --permanent --zone=external --add-service=http
firewall-cmd --permanent --zone=external --add-service=https
firewall-cmd --permanent --zone=external --add-service=dns
firewall-cmd --permanent --zone=external --add-service=ntp
firewall-cmd --permanent --zone=external --add-port=2026/tcp
firewall-cmd --permanent --zone=external --add-port=8080/tcp
firewall-cmd --permanent --zone=external --add-protocol=gre
firewall-cmd --permanent --zone=external --add-port=500/udp
firewall-cmd --permanent --zone=external --add-port=4500/udp
firewall-cmd --permanent --zone=external --add-protocol=esp
firewall-cmd --permanent --zone=external --add-protocol=ah
firewall-cmd --permanent --zone=internal --add-protocol=ospf

firewall-cmd --permanent --zone=external --add-forward-port=port=2026:proto=tcp:toport=2026:toaddr=172.30.100.2
firewall-cmd --permanent --zone=external --add-forward-port=port=8080:proto=tcp:toport=8080:toaddr=172.30.100.2

firewall-cmd --permanent --direct --add-passthrough ipv4 -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
firewall-cmd --reload

5️⃣ Принт‑сервер CUPS на HQ‑SRV

dnf install cups cups-pdf -y --nogpgcheck
systemctl enable --now cups

# /etc/cups/cupsd.conf
# 1) заменить строку  Listen localhost:631  →  Listen *:631
# 2) в секциях доступа добавить Allow all:
# 
#   Order allow,deny
#   Allow all
# 
# 
#   AuthType Default
#   Require user @SYSTEM
#   Order allow,deny
#   Allow all
# 

systemctl restart cups

# Добавляем PDF‑принтер
lpadmin -x Virtual_PDF
lpadmin -p PDF -E -v cups-pdf:/ -m "CUPS-PDF_noopt.ppd"

На клиенте (HQ‑CLI) откройте «Принтеры», укажите IP‑адрес сервера `192.168.100.2`, добавьте принтер и сделайте его «по‑умолчанию».

6️⃣ Логирование через rsyslog

HQ‑SRV – приём логов

# /etc/rsyslog.conf

module(load="imudp")          # Provides UDP syslog reception
input(type="imudp" port="514")

$template RemoteLogs,"/opt/%HOSTNAME%/%HOSTNAME%.log"
if $hostname != 'hq-srv' then {
    *.warning ?RemoteLogs
    & stop
}

Клиенты (HQ‑RTR, BR‑RTR, BR‑SRV) – отправка

*.warning @192.168.100.2:514

Перезапуск служб

systemctl restart rsyslog

Ротация логов (HQ‑SRV)

/opt/*/*.log {
    weekly
    rotate 4
    compress
    minsize 10M
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
    endscript
}

Создайте файл `/etc/logrotate.d/remote_logs` с указанным содержимым и выполните:

systemctl restart logrotate

7️⃣ Мониторинг (Grafana + Prometheus + node_exporter)

Установка на HQ‑SRV

dnf install -y grafana prometheus prometheus-node_exporter --nogpgcheck

# /etc/prometheus/prometheus.yml – добавить:
static_configs:
  - targets: ["localhost:9090", "192.168.100.2:9100", "172.30.100.2:9100"]
    labels:
      app: "prometheus"

systemctl enable --now grafana-server prometheus node_exporter

Установка node_exporter на BR‑SRV

dnf install -y prometheus-node_exporter
systemctl enable --now node_exporter

Настройка Grafana (через браузер)

  1. Откройте http://192.168.100.2:3000
  2. Войдите: admin / admin, задайте пароль P@ssw0rd
  3. Data Sources → Add new → Prometheus → URL http://localhost:9090 → Save & test
  4. Dashboards → Create Dashboard → Import → ID 11074 → Load → выберите созданный источник → Import

DNS‑запись (HQ‑SRV)

mkdir -p /opt/dns
cat > /opt/dns/au-team.irpo <

Проверка: http://mon.au-team.irpo:3000.

8️⃣ Инвентаризация через Ansible (BR‑SRV)

Подготовка

mount /dev/sr0 /mnt
cp /mnt/playbook/get_hostname_address.yml /etc/ansible

Файл inventory – /etc/ansible/demo.ini

[inventory]
hq-cli ansible_host=192.168.200.2 ansible_user=username
hq-srv ansible_host=192.168.100.2 ansible_port=2026 ansible_user=sshuser

Playbook – /etc/ansible/get_hostname_address.yml

- name: Inventory of HQ‑SRV and HQ‑CLI
  hosts: inventory
  tasks:
    - copy:
        dest: "/etc/ansible/PC-INFO/{{ ansible_hostname }}.yml"
        content: |
          Hostname: {{ ansible_hostname }}
          IP_Address: {{ ansible_default_ipv4.address }}
      delegate_to: localhost

Запуск

mkdir -p /etc/ansible/PC-INFO
cd /etc/ansible
ansible-playbook get_hostname_address.yml -i demo.ini

Проверка

ls /etc/ansible/PC-INFO
cat /etc/ansible/PC-INFO/hq-cli.yml
cat /etc/ansible/PC-INFO/hq-srv.yml

9️⃣ Защита SSH через fail2ban (HQ‑SRV)

dnf install fail2ban -y --nogpgcheck
nano /etc/fail2ban/jail.local
# Начало файла
[sshd]
enabled = true
port    = 2026
filter  = sshd
maxretry = 3
bantime = 60
findtime = 120
# Конец файла

systemctl restart fail2ban
systemctl enable --now fail2ban
fail2ban-client status sshd

Проверка: выполнить 3 неправильных попытки входа в SSH на порт 2026 – IP‑адрес будет заблокирован на 60 сек.