NGINX Plus Ingress Controller를 활용한 IP Access Control 구성

오늘날 빠르게 변화하는 디지털 세계에서는 애플리케이션에 액세스할 수 있는 사람을 제어하는 ​​것이 중요합니다. DevOps 엔지니어와 Kubernetes 사용자는 환경이 안전하면서도 액세스 가능하도록 보장하는 강력한 솔루션이 필요합니다. 상세한 IP 기반 Access Control 를 제공하는 강력한 도구인 NGINX Plus Ingress Controller를 만나보세요. 이 블로그 포스트는 NGINX Plus Ingress Controller를 사용하여 IP Access Control를 구성하는 과정을 안내하므로 Kubernetes 환경을 효율적으로 보호할 수 있습니다.

NGINX에서 사용할 수 있는 Access control(IP Allow && Deny) 방식을 NGINX Plus Ingress Controller에서도 그래도 사용할 수 있습니다.

이 포스트에서는 NGINX Plus Ingress Controller의 Policy 리소스를 사용하여 access control 을 구현하는 방법에 대해 간단하게 설명합니다.

목차

1. Kubernetes에서 Access Control 의 중요성
2. NGINX Plus Ingress Controller?
3. IP Access Control를 위해 NGINX Plus를 선택하는 이유는 무엇입니까?
4. 구성 전제 조건
5. Access Control – IP Allow
6. Access Control – IP deny
7. 결론

1. Kubernetes에서 Access Control 의 중요성

Access Control 는 모든 환경을 보호하는 기본 측면이며 Kubernetes와 같은 동적이며 확장 가능한 환경에서는 더욱 중요해집니다. 여러 서비스가 실행 중인 경우 승인된 IP 주소만 이러한 서비스에 액세스할 수 있도록 하는 것이 가장 중요합니다. 무단 액세스는 데이터 침해, 가동 중지 시간 및 기타 보안 사고로 이어질 수 있습니다.
Kubernetes 설정에서 수신 수준에서 Access Control 를 관리하면 보안 관리가 단순화됩니다. NGINX Plus Ingress Controller를 사용하면 서비스에 액세스할 수 있는 IP 주소를 효율적으로 제어하여 추가 보안 계층을 제공할 수 있습니다.

2. NGINX Plus Ingress Controller?

NGINX Plus Ingress Controller는 Kubernetes 환경을 위한 고급 트래픽 관리 솔루션입니다. 로드 밸런싱, 향상된 보안 및 고급 모니터링과 같은 기능을 제공하여 표준 NGINX Ingress Controller의 기능을 확장합니다. 뛰어난 기능 중 하나는 IP 기반 Access Control 를 적용하는 기능으로, DevOps 엔지니어와 Kubernetes 사용자가 선호하는 선택입니다.
오픈 소스 버전과 달리 NGINX Plus는 추가 기능과 지원을 갖춘 상용급 솔루션을 제공합니다. 따라서 복잡한 트래픽 시나리오를 관리하고 Kubernetes 배포의 보안을 보장하기 위한 다목적 도구가 됩니다.

3. IP Access Control를 위해 NGINX Plus를 선택하는 이유는 무엇입니까?

IP Access Control 를 위한 올바른 도구를 선택하는 것이 중요합니다. NGINX Plus Ingress Controller는 여러 가지 이유로 눈에 띕니다.

  • Comprehensive Security(포괄적인 보안):

NGINX Plus는 단순한 IP 차단 이상의 기능을 제공합니다. 자세한 로깅, 모니터링 및 경고를 제공하므로 액세스 시도를 추적하고 잠재적인 위협에 신속하게 대응할 수 있습니다.

  • Scalability(확장성):

이 도구는 높은 트래픽 부하를 처리하도록 설계되어 대규모 애플리케이션에 적합합니다. 효율적인 리소스 관리를 통해 Access Control 가 병목 현상을 일으키지 않도록 합니다.

  • Ease of Configuration(구성 용이성):

NGINX Plus Ingress Controller는 IP Access Control 설정 프로세스를 단순화합니다. 간단한 구성 옵션을 사용하면 Kubernetes를 처음 접하는 사용자라도 강력한 보안 조치를 구현할 수 있습니다.

4. 구성 전제 조건

해당 Access control에서는 NGINX Plus Ingress Controller를 사용하였으며, NodePort 타입으로 배포하였고, 30000번 포트로 포워딩 중입니다.

$ kubectl get svc -n nginx-ingress
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP PORT(S)                    AGE
nginx-ingress   NodePort    10.102.155.204 <none>      80:30000/TCP,443:30508/TCP 3d22h

그리고 아래와 같은 Deploymeny 및 Service 리소스를 생성하였습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1
  namespace: nginx-ingress
spec:
  selector:
    matchLabels:
      app: deploy1
  template:
    metadata:
      labels:
        app: deploy1
    spec:
      containers:
      - name: containerd1
        image: nginx
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: svc1
  namespace: nginx-ingress
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: deploy1

위에서 생성한 파드의 내용은 아래와 같습니다.

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
            default_type application/json;
            return 200 '{client IP: $proxy_add_x_forwarded_for}';
    }
}

