Third-Party NGINX 동적 모듈 컴파일

이 포스트는 NGINX Open Source 및 NGINX Plus와 함께 Third-Party NGINX 동적 모듈 을 사용하는 방법에 대한 2부작 시리즈의 일부입니다.

  • 이 포스트는 런타임 시 NGINX Open Source 또는 NGINX Plus에서 로드할 수 있는 Third-Party 동적 모듈을 컴파일하기 위한 단계별 지침을 제공합니다.
  • 두 번째 포스트는 프로덕션 환경을 위한 Third-Party동적 모듈 빌드를 자동화하기 위한 지침과 도구를 제공합니다. 버전 종속성 검사를 포함하는 Third-Party 동적 모듈용으로 설치 가능한 패키지를 만드는 방법을 설명합니다.

NGINX Open Source 1.11.5 및 NGINX Plus 릴리스 R11은 동적 모듈에 대한 바이너리 호환성을 도입했습니다. 이 문서에서는 개발 환경에서 NGINX Open Source 및 NGINX Plus와 함께 사용할 Third-Party 모듈을 컴파일하는 방법을 설명합니다. 프로덕션 환경에서 Third-Party 동적 모듈을 빌드, 배포 및 업그레이드하는 방법에 대한 지침은 동적 모듈용 설치 가능 패키지 생성을 참조하십시오.

간결함을 위해 이 포스트의 나머지 부분에서는 NGINX Plus와 NGINX Open Source 간의 차이점이 관련된 경우를 제외하고는 NGINX Plus만 언급합니다. 명시된 경우를 제외하고 NGINX Plus에 대한 모든 설명은 NGINX Open Source에도 적용됩니다.

목차

1. NGINX 동적 모듈 개요
2. 예: 간단한 “Hello World” 모듈
-2-2. 1단계: NGINX Open Source 릴리스 얻기
-2-2. 2단계: 모듈 소스 얻기
-2-3. 3단계: NGINX 동적 모듈 컴파일
-2-4. 4단계: 모듈 로드 및 사용
3. 예: NAXSI 웹 애플리케이션 방화벽
4. NGINX Plus에서 동적 모듈을 지원하는 방법
5. 요약

1. NGINX 동적 모듈 개요

NGINX Plus에 로드할 수 있는 모듈은 C로 작성되었으며 NGINX Wiki의 NGINX 확장에 설명된 API를 준수합니다. 언어 인터프리터에서 보안 솔루션에 이르는 대규모 Third-Party 모듈 에코시스템이 있으며 이들 중 일부는 NGINX Plus에 포함 및 지원됩니다.

다른 Third-Party 모듈과 직접 만든 모듈은 독립적으로 컴파일해야 하며 런타임에 NGINX Plus에 동적으로 로드해야 합니다. 아래의 두 가지 예와 같이 NGINX Open Source에 대해 모듈을 빌드하여 NGINX Plus와 함께 사용하기 위해 이러한 모듈을 컴파일할 수 있습니다.

2. 예: 간단한 “Hello World” 모듈

이 예제에서는 간단한 Hello World 모듈을 사용하여 모듈의 소스를 업데이트하고 NGINX Plus에 로드하는 방법을 보여줍니다. “Hello World” 모듈은 간단한 메시지로 요청에 응답하는 간단한 지시문(hello_world)을 구현합니다.

2-1. 1단계: NGINX Open Source 릴리스 얻기

1. NGINX Plus 설치에 해당하는 NGINX Open Source 버전을 확인합니다. 이 예에서는 NGINX 1.11.5입니다.

$ nginx -v
nginx version: nginx/1.11.5 (nginx-plus-r11)

2. nginx.org/download에서 해당 NGINX Open Source 패키지를 다운로드합니다.

$ wget https://nginx.org/download/nginx-1.11.5.tar.gz
$ tar -xzvf nginx-1.11.5.tar.gz

2-2. 2단계: NGINX 동적 모듈 소스 얻기

3. GitHub에서 ‘Hello World’ NGINX 모듈의 소스를 가져옵니다.

$ git clone https://github.com/perusio/nginx-hello-world-module.git

4. 모듈의 config shell 파일은 모듈이 빌드되는 방식을 정의하며 동적 모듈의 형식은 NGINX Open Source 바이너리에 정적으로 빌드되는 모듈의 경우와 다릅니다.

