Good

UMTC: Посібник із захисту системи

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

💡 Чому це важливо?
Безпека UMTC — це безпека комунікації. Цей документ описує всі рівні захисту, які застосовуються в інфраструктурі: від WireGuard до firewall, від SSH до mTLS.

Огляд безпеки

Принципи захисту UMTC

Defense in Depth (Глибинний захист):

flowchart TB
    subgraph layers["Рівні захисту"]
        L5["🔐 Layer 5: Application<br/>E2E encryption"]
        L4["🔑 Layer 4: Service Auth<br/>Passwords, 2FA"]
        L3["📜 Layer 3: mTLS<br/>Client certificates"]
        L2["🔥 Layer 2: Firewall<br/>Network segmentation"]
        L1["🛡️ Layer 1: WireGuard<br/>VPN encryption"]
    end

    L5 --> L4 --> L3 --> L2 --> L1

    style L5 fill:#fee2e2
    style L4 fill:#fef3c7
    style L3 fill:#d1fae5
    style L2 fill:#dbeafe
    style L1 fill:#e0e7ff

Кожен рівень має бути незалежно захищеним!

Модель безпеки

ℹ️ Довіряємо
- Криптографії (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