본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

DoS 공격 방어하기

원문 보기 위키 갱신

Calico 정책에 DoS 완화 규칙을 정의하면 패킷 처리 파이프라인에서 가장 빠른 시점(eBPF 또는 XDP 계층)에서 연결을 차단해요. NIC 하드웨어가 지원하면 오프로딩까지 활용해요. 공격 트래픽을 빠르게 드롭할수록 호스트 부하가 줄어든다는 원리예요.

출처: 문서

본문

큰 그림

Calico는 패킷 처리 파이프라인에서 가능한 한 가장 이른 시점에 특정 유형의 deny-list 정책을 자동으로 강제 적용하고, 가능하면 NIC 하드웨어로 오프로딩까지 해요.

활용 가치

DoS 공격 중에는 클러스터가 공격자로부터 대량의 연결 요청을 받을 수 있어요. 이 연결 요청을 더 빨리 드롭할수록 호스트에 몰리는 홍수와 과부하가 줄어들어요. Calico 네트워크 정책에 DoS 완화 규칙을 정의하면, Calico가 영향을 최소화하기 위해 규칙을 최대한 효율적으로 강제 적용해요.

개념

가장 이른 패킷 처리

패킷을 드롭할 수 있는 패킷 처리 파이프라인의 가장 이른 지점은 Linux 커널 버전과 NIC 드라이버·NIC 하드웨어의 능력에 따라 달라져요. Calico는 사용 가능한 가장 빠른 옵션을 자동으로 사용해요.

Processed by... Used by Calico if... Performance
NIC hardware The NIC supports XDP offload mode. Fastest
NIC driver The NIC driver supports XDP native mode. Faster
Kernel The kernel supports XDP generic mode and Calico is configured to explicitly use it. This mode is rarely used and has no performance benefits over iptables raw mode below. To enable, see Felix Configuration. Fast
Kernel If none of the modes above are available, iptables raw mode is used. Fast

SECONDARY: XDP 모드는 Linux 커널 v4.16 이상이 필요해요.

방법

DoS 공격을 방어하는 상위 단계는 다음과 같아요:

모범 사례

다음 절차는 기존 설정이 없다고 가정하고 필수 단계를 다뤄요. 모범 사례는 공격이 오기 전에 이 단계들을 사전에 수행하는 거예요(host endpoint, 네트워크 정책, 글로벌 네트워크 셋을 만들어 두기). DoS 공격이 발생하면 deny-list에 추가하고 싶은 CIDR만 글로벌 네트워크 셋에 넣어 빠르게 대응할 수 있어요.

1단계: host endpoint 만들기

먼저 DoS 완화 규칙을 강제 적용하려는 네트워크 인터페이스에 해당하는 HostEndpoints를 만들어요. 다음 예시에서 HostEndpoint는 노드 jasper의 IP 10.0.0.1을 가진 eth0 인터페이스를 보호해요.

apiVersion: projectcalico.org/v3
kind: HostEndpoint
metadata:
  name: production-host
  labels:
    apply-dos-mitigation: 'true'
spec:
  interfaceName: eth0
  node: jasper
  expectedIPs: ['10.0.0.1']

2단계: 글로벌 네트워크 셋의 deny-list에 CIDR 추가하기

다음으로 Calico GlobalNetworkset을 만들어 deny-list에 추가하고 싶은 CIDR을 넣어요. 다음 예시에서 글로벌 네트워크 셋은 CIDR 범위 1.2.3.4/32와 5.6.0.0/16을 deny-list에 넣어요:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkSet
metadata:
  name: dos-mitigation
  labels:
    dos-deny-list: 'true'
spec:
  nets:
    - '1.2.3.4/32'
    - '5.6.0.0/16'

3단계: 들어오는 트래픽 거부 글로벌 네트워크 정책 만들기

마지막으로 Calico GlobalNetworkPolicy를 만들어, 이전 단계의 GlobalNetworkSet 레이블(dos-deny-list)을 셀렉터로 추가해 ingress 트래픽을 거부해요. 호스트로 포워딩되는 트래픽 거부를 패킷 수준에서 더 빠르게 강제 적용하려면 doNotTrack과 applyOnForward 옵션을 사용하세요.

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: dos-mitigation
spec:
  selector: apply-dos-mitigation == 'true'
  doNotTrack: true
  applyOnForward: true
  types:
    - Ingress
  ingress:
    - action: Deny
      source:
        selector: dos-deny-list == 'true'

추가 리소스

더 알아보기 (Learn more)

DoS 방어의 핵심은 공격 CIDR을 글로벌 네트워크 셋에 넣고, 그 셋을 셀렉터로 참조하는 글로벌 정책으로 드롭하는 구조예요. HostEndpoint와 GlobalNetworkSet을 미리 만들어 두면 공격 발생 시 CIDR만 추가하면 돼요. XDP 모드는 커널 v4.16 이상이 필요하다는 점도 기억하세요.