Kubernetes 에서 NGINX Ingress Controller를 활용한 IP 접근 제어

이 블로그 포스트는 Kubernetes 환경에서 NGINX Ingress Controller를 활용하여 IP 주소를 기반으로 한 접근 제어 방법에 대해 다룹니다.

접근 제어는 보안 및 네트워크 관리에 있어서 중요한 부분으로, 특히 클라우드 기반 서비스에서는 IP 주소를 기반으로 한 접근 제어가 필수적입니다.
이 포스트에서는 NGINX Ingress Controller의 기능을 활용하여 특정 IP 주소를 허용하거나 거부하는 방법에 대해 자세히 알아보겠습니다.
NGINX Ingress Controller를 통한 IP 기반 접근 제어의 구현 방법과 실제 적용 시 고려해야 할 사항에 대해 다룰 것입니다.

목차

1. IP 기반 접근 제어의 중요성
2. NGINX Ingress Controller 구성
 2-1. Whitelist 규칙 작성

 2-1. Blacklist 규칙 작성
3. NGINX Ingress Controller – IP 기반 접근 제어 구현

1. IP 기반 접근 제어의 중요성

IP 기반 접근 제어는 네트워크 보안의 핵심 요소 중 하나로, 특정 IP 주소를 기준으로 허용하거나 거부함으로써 시스템 또는 서비스에 접근할 수 있는 사용자를 제어합니다. 이는 다음과 같은 이유로 중요합니다.

  1. 보안 강화: 특정 IP 주소를 허용하거나 거부함으로써, 시스템 또는 서비스에 불법적인 접근을 차단하고 보안을 강화할 수 있습니다. 악의적인 공격이나 무단 접근으로부터 시스템을 보호하는 데 중요한 역할을 합니다.
  2. 접근 제어: 특정 IP 주소를 허용하여 특정 사용자 또는 그룹에게만 서비스에 접근할 수 있도록 함으로써, 접근을 제어할 수 있습니다. 이는 내부 시스템에만 접근을 허용하거나, 특정 지역 또는 네트워크에서의 접근을 허용하고 외부에서의 접근을 거부하는 등의 용도로 활용될 수 있습니다.
  3. 규정 준수: 일부 산업군이나 기업은 법적, 규제적 또는 규정 준수 요구 사항을 준수해야 합니다. IP 기반 접근 제어를 통해 특정 지역의 접근을 제한하거나, 보안 강화를 통해 규정 준수를 충족시킬 수 있습니다.
  4. 리소스 관리: 특정 IP 주소를 허용 또는 거부하여 허용된 사용자만 리소스에 액세스할 수 있도록 함으로써, 리소스를 효율적으로 관리할 수 있습니다. 허용되지 않은 사용자로부터의 접근을 방지하여 시스템의 가용성과 성능을 유지할 수 있습니다.

IP 기반 접근 제어는 네트워크 보안의 핵심 요소로서, 시스템 및 서비스의 안정성과 보안을 강화하는 데 중요한 역할을 합니다. 특히 클라우드 환경에서는 이러한 접근 제어가 더욱 중요하며, NGINX Ingress Controller 를 활용하여 쉽게 구현할 수 있습니다.

2. Kubernetes NGINX Ingress Controller 구성

NGINX Ingress Controller를 사용하여 IP 기반 접근 제어를 구현하려면 다음과 같은 설정 단계가 필요합니다. 이 설정은 Kubernetes 환경에서 수행됩니다.

NGINX Ingress Controller 배포

먼저, 클러스터에 NGINX Ingress Controller를 배포해야 합니다. 이를 위해서는 적절한 배포 매니페스트 파일을 사용하거나, Helm을 통해 NGINX Ingress Controller를 설치할 수 있습니다. 이 단계에서는 Ingress Controller를 클러스터에 배포하고 구성합니다.

VirtualServer 리소스 작성

IP 기반 접근 제어를 구현하기 위해 VirtualServer 리소스를 생성해야 합니다. 이 리소스는 NGINX Ingress Controller가 요청을 어떻게 처리할지를 정의합니다. VirtualServer 리소스에는 다음과 같은 내용이 포함될 수 있습니다:

  • 서비스 및 경로 설정
  • 주요한 HTTP 옵션들 (예: Rewrite 규칙)
  • 접근 제어를 위한 Annotation

