Nginx Ingress Controller Ingress IP 제한 설정

Hoonkii·2023년 8월 15일
0

Intro

사내에서 사용 중인 Internal application의 경우 회사 내 ip에서만 접근할 수 있도록 보안 정책을 설정해야 한다. 기존 internal application 은 aws ec2 + ALB 로 구성되어 있었으며 ALB 의 Security rule을 통해 회사 ip만 허용하도록 설정되어 있었다.

Internal application을 EKS 환경에 배포하는 작업을 하면서 해당 애플리케이션을 위한 별도의 ingress 를 설정하였고 동일한 ip 제한이 필요하였다.

Solution

Ingress 리소스를 프로비저닝하기 위해 우리는 Nginx ingress controller를 사용하고 있다. 내 목표는 특정 애플리케이션에 대한 endpoint에서의 ip 제한이 필요하였다.

  • Ingress 업데이트

기본적으로 Nginx ingress controller는 각 ingress 리소스가 프로비저닝 되면 Nginx ingress controller pod에 해당 설정을 업데이트해준다. 즉 개별 Ingress 리소스에 대해 각각 ip restriction을 설정해줄 수 있다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/whitelist-source-range: X.X.X.X/32
spec:
  ingressClassName: nginx # must use ingress
  rules:
  - host: subdomain.main-domain.com
    http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 80

위와 같이 Ingress를 정의할 때 annotation으로 nginx.ingress.kubernetes.io/whitelist-source-range: X.X.X.X/32 를 추가해주면 해당 호스트로 들어온 트래픽에 ip restriction을 걸 수 있다.

근데 위와 같이 수행해도 제대로 적용이 안되는 경우가 존재한다. (나의 경우도 그랬다)

  • Nginx ingress controller 업데이트

helm chart 를 통해 ingress-nginx 를 처음 설치할 때 controller.service.externalTrafficPolicy 옵션의 default 값은 Cluster이다. 그러면 Ingress controller pod은 client로 부터 온 실제 source ip를 받을 수 없고, internal ip 즉 EKS 환경 기준으로는 Load Balancer의 ip를 받는다. 따라서 이 값을 Local로 수정해야 한다.

helm chart 를 설치했다고 가정했을 때 values.yaml 파일을 수정하고 upgrade command를 통해 수정할 수 있었다.

helm upgrade -n nginx-ingress my-release -f values.yaml .

결과

적용한 뒤 회사 네트워크가 아닌 다른 네트워크 접속 환경에서 FE를 통해 API 호출을 수행하면 403 Forbidden이 뜨면서 ip 제한이 정상적으로 동작함을 확인할 수 있었다.

profile
개발 공부 내용 정리

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 글 감사합니다.

답글 달기