NGINX App Protect WAF V5 – 기존 NGINX 통합 설치 가이드

이 포스트는 기존에 NGINX가 설치된 인스턴스에 NGINX App Protect WAF V5(NAP WAF)를 추가로 설치하여 통합하는 방법을 설명합니다. app-protect-module 패키지를 설치하고, Docker를 통해 waf-enforcer, waf-config-mgr 컨테이너를 실행하여 NGINX App Protect WAF V5를 통합 구성합니다.

이 포스트는 NGINX Plus, Docker가 사전에 설치된 환경에서 진행되며, NGINX OSS의 구성 방법도 포함하고 있습니다. 또한 Ubuntu 22.04 OS를 기준으로 작성되었으며, 기타 OS의 경우 NGINX App Protect WAF 설치 포스트를 참고하세요.

NGINX App Protect WAF를 사용하기 위해선 NGINX의 상업용 구독이 필요하며, 기존 NGINX와의 통합은 NGINX OSS, NGINX Plus 모두 가능합니다. NGINX STORE를 통해 문의해 무료로 NGINX의 상업용 구독을 체험해 보실 수 있습니다.

목차

1. NGINX App Protect WAF V5란?
2. 버전 정보
3. NGINX App Protect WAF V5 설치
4. NGINX 설정 구성
5. 결론

1. NGINX App Protect WAF V5 란?

NGINX App Protect WAF(Web Application Firewall)는 NGINX Plus 및 NGINX Open Source와 통합하여 웹 애플리케이션과 API를 보호하는 보안 솔루션입니다. F5의 고급 보안 기술을 기반으로 동작하며, DevOps 및 클라우드 네이티브 환경에 최적화된 WAF 기능을 제공합니다.

NGINX App Protect WAF의 주요 특징은 다음과 같습니다.

  • 주요 기능: 서명 기반 탐지, API 보안, OWASP Top 10 대응
  • 구성 방식: NGINX Plus(OSS) 모듈 및 별도 enforcer, config-mgr 컨테이너 활용
  • 운영 환경: 온프레미스, 컨테이너, Kubernetes 등 다양한 환경 지원

2. 버전 정보

  • OS : Ubuntu 22.04
  • NGINX Plus : R33 (1.27.2)
  • NGINX App Protect WAF V5 : 5.5
  • Docker : 28.0.1

3. NGINX App Protect WAF V5 설치

공통 구성

1. /etc/ssl/nginx/ 디렉터리를 생성합니다.

$ sudo mkdir -p /etc/ssl/nginx

2. NGINX의 상업 구독을 통해 다운받은 nginx-repo.crt, nginx-repo.key 파일을 /etc/ssl/nginx/  디렉터리로 복사합니다.

$ sudo cp nginx-repo.crt /etc/ssl/nginx/nginx-repo.cert
$ sudo cp nginx-repo.key /etc/ssl/nginx/nginx-repo.key

3. 이전에 구성된 NGINX 리포지토리, apt 설정 파일을 제거합니다.

