블로그 | NGINX

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

NGINX-F5-수평-검정-유형-RGB의 일부
아카쉬 아난타나라야난 썸네일
아카쉬 아난타나라야난
2023년 7월 20일 게시

개발자들은 API를 구축하는 선호하는 방법으로 GraphQL을 점점 더 많이 받아들이고 있습니다. GraphQL은 여러 소스에서 데이터를 검색하는 과정을 간소화하여 데이터 접근과 집계를 효율화합니다. GraphQL을 사용하는 개발자는 단일 엔드포인트에서 하나의 POST 요청으로 여러 데이터 소스를 쿼리함으로써 다양한 소스에서 필요한 데이터를 정확하게 요청할 수 있습니다. 이러한 접근 방식은 REST API 아키텍처에서 발생할 수 있는 제약을 해결하는 데 도움이 됩니다. 제약으로 인해 쿼리 부족(필요한 모든 데이터가 부족한 요청)이나 쿼리 과잉(여러 엔드포인트로 요청이 전송되어 과도한 데이터 수집)과 같은 문제가 발생할 수 있습니다.

GraphQL은 클라이언트가 각 서비스나 데이터 소스에서 필수 데이터만 검색할 수 있도록 해주므로, 마이크로서비스 아키텍처에 최적의 선택입니다. 이는 현대 비즈니스 환경에서 성공하는 데 중요한 요소인 높은 유연성과 민첩성을 촉진합니다.

GraphQL API에 보안은 필수입니다.

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

튜토리얼 개요

이 튜토리얼은 GraphQL API를 제공하고 보호하는 방법을 이해하는 데 도움이 됩니다. F5 NGINX Plus를 API 게이트웨이로 사용하여 F5 NGINX UnitApollo GraphQL 서버를 배포하는 방법을 보여드리겠습니다. 또한, 고급 보안을 위해 API 게이트웨이에 F5 NGINX App Protect WAF를 배포하는 방법과 F5 NGINX Management Suite를 사용하여 WAF를 구성하고 잠재적 위협을 모니터링하는 방법을 보여드립니다. 이 설정을 사용하면 NGINX App Protect WAF를 사용하여 SQL 주입과 같은 공격을 감지할 수도 있습니다.

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

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

필수 조건

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

NGINX Management Suite 보안 모니터링 설치 및 구성

NGINX 관리 제품군은 여러 고급 기능을 하나의 단일 플랫폼으로 통합하여 NGINX 인스턴스의 구성, 모니터링 및 문제 해결 프로세스를 단순화합니다. 또한 API 관리 및 거버넌스를 용이하게 하고, 애플리케이션 부하 분산을 최적화하며, 조직의 전반적인 보안을 강화합니다.

NGINX Management Suite를 설치하고 구성하려면 다음 단계를 따르세요.

  • 설치 페이지의 가상 머신 또는 베어 메탈 페이지의 지침을 따르세요. 이 페이지에는 보안 모니터링 모듈(이 튜토리얼에서 사용)과 사용자가 원하는 대로 설치할 수 있는 다른 모듈이 포함되어 있습니다.
  • 설치된 각 모듈에 대한 라이센스를 추가합니다 .
  • NGINX Management Suite 호스트에서 NGINX 에이전트 패키지를 설치하고 여기의 지침에 따라 NGINX App Protect 인스턴스에 대한 보안 모니터링을 설정합니다.

NGINX Unit 배포 및 Apollo GraphQL 서버 설치

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

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

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

  1. 지원되는 운영체제 에 NGINX Unit을 설치합니다.
  2. 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. nginx.conf 디렉토리에 load_modules를 추가합니다.
  4. 로드_모듈 모듈/ngx_http_js_module.so; 로드_모듈 모듈/ngx_stream_js_module.so;
    
  5. 지원되는 운영 체제에 NGINX App Protect WAF를 설치하세요.
  6. nginx.conf 파일의 메인 컨텍스트에 NGINX App Protect WAF 모듈을 추가합니다.
  7. 로드_모듈 모듈/ngx_http_app_protect_module.so;
  8. nginx.conf 파일에서 http/server/location 컨텍스트에서 NGINX App Protect WAF를 활성화합니다.
  9. app_protect_enable 켜짐;
  10. /etc/app_protect/conf 디렉토리에 GraphQL 정책 구성을 만듭니다. NGINX App Protect WAF 정책을 생성하는 방법에 대한 자세한 내용은 관련 지침을 참조하세요.

    다음은 GraphQL 정책 구성의 예입니다.

  11. {   "name": "graphql_policy",
        "template": {
            "name": "POLICY_TEMPLATE_NGINX_BASE"
        },
        "applicationLanguage": "utf-8",
        "caseInsensitive": false,
        "enforcementMode": "차단",
        "차단 설정": {
            "위반": [
               {
                     "이름": "VIOL_GRAPHQL_FORMAT",
                    "알람": 참,
                     "블록": 거짓
                },
                {
                    "이름": "VIOL_GRAPHQL_MALFORMED",
                    "알람": 참,
                     "블록": 거짓
                },
                {
                    "이름": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                    "알람": 참,
                     "블록": 거짓
                },
                {
                    "이름": "VIOL_GRAPHQL_ERROR_RESPONSE",
                    "알람": 참,
                    '차단': 거짓
                }
            ]
        } 
  12. GraphQL 설정을 적용하려면 nginx.conf 파일에서 app_protect_policy_file 필드를 GraphQL 정책 이름으로 업데이트합니다. 파일을 업데이트한 후 NGINX를 다시 로드하여 GraphQL 설정을 적용합니다.

    다음은 NGINX App Protect 정책이 포함된 nginx.conf 파일의 예입니다.

  13. 사용자 nginx; 작업자 프로세스  4;
    모듈 로드 모듈/ngx_http_js_module.so;
    모듈 로드 모듈/ngx_stream_js_module.so; 
    모듈 로드 모듈/ngx_http_app_protect_module.so;
    오류 로그 /var/log/nginx/error.log 디버그;
    이벤트 {
        작업자 연결  65536;
    }
    http {     /etc/nginx/mime.types를 포함합니다.     기본 유형 애플리케이션/옥텟 스트림;     전송 파일        켜짐;     keepalive_timeout  65;     서버 {         수신       <포트>;         서버 이름  <이름>;         app_protect_enable 켜짐;         app_protect_security_log_enable 켜짐; # 이 섹션에서는 로깅 기능을 활성화합니다.         app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # 원격 로거는 로깅 옵션(참조 파일에서 정의됨), 로그 서버 IP, 로그 서버 포트 등의 관점에서 정의됩니다.         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;              기본 유형 text/html;             proxy_pass http://<ip 주소>:<포트>$request_uri;#Nginx 유닛의 <ip 주소>         }         위치 /graphql {             클라이언트_최대_몸_크기 0;             기본_유형 텍스트/html;              app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";              proxy_pass http://<ip 주소>:<포트>$$request_uri; #Nginx 유닛의 <ip 주소>         
            }     } }
  14. 다음 명령을 실행하여 NGINX Plus를 다시 시작합니다.
  15.    

    $ nginx -s 다시 로드
    

