서버가 해킹을 당했거나 의심스러운 상황이 발생했을 때, 로그 파일은 가장 중요한 단서가 됩니다. 이 글에서는 주요 로그 파일의 위치와 분석 방법을 알아봅니다.
주요 로그 파일 위치
| 로그 파일 | 내용 |
|---|---|
/var/log/auth.log |
SSH 로그인, sudo 사용 내역 |
/var/log/syslog |
시스템 전반 메시지 |
/var/log/kern.log |
커널 메시지 |
/var/log/nginx/access.log |
Nginx 접속 로그 |
/var/log/nginx/error.log |
Nginx 에러 로그 |
/var/log/mysql/error.log |
MySQL 에러 |
/var/log/fail2ban.log |
fail2ban 차단 기록 |
SSH 침입 시도 분석
# 로그인 실패 IP 상위 20개
grep "Failed password" /var/log/auth.log | \
awk '{print $(NF-3)}' | \
sort | uniq -c | sort -rn | head -20
# 특정 날짜 로그인 실패
grep "Failed password" /var/log/auth.log | \
grep "Jan 15" | wc -l
# 성공한 SSH 로그인 확인
grep "Accepted" /var/log/auth.log | \
awk '{print $1, $2, $3, $9, $11}'
# 비정상적인 시간대 로그인 확인 (야간)
grep "Accepted" /var/log/auth.log | \
awk '$3 ~ /^(00|01|02|03|04|05):/'
sudo 사용 내역 확인
# 모든 sudo 명령 확인
grep "sudo" /var/log/auth.log | grep "COMMAND"
# root로 su 전환 시도
grep "su\[" /var/log/auth.log
웹서버 로그에서 공격 패턴 탐지
# SQL 인젝션 시도 탐지
grep -E "(union|select|insert|drop|update|delete|exec|script)" \
/var/log/nginx/access.log -i | grep "200\|301\|302"
# 웹쉘 접근 시도
grep -E "\.(php|asp|aspx|jsp)\?" /var/log/nginx/access.log | \
grep -E "(cmd=|exec=|shell=|passthru)"
# 404 에러 폭증 (디렉토리 스캔 의심)
awk '$9==404{print $1}' /var/log/nginx/access.log | \
sort | uniq -c | sort -rn | head -20
# 특정 IP의 모든 접근
grep "1.2.3.4" /var/log/nginx/access.log
# 대용량 응답 (데이터 유출 의심)
awk '$10 > 1000000 {print}' /var/log/nginx/access.log
시스템 변조 흔적 확인
# 최근 24시간 내 수정된 실행 파일
find /usr /bin /sbin -newer /var/log/dpkg.log -type f 2>/dev/null
# SUID 파일 목록 (공격자가 추가했을 수 있음)
find / -perm -4000 -type f 2>/dev/null | sort
# 숨겨진 디렉토리 확인
find / -name ".*" -type d 2>/dev/null | grep -v "^/proc\|^/sys"
# 크론 작업 전체 확인 (백도어 심는 데 자주 사용)
for user in $(cut -f1 -d: /etc/passwd); do
crontab -u $user -l 2>/dev/null | grep -v "^#"
done
cat /etc/cron* /etc/at* 2>/dev/null
네트워크 연결 이상 확인
# 알 수 없는 외부 연결 확인
ss -tnp | grep ESTABLISHED
# 백도어 포트 확인 (알 수 없는 LISTEN 포트)
ss -tlnp
# DNS 쿼리 로그 (dnsmasq 사용 시)
tail -100 /var/log/dnsmasq.log
로그 보존 정책
로그는 공격자가 삭제하는 경우가 많습니다. 중요 로그를 외부 서버로 실시간 전송하는 것을 권장합니다:
# rsyslog으로 원격 로그 서버 전송
echo "*.* @로그서버IP:514" >> /etc/rsyslog.conf
sudo systemctl restart rsyslog
정기적인 로그 검토는 침해사고를 조기에 발견하는 가장 효과적인 방법입니다.