Короткий ответ

Минимум на каждое подключение: кто (пир/CN/учётка), откуда (WAN IP), когда (connect/disconnect), куда (назначенный 10.8.0.x). WireGuard не пишет учётку AD сам — ключ ↔ человек в инвентаре. OpenVPN/RAS/strongSwan умеют auth-лог. Централизуйте в syslog/SIEM, ротация, доступ только админам ИБ. Вырежьте из логов PSK, --verb 9, wg showconf с private, пароли RADIUS. Не включайте debug навсегда.

Проверка: найдите своё тестовое подключение за вчера по ФИО или /32.

Симптомы и как отличить

Нет журнала, если после инцидента вы не отвечаете «был ли Иванов в 19:40 с IP X». Есть вредный журнал, если в git лежит journalctl с PrivateKey. Диагностика сети — лестница, это не замена учёта доступов.

Возможные причины

  1. journald volatile, retention 1 день.
  2. OpenVPN verb 1 и нет status/log.
  3. RAS Accounting не настроен, только локальный Event Viewer на RRAS без сбора.
  4. Несколько шлюзов, смотрите не тот.
  5. Логи есть, нет справочника ключ→сотрудник.

Диагностика

journalctl -u wg-quick@wg0 -u strongswan -u openvpn --since yesterday | head
ls -l /var/log/openvpn*
wg show
Get-WinEvent -LogName Application -ProviderName RasClient -MaxEvents 20
Get-RemoteAccessAccounting  # на RRAS, если роль есть
Get-VpnConnection

Ищите строки с паролем, PrivateKey, shared secret. Если есть — инцидент утечки лога.

Решение

WireGuard

Демон малословен. Варианты:

  • cron/wg show dump раз в минуту в файл (кто handshake < 180s) — грубо, но работает;
  • wg-quick PostUp не логирует пиров;
  • пользовательские решения netlink — только проверенные, не случайный скрипт с github в проде без ревью;
  • обязательный CMDB: pubkey, ФИО, 10.8.0.10.

Пример безопасного снимка (без ключей private):

wg show all dump | awk '{print $1,$3,$4,$5,$6}' >> /var/log/wireguard-peers.log

Права 640, пользователь adm. Ротация logrotate. В dump есть public key — это идентификатор, не private.

OpenVPN 2.6

verb 3
log /var/log/openvpn/openvpn.log
status /var/log/openvpn/status.log 1
status-version 2

status даёт CN и виртуальный IP. syslog: --syslog. Не verb 9.

strongSwan

journalctl -u strongswan + charon.debug умеренно. EAP identity в логе — ок, MSCHAPv2 hash/пароль — нет. Проверьте, что accounting RADIUS пишет Start/Stop.

Windows 11 / RRAS

Включите Accounting в Remote Access. События RasClient на клиенте полезны для диагностики, на сервере — NPS/RRAS:

Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='RemoteAccess'} -MaxEvents 20

Сбор через WEF/SIEM. Get-VpnConnection на клиенте — не серверный аудит.

Поля, которые хранить

ПолеЗачем
timestamp UTCкорреляция
identityCN, AD, pubkey short
src WANоткуда
tunnel IP10.8.0.x
resultok/fail
gatewayкакой vpn.example.com

Не хранить: PSK, OTP seed, полный сертификат с ключом, session cookie.

Корреляция с AD

Для OpenVPN/NPS identity = sAMAccountName. Для WG — таблица в git (без private). Offboarding сверяет обе.

Стенд: найти вчерашнее подключение

Выберите сотрудника с известным 10.8.0.10 / CN. Задача: за 5 минут показать connect/disconnect вчера. Если не можете — журнала нет, сколько бы verb ни стояло.

grep '10.8.0.10' /var/log/openvpn/openvpn.log /var/log/openvpn/status.log
journalctl --since yesterday | grep -F '<pubkey-short>'

RRAS: события NPS/RemoteAccess за вчера по sAMAccountName. Клиентский Get-VpnConnection не аудит.

Прогоните grep -iE 'privatekey|preshared|password=' по каталогу логов. Совпадения — инцидент: снизьте verb, вырежьте секреты, ротируйте то, что утекло. wg showconf не должен попадать в syslog: там private.

Retention: logrotate rotate 12 weekly или центральный SIEM 90 дней. Диск journald SystemMaxUse ограничите, иначе «логи съели root» и вы отключите journal — снова слепота.

Канарейка cron: раз в 15 минут «есть ли свежая строка WG dump / OpenVPN status», алерт если файла нет.

Поля SIEM нормализуйте: vpn.user, vpn.src_ip, vpn.tun_ip, vpn.gateway, vpn.action. Не парсите свободный текст wg show глазами в инциденте. Для RAS используйте Accounting SQL/RADIUS, не скрин Event Viewer. Клиенты OpenVPN 2.6 с --log-append на самом ноутбуке не заменяют сервер: ноутбук выключат. Право на чтение логов — группа ИБ/админов VPN, не Domain Users. Экспорт в тикет — вырезать pubkey полностью, если политика считает его полусекретом; достаточно short fingerprint.

Не логируйте полный AllowedIPs вместе с комментариями ФИО в публичный Slack. Краткий syslog: identity, src, tun IP, result. Корреляция с DHCP WAN клиента не нужна в том же файле, что private key backup. Backup конфигов VPN шифруйте отдельно от логов подключений: разные роли читают разные секреты.

Как проверить, что проблема устранена

  1. Поднимите тестовый туннель, отключите.
  2. Найдите connect и disconnect в центральном логе за 5 минут.
  3. grep -i 'privatekey\\|password\\|psk' по новым логам — пусто.
  4. Retention ≥ срок, требуемый политикой (часто 90+ дней), диск не забит verb 9.
  5. Доступ к логам: не все Domain Users.
grep '10.8.0.10' /var/log/openvpn/status.log
journalctl --since '1 hour ago' | grep -i handshake

Если не помогло

  • Несколько контейнеров OpenVPN — каждый со своим log path.
  • Клиенты Always On с постоянным handshake — лог будет шумным, агрегируйте «сессия > N минут».
  • Нужна полезка трафика (какой URL) — это уже proxy/firewall log, не VPN. VPN знает подсеть, не HTTP.

Профилактика

  • logrotate + алерт «лога нет 30 мин».
  • Запрет debug в ansible.
  • Регулярный drill: «покажи вчерашние коннекты Петрова».
  • Связка с отзывом.

FAQ

Достаточно ли last handshake в момент инцидента?

Нет, если сервер уже перезагрузили. Нужен архив.

Можно ли логировать в Telegram?

Не секреты. WAN IP+ФИО в мессенджер — утечка ПДн. SIEM/закрытый канал.

wg show в motd админам

Покажет peers онлайн. Не пишет историю. Не вставляйте в motd dump с ключами.

Windows клиент не шлёт Accounting

Accounting на сервере RAS/NPS. Клиентский Event Viewer — локально.

OpenVPN AUTH_FAILED спамит

Это полезно (brute). Режьте источник на firewall, логи оставляйте, пароли не пишите (2.6 по умолчанию не должен).