NGINX.COM
Web Server Load Balancing with NGINX Plus

越来越多的开发人员将 GraphQL 作为构建 API 的首选方法。GraphQL 简化了从多个来源检索数据的流程,提高了数据访问和聚合效率。通过从单个端点发送一个 POST 请求来查询多个数据源,使用 GraphQL 的开发人员能够从各种数据源精确地请求所需的数据。这种方法有助于解决 REST API 架构中存在的限制,在后者中,可能会出现查询不足(请求缺乏所有必要数据)或查询过度(请求发送到多个端点并收集过多数据)等问题。

GraphQL 是微服务架构的最佳选择,因为它支持客户端仅从每个服务或数据源检索必要数据。这有助于提高灵活性和敏捷性,而两者正是在现代业务环境中实现蓬勃发展的关键要素。

 

安全防护对 GraphQL API 至关重要

GraphQL API 带来了更高的可访问性和灵活性,但也向攻击者暴露出更广泛的攻击面。尽管 GraphQL 相对较新,但仍容易受到在其他 API 架构中发现的许多漏洞的影响。幸运的是,您可以利用一些现有基础架构和工具来保护 GraphQL API 免受这些常见威胁的侵害。

 

教程概述

本教程有助于了解如何交付和保护 GraphQL API。我们将介绍如何在 F5 NGINX Unit 上部署 Apollo GraphQL 服务器,并将 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:

  • 按照安装页面中虚拟机或裸机页面上的说明进行操作。该页面涵盖 Security Monitoring 模块(本教程中使用)及其他可自行安装的模块。
  • 为每个已安装的模块添加许可
  • 从 NGINX Management Suite 主机安装 NGINX Agent 安装包,并按照此处的说明为 NGINX App Protect 实例设置 Security Monitoring。

 

部署 NGINX Unit 并安装 Apollo GraphQL 服务器

NGINX Unit 是一款高效、精简的运行时应用,采用轻量级设计,是希望在不影响速度或敏捷性的情况下实现高性能的企业的理想之选。它是一种开源服务器,可以处理 TLS、请求路由和运行应用代码。有关 NGINX Unit 的更多信息,请访问其“主要功能”页面。

在本教程中,我们使用 Express 作为 NGINX Unit 上的 Node.js Web 应用框架,它提供了广泛的功能以支持构建 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. load_module modules/ngx_http_js_module.so;
    load_module modules/ngx_stream_js_module.so;
  5. 在支持的操作系统上安装 NGINX App Protect WAF
  6. 将 NGINX App Protect WAF 模块添加到 nginx.conf 文件的 main 上下文中:
  7. load_module modules/ngx_http_app_protect_module.so;
  8. nginx.conf 文件的 http/server/location 上下文中启用 NGINX App Protect WAF:
  9. app_protect_enable on;
  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": "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
                  }
              ]
          } 
  12. 要执行 GraphQL 设置,请在 nginx.conf 文件中使用 GraphQL 策略名称更新 app_protect_policy_file 字段。更新文件后,执行 NGINX 重新加载以应用 GraphQL 设置。

    以下是添加了 NGINX App Protect 策略的 nginx.conf 文件示例:

  13. 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; # 本节启用日志记录功能         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;             default_type text/html;             proxy_pass http://<ip addr>:<port>$request_uri;#Nginx unit 的 <ip addr>         }         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; #Nginx unit 的 <ip addr>         
            }     } }
  14. 运行此命令重启 NGINX Plus:
  15.    

    $ nginx -s reload

 

测试配置

现在,您可以按照以下步骤测试配置:

  1. 导航到 NGINX Unit 服务器并输入以下命令,启动 Apollo GraphQL 应用:
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. 成功更新后,该应用即可在监听器的 IP 地址和端口上访问:
  4. {
              "success": "Reconfiguration done."
      }
  5. 要访问 Apollo GraphQL 服务器,请打开 Web 浏览器并粘贴服务器的公共 IP 地址。例如:http://3..X.X.X:4003/graphql(本例使用端口 4003)。
  6. 要测试应用,请输入正确的 GraphQL 查询命令并运行查询。
  7. 图 2:Apollo GraphQL 用户界面
  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>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>
  10. 要查看攻击详情,请参阅 NGINX Plus 实例的日志(位于 /var/log/app_protect/security.log 中)。
  11. 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",
  12. 在 NGINX Management Security Monitoring 模块中,您可以监控实例数据、审查潜在威胁并按需调整策略,以实现最佳防护。
  13. 图 3:NGINX Management Suite Security Monitoring 模块概览
    图 4:Security Monitoring 模块中安全防护违规情况的全面综述

 

结语

本教程介绍了如何在 NGINX Unit 上设置 Apollo GraphQL 服务器,将 NGINX Plus 部署为 API 网关,并在 API 网关的前面部署 NGINX App Protect WAF 以保护 GraphQL API。

您还可以使用 NGINX Management Suite Security Monitoring 来识别和阻止常见的高级威胁,以免其危及 GraphQL API。这种简单的架构可保护 GraphQL API 免受一些最常见 API 漏洞的影响,包括身份验证和授权缺失、注入攻击、不受限制的资源消耗等。

如欲试用 NGINX,请立即下载 API 互联套件(API Connectivity Stack)30 天免费试用版,其中包括 NGINX Plus、NGINX App Protect 和 NGINX Management Suite。

 

更多资源

Hero image
将 NGINX 部署为 API 网关

这本免费电子书更新于 2022 年,您将通过这本书了解到如何将 NGINX 部署为 API 网关

关于作者

Akash Ananthanarayanan

技术营销经理

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。