NGINX Ingress Controller WAF v5와 설치

이 문서는 소스 코드를 통해 NGINX Ingress Controller 와 NGINX App Protect WAF v5 이미지를 빌드하는 방법을 설명합니다.

  • NGINX App Protect WAF와 NGINX Ingress Controller을 함께 사용하려면, NGINX Plus가 필요합니다.

사전 빌드 이미지

NGINX Ingress Controller 이미지를 직접 빌드하지 않으려면, 이 문서 마지막의 사전 빌드 이미지 옵션 섹션을 참고하세요.

목차

1. 환경 준비
2. NGINX Ingress Controller WAF 이미지 빌드
3. 개인 레지스트리로 NGINX Ingress Controller WAF 이미지 push
4. NGINX Ingress Controller 배포
 4-1. Helm 설치
 4-2. Manifest 설치
5. 사전 빌드 이미지
6. NGINX App Protect WAF v5 버전 호환성

1. 환경 준비

NGINX Ingress Controller, NGINX App Protect WAF v5 이미지를 빌드하고 push 하기 위해 시스템을 준비하세요.

1. 개인 레지스트리에 로그인합니다. <my-docker-registry> 값을 개인 레지스트리 경로로 변경하세요.

$ docker login <my-docker-registry>

2. WAF Config Manager 이미지를 pull 합니다.

$ docker pull private-registry.nginx.com/nap/waf-config-mgr:<image-tag>

3. WAF Enforcer Docker 이미지를 pull 합니다.

$ docker pull private-registry.nginx.com/nap/waf-enforcer:<image-tag>

4. NGINX Ingress Controller 리포지토리를 복제합니다.

$ git clone https://github.com/nginxinc/kubernetes-ingress.git --branch v3.7.1
cd kubernetes-ingress

2. NGINX Ingress Controller WAF 이미지 빌드

NGINX Ingress Controller와 NGINX App Protect WAF v5 이미지를 빌드하기 위해 다음 단계를 따르세요.

1. NGINX Plus 라이선스 파일(nginx-repo.crt, nginx-repo.key)을 프로젝트의 루트 폴더에 넣습니다. 다음 명령어를 통해 파일을 확인합니다.

$ ls nginx-repo.*

다음과 같은 출력이 나와야합니다.

nginx-repo.crt  nginx-repo.key

2. 이미지를 빌드합니다. <makefile target> 를 사용할 빌드 옵션으로 변경하고, <my-docker-registry> 를 개인 레지스트리 경로로 변경합니다. 빌드 옵션은 하단의 Makefile target을 참고하세요.

$ make <makefile target> PREFIX=<my-docker-registry>/nginx-plus-ingress TARGET=download

예시로, Debain을 기반으로 하는 NGINX Plus Ingress Controller와 NGINX App Protect WAF v5를 빌드하려면 다음과 같은 명령어를 사용합니다.

$ make debian-image-nap-v5-plus PREFIX=<my-docker-registry>/nginx-plus-ingress TARGET=download

이미지는 빌드되고 Makefile 내부의 VERSION 변수의 버전 번호로 태그됩니다. 버전 번호는 트래킹, 배포 목적으로 사용됩니다.

Note:

NGINX Plus 패치가 배포되면, 최신 버전을 사용하기 위해 이미지를 다시 빌드하세요. 시스템이 Docker 레이어를 캐시하고 패키지를 업데이트하지 않으면, make 명령어에 DOCKER_BUILD_OPTIONS="--pull --no-cache" 옵션을 추가하세요.
Makefile targets
Makefile Target설명호환 시스템
alpine-image-nap-v5-plus-fipsNGINX Plus와 NGINX App Protect WAF v5 모듈, FIPS가 포함된 Alpine 기반 이미지를 빌드합니다.Alpine
debian-image-nap-v5-plusNGINX Plus와 NGINX App Protect WAF v5 모듈이 포함된 Debian 기반 이미지를 빌드합니다.Debian
ubi-image-nap-v5-plusNGINX Plus와 NGINX App Protect WAF v5 모듈이 포함된 UBI 기반 이미지를 빌드합니다.OpenShift
ubi-image-nap-dos-v5-plusNGINX Plus와 NGINX App Protect WAF v5, NGINX App Protect DoS가 포함된 UBI 기반 이미지를 빌드합니다.OpenShift

3. 개인 레지스트리로 NGINX Ingress Controller WAF 이미지 push

WAF v5 config manager, enforcer 이미지를 pull 하고, NGINX App Protect WAF v5가 포함된 NGINX Ingress Controller 이미지를 빌드하고 나면, 이 이미지들을 개인 Docker 레지스트리로 업로드해야합니다. 이를 통해 해당 이미지들을 Kubernetes 클러스터에 배포할 수 있습니다.

