오늘은 쿠버네티스 환경에서 Ingress Nginx를 통해 Request를 제한하는 방법에 대해 적어보려고 한다.
서비스를 배포하게 되면 서비스의 신뢰성과 안정성을 위해서 DDoS, 무차별 대입 공격 등의 위협을 막을 방법을 생각해야 할 것이다.
DDoS, 무차별 대입 공격의 위험성
반복적인 요청을 통제하지 않을 경우 무차별 대입 공격으로 인해 사용자 계정 정보 등을 탈취당할 수 있고, 자동화 공격으로 게시글 등록, SMS 발송 요청을 반복하여 애플리케이션의 자원을 고갈시킬 수 있다.
Ingress Nginx Controller
Ingress 매니페스트 파일에서 nginx 어노테이션을 사용하여 연결 및 전송 속도를 제한할 수 있다.
Rate Limit > Anntations
- nginx.ingress.kubernetes.io/limit-connections : 단일 IP 주소에서 허용되는 동시 연결 수
- nginx.ingress.kubernetes.io/limit-rps : 단일 IP 주소에서 초당 수락된 요청 수
- nginx.ingress.kubernetes.io/limit-rpm : 단일 IP 주소에서 분당 수락된 요청 수
- nginx.ingress.kubernetes.io/limit-burst-multiplier : 버스트 크기에 대한 제한 속도의 승수 (default : 5)
- nginx.ingress.kubernetes.io/limit-rate : 주어진 연결에 대한 응답의 추가 전송이 속도가 제한되는 초기 킬로바이트
- nginx.ingress.kubernetes.io/limit-rate-after : 주어진 연결에 보낼 수 있는 초당 킬로바이트 수
- nginx.ingress.kubernetes.io/limit-whitelist : 속도 제한에서 제외할 클라이언트 IP 소스 범위
-> 설정한 limit을 초과하게 되면 Ingress nginx는 503 Service Temporarily Unavailable를 반환한다.
Limit 설정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
..
nginx.ingress.kubernetes.io/limit-rpm: "60"
..
limit-rps: 1 (초당 요청수 1)과 limit-rpm: 60 (분당 요청수 60)은 1초에 1개의 요청만 보내는 경우 1분에 60개의 요청을 받는 것은 동일하다. 하지만 다른 API를 연계하여 호출하는 경우도 존재하고, 사용자가 서비스에 들어와서 1초에 1개 이상의 요청을 보내는 상황이 더 많을 것이기 때문에 분당 요청수 제한인 limit-rpm만 설정했다.
limit-burst-multiplier
초과되는 요청에 대한 limit-burst-multiplier는 매니페스트 파일에 명시하지 않아서 기본 값인 5로 적용되었다.
서비스의 nginx 로그에서 반환되는 503 에러 노출 빈도를 확인하고 서비스에 알맞게 재설정하면 될 것이다.
Test
Case 1 : limit-rpm = 10, burst-multiplier = 10 => Total Available Request 100r/m
1분 내로 약 200건의 요청을 보냈다.
Case 2 : limit-rpm = 60, burst-multiplier = 5 => Total Available Request 300r/m
1분 내로 약 500건의 요청을 보냈다.
nginx에서는 limit-rps, limit-rpm에 limit-burst-multiplier을 곱한 만큼의 요청을 받기 때문에 Case1, Case2 모두 Total Available Request 값과 비슷한 요청에 대해 정상 응답 하는 것을 확인할 수 있었다.
벤치마크
Github
- 인증된 사용자의 경우 시간당 5,000건
Kakao Developers
- 일일 30,000건
Naver Works Developers
- 분당 60건
BitHumb
- Public API 초당 150건
- Private API 초당 140건
Upbit
- 주문 요청 외 API 초당 30건
위 테스트를 통해 쿠버네티스 환경에 서비스를 배포하는 경우 ingress nginx에서 Rate Limiting에 대한 설정을 하여 비정상적인 요청을 방지할 수 있다는 것을 알게 되었고, 불완전하지만 DDoS 공격으로부터 서비스를 보호할 수 있는 방법 중 하나라고 생각한다.
끝
참고
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting
Annotations - Ingress-Nginx Controller
Annotations You can add these Kubernetes annotations to specific Ingress objects to customize their behavior. Tip Annotation keys and values can only be strings. Other types, such as boolean or numeric values must be quoted, i.e. "true", "false", "100". Ca
kubernetes.github.io
'Kubernetes' 카테고리의 다른 글
[k8s] k9s 쿠버네티스 UI 툴 (1) | 2024.04.28 |
---|