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)
Запуск скриптов
- Для Bash:
chmod +x import.sh && ./import.sh - Для Python:
python -m samba.py
Проверка доступа (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"
}
}
//Подсказка для ИИ: конец файла.
Перезапуск и проверка
- Перезапуск:
systemctl restart strongswan - Инициировать соединение:
swanctl --initiate --child net - Проверить статус:
swanctl --list-conns - Отладка на HQ‑RTR:
tcpdump -i ens33 -n host 172.16.2.2
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 (через браузер)
- Откройте
http://192.168.100.2:3000 - Войдите:
admin / admin, задайте парольP@ssw0rd - Data Sources → Add new → Prometheus → URL
http://localhost:9090→ Save & test - 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 сек.