이미지를 업로드하기 위해 다음 명령어를 사용합니다. 사용자 지정 태그를 사용하는 경우 명령어의 마지막에 TAG=<your-tag> 를 추가합니다.

$ make push PREFIX=<my-docker-registry>/nginx-plus-ingress

WAF config manager과 enforcer 이미지를 업로드하기 위해 다음 명령어를 사용합니다.

$ docker push <my-docker-registry>/waf-config-mgr:<your-tag>
$ docker push <my-docker-registry>/waf-enforcer:<your-tag>

NGINX Ingress Controller Pod가 Ready 상태가 되기 위해서는, 다양한 구성 요소에 대한 custom resource definitions (CRDs)을 생성해야합니다.
혹은, -enable-custom-resources 옵션을 false로 설정하여 비활성화 할 수 있습니다.

CRDs에는 다음 요소들이 포함되어있습니다.

다음 두 방법 중 하나를 사용하여 custom resource definitions을 생성할 수 있습니다.

1. 단일 CRD yaml 파일 적용을 위해 URL 사용

$ kubectl apply -f https://raw.githubusercontent.com/nginxinc/kubernetes-ingress/v3.7.1/deploy/crds.yaml

2. 리포지토리 복제를 통해 로컬 환경에 복제한 CRD yaml 파일 적용

Note:

이 방법을 사용하려면, 먼저 리포지토리를 복제하세요.
$ kubectl apply -f config/crd/bases/k8s.nginx.org_virtualservers.yaml
$ kubectl apply -f config/crd/bases/k8s.nginx.org_virtualserverroutes.yaml
$ kubectl apply -f config/crd/bases/k8s.nginx.org_transportservers.yaml
$ kubectl apply -f config/crd/bases/k8s.nginx.org_policies.yaml
$ kubectl apply -f config/crd/bases/k8s.nginx.org_globalconfigurations.yaml

4. NGINX Ingress Controller 배포

중요:

AppProtect WAF v5 모듈과 함께 구성된 NGINX Ingress Controller는 정책 파일로 동작합니다. Deployment 혹은 DaemonSet 파일을 수정하여 volumes, volume mounts와 waf-config-mgrwaf-enforcer Docker 이미지를 포함시켜야합니다.
NGINX Ingress Controller는 /etc/app_protect/bundles 경로에 volume이 마운트 되어야 합니다.

4-1. Helm 설치

아래의 예시는 Helm value 설정에 참고할 수 있는 PersistentVolumePersistentVolumeClaim 예시입니다.

...
volumes:
- name: <volume_name>
persistentVolumeClaim:
    claimName: <claim_name>
...

containers 섹션에 volumeMounts 를 추가합니다.

...
volumeMounts:
- name: <volume_mount_name>
    mountPath: /etc/app_protect/bundles
...
WAF v5 활성화

Helm value에서 controller.appprotect.enable 값을 true로 설정합니다. 이렇게 설정하면 표준 App Protect WAF 기능이 설정됩니다. 이후 controller.approtect.v5true로 설정합니다. 해당 설정을 적용하면 waf-enforcerwaf-config-mgr 컨테이너가 NGINX Ingress Controller 컨테이너와 함께 구성됩니다. 두 추가 컨테이너는 App Protect WAF v5 사용에 필요합니다.

Helm value는 다음과 같이 구성되어야 합니다.

controller:
  ...
  ## Support for App Protect WAF
  appprotect:
    ## Enable the App Protect WAF module in the Ingress Controller.
    enable: true
    ## Enables App Protect WAF v5.
    v5: true
볼륨 설정

새로운 PersistentVolume과 PersistentVolumeClaim을 생성했거나, 이미 존재하는 PersistentVolumeClaim을 참조할 경우 app-protect-bundles volume에 PersistentVolumeClaim을 참조하도록 구성합니다.

예시 Helm value:

...
controller:
  ...
  appprotect:
  ...
   volumes:
   - name: app-protect-bundles
     persistentVolumeClaim:
        claimName: <my_claim_name>
...

Note:

기본적으로, emptyDir 마운트가 사용됩니다. 이 마운트에 추가된 번들 파일은 Pod 재시작에 유지되지 않습니다.
...
controller:
  ...
  appprotect:
  ...
   volumes:
   - name: app-protect-bundles
     emptyDir: {}
...

4-2. Manifest 설치

NGINX Ingress Controller 배포를 위한 두가지 옵션이 있습니다.

  • Deployment. NGINX Ingress Controller replicas의 수를 동적으로 유연하게 변경할 수 있습니다.
  • DaemonSet. NGINX Ingress Controller를 모든 노드 혹은 노드 하위 집합에서 실행할 수 있습니다.