구성 테스트

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

  1. NGINX Unit 서버로 이동하여 다음 명령을 입력하여 Apollo GraphQL 애플리케이션을 시작합니다.
  2. $ curl -X PUT --data-binary @demo.json --unix-소켓 /var/run/control.unit.sock http://localhost/config
  3. 업데이트가 성공적으로 완료되면 리스너의 IP 주소와 포트에서 앱을 사용할 수 있음을 확인할 수 있습니다.
  4. {          "성공": "재구성 완료."
    }
  5. Apollo GraphQL 서버에 액세스하려면 웹 브라우저를 열고 서버의 공용 IP 주소를 붙여넣으세요. 예: http://3.. X . X . X :4003/graphql (이 예에서는 포트 4003을 사용합니다).
  6. 애플리케이션을 테스트하려면 올바른 GraphQL 쿼리를 입력하고 쿼리를 실행합니다.
  7. Apollo GraphQL UI 플레이그라운드의 스크린샷
    그림 2: Apollo GraphQL UI 플레이그라운드
  8. 개인이 쿼리에 SQL 주입을 입력하는 상황을 생각해 보겠습니다. 이 경우 NGINX App Protect WAF는 Apollo GraphQL 서버를 보호하고 공격의 특성을 설명하는 지원 ID를 생성합니다.
  9. $ 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>요청이 거부되었습니다.</title></head><body>요청한 URL이 거부되었습니다. 관리자에게 문의하세요.<br><br>귀하의 지원 ID는 다음과 같습니다. 7313092578494613509<br><br><ahref='javascript:history.back();'>[뒤로 돌아가기]</a></body><html>
  10. 공격의 세부 정보를 확인하려면 /var/log/app_protect/security.log에 있는 NGINX Plus 인스턴스의 로그를 참조하세요.
  11. 공격 유형="비브라우저 클라이언트, 기능 남용, SQL 주입, 기타 애플리케이션 활동, HTTP 파서 공격", 차단 예외 이유="N/A", 날짜 시간="2023-07-05 21:22:38", 대상 포트="4003", ip_client="99.187.244.63", is_truncated="false", 메서드="POST", 정책 이름="graphql_policy", 프로토콜="HTTP", 요청 상태="차단됨", 응답 코드="0", 심각도="중요", sig_cves="N/A,N/A", sig_ids="200002147,200002476", sig_names="SQL-INJ 표현식(예: ""or 1=1"")(3), SQL-INJ 표현식 ""또는 1=1"" (6) (매개변수)", sig_set_names="{SQL 주입 서명},{SQL 주입 서명}", src_port="64257", sub_violations="HTTP 프로토콜 준수 실패: 호스트 헤더에 IP 주소가 포함되어 있음", support_id="7313092578494613509 ",
  12. NGINX 관리 보안 모니터링 모듈에서는 인스턴스 데이터를 모니터링하고, 잠재적 위협을 검토하며, 최적의 보호를 위해 필요에 따라 정책을 조정할 수 있습니다.
  13. NGINX Management Suite 보안 모니터링 모듈 개요 스크린샷
    그림 3: NGINX Management Suite 보안 모니터링 모듈 개요
    보안 모니터링 모듈의 보안 위반에 대한 포괄적인 요약의 스크린샷
    그림 4: 보안 모니터링 모듈의 보안 위반에 대한 종합 요약

결론

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

NGINX Management Suite Security Monitoring을 사용하면 GraphQL API가 손상되기 전에 일반적인 고급 위협을 식별하고 차단할 수도 있습니다. 이 간단한 아키텍처는 인증 및 권한 부여 누락, 주입 공격, 제한 없는 리소스 소비 등 가장 흔한 API 취약점으로부터 GraphQL API를 방어합니다.

NGINX Plus, NGINX App Protect, NGINX Management Suite가 포함된 API Connectivity Stack의 30일 무료 평가판을 통해 오늘 NGINX를 테스트해 보세요.

추가 자료


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."