NGINX Plus Dynamic IP Access Control 구성

NGINX Plus와 ngx_http_keyval_module을 사용하면 NGINX Plus 중단 없이 동적으로 Access Control 을 구성할 수 있습니다.

NGINX Plus의 API 모듈(ngx_http_api_module)은 RESTful API를 통해 NGINX Plus의 운영 상태, 설정 정보, 통계, 모니터링 데이터 등을 실시간으로 조회하고 제어할 수 있는 모듈입니다. 이 모듈은 JSON 형식의 데이터를 반환하며, 관리자나 모니터링 시스템이 NGINX Plus 상태를 빠르게 확인하고 제어할 수 있는 기능을 제공합니다.

이번 포스트에서는 ngx_http_api_module과 ngx_http_keyval_module을 사용하여 동적으로 IP-based access control을 구성하는 방법에 대해 설명합니다.

목차

1. Dynamic IP Access Control
2. NGINX Plus Dynamic IP Access Control 구성
3. IP 제어 및 관리
4. NGINX Plus IP Access Control 목록 확인
5.결론

1. Dynamic IP Access Control

Dynamic IP Access Control은 NGINX Plus에서 동적으로 IP 주소를 기반한 실시간 엑세스 제어를 할 수 있게 해줍니다. 이 기능을 사용하여 특정 IP 주소를 동적으로 허용하거나 차단하는 데 사용되며, 보안성을 높이면서도 제어 편의성을 향상시킬 수 있습니다.

주요 기능은 다음과 같습니다:

  • 실시간 액세스 제어: 미리 정의한 IP 목록을 통해 액세스 제어를 적용하는 방식과 달리, NGINX Plus의 API를 통해 실시간으로 IP Access Control(허용/차단)이 가능합니다.
  • REST API 기반 제어: NGINX Plus API를 사용해 접근 제어 규칙을 실시간으로 변경할 수 있어, 특정 IP 주소를 즉각 차단하거나 허용할 수 있습니다.
  • 화이트리스트/블랙리스트 관리: 별도의 목록으로 관리할 수 있으며, 보안 요구 사항에 따라 필요 시 두 가지 방식으로 제어할 수 있습니다.

따라서 NGINX Plus의 RESTAPI와 keyval 모듈을 사용하여, 서비스 중단 없이 access control을 설정할 수 있습니다.

2. NGINX Plus Dynamic IP Access Control 구성

NGINX Plus를 사용한 서비스 중단 없이 동적으로 IP access control을 구성하는 방법은 어렵지 않습니다.

아래는 구성 예시입니다.

# IP Access 목록을 관리할 keyval 데이터 저장소를 정의합니다.
keyval_zone zone=ip_acl:1m state=/var/lib/nginx/state/IPbased_access_control.keyval;

# $remote_addr 변수를 키로 사용하고 $access_granted 변수에 할당된 값을 가져옵니다.
keyval $remote_addr $access_granted zone=ip_acl;

# $access_granted의 값에 따라 $access_allowed 값을 설정합니다.
map $access_granted $access_allowed {
        default "0";
        "T"     "1";
}

server {
        listen 80;
        server_name example.com;

        location / {
                # $access_allowed 값이 0일 경우 403 Forbidden을 응답합니다.
                if ($access_allowed = 0) {
                        return 403;
                }

                root /usr/share/nginx/html;
                index index.html;
        }

        # 동적으로 IP Access Control을 하기 위해 API를 활성화합니다.
        location /api/ {
               # allow 127.0.0.1;
               # deny all;
                api write=on;
        }
}

위 구성의 전체적인 흐름은 아래와 같습니다.

  1. 클라이언트 IP 저장:
    • 클라이언트 IP가 $remote_addr 변수에 저장됩니다. (예: $remote_addr = 192.168.1.10)
  2. Key-Value 조회:
    • $remote_addr 값이 ip_acl 데이터 저장소에서 조회되고, 결과가 $access_granted 변수에 저장됩니다. (예: $access_granted = “T”)
  3. map 지시문으로 접근 여부를 결정:
    • $access_granted 값에 따라 $access_allowd 변수가 설정됩니다. (예: $access_granted =”T”, $access_allowd = 1)
  4. 접근 허용/차단 결정:
    • $access_allowed 값이 0이면 차단, 1이면 요청을 처리합니다.

IPbased_access_control.keyval 파일을 생성하기 위해 NGINX를 재시작합니다.

3. IP 제어 및 관리

현재 key-value에 저장된 값을 확인하려면 http://example.com/api/9/http/keyvals 로 접근하면 현재 IP 제어 목록을 확인할 수 있습니다.

nginx plus access control

현재 key-value에 값이 없으므로 example.com으로 요청 시 403 Forbidden을 반환합니다.

nginx plus access control

Curl 명령을 사용하여 동적으로 허용할 IP를 추가하는 방법은 아래와 같습니다:

# 허용할 IP를 추가하는 방법
# curl -X POST -d '{"허용할 IP":"T"}' example.com/api/9/http/keyvals/ip_acl
$ curl -X POST -d '{"127.0.0.1":"T"}' example.com/api/9/http/keyvals/ip_acl

# 허용된 IP를 제거하는 방법
# curl -X DELETE -d '{"제거할 IP"}' example.com/api/9/http/keyvals/ip_acl
$ curl -X DELETE -d '{"127.0.0.1"}' example.com/api/9/http/keyvals/ip_acl

curl 명령어를 사용하여 허용할 IP를 추가한 뒤 NGINX 중단 없이 IP Access 가 허용되는 지 확인합니다.

nginx plus access control

위의 사진과 같이 NGINX Plus의 서비스 중단 없이 동적으로 127.0.0.1의 아이피를 허용하고 삭제(차단)이 되는 것을 확인할 수 있습니다.

4. NGINX Plus IP Access Control 목록 확인

현재 등록된 IP 목록을 확인하는 방법은 크게 두 가지 있습니다.

첫 번째는 GET 요청을 통해 확인할 수 있습니다. 아래는 curl을 사용하여 현재 IP Access Control 에 등록된 IP를 확인하는 방법입니다.

nginx plus access control

또는 웹사이트에서 해당 경로를 입력하여 확인할 수 있습니다.

두 번째 방법은 현재 아래와 같이 keyval_zone을 지정하였습니다.

keyval_zone zone=ip_acl:1m state=/var/lib/nginx/state/IPbased_access_control.keyval;

state 매개변수의 경로를 /var/lib/nginx/state/IPbased_access_control.keyval로 지정하였기 때문에 현재 등록된 IP 목록은 해당 파일에서 확인할 수 있습니다.

# cat /var/lib/nginx/state/IPbased_access_control.keyval 

{"123.456.789.123":"T","127.0.0.1":"T"}

만약 state에 지정된 경로에 파일이 생성되지 않았다면, 두 가지를 확인하세요.

  1. keyval_zone 구성 후 NGINX Plus 재시작
  2. keyval_zone 지시문의 state 매개변수 경로의 디렉토리에 NGINX가 파일을 쓸 수 있는 권한이 있는지 확인하세요.

파일이 정상적으로 생성되고 기록된다면 NGINX Plus를 재시작해도 IP access control이 적용됩니다.

5.결론

이번 포스트에서는 NGINX Plus의 강력한 기능인 ngx_http_api_module과 ngx_http_keyval_module을 활용하여 동적인 IP access control 을 구성하는 방법을 살펴보았습니다. 이 두 모듈을 통해 NGINX Plus의 중단 없이 실시간으로 access control을 관리할 수 있는 유연성을 확보할 수 있습니다.

ngx_http_api_module은 IP access control 을 제외하고도 RESTful API를 통해 NGINX Plus의 운영 상태와 설정 정보를 손쉽게 조회하고 변경할 수 있는 기능을 제공하며, 이로 인해 관리자는 서버의 상태를 신속하게 모니터링하고 필요한 조치를 취할 수 있습니다.

또한, ngx_http_keyval_module을 이용해 IP 주소를 동적으로 추가하거나 제거함으로써, 변화하는 환경에 즉각적으로 대응할 수 있는 access control 전략을 구현할 수 있습니다.

결론적으로, 이러한 동적 access control 방식은 보안성을 높이고, 관리의 효율성을 극대화하며, 운영 중단 없이도 시스템을 안정적으로 유지하는 데 큰 도움이 됩니다.

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

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

* indicates required