Короткий ответ
Минимум на каждое подключение: кто (пир/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. Диагностика сети — лестница, это не замена учёта доступов.
Возможные причины
- journald volatile, retention 1 день.
- OpenVPN
verb 1и нетstatus/log. - RAS Accounting не настроен, только локальный Event Viewer на RRAS без сбора.
- Несколько шлюзов, смотрите не тот.
- Логи есть, нет справочника ключ→сотрудник.
Диагностика
journalctl -u wg-quick@wg0 -u strongswan -u openvpn --since yesterday | head
ls -l /var/log/openvpn*
wg showGet-WinEvent -LogName Application -ProviderName RasClient -MaxEvents 20
Get-RemoteAccessAccounting # на RRAS, если роль есть
Get-VpnConnectionИщите строки с паролем, PrivateKey, shared secret. Если есть — инцидент утечки лога.
Решение
WireGuard
Демон малословен. Варианты:
- cron/
wg show dumpраз в минуту в файл (кто handshake < 180s) — грубо, но работает; wg-quickPostUp не логирует пиров;- пользовательские решения 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 2status даёт 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 | корреляция |
| identity | CN, AD, pubkey short |
| src WAN | откуда |
| tunnel IP | 10.8.0.x |
| result | ok/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 шифруйте отдельно от логов подключений: разные роли читают разные секреты.
Как проверить, что проблема устранена
- Поднимите тестовый туннель, отключите.
- Найдите connect и disconnect в центральном логе за 5 минут.
grep -i 'privatekey\\|password\\|psk'по новым логам — пусто.- Retention ≥ срок, требуемый политикой (часто 90+ дней), диск не забит verb 9.
- Доступ к логам: не все 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 по умолчанию не должен).