다음과 같이 nginx-hello-world-module/config 파일을 수정합니다.

ngx_addon_name=ngx_http_hello_world_module

if test -n "$ngx_module_link"; then
    ngx_module_type=HTTP
    ngx_module_name=ngx_http_hello_world_module
    ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"

    . auto/module
else
    HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
fi

이전 형식에서 모듈의 config 파일을 업데이트하는 방법을 포함하여 동적 모듈 컴파일에 대한 자세한 내용은 NGINX Wiki를 참조하세요.

2-3. 3단계: NGINX 동적 모듈 컴파일

5. NGINX Open Source와 NGINX Plus에서 모두 지원하는 표준 빌드 환경을 생성하는 –with-compat 인수로 구성 스크립트를 먼저 실행하여 모듈을 컴파일합니다. 그런 다음 make module을 실행하여 모듈을 빌드합니다.

$ cd nginx-1.11.5/
$ ./configure --with-compat --add-dynamic-module=../nginx-hello-world-module
$ make modules

6. 모듈 라이브러리(.so 파일)를 /etc/nginx/modules에 복사합니다.

$ sudo cp objs/ngx_http_hello_world_module.so /etc/nginx/modules/

2-4. 4단계: 모듈 로드 및 사용

7. 모듈을 NGINX Plus에 로드하려면 nginx.conf 구성 파일의 최상위(기본) 컨텍스트(http 또는 stream 컨텍스트 내 아님)에 load_module 지시문을 추가합니다.

load_module modules/ngx_http_hello_world_module.so;

8. http 컨텍스트에서 Hello World 모듈에서 제공하는 hello_world 지시문을 사용하여 location 블록을 추가합니다. location 에 대한 요청은 응답 hello world를 반환합니다.

server {
    listen 80;

    location / {
         hello_world;
    }
}

9. NGINX Plus 구성을 다시 로드하고 간단한 요청으로 테스트합니다.

$ nginx -s reload
$ curl http://localhost/
hello world

3. 예: NAXSI 웹 애플리케이션 방화벽

NAXSI는 XSS 및 SQL 삽입 공격과 같은 의심스러운 요청을 식별하기 위해 휴리스틱 및 스코어링 시스템을 사용하는 사용하기 쉬운 고성능 웹 애플리케이션 방화벽(WAF)입니다.

NAXSI 소스는 config shell 파일의 새 형식을 준수하도록 업데이트되었으므로 NGINX Plus용 동적 모듈을 간단하게 빌드할 수 있습니다. 이 프로세스는 NAXSI 설치 지침을 기반으로 합니다.

$ git clone https://github.com/nbs-system/naxsi.git
$ cd nginx-1.11.5/
$ ./configure --with-compat --add-dynamic-module=../naxsi/naxsi_src
$ make modules
$ sudo cp objs/ngx_http_naxsi_module.so /etc/nginx/modules

nginx.conf 파일의 기본 컨텍스트에 load_module 지시문을 추가하여 NGINX Plus 코어에 모듈을 로드합니다.

load_module modules/ngx_http_naxsi_module.so;

NAXSI 구성은 프로젝트 문서에 자세히 설명되어 있습니다. 다음 NGINX 구성은 작동 중인 모듈을 보여줍니다.

# Edit this 'include' directive to point to your naxsi_core.rules file
include /home/owen/src/naxsi/naxsi_config/naxsi_core.rules;

server {
    listen 80;

    location / {
        root /usr/share/nginx/html;

        # Enable NAXSI
        SecRulesEnabled;

        # Define where blocked requests go
        DeniedUrl "/50x.html";

        # CheckRules, determining when NAXSI needs to take action
        CheckRule "$SQL >= 8" BLOCK;
        CheckRule "$RFI >= 8" BLOCK;
        CheckRule "$TRAVERSAL >= 4" BLOCK;
        CheckRule "$EVADE >= 4" BLOCK;
        CheckRule "$XSS >= 8" BLOCK;

        # Don’t forget the error_log, where blocked requests are logged
        error_log /tmp/naxsi.log;
    }

    error_page   500 502 503 504  /50x.html;
}

