튜토리얼: F5 NGINX로 GraphQL API 제공 및 보안 강화

NGINX | 2023년 7월 20일

개발자들은 API를 구축하는 데 선호하는 방식으로 GraphQL을 점점 더 많이 채택하고 있습니다. GraphQL은 여러 소스에서 데이터를 가져오는 과정을 간소화하여 데이터 액세스와 집계를 효율화합니다. GraphQL을 사용하는 개발자는 단일 엔드포인트에 한 번의 POST 요청으로 여러 데이터 소스를 쿼리하여 다양한 소스에서 필요한 데이터를 정확하게 요청할 수 있습니다. 이 접근 방식은 REST API 아키텍처에서 발생하는 한계를 해결하는 데 도움이 됩니다. 이러한 아키텍처에서는 언더 쿼리(요청에 필요한 데이터가 모두 포함되지 않는 문제)나 오버 쿼리(여러 엔드포인트에 요청을 보내 과도한 데이터를 수집하는 문제)와 같은 문제가 발생할 수 있습니다.

GraphQL은 클라이언트가 각 서비스 또는 데이터 소스에서 꼭 필요한 데이터만 가져올 수 있도록 지원하므로 마이크로서비스 아키텍처에 가장 적합한 선택입니다. 이를 통해 유연성과 민첩성을 한층 높일 수 있으며, 이는 현대적인 비즈니스 환경에서 성공하는 데 필수적인 요소입니다.

GraphQL API에서 보안은 매우 중요합니다

GraphQL API는 더 높은 수준의 접근성과 유연성을 제공하는 만큼, 악의적인 공격자에게 매력적인 더 광범위한 공격 표면을 노출하기도 합니다. GraphQL은 비교적 새로운 기술이지만, 다른 API 아키텍처에서 발견되는 여러 취약점에 여전히 노출될 수 있습니다. 다행히 기존 인프라와 도구를 활용하면 이러한 일반적인 위협으로부터 GraphQL API를 보호할 수 있습니다.

튜토리얼 개요

이 튜토리얼에서는 GraphQL API를 제공하고 보호하는 방법을 이해할 수 있도록 안내합니다. Apollo GraphQL 서버를 F5 NGINX Unit에 배포하고 F5 NGINX Plus를 API 게이트웨이로 사용하는 방법을 설명합니다. 또한 고급 보안을 위해 API 게이트웨이에 F5 NGINX App Protect WAF를 배포하고 F5 NGINX Management Suite를 사용하여 WAF를 구성하고 잠재적 위협을 모니터링하는 방법을 보여 줍니다. 이 구성을 통해 NGINX App Protect WAF를 사용하여 SQL 인젝션과 같은 공격도 탐지할 수 있습니다.

이 튜토리얼을 완료하려면 다음 섹션의 단계를 따르세요:

그림 1: GraphQL API에 보안 및 인증을 제공하는 NGINX Plus 및 NGINX App Protect WAF, 공격을 모니터링하는 NGINX Management Suite, NGINX Unit에서 실행되는 Apollo GraphQL 서버로 구성된 아키텍처

사전 요구 사항

이 튜토리얼을 시작하기 전에 다음 항목이 필요합니다:

NGINX Management Suite Security Monitoring 설치 및 구성

NGINX Management Suite는 여러 고급 기능을 하나의 통합 플랫폼에 결합하여 NGINX 인스턴스의 구성, 모니터링 및 문제 해결 프로세스를 간소화합니다. 또한 API 관리 및 거버넌스를 지원하고, 애플리케이션 부하 분산을 최적화하며, 조직의 전반적인 보안을 강화합니다.

다음 단계에 따라 NGINX Management Suite를 설치하고 구성하세요:

  • Follow the instructions on the 가상 머신 또는 베어 메탈 페이지에 나와 있는 지침을 따르세요. 이 페이지는 설치 페이지에 있습니다. 여기에는 이 튜토리얼에서 사용하는 보안 모니터링 모듈과 필요에 따라 설치할 수 있는 기타 모듈이 포함되어 있습니다.
  • 라이선스를 추가하세요 (설치된 각 모듈별).
  • NGINX Management Suite 호스트에서 NGINX Agent 패키지를 설치하고 다음 안내에 따라 NGINX App Protect 인스턴스에 대한 보안 모니터링을 설정하세요. 안내는 여기에서 확인할 수 있습니다.

