UTMC: ПОСІБНИК ІЗ ЗАХИСТУ СИСТЕМИ¶
Практичний гайд з hardening’у Ukrainian Tactical Mesh Cloud¶
Версія: 1.0
Дата: 24 грудня 2025
Автор: Олег (Проект MYTEC)
Класифікація: ДЛЯ СЛУЖБОВОГО КОРИСТУВАННЯ
Призначення: DevOps, SecOps, System Administrators
📋 Зміст¶
- Огляд безпеки
- Hardening VPS хабу
- Hardening сервера СОТ
- Hardening клієнтських пристроїв
- Управління ключами та сертифікатами
- Моніторинг та виявлення вторгнень
- Incident Response
- Checklist’и безпеки
🎯 Огляд безпеки¶
Принципи захисту UTMC¶
Defense in Depth (Глибинний захист):
┌────────────────────────────────────────────┐
│ Layer 5: Application (E2E encryption) │
├────────────────────────────────────────────┤
│ Layer 4: Service Auth (passwords, 2FA) │
├────────────────────────────────────────────┤
│ Layer 3: mTLS (client certificates) │
├────────────────────────────────────────────┤
│ Layer 2: Firewall (network segmentation) │
├────────────────────────────────────────────┤
│ Layer 1: WireGuard (VPN encryption) │
└────────────────────────────────────────────┘
Кожен рівень має бути незалежно захищеним!
Модель безпеки¶
Довіряємо:
✅ Криптографії (WireGuard, mTLS)
✅ Перевіреним публічним ключам
✅ Offline Root CA (air-gapped)
✅ Firewall правилам (default deny)
НЕ довіряємо:
❌ Транспортній мережі (інтернет, WiFi)
❌ VPS провайдерам (можуть бути змушені співпрацювати)
❌ Користувачам (social engineering)
❌ Одному рівню захисту (потрібен defense in depth)
🔒 Hardening VPS хабу¶
Базова конфігурація системи¶
1. Оновлення системи
# Ubuntu 24.04 LTS
apt update && apt upgrade -y
apt autoremove -y
# Автоматичні security updates
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
# Налаштування
cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF
2. Firewall (UFW)
# Базова конфігурація
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
# Дозволити тільки необхідне
ufw allow 51820/udp comment 'WireGuard VPN'
ufw allow 80/tcp comment 'HTTP (Caddy - auto redirect to HTTPS)'
ufw allow 443/tcp comment 'HTTPS (Caddy)'
# SSH з обмеженням (опціонально, якщо потрібен)
# Краще: SSH тільки через VPN після налаштування!
ufw allow from <YOUR_TRUSTED_IP> to any port 22 proto tcp comment 'SSH from trusted IP'
# Rate limiting для SSH (захист від brute-force)
ufw limit 22/tcp comment 'SSH rate limit'
# Увімкнути
ufw enable
# Перевірка
ufw status verbose
3. SSH Hardening
# Резервна копія оригінального конфігу
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
# Налаштування /etc/ssh/sshd_config
cat > /etc/ssh/sshd_config << 'EOF'
# Базові налаштування
Port 22
Protocol 2
PermitRootLogin prohibit-password # Тільки ключі, НЕ паролі!
StrictModes yes
MaxAuthTries 3
MaxSessions 5
# Автентифікація
PubkeyAuthentication yes
PasswordAuthentication no # ❌ Паролі заборонені!
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# Kerberos/GSSAPI
KerberosAuthentication no
GSSAPIAuthentication no
# Обмеження користувачів
AllowUsers admin # Тільки конкретний користувач!
DenyUsers root # Root заборонений явно
# Мережеві налаштування
ListenAddress 0.0.0.0 # Або конкретний IP
AddressFamily inet # IPv4 only (або 'any' для IPv4+IPv6)
TCPKeepAlive yes
ClientAliveInterval 300
ClientAliveCountMax 2
# Банери та логування
Banner /etc/ssh/banner
SyslogFacility AUTH
LogLevel VERBOSE
# Forwarding (обмежити!)
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
GatewayPorts no
# Інше
UsePAM yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
# Банер попередження
cat > /etc/ssh/banner << 'EOF'
**************************************************************************
* АВТОРИЗОВАНИЙ ДОСТУП ТІЛЬКИ *
* *
* Несанкціонований доступ до цієї системи ЗАБОРОНЕНО. *
* Усі дії логуються та моніторяться. *
* Порушення переслідуються згідно з законодавством України. *
**************************************************************************
EOF
# Перезапустити SSH
systemctl restart sshd
# Тестування (НЕ закривай поточну сесію!)
# Відкрий нову сесію та перевір доступ
ssh admin@<VPS_IP> -i ~/.ssh/id_rsa
4. Fail2ban (захист від brute-force)
# Встановлення
apt install fail2ban -y
# Конфігурація
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600 # Бан на 1 годину
findtime = 600 # Вікно 10 хвилин
maxretry = 3 # Максимум 3 спроби
banaction = ufw # Використовувати UFW для банів
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[wireguard]
enabled = true
port = 51820
protocol = udp
filter = wireguard
logpath = /var/log/syslog
maxretry = 5
bantime = 7200 # 2 години
[caddy]
enabled = true
port = 80,443
filter = caddy
logpath = /var/log/caddy/access.log
maxretry = 10
EOF
# Створити фільтр для WireGuard
cat > /etc/fail2ban/filter.d/wireguard.conf << 'EOF'
[Definition]
failregex = ^.*wireguard.*Invalid handshake.*<HOST>.*$
^.*wireguard.*Failed handshake.*<HOST>.*$
ignoreregex =
EOF
# Створити фільтр для Caddy
cat > /etc/fail2ban/filter.d/caddy.conf << 'EOF'
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD) .* HTTP.*" 40[134] .*$
^<HOST> - .* "(GET|POST|HEAD) .* HTTP.*" 50[023] .*$
ignoreregex =
EOF
# Запустити
systemctl enable fail2ban
systemctl start fail2ban
# Перевірка
fail2ban-client status
fail2ban-client status sshd
5. Sysctl (kernel hardening)
cat >> /etc/sysctl.conf << 'EOF'
# IP Forwarding (потрібно для VPN)
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# SYN flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# ICMP protection
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# IP spoofing protection
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
# Не приймати source routed packets
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Log Martians (підозрілі пакети)
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# IPv6 (вимкнути якщо не використовується)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF
# Застосувати
sysctl -p
WireGuard Hardening¶
6. WireGuard конфігурація (безпечна)
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <ЗГЕНЕРОВАНИЙ_ПРИВАТНИЙ_КЛЮЧ>
# Firewall правила (PostUp)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
# ❌ БЛОКУВАННЯ INTER-PEER TRAFFIC (опціонально, для підвищеної безпеки)
# Заборонити СОТам комунікувати напряму через VPS
PostUp = iptables -A FORWARD -i wg0 -o wg0 -s 10.10.10.0/24 -d 10.10.11.0/24 -j DROP
PostUp = iptables -A FORWARD -i wg0 -o wg0 -s 10.10.11.0/24 -d 10.10.10.0/24 -j DROP
# Cleanup (PostDown)
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o wg0 -s 10.10.10.0/24 -d 10.10.11.0/24 -j DROP
PostDown = iptables -D FORWARD -i wg0 -o wg0 -s 10.10.11.0/24 -d 10.10.10.0/24 -j DROP
# Peers (тільки зареєстровані!)
[Peer]
# СОТ А
PublicKey = <СОТ_А_ПУБЛІЧНИЙ_КЛЮЧ>
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25
[Peer]
# СОТ Б
PublicKey = <СОТ_Б_ПУБЛІЧНИЙ_КЛЮЧ>
AllowedIPs = 10.10.11.0/24
PersistentKeepalive = 25
# ❌ НЕ додавай peers з AllowedIPs = 0.0.0.0/0 !
# ✅ Тільки конкретні підмережі!
Права доступу:
chmod 600 /etc/wireguard/wg0.conf
chown root:root /etc/wireguard/wg0.conf
# Приватні ключі ізольовані
chmod 600 /etc/wireguard/privatekey
Caddy Hardening¶
7. Caddy конфігурація (безпечна)
# /etc/caddy/Caddyfile
# Глобальні налаштування
{
email admin@nxcl.club
# Security headers
servers {
protocols h1 h2 h3
timeouts {
read_body 10s
read_header 5s
write 10s
idle 120s
}
}
}
# Сервіс з mTLS (максимальна безпека)
grz.nxcl.club {
# Обмеження джерел
@wg {
remote_ip 10.10.0.0/16 # Тільки VPN мережа
}
# mTLS
tls {
client_auth {
mode require_and_verify
trust_pool file {
pem_file /etc/caddy/mtls/ca.crt
}
}
}
# Security headers
header {
# HSTS (HTTP Strict Transport Security)
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# CSP (Content Security Policy)
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"
# X-Frame-Options (clickjacking protection)
X-Frame-Options "DENY"
# X-Content-Type-Options
X-Content-Type-Options "nosniff"
# Referrer Policy
Referrer-Policy "strict-origin-when-cross-origin"
# Permissions Policy
Permissions-Policy "geolocation=(), microphone=(), camera=()"
# Видалити server header (information disclosure)
-Server
}
# Rate limiting
rate_limit {
zone wg_zone {
key {remote_ip}
events 100
window 1m
}
}
# Proxy до сервісу
handle @wg {
reverse_proxy 10.10.10.235:8080 {
# Health check
health_uri /status
health_interval 10s
health_timeout 5s
# Timeouts
transport http {
dial_timeout 5s
response_header_timeout 10s
}
}
}
# Блокувати все інше
handle {
abort
}
}
# Сервіс БЕЗ mTLS (тільки VPN + passwords)
cloud.nxcl.club {
@wg {
remote_ip 10.10.0.0/16
}
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Frame-Options "SAMEORIGIN" # Nextcloud потребує frames
X-Content-Type-Options "nosniff"
-Server
}
handle @wg {
reverse_proxy 10.10.10.235:8080
}
handle {
abort
}
}
DNS Hardening¶
8. dnsmasq конфігурація
# /etc/dnsmasq.conf
# Інтерфейси
listen-address=127.0.0.1,10.10.0.1
interface=lo,wg0
bind-interfaces
# Upstream DNS (trusted)
server=1.1.1.1 # Cloudflare
server=1.0.0.1
server=8.8.8.8 # Google (резерв)
server=8.8.4.4
# Локальні домени
address=/nxcl.club/10.10.0.1
address=/.nxcl.club/10.10.0.1
# Безпека
bogus-priv # Ігнорувати приватні IP у публічних доменах
domain-needed # Не пересилати прості назви (без крапок)
expand-hosts # Додавати domain до локальних хостів
no-resolv # Не читати /etc/resolv.conf
no-poll # Не перевіряти /etc/resolv.conf на зміни
# DNSSEC (перевірка підписів)
dnssec
trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D
# Кеш
cache-size=10000
neg-ttl=3600 # Кешувати негативні відповіді (NXDOMAIN)
# Логування
log-queries
log-facility=/var/log/dnsmasq.log
log-async=20 # Асинхронне логування (продуктивність)
# Rate limiting (захист від DNS amplification)
dns-loop-detect
🏰 Hardening сервера СОТ¶
MikroTik RouterOS¶
9. Базова безпека MikroTik
# Підключення через WinBox або SSH
# 1. Оновити RouterOS до останньої версії
/system package update check-for-updates
/system package update download
# Після завантаження - перезавантажити
/system reboot
# 2. Змінити default credentials
/user set admin password="<СИЛЬНИЙ_ПАРОЛЬ>"
# 3. Вимкнути непотрібні сервіси
/ip service disable telnet,ftp,www,api,api-ssl
/ip service set ssh port=22222 # Змінити SSH порт (опціонально)
/ip service set winbox port=8291 # Стандартний порт
# 4. Firewall основні правила
/ip firewall filter
# Дозволити встановлені/пов'язані
add chain=input connection-state=established,related action=accept
add chain=forward connection-state=established,related action=accept
# Дозволити ICMP (ping) з обмеженнями
add chain=input protocol=icmp icmp-options=8:0 limit=5,10:packet action=accept
add chain=input protocol=icmp action=drop
# Дозволити SSH тільки з LAN
add chain=input src-address=192.168.88.0/24 protocol=tcp dst-port=22222 action=accept
# Дозволити WireGuard
add chain=input protocol=udp dst-port=51820 action=accept
# Дозволити DHCP, DNS з LAN
add chain=input src-address=192.168.88.0/24 protocol=udp dst-port=53,67,68 action=accept
# ❌ ЗАБЛОКУВАТИ SSH з WireGuard (безпека!)
add chain=input in-interface=wg0 protocol=tcp dst-port=22,22222 action=drop comment="Block SSH from VPN"
# ❌ ЗАБЛОКУВАТИ WinBox з WireGuard
add chain=input in-interface=wg0 protocol=tcp dst-port=8291 action=drop comment="Block WinBox from VPN"
# Drop всі інші вхідні
add chain=input action=drop comment="Drop all other input"
# Forward правила (між VPN та LAN)
# ЗАБОРОНИТИ forwarding з VPN до LAN (за замовчуванням)
add chain=forward in-interface=wg0 out-interface=ether2 action=drop comment="Block VPN to LAN"
# Дозволити тільки конкретні сервіси (whitelist)
add chain=forward in-interface=wg0 dst-address=10.10.10.235 protocol=tcp dst-port=8080 action=accept comment="Allow Nextcloud"
# 5. WireGuard конфігурація
/interface wireguard
add listen-port=51820 name=wg0 private-key="<ЗГЕНЕРОВАНИЙ_КЛЮЧ>"
/interface wireguard peers
add allowed-address=10.10.0.0/16 \
endpoint-address=2.56.207.143 \
endpoint-port=51820 \
public-key="<VPS_ПУБЛІЧНИЙ_КЛЮЧ>" \
persistent-keepalive=25s
/ip address
add address=10.10.10.1/24 interface=wg0 network=10.10.10.0
# 6. Disable unused interfaces
/interface ethernet
set [find name="ether3"] disabled=yes
set [find name="ether4"] disabled=yes
# 7. Налаштувати NTP (точний час критичний для логів)
/system ntp client
set enabled=yes servers=ua.pool.ntp.org,europe.pool.ntp.org
# 8. Логування
/system logging
add topics=firewall,info action=memory
add topics=wireguard,info action=memory
add topics=critical action=echo
# 9. Увімкнути watchdog (auto-reboot якщо зависне)
/system watchdog
set watchdog-timer=yes
# 10. Backup конфігурації
/system backup save name=utmc-backup
/export file=utmc-config
# Завантажити резервні копії на безпечне місце!
Linux сервер СОТ (Raspberry Pi / NUC)¶
10. Системний hardening
# Аналогічно VPS, але додатково:
# 1. Шифрування диска (LUKS)
# Під час установки Ubuntu вибрати "Encrypt the disk"
# Або після установки:
cryptsetup luksFormat /dev/sda2
cryptsetup luksOpen /dev/sda2 cryptroot
# 2. Автоматичне монтування з ключем (для headless серверів)
# /etc/crypttab
echo "cryptroot UUID=<UUID> /etc/luks/keyfile luks" >> /etc/crypttab
# Генерувати ключ
dd if=/dev/urandom of=/etc/luks/keyfile bs=1024 count=4
chmod 000 /etc/luks/keyfile
cryptsetup luksAddKey /dev/sda2 /etc/luks/keyfile
# 3. AppArmor (обов'язково для Docker)
systemctl enable apparmor
systemctl start apparmor
# Профілі для Docker containers
aa-enforce /etc/apparmor.d/docker-*
# 4. Auditd (логування системних подій)
apt install auditd audispd-plugins -y
cat >> /etc/audit/rules.d/utmc.rules << 'EOF'
# Моніторинг доступу до WireGuard конфігів
-w /etc/wireguard/ -p wa -k wireguard_config
# Моніторинг змін firewall
-w /etc/ufw/ -p wa -k firewall_config
-a always,exit -F arch=b64 -S sethostname -S setdomainname -k network_modifications
# Моніторинг SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /root/.ssh/ -p wa -k root_ssh
# Sudo команди
-a exit,always -F arch=b64 -F euid=0 -S execve -k root_commands
EOF
systemctl restart auditd
# 5. Automatic security updates (як на VPS)
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
11. Docker Security
# /etc/docker/daemon.json
cat > /etc/docker/daemon.json << 'EOF'
{
"icc": false,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"seccomp-profile": "/etc/docker/seccomp.json",
"userns-remap": "default"
}
EOF
systemctl restart docker
# Docker Compose security
# У кожному docker-compose.yml:
version: '3.8'
services:
nextcloud:
image: nextcloud:latest
security_opt:
- no-new-privileges:true
- apparmor=docker-default
- seccomp=/etc/docker/seccomp.json
read_only: true # Файлова система read-only
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- SETGID
- SETUID
networks:
- isolated_network
restart: unless-stopped
networks:
isolated_network:
driver: bridge
internal: true # Без доступу до інтернету (якщо не потрібен)
📱 Hardening клієнтських пристроїв¶
Windows¶
12. Windows конфігурація
# PowerShell as Administrator
# 1. Firewall правила
New-NetFirewallRule -DisplayName "Block SSH from VPN" `
-Direction Inbound -InterfaceAlias "MYTEC" `
-Protocol TCP -LocalPort 22,3389,445,5900 -Action Block
# 2. WireGuard конфіг (безпечний)
# C:\Users\<USER>\wg0.conf
[Interface]
PrivateKey = <ПРИВАТНИЙ_КЛЮЧ>
Address = 10.10.10.69/24
DNS = 10.10.0.1
[Peer]
PublicKey = <VPS_ПУБЛІЧНИЙ_КЛЮЧ>
AllowedIPs = 10.10.0.0/16 # ✅ ТІЛЬКИ mesh, НЕ 0.0.0.0/0!
Endpoint = 2.56.207.143:51820
PersistentKeepalive = 25
# 3. BitLocker (шифрування диска)
Enable-BitLocker -MountPoint "C:" -EncryptionMethod XtsAes256 `
-UsedSpaceOnly -RecoveryPasswordProtector
# Збережи recovery key у безпечному місці!
Get-BitLockerVolume -MountPoint "C:" | Select-Object -ExpandProperty KeyProtector
# 4. Windows Defender (актуально тримати)
Update-MpSignature
Set-MpPreference -DisableRealtimeMonitoring $false
# 5. Вимкнути непотрібні сервіси
Stop-Service -Name "RemoteRegistry" -Force
Set-Service -Name "RemoteRegistry" -StartupType Disabled
Linux Desktop/Laptop¶
13. Linux клієнт
# 1. UFW firewall
ufw default deny incoming
ufw default allow outgoing
# Блокувати SSH з VPN
ufw deny in on wg0 to any port 22
# 2. WireGuard systemd service
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# 3. Шифрування home директорії
sudo apt install ecryptfs-utils
sudo ecryptfs-migrate-home -u <USERNAME>
# 4. ClamAV антивірус
sudo apt install clamav clamav-daemon
sudo freshclam # Оновити бази
sudo systemctl enable clamav-freshclam
iOS/Android¶
14. Mobile пристрої
iOS:
1. Встановити WireGuard app з App Store (офіційний!)
2. Імпортувати конфіг через QR код або файл
3. Settings → General → VPN & Device Management
→ Перевірити що тільки UTMC VPN активний
4. Settings → Face ID & Passcode → Увімкнути
5. Settings → Privacy & Security → Enable "Lockdown Mode" (iOS 16+)
6. Find My iPhone → Увімкнути (remote wipe при втраті)
Android:
1. Встановити WireGuard app з Google Play (офіційний!)
2. Імпортувати конфіг
3. Settings → Security → Encryption → Перевірити увімкнено
4. Settings → Security → Screen Lock → PIN/Pattern/Fingerprint
5. Google Play Protect → Увімкнути
6. Find My Device → Увімкнути (remote wipe)
🔑 Управління ключами та сертифікатами¶
Генерація ключів (безпечна)¶
15. WireGuard ключі
# На air-gapped машині (офлайн!)
# Або на безпечній робочій станції
# Генерувати ключову пару
wg genkey | tee privatekey | wg pubkey > publickey
# Права доступу
chmod 600 privatekey
chmod 644 publickey
# Переглянути
cat privatekey # ← НЕ передавати через інтернет!
cat publickey # ← Можна передавати
# Безпечна передача приватного ключа:
# 1. Зашифрувати GPG
gpg --symmetric --cipher-algo AES256 privatekey
# → privatekey.gpg
# 2. Передати зашифрований файл
scp privatekey.gpg admin@server:/tmp/
# 3. На сервері розшифрувати
gpg --decrypt /tmp/privatekey.gpg > /etc/wireguard/privatekey
chmod 600 /etc/wireguard/privatekey
shred -vfz /tmp/privatekey.gpg # Безпечно видалити
16. Root CA та mTLS сертифікати
# На ПОВНІСТЮ ОФЛАЙН машині (air-gapped!)
# Використати Live USB з Ubuntu, БЕЗ мережевих підключень
# 1. Генерувати Root CA
mkdir -p /mnt/usb/utmc-ca
cd /mnt/usb/utmc-ca
openssl genrsa -aes256 -out ca.key 4096
# Пароль: ДУЖЕ СИЛЬНИЙ, запиши на папері у сейфі!
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/C=UA/ST=Dnipro/L=Dnipro/O=NXCL/OU=Security/CN=NXCL Root CA"
# 2. Генерувати клієнтський сертифікат
# (це можна на онлайн машині, але CA key залишається offline!)
# На офлайн машині з ca.key:
openssl genrsa -out mytec-client.key 4096
openssl req -new -key mytec-client.key -out mytec-client.csr \
-subj "/C=UA/ST=Dnipro/O=NXCL/OU=Client/CN=mytec-client"
# Підпис (потрібен ca.key - тільки на offline машині!)
openssl x509 -req -in mytec-client.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out mytec-client.crt -days 825 -sha256
# PKCS#12 для імпорту
openssl pkcs12 -export \
-out mytec-client.p12 \
-inkey mytec-client.key \
-in mytec-client.crt \
-certfile ca.crt \
-name "UTMC Client Certificate" \
-passout pass:nxcl2025
# 3. Зберегти CA key у безпечному місці
# - Зашифрований USB флеш у сейфі
# - Паперова копія (QR код) у банківському сейфі
# - Shamir's Secret Sharing (розділити на 5 частин, потрібно 3)
# 4. Видалити всі сліди з online машини
shred -vfz -n 10 ca.key mytec-client.key mytec-client.csr
Ротація ключів¶
17. Політика ротації
# Скрипт ротації WireGuard ключів
# /usr/local/bin/rotate-wg-keys.sh
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/wireguard"
DATE=$(date +%Y%m%d-%H%M%S)
# Backup поточного ключа
mkdir -p "$BACKUP_DIR"
cp /etc/wireguard/wg0.conf "$BACKUP_DIR/wg0.conf.$DATE"
# Генерувати новий ключ
NEW_PRIVATE=$(wg genkey)
NEW_PUBLIC=$(echo "$NEW_PRIVATE" | wg pubkey)
# Оновити конфіг
sed -i "s/^PrivateKey = .*/PrivateKey = $NEW_PRIVATE/" /etc/wireguard/wg0.conf
echo "Новий публічний ключ: $NEW_PUBLIC"
echo "ВАЖЛИВО: Оновити peers на VPS з новим публічним ключем!"
# Перезапустити WireGuard
wg-quick down wg0
wg-quick up wg0
echo "Ротація завершена. Backup: $BACKUP_DIR/wg0.conf.$DATE"
Розклад ротації:
WireGuard ключі: Кожні 90 днів
mTLS сертифікати: Кожні 365 днів (825 днів валідність - поновлювати щороку)
Root CA: Кожні 10 років (НЕ ротувати без критичної потреби!)
SSH ключі: Кожні 180 днів
Паролі сервісів: Кожні 90 днів
📊 Моніторинг та виявлення вторгнень¶
Централізований моніторинг¶
18. Prometheus + Grafana
# На VPS Hub
# Docker Compose для моніторингу
cat > /opt/monitoring/docker-compose.yml << 'EOF'
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
ports:
- "127.0.0.1:9090:9090"
restart: unless-stopped
grafana:
image: grafana/grafana:latest
volumes:
- grafana_data:/var/lib/grafana
- ./grafana-dashboards:/etc/grafana/provisioning/dashboards
environment:
- GF_SECURITY_ADMIN_PASSWORD=<STRONG_PASSWORD>
- GF_SERVER_ROOT_URL=https://mon.nxcl.club
ports:
- "127.0.0.1:3000:3000"
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
command:
- '--path.rootfs=/host'
volumes:
- /:/host:ro,rslave
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
EOF
# Prometheus конфіг
cat > /opt/monitoring/prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'vps-hub'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'wireguard'
static_configs:
- targets: ['10.10.0.1:9586'] # wireguard-exporter
- job_name: 'cot-servers'
static_configs:
- targets:
- '10.10.10.235:9100' # СОТ А node-exporter
- '10.10.11.50:9100' # СОТ Б node-exporter
EOF
docker-compose up -d
19. Алерти (критичні події)
# /opt/monitoring/alerts.yml
groups:
- name: utmc_alerts
interval: 30s
rules:
- alert: VPSDown
expr: up{job="vps-hub"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "VPS Hub is down!"
- alert: UnauthorizedSSH
expr: rate(node_auth_failed_total[5m]) > 5
labels:
severity: warning
annotations:
summary: "Multiple failed SSH attempts"
- alert: WireGuardPeerDown
expr: wireguard_peer_last_handshake_seconds > 300
for: 10m
labels:
severity: warning
annotations:
summary: "WireGuard peer {{ $labels.public_key }} is down"
- alert: HighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 15m
labels:
severity: warning
SIEM (Security Information and Event Management)¶
20. Централізоване логування (Loki)
# Docker Compose додати Loki
cat >> /opt/monitoring/docker-compose.yml << 'EOF'
loki:
image: grafana/loki:latest
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml
- loki_data:/loki
ports:
- "127.0.0.1:3100:3100"
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
promtail:
image: grafana/promtail:latest
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml
- /var/log:/var/log:ro
command: -config.file=/etc/promtail/config.yml
restart: unless-stopped
EOF
# Loki конфіг
cat > /opt/monitoring/loki-config.yml << 'EOF'
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
schema_config:
configs:
- from: 2023-01-01
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-shipper-active
cache_location: /loki/boltdb-shipper-cache
filesystem:
directory: /loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
EOF
# Promtail конфіг (збір логів)
cat > /opt/monitoring/promtail-config.yml << 'EOF'
server:
http_listen_port: 9080
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log
- job_name: wireguard
static_configs:
- targets:
- localhost
labels:
job: wireguard
__path__: /var/log/wireguard.log
- job_name: auth
static_configs:
- targets:
- localhost
labels:
job: auth
__path__: /var/log/auth.log
EOF
IDS/IPS (Intrusion Detection/Prevention)¶
21. Suricata
# Встановлення
apt install suricata -y
# Конфігурація /etc/suricata/suricata.yaml
# (великий файл, ключові зміни:)
vars:
address-groups:
HOME_NET: "[10.10.0.0/16,192.168.88.0/24]"
EXTERNAL_NET: "!$HOME_NET"
af-packet:
- interface: wg0
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
- interface: ens3
cluster-id: 98
cluster-type: cluster_flow
# Оновити правила
suricata-update
# Кастомні правила
cat > /etc/suricata/rules/utmc-custom.rules << 'EOF'
# Виявлення port scan
alert tcp any any -> $HOME_NET any (msg:"UTMC: Port scan detected"; \
flags:S; threshold: type both, track by_src, count 20, seconds 60; \
classtype:attempted-recon; sid:1000001; rev:1;)
# Виявлення brute-force SSH
alert tcp any any -> $HOME_NET 22 (msg:"UTMC: SSH brute force"; \
flow:to_server,established; content:"SSH"; threshold: type both, \
track by_src, count 5, seconds 60; classtype:attempted-admin; \
sid:1000002; rev:1;)
# Виявлення підозрілого WireGuard handshake flood
alert udp any any -> $HOME_NET 51820 (msg:"UTMC: WireGuard handshake flood"; \
threshold: type both, track by_src, count 50, seconds 10; \
classtype:attempted-dos; sid:1000003; rev:1;)
EOF
# Увімкнути custom правила
echo "include: /etc/suricata/rules/utmc-custom.rules" >> /etc/suricata/suricata.yaml
# Запустити
systemctl enable suricata
systemctl start suricata
# Перевірити логи
tail -f /var/log/suricata/fast.log
🚨 Incident Response¶
План реагування на інциденти¶
22. Процедури реагування
# UTMC Incident Response Plan
## Фаза 1: Виявлення
### Індикатори компрометації:
- Незвичайна мережева активність (аlerти Prometheus/Suricata)
- Невідомі SSH/VPN з'єднання
- Зміни в конфігураційних файлах
- Підозрілі процеси
- Аномалії в логах
### Дії:
1. ✅ Перевірити аlerти моніторингу
2. ✅ Перевірити логи (auth.log, syslog, wireguard)
3. ✅ Запустити security scan (rkhunter, chkrootkit)
## Фаза 2: Ізоляція
### Якщо підтверджено компрометацію:
1. **НЕ ВИМИКАТИ** скомпрометовану систему (втратиш докази!)
2. **Ізолювати** від мережі:
```bash
# На VPS: видалити peer з WireGuard
wg set wg0 peer <COMPROMISED_PEER_PUBLIC_KEY> remove
# Firewall block
ufw deny from <COMPROMISED_IP>
- Відкликати облікові дані:
```bash
# Disable SSH ключі
mv ~/.ssh/authorized_keys ~/.ssh/authorized_keys.REVOKED
# Відкликати mTLS сертифікати
# Додати до CRL (Certificate Revocation List)
```
1. Повідомити security team та керівництво
Фаза 3: Збір доказів¶
# Зберегти образ пам'яті
sudo apt install lime-forensics-dkms
sudo insmod /usr/src/lime-*/lime.ko "path=/tmp/memory.lime format=lime"
# Зберегти копію диска (якщо можливо)
dd if=/dev/sda of=/mnt/evidence/disk.img bs=4M status=progress
# Зберегти логи
tar czf /tmp/logs-$(date +%Y%m%d).tar.gz /var/log
# Зберегти конфігурації
tar czf /tmp/configs-$(date +%Y%m%d).tar.gz \
/etc/wireguard /etc/ssh /etc/caddy /etc/ufw
# Зберегти мережеві з'єднання
netstat -tunlp > /tmp/netstat.txt
ss -tunlp > /tmp/ss.txt
lsof -i > /tmp/lsof.txt
# Зберегти процеси
ps auxf > /tmp/processes.txt
# Hash всіх доказів (для юридичної дійсності)
sha256sum /tmp/*.{img,tar.gz,txt} > /tmp/evidence.sha256
Фаза 4: Eradication (Усунення загрози)¶
# 1. Повне перевстановлення ОС (не довіряти очищенню!)
# 2. Відновити з перевіреного backup
# 3. Змінити ВСІ паролі, ключі, сертифікати
# 4. Оновити всі системи до останніх версій
# 5. Виправити вразливість що дозволила компрометацію
Фаза 5: Відновлення¶
# 1. Поступово повертати систему в мережу
# 2. Посилений моніторинг (24/7)
# 3. Перевірити чи немає повторної компрометації
# 4. Відновити сервіси поетапно
Фаза 6: Lessons Learned¶
- Документувати інцидент
- Провести post-mortem аналіз
- Оновити security процедури
- Провести додаткове навчання персоналу
---
## ✅ Checklist'и безпеки
### Pre-Deployment Checklist
```markdown
## VPS Hub Security Checklist
- [ ] Системні оновлення застосовано
- [ ] UFW firewall налаштовано (default deny)
- [ ] SSH hardening виконано (ключі, без паролів)
- [ ] Fail2ban налаштовано та працює
- [ ] WireGuard конфігурація перевірена (AllowedIPs обмежені)
- [ ] Caddy налаштовано з security headers
- [ ] dnsmasq налаштовано з trusted DNS
- [ ] Логування увімкнено (syslog, audit, fail2ban)
- [ ] Prometheus + Grafana розгорнуто
- [ ] Backup налаштовано (автоматично, зашифровано)
- [ ] Суворі права файлів (/etc/wireguard 600)
- [ ] Root CA зберігається offline (air-gapped)
- [ ] Тестування проникнення виконано
## СОТ Server Security Checklist
- [ ] MikroTik RouterOS оновлено до останньої версії
- [ ] Default паролі змінено
- [ ] Firewall налаштовано (блокувати SSH з VPN)
- [ ] WireGuard peer налаштовано правильно
- [ ] NTP налаштовано (точний час для логів)
- [ ] Linux сервер: шифрування диска (LUKS)
- [ ] Linux сервер: AppArmor увімкнено
- [ ] Docker: security options застосовано
- [ ] Backup налаштовано (локально + VPS)
- [ ] UPS підключено та протестовано
- [ ] Моніторинг працює (metrics до Prometheus)
## Client Device Security Checklist
- [ ] WireGuard конфіг перевірено (AllowedIPs = 10.10.0.0/16)
- [ ] Firewall блокує SSH з VPN
- [ ] Диск зашифровано (BitLocker/LUKS/FileVault)
- [ ] Screen lock увімкнено (PIN/password)
- [ ] Антивірус актуальний (Windows Defender/ClamAV)
- [ ] Автоматичні оновлення увімкнені
- [ ] Find My Device/Lost Mode налаштовано
- [ ] VPN автоматично підключається (on-demand)
Monthly Security Audit Checklist¶
## Щомісячний Security Audit
### Системні перевірки:
- [ ] Переглянути Prometheus аlerти (критичні події?)
- [ ] Аналіз логів (Loki/Grafana - аномалії?)
- [ ] Fail2ban - кількість банів (підозрілий трафік?)
- [ ] Суricata - IDS аlerти (спроби атак?)
- [ ] WireGuard peers - всі активні? (останній handshake < 5 хв)
- [ ] SSH логи - незвичайні спроби входу?
- [ ] Disk usage - достатньо місця? (> 20% вільного)
### Конфігураційні перевірки:
- [ ] UFW правила актуальні?
- [ ] WireGuard peers список актуальний? (видалити старі)
- [ ] mTLS сертифікати не прострочені? (> 30 днів до експірації)
- [ ] Backup'и працюють? (перевірити останню копію)
- [ ] DNS працює правильно? (nslookup тест)
### Оновлення:
- [ ] Системні пакети (apt update && apt upgrade)
- [ ] Docker images (docker-compose pull && restart)
- [ ] Fail2ban rules (оновити якщо є нові загрози)
- [ ] Suricata rules (suricata-update)
### Документація:
- [ ] Оновити inventory (нові пристрої додані?)
- [ ] Перевірити SOP (Standard Operating Procedures актуальні?)
- [ ] Backup плану (tested in last 30 days?)
Quarterly Security Review¶
## Щоквартальний Security Review
- [ ] Повний penetration test (internal + external)
- [ ] Ротація WireGuard ключів (якщо 90+ днів)
- [ ] Ротація mTLS сертифікатів (якщо наближається експірація)
- [ ] Перегляд та оновлення firewall правил
- [ ] Аудит користувачів (видалити неактивних)
- [ ] Перегляд Incident Response плану
- [ ] Навчання персоналу (phishing simulation, security awareness)
- [ ] Тестування disaster recovery (відновлення з backup)
- [ ] Перегляд та оновлення цього документу
📚 Додаткові ресурси¶
Корисні команди¶
Швидка діагностика безпеки:
# Перевірити відкриті порти
ss -tunlp
# Перевірити firewall
ufw status verbose
# Перевірити останні SSH входи
last -a | head -20
# Перевірити failed SSH
grep "Failed password" /var/log/auth.log | tail -20
# Перевірити WireGuard статус
wg show
# Перевірити процеси що слухають на мережі
lsof -i -P -n
# Перевірити cron jobs (backdoors часто тут)
crontab -l
ls -la /etc/cron.*
# Сканування rootkits
rkhunter --check
chkrootkit
Emergency Response Commands¶
# ЯКЩО ПІДОЗРА НА КОМПРОМЕТАЦІЮ:
# 1. Негайно ізолювати (але НЕ вимикати!)
ufw deny from <SUSPICIOUS_IP>
wg set wg0 peer <SUSPICIOUS_PUBLIC_KEY> remove
# 2. Зберегти докази
mkdir /tmp/evidence-$(date +%Y%m%d-%H%M%S)
tar czf /tmp/evidence.tar.gz /var/log /etc /home
sha256sum /tmp/evidence.tar.gz > /tmp/evidence.sha256
# 3. Повідомити
echo "SECURITY INCIDENT at $(hostname) - $(date)" | \
mail -s "URGENT: Security Incident" security@nxcl.club
# 4. Документувати
cat > /tmp/incident-report.txt << EOF
Дата/час: $(date)
Хост: $(hostname)
IP: $(hostname -I)
Опис: <DESCRIBE_WHAT_HAPPENED>
Дії: <ACTIONS_TAKEN>
EOF
🎓 Висновки та рекомендації¶
Ключові принципи¶
- Defense in Depth - Множинні рівні захисту
- Least Privilege - Мінімально необхідні права
- Zero Trust - Ніколи не довіряти, завжди перевіряти
- Assume Breach - Припускати що компрометація можлива
- Monitor Everything - Логувати та моніторити все
Найважливіші контроли¶
Критична важливість (P0):
1. Firewall default deny
2. SSH без паролів (тільки ключі)
3. WireGuard AllowedIPs обмежені
4. Шифрування диска
5. Регулярні backup'и
Висока важливість (P1):
6. mTLS для критичних сервісів
7. Fail2ban / rate limiting
8. Централізований моніторинг
9. IDS/IPS (Suricata)
10. Регулярні оновлення
Середня важливість (P2):
11. Ротація ключів кожні 90 днів
12. Quarterly penetration tests
13. Security awareness training
14. Документація та процедури
Постійне вдосконалення¶
Безпека - це не одноразова дія, а безперервний процес:
- Регулярні аудити
- Постійний моніторинг
- Швидке реагування на інциденти
- Навчання та тренування персоналу
- Оновлення та патчі
- Тестування та валідація
Пам’ятайте: Найслабша ланка - це завжди люди. Технічні контролі важливі, але навчання та процедури критичні!
КІНЕЦЬ ДОКУМЕНТА
🇺🇦 Захищайте інфраструктуру. Захищайте людей. Слава Україні! 💙💛
Шлях: security/hardening.md