한 쌍의 간단한 HTTP 요청으로 NAXSI의 올바른 작동을 확인할 수 있습니다.

  • curl http://localhost/는 /usr/share/nginx/html에 저장된 표준 NGINX Plus 인덱스 페이지를 반환합니다.
  • curl “http://localhost/?a=<>”는 NAXSI의 XSS 감지를 트리거하고 요청을 차단하여 /usr/share/nginx/html에서 표준 50x.html 오류 페이지를 반환합니다. 또한 error_log에 메시지를 기록합니다.

프로덕션 배포의 경우 https://github.com/nbs-system/naxsi/tags에서 서명된 NAXSI 릴리스를 다운로드하고 유사한 방식으로 컴파일할 수도 있습니다.

4. NGINX Plus에서 동적 모듈을 지원하는 방법

참고: 이 섹션의 정보는 NGINX Plus에만 적용됩니다. 미리 빌드된 NGINX Open Source 패키지와 함께 제공되는 동적 모듈 세트는 NGINX Plus와 함께 제공되는 것과 다를 수 있습니다. NGINX Open Source와 함께 사용되는 동적 모듈은 NGINX 소스 코드 및 사전 빌드된 바이너리와 같은 방식으로 지원됩니다.

NGINX Plus는 모듈 리포지토리에서 직접 다운로드할 수도 있는 여러 동적 모듈과 함께 제공됩니다. 목록은 동적 모듈 페이지를 참조하십시오. 이러한 모듈에는 두 가지 유형이 있습니다.

  • NGINX Plus 모듈은 NGINX 엔지니어링 팀에서 작성 및/또는 유지 관리합니다. 기술적인 이유로(예: 추가 종속성이 있음) 미리 보기 상태이기 때문에 NGINX Plus에 포함하지 않습니다. 미리보기 모듈은 활발히 개발 중이며 신중하게 배포해야 합니다. 그렇지 않으면 NGINX Plus 모듈이 NGINX에서 지원됩니다. 목록을 보려면 동적 모듈 페이지에서 작성자 NGINX로 필터링하세요.
  • NGINX Plus 인증 커뮤니티 모듈은 NGINX가 테스트 및 배포하고 설치 및 기본 구성에 대한 지원을 제공하는 인기 있는 Third-Party 모듈입니다. 당사는 이러한 모듈이 NGINX Plus의 올바른 작동을 방해하지 않음을 보증하며 각 NGINX Plus 릴리스 또는 보안 릴리스가 있을 때 필요에 따라 업데이트합니다. 목록을 보려면 동적 모듈 페이지에서 작성자 커뮤니티로 필터링하십시오.

또한 NGINX는 NGINX Plus 인증 모듈 프로그램에 참여하는 상용 공급업체의 모듈을 인증합니다. 이러한 모듈은 공급업체에서 배포하고 지원합니다. 목록을 보려면 동적 모듈 페이지에서 작성자 인증 파트너로 필터링하십시오.

NGINX는 사용자가 직접 컴파일하는 모듈(다른 커뮤니티 모듈, NGINX Plus 인증 모듈 프로그램의 일부가 아닌 Third-Party 공급업체에서 제공하는 모듈 및 사용자 지정 모듈)을 테스트하거나 지원하지 않습니다. 문제에 대한 기술 지원을 요청하는 경우 NGINX 지원 팀은 기술 지원 프로세스의 일부로 지원되지 않는 모듈을 제거하고 오류를 재현하도록 요청할 수 있으므로 지원되지 않는 모듈로 인해 오류가 발생했는지 여부를 확인할 수 있습니다.

5. 요약

NGINX Plus의 동적 모듈 빌드 프로세스를 통해 NGINX Open Source 모듈의 광범위한 에코시스템을 활용하여 풍부하고 완벽하게 지원되는 NGINX Plus 코어에서 실행할 수 있습니다.

현재 Third-Party 확장 프로그램과 함께 NGINX Open Source를 사용하고 있다면 이러한 확장 프로그램을 NGINX Plus에 컴파일하고 로드할 수 있습니다.

NGINX Developers 메일링 리스트는 커뮤니티 지원을 위한 장소이며 전문 서비스 팀도 기꺼이 도와드립니다.

NGINX Plus로 동적 모듈을 직접 사용해 보려면 지금 무료 30일 평가판을 시작하거나 당사에 연락하여 사용 사례에 대해 논의하십시오.

사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.