NGINX Unit를 배포하고 Apollo GraphQL Server 설치

NGINX Unit은 가볍게 설계된 효율적이고 간소화된 런타임 애플리케이션으로, 속도나 민첩성을 저해하지 않으면서 높은 성능을 원하는 조직에 이상적인 선택입니다. TLS 처리, 요청 라우팅 및 애플리케이션 코드 실행이 가능한 오픈 소스 서버입니다. NGINX Unit에 대한 자세한 내용은 주요 기능 페이지에서 확인할 수 있습니다.

이 튜토리얼에서는 Apollo GraphQL 서버를 구축하는 데 필요한 다양한 기능을 제공하는 NGINX Unit 기반 Node.js 웹 애플리케이션 프레임워크로 Express를 사용합니다. 이 글을 작성하는 현재 최신 버전은 Apollo Server 4입니다.

다음 단계에 따라 NGINX Unit을 배포하고 Apollo GraphQL 서버를 설치하세요:

  1. NGINX Unit를 지원되는 운영 체제에 설치합니다.
  2. Follow the GitHub 저장소의 안내에 따라 Apollo GraphQL 서버를 빌드하고 Apollo GraphQL Hello 앱을 만드세요.

NGINX Plus를 API 게이트웨이로 배포하고 NGINX App Protect WAF 설치

NGINX Plus 인스턴스를 배포할 적절한 환경을 선택합니다. 이 튜토리얼에서는 AWS Ubuntu 인스턴스를 사용하고 NGINX Plus로 API 게이트웨이 리버스 프록시를 설정합니다. 그런 다음 보안을 강화하기 위해 API 게이트웨이 앞에 NGINX App Protect WAF를 배포합니다.

다음 지침에 따라 NGINX Plus 및 NGINX App Protect WAF를 설치하세요:

  1. NGINX Plus 설치 지원되는 운영 체제에에 설치합니다.
  2. NGINX JavaScript 모듈을 설치합니다 (njs).
  3. Add the load_modules를 nginx.conf 디렉터리에 추가합니다.
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
  1. 지원되는 운영 체제에 NGINX App Protect WAF를 설치합니다.
  2. 기본 컨텍스트에 NGINX App Protect WAF 모듈을 추가합니다. 파일 위치: nginx.conf :
load_module modules/ngx_http_app_protect_module.so;
  1. Enable NGINX App Protect WAF on an http/server/location context in the nginx.conf 파일의 http/server/location 컨텍스트에서 NGINX App Protect WAF를 활성화합니다:
