MSA 트레이닝 센터
NGINX Service Mesh 의 Rate Limit 설정으로 보안 강화
이 트레이닝 영상에서는 NGINX 엔지니어는 오픈소스인 NGINX Service Mesh 를 사용하여 Rate Limiting 정책을 정의하고 적용하는 방법을 시연합니다.
악의적(예: 무차별 대입 암호 추측 및 DDoS 공격)이든 양성(예: 고객이 판매에 몰리는 경우)이든 대량의 HTTP 요청은 서비스를 압도하고 앱 충돌을 일으킬 수 있습니다. Rate Limiting은 사용자가 주어진 기간 동안 만들 수 있는 요청 수를 제한합니다.
NGINX Service Mesh 의 Rate Limit 설정으로 보안 강화
NGINX Service Mesh 는 Kubernetes 환경에서 서비스 간 트래픽을 제어하고 보안을 강화하는 강력한 오픈소스 도구입니다. Rate Limiting 정책을 활용하면 각 서비스에 대한 요청 빈도를 제한하여 시스템 과부하를 방지하고 DDoS(Distributed Denial of Service) 공격을 완화할 수 있습니다. 이 가이드는 NGINX Service Mesh를 사용하여 Rate Limiting 정책을 정의하고 적용하는 방법을 설명합니다.
Rate Limiting의 필요성
Rate Limiting은 클라이언트 요청 빈도를 제한하여 다음과 같은 문제를 방지할 수 있습니다:
- 서비스 과부하 방지: 트래픽 급증 시 애플리케이션의 안정성을 보장.
- 보안 강화: 악의적인 요청을 줄이고, DDoS와 같은 공격으로부터 보호.
- 리소스 최적화: 제한된 리소스를 효율적으로 사용.
NGINX Service Mesh의 Rate Limiting 설정
NGINX Service Mesh에서 Rate Limiting은 Traffic Policies를 통해 설정됩니다. 이를 통해 특정 서비스에 대한 요청 빈도를 제어할 수 있습니다.
NGINX Service Mesh 설치
먼저, Kubernetes 클러스터에 NGINX Service Mesh를 설치해야 합니다. 설치가 이미 완료된 경우 이 단계를 건너뛸 수 있습니다.
curl -fsSL https://nginx.org/packages/keys/nginx_signing.key | sudo apt-key add -
helm repo add nginx-service-mesh https://helm.nginx.com/stable
helm repo update
helm install nginx-mesh nginx-service-mesh/nginx-service-mesh
설치 후, kubectl get pods -n nginx-mesh 명령으로 NGINX Service Mesh가 제대로 실행되고 있는지 확인합니다.
Rate Limiting 정책 정의
NGINX Service Mesh는 TrafficPolicy 리소스를 사용하여 서비스 간 트래픽에 Rate Limiting을 적용합니다.
다음 예제는 특정 서비스에 대해 초당 최대 10개의 요청만 허용하는 정책을 정의합니다.
apiVersion: networking.nginx.com/v1alpha1
kind: TrafficPolicy
metadata:
name: rate-limit-policy
namespace: default
spec:
destination:
app: my-service
policy:
rateLimit:
requestsPerUnit: 10
unit: second
requestsPerUnit: 단위 시간당 허용되는 요청 수.unit: 제한 단위(초, 분 등).
Rate Limiting 정책 적용
Rate Limiting 정책을 적용하려면 해당 YAML 파일을 클러스터에 적용합니다.
kubectl apply -f rate-limit-policy.yaml
정책이 적용되면, my-service로 들어오는 요청이 초당 10개로 제한됩니다.
고급 설정
특정 클라이언트 IP별로 요청을 제한하려면 다음과 같이 설정합니다.
apiVersion: networking.nginx.com/v1alpha1
kind: TrafficPolicy
metadata:
name: rate-limit-by-ip
namespace: default
spec:
destination:
app: my-service
policy:
rateLimit:
requestsPerUnit: 5
unit: second
key: remoteAddr
특정 서비스 간 트래픽에만 제한을 적용하려면 다음과 같이 설정합니다.
apiVersion: networking.nginx.com/v1alpha1
kind: TrafficPolicy
metadata:
name: service-to-service-rate-limit
namespace: default
spec:
source:
app: frontend
destination:
app: backend
policy:
rateLimit:
requestsPerUnit: 50
unit: minute
테스트 및 검증
초당 10개의 요청 제한이 설정된 서비스를 테스트하려면 curl 또는 로드 테스트 도구를 사용합니다.
curl http:// -H "Host: my-service"
다중 요청을 통해 제한 초과 시 반환되는 응답 상태 코드를 확인합니다.
for i in {1..20}; do curl -s -o /dev/null -w "%{http_code}\n" http:// -H "Host: my-service"; done
출력 예시:
200
200
429
429
429 Too Many Requests 상태 코드는 Rate Limiting이 적용되었음을 나타냅니다.
모니터링 및 관리
NGINX Service Mesh는 Prometheus와 Grafana와 통합되어 Rate Limiting 상태를 실시간으로 모니터링할 수 있습니다.
helm install prometheus prometheus-community/kube-prometheus-stack
Grafana에서 NGINX Service Mesh 메트릭을 확인하여 Rate Limiting 동작을 모니터링합니다.
Rate Limiting 관련 로그는 NGINX Service Mesh의 로깅 기능을 통해 확인할 수 있습니다.
kubectl logs -n nginx-mesh -l app=nginx-mesh
Best Practices
- 적절한 Rate 설정: 서비스의 트래픽 패턴과 용량에 따라 Rate Limiting 값을 설정하세요.
- 모니터링 활성화: Prometheus와 Grafana를 사용하여 실시간으로 정책 상태를 확인하고, 이상 동작을 조기에 발견하세요.
- IP 및 서비스별 제한 사용: 사용자와 서비스의 특성에 따라 Rate Limiting 정책을 세분화하세요.
- 주기적인 검토: 트래픽 변화에 맞춰 정책을 정기적으로 검토하고 업데이트하세요.
- 테스트 환경 설정: 실제 환경에 적용하기 전에 테스트 환경에서 충분히 검증하세요.
결론
NGINX Service Mesh를 활용한 Rate Limiting은 서비스 간 트래픽을 효과적으로 관리하고, 과부하나 악의적인 요청으로부터 시스템을 보호하는 데 중요한 역할을 합니다. 이 가이드를 따라 정책을 설정하고 모니터링하여 안정적이고 안전한 서비스 운영을 실현하세요. Rate Limiting과 함께 다른 보안 메커니즘을 통합하면 다층 방어 전략을 구현할 수 있습니다.
NGINX Service Mesh 에 대해 더욱 자세히 알아보려면 NGINX STORE에 문의하여 사용 사례에 대해 상담 받아보세요.