$ sudo rm /etc/apt/sources.list.d/nginx*.list
$ sudo rm /etc/apt/sources.list.d/*app-protect*.list
$ sudo rm /etc/apt/apt.conf.d/90pkgs-nginx

4. 필수 패키지를 설치합니다.

$ sudo apt-get update && sudo apt-get install apt-transport-https lsb-release ca-certificates wget gnupg2 ubuntu-keyring

5. NGINX 서명 키를 다운로드하고, 추가합니다.

$ wget -qO - https://cs.nginx.com/static/keys/nginx_signing.key | gpg --dearmor | \
sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

6. apt 설정을 /etc/apt/apt.conf.d에 다운로드합니다.

$ sudo wget -P /etc/apt/apt.conf.d https://cs.nginx.com/static/files/90pkgs-nginx
NGINX OSS

1. NAP WAF v5 리포지토리를 추가합니다.

$ printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://pkgs.nginx.com/app-protect-x-oss/ubuntu `lsb_release -cs` nginx-plus\n" | \
sudo tee /etc/apt/sources.list.d/nginx-app-protect.list

2. NAP WAF v5 패키지를 설치합니다.

$ sudo apt-get update
$ sudo apt-get install app-protect-module-oss
NGINX Plus

1. NAP WAF v5 리포지토리를 추가합니다.

printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://pkgs.nginx.com/app-protect-x-plus/ubuntu `lsb_release -cs` nginx-plus\n" | \
sudo tee /etc/apt/sources.list.d/nginx-app-protect.list

2. NAP WAF v5 패키지를 설치합니다.

$ sudo apt-get update
$ sudo apt-get install app-protect-module-plus
Docker 구성

waf-enforcerwaf-config-mgr 컨테이너 실행을 위해 디렉터리를 생성하고, Docker Compose 파일을 작성합니다.

1. NGINX App Protect WAF 구성에 필요한 디렉터리를 생성합니다.

$ sudo mkdir -p /opt/app_protect/config /opt/app_protect/bd_config

2. NGINX App Protect WAF V5 서비스의 기본 UID/GID인 101:101로 디렉터리의 소유자를 변경합니다.

$ sudo chown -R 101:101 /opt/app_protect/

3. Docker가 F5 Container Registry(private-registry.nginx.com)로부터 waf-enforcerwaf-config-mgr 이미지를 pull 할 수 있도록 NGINX의 상업 구독을 통해 다운받은 nginx-repo.crt, nginx-repo.key 파일을 복사합니다.

$ sudo mkdir -p /etc/docker/certs.d/private-registry.nginx.com
$ sudo cp nginx-repo.crt /etc/docker/certs.d/private-registry.nginx.com/client.cert
$ sudo cp nginx-repo.key /etc/docker/certs.d/private-registry.nginx.com/client.key

4. 컨테이너 실행에 사용할 Docker Compose 파일을 생성합니다. 이미지의 태그를 통해 버전을 지정할 수 있습니다.

dockeer-compose.yml
services:
  waf-enforcer:
    container_name: waf-enforcer
    image: private-registry.nginx.com/nap/waf-enforcer:5.5.0
    environment:
      - ENFORCER_PORT=50000
    ports:
      - "50000:50000"
    volumes:
      - /opt/app_protect/bd_config:/opt/app_protect/bd_config
    networks:
      - waf_network
    restart: always

  waf-config-mgr:
    container_name: waf-config-mgr
    image: private-registry.nginx.com/nap/waf-config-mgr:5.5.0
    volumes:
      - /opt/app_protect/bd_config:/opt/app_protect/bd_config
      - /opt/app_protect/config:/opt/app_protect/config
      - /etc/app_protect/conf:/etc/app_protect/conf
    restart: always
    network_mode: none
    depends_on:
      waf-enforcer:
        condition: service_started

networks:
  waf_network:
    driver: bridge

5. dockeer-compose.yml 파일이 위치한 디렉터리에서 다음 명령어를 사용하여 컨테이너를 실행합니다.

$ sudo docker compose up -d

6. docker ps 명령어로 컨테이너를 확인합니다.

$ docker ps

CONTAINER ID   IMAGE                                                 COMMAND                  CREATED         STATUS         PORTS                                             NAMES
b1ab1a5b8e64   private-registry.nginx.com/nap/waf-config-mgr:5.5.0   "/service/config-mgr…"   7 seconds ago   Up 5 seconds                                                     waf-config-mgr
958a935cb7e5   private-registry.nginx.com/nap/waf-enforcer:5.5.0     "/start-enforcer"        7 seconds ago   Up 5 seconds   0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp   waf-enforcer

NGINX의 설정이 구성되기 전에는 waf-enforcer 컨테이너가 지속적으로 재시작됩니다. NGINX 설정 구성 시 정상적으로 동작합니다.

4. NGINX 설정 구성

1. /etc/nginx/nginx.conf 파일의 상단에 NGINX App Protect WAF V5 모듈을 로드하는 지시문을 추가합니다.

load_module modules/ngx_http_app_protect_module.so;

2. http 블록 내부에 enforcer 컨테이너의 주소를 추가합니다.

app_protect_enforcer_address 127.0.0.1:50000;

두 지시문을 적용한 예시는 다음과 같습니다.

user  nginx;
worker_processes  auto;

# NGINX App Protect WAF
load_module modules/ngx_http_app_protect_module.so;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # NGINX App Protect WAF
    app_protect_enforcer_address 127.0.0.1:50000;

    include /etc/nginx/conf.d/*.conf;
}

3. NGINX App Protect WAF V5를 활성화하는 지시문을 http/server/location 블록에 추가합니다.
proxy_pass/grpc_pass 지시문을 사용하는 설정에 적용합니다.

app_protect_enable on;

proxy_pass 지시문을 통해 요청을 프록시 하는 location 블록에 적용 시 아래와 같이 적용할 수 있습니다.

server {
    listen 80;
    server_name localhost;

    proxy_http_version 1.1;

    location / {

        # NGINX App Protect WAF
        app_protect_enable on;

        client_max_body_size 0;
        default_type text/html;
        proxy_pass http://127.0.0.1:9090/;
    }
}

server {
    listen 9090;
    server_name localhost;


    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

4. 적용을 위해 NGINX를 reload 합니다.

$ sudo nginx -s reload

5. 다음 요청을 통해 NGINX App Protect WAF가 요청을 차단하는 것을 확인할 수 있습니다.

$ curl "localhost/<script>"

<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 4645162530321456488<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>

5. 결론

이번 포스트에서는 기존에 NGINX가 설치된 인스턴스에 NGINX App Protect WAF를 설치하고, NGINX와 통합하는 방법을 알아봤습니다. 먼저 app-protect-module 패키지를 설치하고, Docker를 통해 waf-enforcer, waf-config-mgr 컨테이너를 실행 후 NGINX에 NGINX App Protect WAF 관련 지시문을 추가하여 통합 구성하는 방법을 알아봤습니다.

이 포스트의 구성과 같이 기존에 사용중이던 NGINX에 손쉽게 NGINX App Protect WAF를 통합하여 애플리케이션과 API를 보호할 수 있습니다. 또한 waf-enforcerwaf-config-mgr뿐만이 아닌 NGINX도 컨테이너로 배포하거나, Kubernetes 환경에 배포하는 등 다양한 환경과 요구사항에 맞춰서 구성할 수 있습니다.

기존에 사용 중이던 NGINX에 NGINX App Protect WAF를 통합해 사용해 보고 싶으시다면, NGINX STORE를 통해 문의해 무료로 NGINX의 상업용 구독을 체험해 보실 수 있습니다.

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

* indicates required