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, 또는 역방향 프록시 뒤에서는 모든 요청이 프록시에서 오는 것처럼 보일 수 있습니다. 서버가 실제 클라이언트를 기록하도록 설정되지 않은 경우, Nginx의 set_real_ip_from 및 real_ip_header, Apache의 mod_remoteip을 사용해야 합니다. 모든 줄에 같은 몇 개의 내부 IP가 표시되면, 공격자의 주소는 X-Forwarded-For에 기록되어 있거나, 기록이 안 된 경우 프록시 자체의 로그에만 있습니다.
형식을 확인하세요. 두 서버 모두 기본적으로 “combined” 형식을 사용하지만, 많은 설정이 이를 맞춤화합니다(로그 양식 자체는 Nginx에서 log_format, Apache에서는 LogFormat). 업로드하기 전의 형식을 주목하세요.
권한. Debian 및 Ubuntu에서는 이러한 로그를 root와 adm 그룹이 읽을 수 있습니다. 그 외의 경우, sudo를 계획하세요.
로그 파일에서 내보내기
로그는 매일 또는 매주 회전하므로 회전된 파일을 포함하세요. zcat -f는 일반 파일과 gzip 압축된 파일 모두를 읽습니다:
# Nginx, 현재 및 회전된 로그, 가장 오래된 것부터
sudo zcat -f $(ls -tr /var/log/nginx/access.log*) > web-03_nginx_access.log
# Apache on RHEL
sudo zcat -f $(ls -tr /var/log/httpd/access_log*) > web-03_httpd_access.log
단일 일자에 대해서는, 결합 형식의 타임스탬프가 있어 grep이면 충분합니다:
grep '19/Oct/2026' web-03_nginx_access.log > web-03_access_1019.log
오류 로그도 가져오세요. 업스트림 오류, 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가 교체되었다면 클러스터의 로그 컬렉터를 대신 확인하세요.
찾을 항목
| 패턴 | 보통 무엇을 의미하는지 |
|---|---|
| /.env, /.git/config, /wp-login.php, /phpmyadmin에 대한 연속적인 404 | 자동 스캐닝 |
| ../, ${jndi:, union select, |