RBAC(role-based access control) 설정

관리자 권한 필요

이 과정을 수행하기 위해서는 클러스터의 관리자 권한이 필요합니다. 관리자 권한 설정을 위해 Kubernetes 플랫폼의 문서를 참고하세요. Google Kubernetes Engine (GKE)의 경우, Role-Based Access Control guide를 참고하세요.

1. 네임스페이스와 Service Account를 생성합니다.

$ kubectl apply -f deployments/common/ns-and-sa.yaml

2. Service Account의 Cluster Role과 Binding을 생성합니다.

$ kubectl apply -f deployments/rbac/rbac.yaml
Volume, VolumeMount

Deployment 탬플릿에 volumes 섹션을 추가합니다.

...
volumes:
- name: <volume_name>
persistentVolumeClaim:
    claimName: <claim_name>
...

containers 섹션에 volume mounts를 추가합니다.

...
volumeMounts:
- name: <volume_mount_name>
    mountPath: /etc/app_protect/bundles
...
WAF Config Manager, WAF Enforcer

containers 섹션에 waf-config-mgr 이미지를 추가합니다.

...
- name: waf-config-mgr
  image: private-registry.nginx.com/nap/waf-config-mgr:<version-tag>
  imagePullPolicy: IfNotPresent
  securityContext:
    allowPrivilegeEscalation: false
    capabilities:
      drop:
        - all
  volumeMounts:
    - name: app-protect-bd-config
      mountPath: /opt/app_protect/bd_config
    - name: app-protect-config
      mountPath: /opt/app_protect/config
    - name: app-protect-bundles
      mountPath: /etc/app_protect/bundles
...

containers 섹션에 waf-enforcer 이미지를 추가합니다.

...
- name: waf-enforcer
  image: private-registry.nginx.com/nap/waf-enforcer:<version-tag>
  imagePullPolicy: IfNotPresent
  env:
    - name: ENFORCER_PORT
      value: "50000"
  volumeMounts:
    - name: app-protect-bd-config
      mountPath: /opt/app_protect/bd_config
...

NGINX Ingress Controller의 컨테이너에 volumeMounts 를 추가합니다.

...
- image: <my_docker_registery>:<version_tag>
  imagePullPolicy: IfNotPresent
  name: nginx-plus-ingress
  volumeMounts:
    - name: app-protect-bd-config
      mountPath: /opt/app_protect/bd_config
    - name: app-protect-config
      mountPath: /opt/app_protect/config
    - name: app-protect-bundles
      mountPath: /etc/app_protect/bundles
...
Deployment 사용

Deployment를 사용하여 컨테이너를 관리하기 위한 추가적인 정보는 공식 Kubernetes Deployments 문서를 참고하세요.

NGINX Ingress Controller를 Deployment로 배포하면, Kubernetes가 자동으로 하나의 NGINX Ingress Controller Pod를 생성합니다.

$ kubectl apply -f deployments/deployment/nginx-plus-ingress.yaml

F5 Container registry 혹은 빌드한 이미지를 사용하도록 nginx-plus-ingress.yaml 파일을 수정합니다.

DaemonSet

Daemonset을 사용하여 컨테이너를 관리하기 위한 추가적인 정보는 공식 Kubernetes DaemonSets 문서를 참고하세요.

NGINX Ingress Controller를 Daemonset으로 배포하면, Kubernetes가 자동으로 클러스터의 모든 노드에 NGINX Ingress Controller Pod를 생성합니다.

NGINX App Protect WAF 모듈 활성화

Daemonset 혹은 Deployment 파일에  enable-app-protect Command-line Arguments를 추가합니다.

NGINX Ingress Controller 동작 확인

NGINX Ingress Controller Pod의 동작을 확인하려면 다음 명령어를 사용합니다.

kubectl get pods --namespace=nginx-ingress

5. 사전 빌드 NGINX Ingress Controller WAF 이미지

NGINX Ingress Controller 이미지를 직접 빌드하지 않고, 사전 빌드된 이미지를 사용할 수 있습니다.

6. NGINX App Protect WAF v5 버전 호환성

NGINX Ingress ControllerApp Protect WAF v5Config ManagerEnforcer
4.0.033_5.2105.4.05.4.0
3.7.032_5.1445.3.05.3.0
3.6.232_5.485.2.05.2.0

NOTE

NGINX Ingress Controller의 새 릴리즈로 업그레이드 시  NGINX AppProtect WAF Policy 번들을 다시 컴파일 하는것을 권장합니다. 이렇게 하면 Policy 번들이 호환되고, 최신의 Attack Signatures, Bot Signatures, 그리고 Threat Campaigns과 함께 컴파일됩니다.

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

* indicates required