На Debian та Ubuntu, Nginx веде журнали в /var/log/nginx/access.log і error.log, а Apache в /var/log/apache2/access.log і error.log. На RHEL, Rocky та Alma, Apache використовує /var/log/httpd/access_log та error_log, з підкресленнями та без розширення. У контейнерах, побудованих із офіційного образа Nginx, взагалі немає файлів журналів: все пишеться у stdout і stderr, тому docker logs є вашим експортом.
Журнал веб-сервера часто є першим місцем, де вторгнення залишає слід: сканер, що перевіряє наявність файлів .env, рядок експлойту, POST до файлу, що не повинен існувати. Prime Core має 812 правил виявлення для журналів веб-серверів, зіставлених із 337 техніками MITRE ATT&CK. Серед них: експлуатація додатків з публічним доступом (T1190), веб-оболонки (T1505.003) та сканування вразливостей (T1595.002).
Перш ніж почати
Знайдіть реальні шляхи. Віртуальні хости часто ведуть журнали в спеціальні місця. Запитайте сам сервер:
# Nginx: виведіть повну активну конфігурацію та виберіть директиви журналу
sudo nginx -T 2>/dev/null | grep -E 'access_log|error_log'
# Apache
sudo apachectl -S
sudo grep -Ri -E 'CustomLog|ErrorLog' /etc/apache2/ /etc/httpd/ 2>/dev/null
На Debian-базованому Apache, віртуальні хости без власного CustomLog потрапляють в other_vhosts_access.log. Люди часто пропускають це.
Перевірте, чий IP ви зберігаєте. За балансувачем навантаження, CDN або зворотним проксі, кожен запит може здаватися, що надходить від проксі. Так і буде, якщо сервер не налаштовано вести журнал реального клієнта: set_real_ip_from і real_ip_header в Nginx, mod_remoteip в Apache. Якщо у кожному рядку показується лише кілька внутрішніх IP, адреса зловмисника тільки в X-Forwarded-For, якщо ви це зберігаєте, або в журналах самого проксі.
Перевірте формат. Обидва сервери за замовчуванням використовують “об’єднаний” формат, але безліч налаштувань кастомізують його (log_format у Nginx, LogFormat у Apache). Зверніть увагу, як він виглядає у вас, перед завантаженням.
Дозволи. На Debian та Ubuntu ці журнали можуть читати root і група adm; в інших місцях, плануйте використовувати sudo.
Експорт з файлів журналів
Журнали обертаються щодня або щотижня, тому включайте обернуті файли. zcat -f читає прості та стиснуті файли разом:
# Nginx, поточні та обернуті, від найстаріших до новіших
sudo zcat -f $(ls -tr /var/log/nginx/access.log*) > web-03_nginx_access.log
# Apache на RHEL
sudo zcat -f $(ls -tr /var/log/httpd/access_log*) > web-03_httpd_access.lo
Для одного дня, часові позначки у форматі об’єднаного формату роблять достатнім grep:
grep '19/Oct/2026' web-03_nginx_access.log > web-03_access_1019.log
Беремо також журнал помилок. Неуспіхи на upstream, PHP помилки та деякі спроби експлойтів з’являються тільки там.
Експорт з контейнерів
# Docker: stdout є журналом доступу, stderr журналом помилок
docker logs --since 2026-10-19T00:00:00 --until 2026-10-20T00:00:00 nginx > nginx_access.log 2> nginx_error.log
# Kubernetes
kubectl logs deploy/nginx --since=24h > nginx.log
Журнали контейнера зникають разом з контейнером, якщо щось їх не збирає. Якщо pod було замінено, перевірте збирач журналів вашого кластеру.
На що звернути увагу
| Шаблон | Що зазвичай це означає |
|---|---|
| Спалахи 404 для /.env, /.git/config, /wp-login.php, /phpmyadmin | Автоматизоване сканування |
| ../, ${jndi:, union select, <script> у URL | Спроби експлойту: обхід, Log4Shell, SQL ін’єкція, XSS |
| 200 на POST до дивного файлу у каталозі завантаження | Можливо, веб-оболонка; подивіться, що ще запитував цей IP |
| User agents, як sqlmap, nikto, nuclei | Інструментарій, що не переймався ховатися |
| Сплеск 5xx одразу після дивних запитів | Щось зламалося, можливо, через те, що експлойт спрацював |
Завантажте, очистіть і перегляньте у LogTotal
- Завантажити. Відкрити logtotal.com і перетягніть файл.
- Очистити. [what gets masked: client IPs, hostnames, usernames and tokens in URLs]. Look it over before you continue. Query strings often carry session tokens.
- Перегляньте.
Коли все пішло не так
| Симптом | Ймовірна причина | Fix |
|---|---|---|
| Немає /var/log/nginx | Користувальницький шлях, або він працює в контейнері | nginx -T, або docker logs |
| access.log існує, але порожній | Журнали відправляються у stdout, або access_log вимкнено | Перевірте конфігурацію та контейнер |
| Кожен запит надходить з одних і тих же IP | Проксі або балансувальник навантаження спереду; реальний IP не налаштований | Використовуйте X-Forwarded-For або журнали проксі |
| Тільки кілька останніх днів | Залишено обернуті файли | Використовуйте команду zcat -f з * глоб |
| Відмовлено в доступі | Не root, не в adm | sudo |
FAQ
Що важливіше, журнал доступу чи журнал помилок?
Журнал доступу розповідає вам, що було запитано. Журнал помилок розповідає вам, що зламалося. У випадку експлуатації, вам потрібні обидва, поруч.
Що з IIS?
IIS за замовчуванням записує журнали W3C в C:inetpublogsLogFiles. Це отримує власний посібник.