response 내용은 client IP를 응답합니다.

$ curl example.com:30000
{client IP: 175.196.233.x, 10.244.1.27}

5. Access Control – IP Allow

Access control을 하기 위해 다음과 같이 Policy 리소스를 생성하여 IP allow를 구성했습니다:

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: allow-policy
  namespace: nginx-ingress
spec:
  accessControl:
    allow:
    - 175.196.233.0/24 # 175.196.233.0/24 대역에서 오는 요청을 허용함.

위에서 생성한 Policy 리소스를 VirtualServer 리소스에서 불러와 적용시킵니다.

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

각각 Policy 리소스와 VirtualServer 리소스를 배포 후 확인합니다.

$ kubectl get policy -n nginx-ingress
NAME           STATE   AGE
allow-policy   Valid   3h23m

$ kubectl get virtualserver -n nginx-ingress
NAME       STATE     HOST                     IP    PORTS   AGE
example    Valid     example.com                            108s

이제 허용된 IP와 허용되지 않은 IP에서 각각 접속을 시도 후 로그를 확인합니다.

허용된 IP에서 접근 시(IP: 175.196.233.x) :

$ curl example.com:30000
{client IP: 175.196.233.x, 10.244.1.27}

허용되지 않은 IP에서 접근시(IP: 106.101.130.x) :

$ curl example.com:30000
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.25.3</center>
</body>
</html>

NGINX Plus Ingress Controller의 로그에서도 확인할 수 있습니다.

175.196.233.x - - [22/Apr/2024:04:38:18 +0000] "GET / HTTP/1.1" 200 156 "-" "curl/7.81.0" "-"

2024/04/22 04:41:49 [error] 284#284: *1288 access forbidden by rule, client: 
106.101.130.x, server: example.com, request: "GET / HTTP/1.1", host: "example.com:30000"

6. Access Control – IP deny

Access control에서 IP deny 또한 어렵지 않게 구성할 수 있습니다:

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: deny-policy
  namespace: nginx-ingress
spec:
  accessControl:
    deny:
    - 175.196.233.0/24 # 175.196.233.0/24 대역에서 오는 요청을 차단함.

VirtualServer 리소스:

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

각각 Policy 리소스와 VirtualServer 리소스를 배포 후 확인합니다.

$ kubectl get policy -n nginx-ingress
NAME          STATE   AGE
deny-policy   Valid   75s

$ kubectl get virtualserver -n nginx-ingress
NAME       STATE     HOST                     IP    PORTS   AGE
example    Valid     example.com                            108s

이제 차단된 IP와 차단되지 않은 IP에서 각각 접속을 시도 후 로그를 확인합니다.

차단된 IP에서 접근 시(IP: 175.196.233.x):

$ curl example.com:30000
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.25.3</center>
</body>
</html>

차단되지 않은 IP에서 접근 시(IP: 106.101.130.x)

$ curl example.com:30000
{client IP: 106.101.130.x, 10.244.1.27}

이 또한 로그에서 확인할 수 있습니다.

2024/04/22 05:02:30 [error] 301#301: *1296 access forbidden by rule, client: 175.196.233.x, server: example.com, request: "GET / HTTP/1.1", host: "example.com:30000"

106.101.130.x - - [22/Apr/2024:05:03:04 +0000] "GET / HTTP/1.1" 200 156 "-" "curl/7.81.0" "-"

7. 결론

NGINX Plus Ingress Controller의 Policy 리소스로 구성할 수 있는 IP Allow & deny를 모두 참조하는 것은 지원되지 않습니다. 만약 아래와 같이 allow 및 deny를 모두 참조하는 경우 NGINX Plus Ingress Controller는 allow 목록 정책만 사용합니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: allow-policy
  namespace: nginx-ingress
spec:
  accessControl:
    allow:
    - 175.196.233.0/24
    deny:
    - 106.101.130.0/24

spec.accessControl.allow를 사용하신다면 허용된 IP를 제외한 IP는 차단되고, 반대로 spec.accessControl.deny를 사용하신다면, 차단된 IP를 제외한 IP는 허용됩니다. VirtualServer 리소스를 수정 및 배포했을 때, 상태를 확인하여 STATE 상태가 Valid인지 항상 확인하여 서비스의 상태를 확인하세요.

NGINX Plus Ingress Controller를 사용하여 IP Access Control를 구성하는 것은 Kubernetes 환경을 보호하는 강력한 방법입니다. 이 가이드에 설명된 단계를 따르면 무단 액세스로부터 서비스를 보호하는 강력한 Access Control 조치를 구현할 수 있습니다.
효과적인 Access Control의 핵심은 정책에 대한 지속적인 모니터링과 정기적인 업데이트라는 점을 기억하십시오. 경계심을 유지하고 NGINX Plus의 고급 기능을 활용하여 안전하고 효율적인 환경을 유지하세요.
Kubernetes 보안을 강화할 준비가 되었다면 NGINX Plus Ingress Controller를 사용하여 IP Access Control를 구현하는 것부터 시작하세요.

NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나, NGINX STORE에 연락하여 논의하십시오.

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

* indicates required