사내에서 사용 중인 Internal application의 경우 회사 내 ip에서만 접근할 수 있도록 보안 정책을 설정해야 한다. 기존 internal application 은 aws ec2 + ALB 로 구성되어 있었으며 ALB 의 Security rule을 통해 회사 ip만 허용하도록 설정되어 있었다.
Internal application을 EKS 환경에 배포하는 작업을 하면서 해당 애플리케이션을 위한 별도의 ingress 를 설정하였고 동일한 ip 제한이 필요하였다.
Ingress 리소스를 프로비저닝하기 위해 우리는 Nginx ingress controller를 사용하고 있다. 내 목표는 특정 애플리케이션에 대한 endpoint에서의 ip 제한이 필요하였다.
기본적으로 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을 걸 수 있다.
근데 위와 같이 수행해도 제대로 적용이 안되는 경우가 존재한다. (나의 경우도 그랬다)
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 제한이 정상적으로 동작함을 확인할 수 있었다.
좋은 글 감사합니다.