UTMC: ПОСІБНИК ІЗ ЗАХИСТУ СИСТЕМИ

Практичний гайд з hardening’у Ukrainian Tactical Mesh Cloud

Версія: 1.0
Дата: 24 грудня 2025
Автор: Олег (Проект MYTEC)
Класифікація: ДЛЯ СЛУЖБОВОГО КОРИСТУВАННЯ
Призначення: DevOps, SecOps, System Administrators


📋 Зміст

  1. Огляд безпеки
  2. Hardening VPS хабу
  3. Hardening сервера СОТ
  4. Hardening клієнтських пристроїв
  5. Управління ключами та сертифікатами
  6. Моніторинг та виявлення вторгнень
  7. Incident Response
  8. 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>
  1. Відкликати облікові дані:

```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

🎓 Висновки та рекомендації

Ключові принципи

  1. Defense in Depth - Множинні рівні захисту
  2. Least Privilege - Мінімально необхідні права
  3. Zero Trust - Ніколи не довіряти, завжди перевіряти
  4. Assume Breach - Припускати що компрометація можлива
  5. 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

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications