서버 침해 사고는 발생하지 않도록 예방하는 것이 최선이지만, 실제로 발생했을 때 올바른 대응 절차를 알아두는 것도 중요합니다. 패닉 상태에서 잘못된 조치를 취하면 증거가 사라지거나 상황이 악화될 수 있습니다.

침해 징후 식별

다음 징후가 하나라도 있다면 침해를 의심해야 합니다:

# 알 수 없는 로그인 기록
last | head -20
lastb | head -20   # 실패한 로그인

# 비정상적인 프로세스
ps aux | grep -v "\[" | sort -k3 -rn | head -20
top -bn1 | head -20

# 외부로 나가는 이상한 연결
ss -tnp | grep ESTABLISHED
netstat -tnp 2>/dev/null

# 루트 권한으로 실행 중인 프로세스
ps aux | awk '$1 == "root" {print}'

# 최근 변경된 파일
find /etc /usr/bin /usr/sbin -newer /etc/passwd -type f 2>/dev/null
find /var/www -newer /etc/cron.d -name "*.php" 2>/dev/null

1단계: 네트워크 격리 (즉각 조치)

서비스를 즉시 종료하기보다 증거 수집을 위해 상황을 파악하되, 추가 피해를 막기 위한 조치를 취합니다:

# 의심스러운 IP 즉시 차단
sudo iptables -A INPUT -s 의심IP -j DROP
sudo iptables -A OUTPUT -d 의심IP -j DROP

# 특정 포트 임시 차단 (해당 서비스 중단 감수)
sudo ufw deny out 443    # 예: HTTPS 아웃바운드 차단

# 방화벽 전체 차단 (극단적 조치, 서비스 완전 중단)
# sudo ufw default deny outgoing

2단계: 증거 수집 (중요)

시스템 포맷 전에 반드시 증거를 수집하세요:

# 메모리 내 프로세스 목록 저장
ps auxf > /tmp/processes_$(date +%Y%m%d%H%M).txt

# 네트워크 연결 상태 저장
ss -tnp > /tmp/connections_$(date +%Y%m%d%H%M).txt
netstat -rn > /tmp/routes_$(date +%Y%m%d%H%M).txt

# 최근 수정 파일 목록
find / -newer /etc/passwd -type f 2>/dev/null > /tmp/modified_files.txt

# 로그 파일 백업
sudo cp -r /var/log /tmp/log_backup_$(date +%Y%m%d)

# 크론탭 확인
crontab -l > /tmp/crontab_root.txt
for user in $(cut -d: -f1 /etc/passwd); do
    crontab -u $user -l 2>/dev/null >> /tmp/crontabs_all.txt
done

# 인증 로그 백업
sudo cp /var/log/auth.log /tmp/auth_backup.log

3단계: 침해 범위 파악

# 최근 수정된 시스템 파일 (웹쉘, 백도어)
find /var/www -name "*.php" -newer /var/www/html/index.php -ls
find /tmp /var/tmp -type f -ls

# SUID 파일 변경 확인
find / -perm -4000 -type f -ls 2>/dev/null

# /etc/passwd 수상한 계정 확인
cat /etc/passwd | grep -v "nologin\|false" | grep -v root

# 숨겨진 프로세스 (rootkit 탐지)
ps aux | awk '{print $1}' | sort > /tmp/ps.txt
ls /proc | grep -E '^[0-9]+$' | sort > /tmp/proc.txt
diff /tmp/ps.txt /tmp/proc.txt

# 네트워크 인터페이스 확인 (promiscuous 모드: 스니핑 의심)
ip link show | grep PROMISC

4단계: 악성 파일 제거

# 웹쉘 탐색 (PHP 웹쉘 패턴)
grep -r "eval(base64_decode" /var/www/ 2>/dev/null
grep -r "system(" /var/www/ 2>/dev/null
grep -r "passthru\|shell_exec\|exec(" /var/www/ 2>/dev/null

# 백도어 사용자 확인 및 삭제
cat /etc/passwd | awk -F: '$3 == 0 && $1 != "root" {print $1}'
# 루트 권한(UID 0)이 있는 불법 계정 삭제
sudo userdel -r 의심계정

# 악성 크론탭 제거
crontab -r

# 의심스러운 프로세스 종료
sudo kill -9 프로세스PID

5단계: 비밀번호 및 키 초기화

# 모든 계정 비밀번호 변경
echo "root:새비밀번호" | sudo chpasswd
echo "admin:새비밀번호" | sudo chpasswd

# SSH 키 초기화
sudo rm /root/.ssh/authorized_keys
sudo rm /home/*/.ssh/authorized_keys
# 재발급 후 본인 키만 등록

# API 키, 데이터베이스 비밀번호 즉시 변경
# 애플리케이션의 .env, config.php 등 설정 파일의 비밀번호 교체

6단계: 취약점 파악 및 패치

# 최신 보안 업데이트 적용
sudo apt update && sudo apt upgrade -y

# 알려진 취약점 스캐너
sudo apt install -y lynis
sudo lynis audit system

# 오픈 포트 확인
sudo nmap -sV localhost

7단계: 서비스 복구

# 서비스 재시작 전 설정 파일 검증
sudo nginx -t
sudo php-fpm8.2 -t

# 정상 백업에서 복원
rsync -av /backup/최신날짜/ /var/www/html/

# 데이터베이스 복원
mysql -u root -p myapp < /backup/db_backup.sql

# 권한 재설정
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type f -exec chmod 644 {} \;
sudo find /var/www/html -type d -exec chmod 755 {} \;

재발 방지 조치

# 웹 파일 무결성 모니터링 (aide)
sudo apt install -y aide
sudo aideinit
sudo aide --check

# 파일 변경 감지 (inotifywait)
sudo apt install -y inotify-tools
inotifywait -m -r /var/www/html -e modify,create,delete

침해 사고가 발생했다면 TCP-80.NET 텔레그램 @tcp80net으로 즉시 연락하세요. 서버 격리 조치와 복구를 지원해 드립니다.