app_protect_enable on;
  1. /etc/app_protect/conf 디렉터리에 GraphQL 정책 구성을 생성합니다. NGINX App Protect WAF 정책을 생성하는 방법에 대한 자세한 내용은 관련 지침을 참조하세요. 다음은 GraphQL 정책 구성의 예입니다:
{   "name": "graphql_policy",
      "template": {
          "name": "POLICY_TEMPLATE_NGINX_BASE"
      },
      "applicationLanguage": "utf-8",
      "caseInsensitive": false,
      "enforcementMode": "blocking",
      "blocking-settings": {
          "violations": [
              {
                  "name": "VIOL_GRAPHQL_FORMAT",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_MALFORMED",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_ERROR_RESPONSE",
                  "alarm": true,
                  "block": false
              }
          ]
      } 
  1. GraphQL 설정을 적용하려면 app_protect_policy_file 필드를 nginx.conf 파일에 있는 GraphQL 정책 이름으로 업데이트합니다. 파일을 업데이트한 후 NGINX를 다시 로드하여 GraphQL 설정을 적용합니다. 다음은 NGINX App Protect 정책이 포함된 nginx.conf 파일의 예입니다:
user nginx;  worker_processes  4;
  load_module modules/ngx_http_js_module.so;
  load_module modules/ngx_stream_js_module.so; 
  load_module modules/ngx_http_app_protect_module.so;
  error_log /var/log/nginx/error.log debug;
  events {
      worker_connections  65536;
  }
http {
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      server {
          listen       <port>;
          server_name  <name>; 
          app_protect_enable on;
          app_protect_security_log_enable on; # This section enables the logging capability
          app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # This is where the remote logger is defined in terms of: logging options (defined in the referenced file), log server IP, log server port
          app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
          proxy_http_version 1.1;    
          location / {
              client_max_body_size 0;
              default_type text/html;
              proxy_pass http://<ip addr>:<port>$request_uri;#<ip addr> of Nginx unit
          }
          location /graphql {
              client_max_body_size 0;
              default_type text/html;
              app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";
              proxy_pass http://<ip addr>:<port>$$request_uri; #<ip addr> of Nginx unit
           
          }
      }
  }
  1. 다음 명령을 실행하여 NGINX Plus를 다시 시작합니다:

$ nginx -s reload

구성 테스트

이제 다음 단계에 따라 구성을 테스트할 수 있습니다:

  1. NGINX Unit 서버로 이동하여 다음 명령을 입력해 Apollo GraphQL 애플리케이션을 시작합니다:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  1. 업데이트가 성공적으로 완료되면 리스너의 IP 주소와 포트에서 앱에 액세스할 수 있는 것을 확인할 수 있습니다:
{          "success": "Reconfiguration done."
  }
  1. Apollo GraphQL 서버에 접속하려면 웹 브라우저를 열고 서버의 공인 IP 주소를 붙여넣으세요. 예: http://3..X.X.X:4003/graphql (이 예시에서는 4003번 포트를 사용합니다).
  2. 애플리케이션을 테스트하려면 올바른 GraphQL 쿼리를 입력하고 실행합니다.

그림 2: Apollo GraphQL UI 플레이그라운드

  1. 개인이 쿼리에 SQL 인젝션을 입력하는 상황을 가정해 보겠습니다. 이 경우 NGINX App Protect WAF는 Apollo GraphQL 서버를 보호하고 공격의 특성을 설명하는 지원 ID를 생성합니다.
$ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {hello OR 1=1;} "}'<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7313092578494613509<br><br><ahref='javascript:history.back();'>[GoBack]</a></body><html>
  1. 공격의 세부 정보를 확인하려면 /var/log/app_protect/security.log에 있는 NGINX Plus 인스턴스의 로그를 참조하세요.
attack_type="Non-browser Client,Abuse of Functionality,SQL-Injection,Other Application Activity,HTTP Parser Attack",blocking_exception_reason="N/A",date_time="2023-07-05 21:22:38",dest_port="4003",ip_client="99.187.244.63",is_truncated="false",method="POST",policy_name="graphql_policy",protocol="HTTP",request_status="blocked",response_code="0",severity="Critical",sig_cves="N/A,N/A",sig_ids="200002147,200002476",sig_names="SQL-INJ expressions like ""or 1=1"" (3),SQL-INJ expressions like ""or 1=1"" (6) (Parameter)",sig_set_names="{SQL Injection Signatures},{SQL Injection Signatures}",src_port="64257",sub_violations="HTTP protocol compliance failed:Host header contains IP address",support_id="7313092578494613509",
  1. NGINX Management Security Monitoring 모듈에서는 인스턴스의 데이터를 모니터링하고 잠재적 위협을 검토할 수 있으며, 최적의 보호를 위해 필요에 따라 정책을 조정할 수 있습니다.

그림 3: NGINX Management Suite Security Monitoring 모듈 개요그림 4: Security Monitoring 모듈의 보안 위반 종합 요약

결론

이 튜토리얼에서는 NGINX Unit에 Apollo GraphQL Server를 설정하고, NGINX Plus를 API 게이트웨이로 배포하며, API 게이트웨이 앞단의 NGINX App Protect WAF를 사용해 GraphQL API를 보호하는 방법을 알아보았습니다.

NGINX Management Suite Security Monitoring을 사용하면 일반적인 지능형 위협이 GraphQL API를 침해하기 전에 이를 식별하고 차단할 수도 있습니다. 이 간단한 아키텍처는 인증 및 권한 부여 누락, 인젝션 공격, 무제한 리소스 소비 등 가장 일반적인 API 취약점으로부터 GraphQL API를 보호합니다.

지금 바로 NGINX를 체험해 보세요. API Connectivity Stack 30일 무료 평가판에는 NGINX Plus, NGINX App Protect 및 NGINX Management Suite가 포함되어 있습니다.

추가 리소스


공유
태그: API, F5 NGINX, Tech

작성자 소개

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.