NGINX Plus

IP 주소 동적 거부 목록

NGINX Plus Key-Value Store 및 API로 구축된 동적 거부 목록을 사용하여 특정 클라이언트 IP 주소에서 사이트 또는 애플리케이션에 대한 액세스를 제어하세요.

이 섹션에서는 특정 클라이언트 IP 주소의 거부 목록 또는 허용 목록을 생성하여 사이트에 대한 액세스를 거부하거나 허용하는 방법과 주소 목록을 동적으로 유지하는 방법에 대해 설명합니다.

목차

1. 개요
2. 전제 조건
3. 설정
4. Key-Value 데이터베이스 관리
5. 전체 예제

1. 개요

NGINX Plus 릴리스 13(R13) 이상에서는 일부 IP 주소를 거부할 수 있을 뿐만 아니라 거부된 IP 주소의 데이터베이스를 생성 및 유지할 수 있습니다. 다른 IP 주소를 명시적으로 허용 목록에 추가할 수도 있습니다. IP 주소 데이터베이스는 NGINX Plus APIkeyval 모듈로 관리됩니다.

2. 전제 조건

NGINX Plus 릴리스 13 이상, 네트워크 지원 범위에 대해서는 NGINX Plus 릴리스 19 이상이 필요합니다.

3. 설정

먼저 거부 목록 및 허용 목록 IP 주소 목록을 저장하기 위해 데이터베이스를 활성화합니다.

1. NGINX Plus 구성 파일에서 Key와 Value를 저장하기 위한 메모리 Zone을 생성하려면 http 컨텍스트에 keyval_zone 지시문을 포함하세요. 이 샘플 지시문은 one이라는 1MB 영역을 생성합니다.

http {
    # ...
    keyval_zone zone=one:1m;
 }

서브넷(예: 192.168.13.0/24)에 대해 IP 주소 매칭을 수행하려면 keyval_zone 지시문의 type=ip 매개변수를 지정합니다.

http {
    # ...
    keyval_zone zone=one:1m type=ip;
 }

Note: type=ip 매개변수를 사용하면 Zone에 추가 인덱스를 저장할 수 있으므로 keyval_zone의 크기도 증가해야 합니다.

선택적으로 state 매개변수를 포함하여 Key-Value 데이터베이스가 저장되어 NGINX Plus가 Reload되고 다시 시작될 때 지속되는 파일(이 예제에서는 one.keyval)을 생성할 수 있습니다.

keyval_zone zone=one:1m state=one.keyval;

2. api 지시문을 사용하여 read-write 모드에서 NGINX Plus api를 활성화합니다.

# ...
 server {
     listen 80;
     server_name www.example.com;

     location /api {
         api write=on;
     }
 }

예를 들어 localhost(127.0.0.1)에서만 액세스를 허용하고 HTTP 기본 인증을 사용하여 지정된 사용자 집합으로 PATCH, POSTDELETE 메서드 사용을 제한하는 등 이 위치에 대한 액세스를 제한할 것을 강력히 권장합니다.

# ...
 server {
     listen 80;
     server_name www.example.com;

     location /api {
         api   write=on;

         allow 127.0.0.1;
         deny  all;

         limit_except GET {
             auth_basic "NGINX Plus API";
             auth_basic_user_file /path/to/passwd/file;
         }
     }
 }

3. API의 POST 메서드를 사용하여 Key-Value 데이터베이스를 채우고 JSON 형식의 데이터를 제공합니다. 다음 예제에서와 같이 curl 명령을 사용할 수 있습니다. Zone이 비어 있으면 여러 개의 Key-Value 쌍을 한 번에 입력할 수 있지만, 그렇지 않은 경우 한 번에 하나씩 쌍을 추가해야 합니다.

$ curl -X POST -d '{
   "10.0.0.1": "1",
   "10.0.0.2": "1",
   "10.0.0.3": "0",
   "10.0.0.4": "0"
 }' -s http://www.example.com/api/6/http/keyvals/one

네트워크 범위와 IP 주소의 일치를 지정한 경우(keyval_zone 지시문의 type=ip 매개변수 사용), CIDR 표기법으로 지정된 네트워크 범위와 함께 POST 명령을 전송합니다.

$ curl -X POST -d '{
   "192.168.13.0/24": "1"
 }' -s http://www.example.com/api/6/http/keyvals/one

