Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- redis
- jwt
- SQL
- VUE
- StringBuilder
- jpa
- 생성자 주입
- KEVISS
- Test
- java
- 재정의
- stream
- select_type
- hashcode
- equals
- AOP
- Spring
- 열 속성
- cache
- static
- 조합
- 인덱스
- lambda
- DDL
- MSA
- DI
- Exception
- 필드 주입
- 테스트 코드
- docker
Archives
- Today
- Total
백엔드 개발자 블로그
Docker trouble with iptable 본문
문제 상황
DB log를 보니 아래와 같은 외부 공격이 이뤄지고 있었다.
우리 redis를 slave로 사용해서 요금 폭탄을 나눠주려고 공격을 시도하고 있다.
1:S 21 May 2025 04:35:09.626 * MASTER <-> REPLICA sync started
1:S 21 May 2025 04:35:09.626 * REPLICAOF 8.219.136.159:60121 enabled (user request from 'id=199 addr=60.172.131.15:44468 laddr=172.17.0.3:6379 fd=23 name= age=1 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 watch=0 qbuf=29 qbuf-free=20445 argv-mem=25 multi-mem=0 rbs=1024 rbp=155 obl=0 oll=0 omem=0 tot-mem=22449 events=r cmd=slaveof user=default redir=-1 resp=2 lib-name= lib-ver= io-thread=0')
1:M 22 May 2025 06:44:03.402 # Possible SECURITY ATTACK detected. It looks like somebody is sending POST or Host: commands to Redis. This is likely due to an attacker attempting to use Cross Protocol Scripting to compromise your Redis instance. Connection from 3.143.33.63:44202 aborted.
1:M 22 May 2025 07:12:23.504 * DB saved on disk
ufw 설정을 했는데, 어떻게 redis에 직접 접근할 수 있는걸까?
To Action From
-- ------ ----
80 ALLOW Anywhere
443/tcp ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
먼저 실제 포트 접근 제어 담당하는 iptables를 확인했다.
예상대로 ufw와 chain을 형성하고, 이를 통해 접근을 제어하고 있었다.
-A ufw-user-input -p tcp --dport 22 -j ACCEPT # SSH 허용
-A ufw-user-input -p tcp --dport 80 -j ACCEPT # HTTP 허용
-A ufw-user-input -p tcp --dport 443 -j ACCEPT # HTTPS 허용
그런데 이상한게 보인다.
Docker도 iptables를 제어하고 있다.
-A DOCKER-USER -j RETURN
-A DOCKER ! -i docker0 -o docker0 -j DROP
-A DOCKER ! -i br-089c8c278103 -o br-089c8c278103 -j DROP
-A DOCKER ! -i br-f572d12d6428 -o br-f572d12d6428 -j DROP
-A DOCKER-BRIDGE -o docker0 -j DOCKER
-A DOCKER-BRIDGE -o br-089c8c278103 -j DOCKER
-A DOCKER-BRIDGE -o br-f572d12d6428 -j DOCKER
-A DOCKER-CT -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o br-089c8c278103 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT -o br-f572d12d6428 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-FORWARD -j DOCKER-CT
-A DOCKER-FORWARD -j DOCKER-ISOLATION-STAGE-1
-A DOCKER-FORWARD -j DOCKER-BRIDGE
-A DOCKER-FORWARD -i docker0 -j ACCEPT
-A DOCKER-FORWARD -i br-089c8c278103 -j ACCEPT
-A DOCKER-FORWARD -i br-f572d12d6428 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-089c8c278103 ! -o br-089c8c278103 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-f572d12d6428 ! -o br-f572d12d6428 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-2 -o br-f572d12d6428 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-089c8c278103 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
조사해보니 docker를 사용하게 되면 iptables과 자동으로 체인되고, 외부에서 바로 docker container에 접근할 수 있다고 한다.
문제 해결 과정
자, 해당 문제를 해결해 보겠다.
1. Docker가 iptables의 조작을 금지하게 설정 - 비권장
/etc/docker/daemon.js에서 아래와 같이 작성하면 되긴 한데, 도커간 네트워크 통신에 영향을 끼치기에 권장하지 않는다.
iptables = false
2. 외부 방화벽을 사용 - 비권장
외부 방화벽 따로 구성해야 되니 패스
3. docker 컨테이너 생성시 포트맵핑을 로컬에만 바인드
아래와 같이 port 설정을 로컬에만 바인드해주자.
외부 통신을 하고 싶다면 local port 설정 + nginx proxy 설정을 해주고,
-p 127.0.0.1:6379:6379
location /chat/v3/api-docs {
proxy_pass http://localhost:6379/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
내부통신만 필요한 경우 port 설정 대신 expose 설정만 해주자
expose:
"6379"
'트러블 슈팅' 카테고리의 다른 글
OOM (4) | 2025.08.04 |
---|---|
S3 업로드 속도 개선, Pre-signed url과 Thumbnail Lambda (3) | 2025.07.31 |
Stored Procedure (0) | 2025.05.08 |
로그와 메트릭 (0) | 2025.05.08 |
외부 api 장애 최소화 (0) | 2025.05.08 |