- SSH 무작위 공격 IP 3개 차단 (103.251.247.158, 112.216.129.27, 85.235.135.46) - fail2ban 설치 및 SSH 방어 설정 추가 - 총 차단 IP 18개로 증가 (HTTP 14개 + SSH 4개) - 자동 차단 시스템 구축 완료 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
288 lines
8.1 KiB
Markdown
288 lines
8.1 KiB
Markdown
# 보안 공격 탐지 및 대응
|
|
|
|
## 작성일: 2025-08-26
|
|
## 작성자: 서버 관리자
|
|
## 상태: ✅ 차단 완료 (8/26 초기, 9/10 추가)
|
|
## 영향: 51123 서버 대상 자동화 공격
|
|
## 최종 업데이트: 2025-09-24 14:45
|
|
|
|
---
|
|
|
|
## 1. 공격 탐지 내역
|
|
|
|
### 1.1 발견 경위
|
|
- Frontend 컨테이너 로그에서 의심스러운 접근 시도 발견
|
|
- PHPUnit eval-stdin.php 및 .env 파일 접근 시도
|
|
|
|
### 1.2 공격 유형
|
|
| 공격 유형 | 대상 파일 | 목적 |
|
|
|----------|----------|------|
|
|
| PHPUnit RCE | `/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php` | 원격 코드 실행 |
|
|
| 환경변수 탈취 | `/.env`, `/api/.env` | 비밀번호/API키 획득 |
|
|
|
|
---
|
|
|
|
## 2. 공격자 IP 분석
|
|
|
|
### 2.1 주요 공격 IP (nginx access.log 분석)
|
|
| IP 주소 | 공격 횟수 | 공격 유형 | 최근 활동 | 차단 시각 |
|
|
|---------|-----------|----------|-----------|----------|
|
|
| 185.177.72.10 | 142회 | 복합 스캔 | 활성 | 15:00 |
|
|
| 119.8.169.21 | 74회 | 자동화 스캔 | 활성 | 15:00 |
|
|
| 111.119.234.186 | 74회 | 자동화 스캔 | 활성 | 15:00 |
|
|
| 103.225.9.122 | 37회 | PHPUnit 전용 | 8/25 06:17 | 15:00 |
|
|
| 142.93.90.55 | 다수 | .env 스캔 | 8/26 12:39 | 15:00 |
|
|
| 8.213.41.158 | 12회 | .env 스캔 | 8/25 23:00 | 15:00 |
|
|
| 185.177.72.29 | 다수 | .env 스캔 | 8/26 10:44 | 15:00 |
|
|
| **221.159.119.8** | **2회** | **TP-Link RCE** | **8/26 20:48** | **20:52** |
|
|
| **34.126.97.130** | **2회** | **WordPress** | **8/26 22:46** | **23:20** |
|
|
| **67.220.94.81** | **1회** | **Symfony** | **8/26 17:17** | **23:20** |
|
|
| **147.45.211.191** | **다수** | **PHPUnit/CGI** | **9/10 13:15** | **9/10** |
|
|
| **45.156.128.0/24** | **다수** | **다중 스캔** | **9/10** | **9/10 서브넷** |
|
|
|
|
### 2.2 공격 패턴
|
|
```bash
|
|
# PHPUnit 공격 패턴 (103.225.9.122)
|
|
[25/Aug/2025:06:17:24] /workspace/drupal/vendor/phpunit/...
|
|
[25/Aug/2025:06:17:25] /panel/vendor/phpunit/...
|
|
[25/Aug/2025:06:17:26] /public/vendor/phpunit/...
|
|
[25/Aug/2025:06:17:27] /apps/vendor/phpunit/...
|
|
[25/Aug/2025:06:17:28] /app/vendor/phpunit/...
|
|
|
|
# .env 스캔 패턴 (142.93.90.55)
|
|
[26/Aug/2025:05:45:37] /.env
|
|
[26/Aug/2025:12:39:21] /.env (반복)
|
|
|
|
# WordPress 공격 패턴 (34.126.97.130)
|
|
[26/Aug/2025:22:46:33] /wp-admin/setup-config.ph%70 (URL 인코딩 우회)
|
|
|
|
# Symfony 공격 패턴 (67.220.94.81)
|
|
[26/Aug/2025:17:17:05] /app_dev.php/_profiler/open?file=app/config/parameters.yml
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 현재 방어 상태
|
|
|
|
### 3.1 자동 방어 (이미 작동중)
|
|
- ✅ 404 응답 반환 (취약 파일 없음)
|
|
- ✅ Python/FastAPI 환경 (PHP 취약점 영향 없음)
|
|
- ✅ Docker 컨테이너 격리
|
|
|
|
### 3.2 적용된 차단 조치
|
|
- ✅ IP 차단 규칙 적용 완료 (총 10개 IP)
|
|
- 15:00: 7개 IP (초기 차단)
|
|
- 20:52: 1개 IP 추가 (TP-Link RCE)
|
|
- 23:20: 2개 IP 추가 (WordPress, Symfony)
|
|
- ✅ iptables-persistent 설치 및 규칙 영구 저장
|
|
- ⏱️ fail2ban 설정 예정
|
|
- ⏱️ WAF 규칙 적용 예정
|
|
|
|
---
|
|
|
|
## 4. 대응 조치 실행 결과
|
|
|
|
### 4.1 ✅ 즉시 차단 완료 (iptables)
|
|
```bash
|
|
# 주요 공격 IP 차단
|
|
sudo iptables -A INPUT -s 185.177.72.10 -j DROP
|
|
sudo iptables -A INPUT -s 119.8.169.21 -j DROP
|
|
sudo iptables -A INPUT -s 111.119.234.186 -j DROP
|
|
sudo iptables -A INPUT -s 103.225.9.122 -j DROP
|
|
sudo iptables -A INPUT -s 142.93.90.55 -j DROP
|
|
sudo iptables -A INPUT -s 8.213.41.158 -j DROP
|
|
sudo iptables -A INPUT -s 185.177.72.29 -j DROP
|
|
|
|
# 규칙 저장 (재부팅 후에도 유지)
|
|
sudo apt-get install iptables-persistent
|
|
sudo netfilter-persistent save
|
|
```
|
|
|
|
### 4.2 fail2ban 설정
|
|
```bash
|
|
# fail2ban 설치
|
|
sudo apt-get install fail2ban
|
|
|
|
# nginx 보안 필터 생성
|
|
sudo cat > /etc/fail2ban/filter.d/nginx-security.conf << 'EOF'
|
|
[Definition]
|
|
failregex = ^<HOST> .* "(GET|POST) .*(phpunit|eval-stdin|\.env).*" .*$
|
|
ignoreregex =
|
|
EOF
|
|
|
|
# jail 설정
|
|
sudo cat > /etc/fail2ban/jail.d/nginx-security.conf << 'EOF'
|
|
[nginx-security]
|
|
enabled = true
|
|
filter = nginx-security
|
|
logpath = /var/log/nginx/access.log
|
|
maxretry = 3
|
|
bantime = 86400
|
|
findtime = 3600
|
|
action = iptables-multiport[name=nginx-security, port="http,https"]
|
|
EOF
|
|
|
|
# fail2ban 재시작
|
|
sudo systemctl restart fail2ban
|
|
```
|
|
|
|
### 4.3 nginx 보안 헤더 강화
|
|
```nginx
|
|
# /etc/nginx/snippets/security.conf
|
|
location ~ \.(env|git|svn|htaccess|htpasswd)$ {
|
|
deny all;
|
|
return 404;
|
|
}
|
|
|
|
location ~ /(vendor|phpunit|eval-stdin)/ {
|
|
deny all;
|
|
return 404;
|
|
}
|
|
|
|
# 보안 헤더 추가
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 모니터링 명령어
|
|
|
|
### 5.1 실시간 공격 모니터링
|
|
```bash
|
|
# 실시간 공격 시도 감시
|
|
tail -f /var/log/nginx/access.log | grep -E "phpunit|eval-stdin|\.env"
|
|
|
|
# 공격 IP 통계
|
|
sudo grep -E "phpunit|\.env" /var/log/nginx/access.log.1 | \
|
|
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
|
|
|
|
# fail2ban 차단 목록
|
|
sudo fail2ban-client status nginx-security
|
|
```
|
|
|
|
### 5.2 차단 확인
|
|
```bash
|
|
# iptables 규칙 확인
|
|
sudo iptables -L -n -v | grep DROP
|
|
|
|
# 차단된 IP 연결 시도
|
|
sudo tcpdump -i any src host 185.177.72.10
|
|
```
|
|
|
|
---
|
|
|
|
## 6. 장기 대책
|
|
|
|
### 6.1 보안 강화
|
|
1. **CloudFlare/WAF 도입 검토**
|
|
- DDoS 방어
|
|
- 자동 봇 차단
|
|
- 지역 기반 접근 제한
|
|
|
|
2. **로그 분석 자동화**
|
|
- ELK Stack 구축
|
|
- 이상 패턴 자동 알림
|
|
|
|
3. **정기 보안 점검**
|
|
- 월 1회 로그 분석
|
|
- 분기별 보안 감사
|
|
|
|
### 6.2 대응 프로세스
|
|
1. 공격 탐지 → 2. IP 분석 → 3. 즉시 차단 → 4. 패턴 분석 → 5. 규칙 업데이트
|
|
|
|
---
|
|
|
|
## 7. 참고 사항
|
|
|
|
- 공격은 자동화 봇에 의한 대규모 스캔
|
|
- 실제 침투 성공 사례 없음
|
|
- Docker 환경으로 격리되어 영향 최소화
|
|
- 정기적인 로그 검토 필요
|
|
|
|
---
|
|
|
|
*최종 차단: 2025-09-24 14:45 (총 18개 규칙)*
|
|
|
|
## 8. 차단 실행 결과
|
|
|
|
### 8.1 차단된 IP 목록
|
|
```bash
|
|
# iptables 차단 규칙 확인
|
|
sudo iptables -L INPUT -n -v | grep DROP
|
|
|
|
# 총 14개 규칙 (개별 13개 + 서브넷 1개)
|
|
185.177.72.10, 119.8.169.21, 111.119.234.186
|
|
103.225.9.122, 142.93.90.55, 8.213.41.158
|
|
185.177.72.29, 221.159.119.8, 34.126.97.130
|
|
67.220.94.81, 147.45.211.191, 45.156.128.170
|
|
45.156.128.171, 45.156.128.0/24 (네덜란드)
|
|
```
|
|
|
|
### 8.2 영구 저장 상태
|
|
- **파일 위치**: `/etc/iptables/rules.v4`
|
|
- **최종 저장**: 2025-09-10 15:20
|
|
- **총 차단**: 14개 규칙
|
|
- **재부팅 후**: 자동 적용 (netfilter-persistent 서비스)
|
|
|
|
### 8.3 차단 효과 분석 (23:20 점검)
|
|
- **PHPUnit/env 공격**: 완전 차단 (15:00 이후 0건)
|
|
- **새로운 공격 유형 탐지**:
|
|
- TP-Link RCE (20:48)
|
|
- WordPress 설치 스캔 (22:46)
|
|
- Symfony 프로파일러 접근 (17:17)
|
|
- **공격 패턴 변화**: 다양한 프레임워크 대상 공격으로 확산
|
|
- **방어 상태**: 정상 작동 중 (모든 공격 차단됨)
|
|
|
|
---
|
|
|
|
## 9. SSH 브루트포스 공격 방어 (2025-09-24 추가)
|
|
|
|
### 9.1 공격 탐지
|
|
**2025-09-24 14:00-14:35 SSH 무작위 로그인 시도**
|
|
|
|
| 공격 IP | 시도 계정 | 빈도 | 차단 시각 |
|
|
|---------|-----------|------|----------|
|
|
| 103.251.247.158 | wuyuanfeng, ypy, root | 다수 | 14:45 |
|
|
| 112.216.129.27 | ar, wangyl, root, admin | 다수 | 14:45 |
|
|
| 85.235.135.46 | vernon, jiazilong, zfb | 다수 | 14:45 |
|
|
|
|
### 9.2 방어 조치
|
|
1. **즉시 차단 (iptables)**
|
|
```bash
|
|
sudo iptables -A INPUT -s 103.251.247.158 -j DROP
|
|
sudo iptables -A INPUT -s 112.216.129.27 -j DROP
|
|
sudo iptables -A INPUT -s 85.235.135.46 -j DROP
|
|
```
|
|
|
|
2. **fail2ban 구성**
|
|
- 설치: `sudo apt-get install fail2ban`
|
|
- 설정 파일: `/etc/fail2ban/jail.d/ssh-custom.conf`
|
|
```
|
|
[sshd]
|
|
enabled = true
|
|
maxretry = 3
|
|
findtime = 600
|
|
bantime = 86400
|
|
ignoreip = 127.0.0.1/8 192.168.219.0/24
|
|
|
|
[sshd-aggressive]
|
|
enabled = true
|
|
maxretry = 2
|
|
findtime = 300
|
|
bantime = 604800
|
|
```
|
|
|
|
3. **영구 저장**
|
|
```bash
|
|
sudo netfilter-persistent save
|
|
```
|
|
|
|
### 9.3 현재 상태
|
|
- **총 차단 IP**: 18개 (HTTP 공격 14개 + SSH 공격 4개)
|
|
- **fail2ban 상태**: 작동 중
|
|
- 일반 모드: 3회 실패 → 24시간 차단
|
|
- 공격 모드: 2회 실패 → 7일 차단
|
|
- **내부 네트워크 제외**: 192.168.219.0/24
|
|
- **보호 수준**: 높음 (자동 차단 활성화) |