접근 제어를 위한 Policy 추가

VirtualServer 리소스에는 NGINX Ingress Controller가 특정 동작을 수행하도록 하는 Policy가 포함될 수 있습니다. IP 기반 접근 제어를 구현하기 위해서는 특히 accessControl와 같은 Policy Resource를 사용할 수 있습니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: allow-localhost
spec:
  accessControl:
    allow:
    - 10.0.0.0/8

이러한 Annotation을 사용하여 Ingress 리소스에 IP 기반 접근 제어 정책을 적용할 수 있습니다.

2-1. Whitelist 규칙 작성

특정 IP를 allow하기 위해 다음과 같이 Policy Resource를 추가합니다. 

spec:
  accessControl:
    allow:
    - 10.0.0.0/8

위 accessControl 블록은 NGINX Ingress Controller 를 사용하여 Policy를 통해 특정 IP 주소를 허용하기 위한 설정을 지정합니다.

  • allow: 특정 IP 주소를 허용하기 위한 설정을 지정합니다. 이 경우 “10.0.0.0/8″라는 IP 범위를 추가하여 해당 IP 주소로부터의 요청을 허용합니다. 다른 IP 주소에서의 요청은 거부됩니다.

이러한 설정을 통해 NGINX Ingress Controller를 통해 특정 IP 주소에서의 접근을 제어할 수 있습니다. 이를 통해 보안을 강화하고 허가된 사용자만이 서비스에 접근할 수 있도록 할 수 있습니다.

2-3. Blacklist 규칙 작성

특정 IP를 거부하기 위해 다음과 같이 Policy Resource를 추가합니다.

spec:
  accessControl:
    deny:
    - 10.0.0.0/8

위 블록은 NGINX Ingress Controller를 사용하여 특정 IP 주소를 거부하기 위한 설정을 지정합니다.

  • deny: 특정 IP 주소를 거부하기 위한 설정을 지정합니다. 이 경우 “10.0.0.0/8″라는 IP 범위를 blacklist에 추가하여 해당 IP 대역로부터의 요청을 거부합니다. 다른 IP 주소에서의 요청은 허용됩니다.

이러한 설정을 통해 NGINX Ingress Controller를 통해 특정 IP 주소에서의 접근을 제어하여 보안을 강화하고, 허가되지 않은 사용자의 접근을 방지할 수 있습니다.

3. Kubernetes NGINX Ingress Controller – IP 기반 접근 제어 구현

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: policy-ip-access
  namespace: nginx-ingress
spec:
  accessControl:
    allow:
    - 10.0.0.0/8

위 Policy를 적용한 Ingress yaml 파일을 배포합니다.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: devbinx-ip-access
  namespace: nginx-ingress
spec:
  host: devbinx.com
  ingressClassName: nginx
  policies:
    - name: policy-ip-access
  upstreams:
  - name: svc
    service: svc1
    port: 80
  routes:
  - path: /
    action:
      pass: svc 

IP 기반 접근 제어 Policy를 적용한 VirtualServer 리소스를 배포한 후 NGINX Ingress Controller를 통해 접근 테스트를 진행합니다.

Curl Response

curl devbinx.com:30000 -I                                                            
HTTP/1.1 403 Forbidden
Server: nginx/1.25.3
Date: Mon, 29 Apr 2024 00:47:13 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

NGINX Ingress Controller Pod logs

[error] 528#528: *1964 access forbidden by rule, client: 172.16.219.64, server: devbinx.com, request: "HEAD / HTTP/1.1", host: "devbinx.com:30000"
172.16.219.64 - - [29/Apr/2024:00:47:13 +0000] "HEAD / HTTP/1.1" 403 0 "-" "curl/7.81.0" "-"

요청한 Client의 IP가 Policy 리소스에서 허용한 IP 대역이 아니기 때문에 403 Forbidden Rule을 통해 파드로의 접근이 차단된 것을 확인할 수 있습니다.

아래 NGINX STORE에 상담을 요청해보세요!

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required