4. http 컨텍스트에 keyval 지시문을 포함하여 클라이언트 IP 주소가 Key-Value 데이터베이스에 대해 평가되는 방식을 정의합니다.

이 지시문은 모든 요청에 대해 클라이언트 IP 주소로 자동 설정되는 표준 NGINX 및 NGINX Plus 변수 $remote_addr을 활용합니다.

각 요청을 처리할 때의 NGINX Plus.

  • zone= 매개변수(여기서는 one)로 지정된 Key-Value 데이터베이스에서 첫 번째 매개변수(여기서는 $remote_addr, 클라이언트의 IP 주소로 사전 설정되어 있습니다)를 조회합니다.
  • 데이터베이스의 Key가 $remote_addr과 정확히 일치하는 경우 두 번째 매개변수(여기서는 $target)를 해당 Key에 해당하는 값으로 설정합니다. 이 예에서는 거부된 주소의 경우 1, 허용된 주소의 경우 0입니다
http {
     # ...
     keyval_zone zone=one:1m type=ip state=one.keyval;
     keyval $remote_addr $target zone=one; # Client address is the key, 
                                           # $target is the value;
 }

5. 클라이언트 IP 주소에 따라 액세스를 허용하거나 거부하는 if 지시문을 사용하여 규칙을 만듭니다. 이 규칙을 사용하면 $target0이면 액세스가 허용되고 1이면 액세스가 거부됩니다.

if ($target) {
    return 403;
}

4. Key-Value 데이터베이스 관리

API 메서드를 사용하여 NGINX Plus를 Reload할 필요 없이 Key-Value 데이터베이스를 동적으로 업데이트할 수 있습니다.

다음 예제는 모두 http://www.example.com/api/6/http/keyvals/one 에서 액세스할 수 있는 one의 Zone 에서 작동합니다.

  • Zone의 모든 데이터베이스 항목 목록을 가져오려면 다음과 같이 작업합니다.

$ curl -X GET 'http://www.example.com/api/6/http/keyvals/one'

  • 기존 항목의 값을 업데이트하려면(이 예에서는 IP 주소 10.0.0.4의 액세스 상태를 허용 목록에서 거부 목록으로 변경하기 위해) 다음과 같이 설정합니다.

$ curl -X PATCH -d '{"10.0.0.4": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'

  • 채워진 영역에 항목을 추가하려면 다음과 같이 설정합니다.

$ curl -X POST -d '{"10.0.0.5": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'

  • 항목을 삭제하려면 다음과 같이 설정합니다.
$ curl -X PATCH -d '{"10.0.0.4":null}' -s 'http://www.example.com/api/6/http/keyvals/one'

5. 전체 예제

전체 NGINX Plus 구성입니다.

http {
    # ...
    keyval_zone zone=one:1m type=ip state=one.keyval;
    keyval $remote_addr $target zone=one;

    server {
        listen 80;
        server_name www.example.com;

        location /api {
            api   write=on;

            allow 127.0.0.1;
            deny  all;
        
            limit_except GET {
                auth_basic "NGINX Plus API";
                auth_basic_user_file /path/to/passwd/file;
            }
        }

        if ($target) {
            return 403;
        }
    }
}

구성:

  • 네트워크 범위를 허용하는 1MB Keyval Zone one을 생성하고, Key-Value 쌍의 데이터베이스가 NGINX Plus의 Reload 및 Restart 시에도 지속되도록 one.keyval 파일을 생성합니다.
  • Zone이 IP 주소로 채워질 수 있도록 쓰기 모드에서 NGINX Plus API를 활성화합니다.
  • Key-Value 데이터베이스에서 IP 주소 $remote_addr을 Key로 조회하고, 찾은 Key의 값을 $target 변수에 넣습니다.
  • $target 값이 1(주소가 거부 목록에 있음)이면 클라이언트에게 403(Forbidden)을 반환하는 간단한 규칙을 사용하여 결과값을 확인할 수 있습니다.

다음 curl 명령은 빈 Keyval Zone one을 거부 목록(값은 1) 또는 허용 목록(값은 0)에 있는 IP 주소로 채웁니다.

$ curl -X POST -d '{
     "10.0.0.1": "1",
     "192.168.13.0/24": "1",
     "10.0.0.3": "0",
     "10.0.0.4": "0"
}' -s 'http://www.example.com/api/6/http/keyvals/one'