博客 | NGINX

教程: 使用 F5 NGINX 交付和保护 GraphQL API

NGINX-F5-horiz-black-type-RGB 的一部分
阿卡什·阿南塔纳拉亚南 缩略图
阿卡什·阿南塔纳拉亚南
2023 年 7 月 20 日发布

开发人员越来越多地选择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 管理套件配置您的 WAF 并监控潜在威胁。 此设置还允许您使用 NGINX App Protect WAF 来检测 SQL 注入等攻击。

按照以下部分中的步骤完成本教程:

NGINX 的架构为 GraphQL API 提供安全性和身份验证、监控攻击,并在 NGINX Unit 上运行 Apollo GraphQL 服务器
图 1: 采用 NGINX Plus 和 NGINX App Protect WAF 的架构为 GraphQL API 提供安全性和身份验证,使用 NGINX Management Suite 监控攻击,并在 NGINX Unit 上运行 Apollo GraphQL 服务器

先决条件

在开始本教程之前,您需要满足以下条件:

安装和配置 NGINX 管理套件安全监控

NGINX 管理套件将多个高级功能集成到统一平台中,以简化配置、监控和排除 NGINX 实例故障的过程。 它还促进了 API 的管理和治理,优化了应用负载均衡,并增强了组织的整体安全性。

按照以下步骤安装并配置 NGINX 管理套件:

  • 按照安装页面的虚拟机或裸机页面上的说明进行操作。 本页面包含安全监控模块(本教程中使用)和您可以自行安装的其他模块。
  • 为每个安装的模块添加许可证
  • 按照此处的说明从 NGINX Management Suite 主机安装 NGINX Agent 包,并设置 NGINX App Protect 实例的安全监控。

部署 NGINX 单元并安装 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 repo构建 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 模块/ngx_http_js_module.so;load_module 模块/ngx_stream_js_module.so;
    
  5. 在支持的操作系统上安装NGINX App Protect WAF
  6. 将 NGINX App Protect WAF 模块添加到nginx.conf文件的主上下文中:
  7. load_module 模块/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. {   “名称”:“graphql_policy”,
        “模板”:{
            “名称”: “POLICY_TEMPLATE_NGINX_BASE”
        },
        “applicationLanguage”:“utf-8”,
        “caseInsensitive”:false,
        “enforcementMode”:“blocking”,
        “blocking-settings”:{
            “violations”:[
                 {
                     “name”: “VIOL_GRAPHQL_FORMAT”,
                     “警报”:true,
                     “阻止”:false
                 },
                 {
                     “名称”: “VIOL_GRAPHQL_MALFORMED”,
                     “警报”:true,
                     “阻止”:false
                 },
                 {
                     “名称”: “VIOL_GRAPHQL_INTROSPECTION_QUERY”,
                     “警报”:true,
                     “阻止”:false
                 },
                 {
                     “名称”: “VIOL_GRAPHQL_ERROR_RESPONSE”,
                     “警报”:true,
                     “阻止”:false
                  }
             ]
        } 
  12. 要强制执行 GraphQL 设置,请使用nginx.conf文件中的 GraphQL 策略名称更新app_protect_policy_file字段。 更新文件后,执行 NGINX 重新加载以强制执行 GraphQL 设置。

    以下是包含 NGINX App Protect 策略的nginx.conf文件的示例:

  13. 用户 nginx;worker_processes  4;
    load_module 模块/ngx_http_js_module.so;
    load_module 模块/ngx_stream_js_module.so; 
    load_module 模块/ngx_http_app_protect_module.so;
    error_log /var/log/nginx/error.log debug;
    events {
        worker_connections  65536;
    }
    http { 包括/etc/nginx/mime.types; 默认类型应用/八位字节流; 发送文件; 保持活动超时 65; 服务器 { 监听<端口>; 服务器名称 <名称>; app_protect_enable 开启; app_protect_security_log_enable 开启; # 本节启用日志记录功能         app_protect_security_log“/etc/app_protect/conf/log_sm.json” syslog:服务器=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 单元的<ip addr>         }         位置 /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 单元的<ip addr>         
            }     } }
  14. 运行以下命令重新启动 NGINX Plus:
  15.    

    $ nginx -s 重新加载
    

测试配置

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

  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. {          “成功”: “重新配置完成。”
    }
  5. 要访问 Apollo GraphQL 服务器,请打开您的 Web 浏览器并粘贴服务器的公共 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 <a href="http://3.X.X.X:4003/graphql/">http://3.XXX:4003/graphql/</a> -H "Content-Type: 应用/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. 要检查攻击的详细信息,请参阅 NGINX Plus 实例的日志,位于 /var/log/app_protect/security.log。
  11. attack_type="非浏览器客户端,滥用功能,SQL 注入,其他application活动,HTTP 解析器攻击",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="类似“或 1=1”的 SQL-INJ 表达式" (3),类似“或 1=1”的 SQL-INJ 表达式" (6) (参数)",sig_set_names="{SQL 注入签名},{SQL 注入签名}",src_port="64257",sub_violations="HTTP 协议合规性失败:主机标头包含 IP 地址", support_id="7313092578494613509 ",
  12. 在NGINX管理安全监控模块中,您可以监控实例的数据并查看潜在威胁,以及根据需要调整策略以获得最佳保护。
  13. NGINX 管理套件安全监控模块概览的屏幕截图
    图 3: NGINX 管理套件安全监控模块概述
    安全监控模块中安全违规行为综合汇总截图
    图4: 安全监控模块中安全违规行为的全面汇总

结论

在本教程中,您学习了如何在 NGINX Unit 上设置 Apollo GraphQL 服务器、如何在 API 网关中部署 NGINX Plus、以及如何在 API 网关前使用 NGINX App Protect WAF 保护您的 GraphQL API。

您还可以使用 NGINX 管理套件安全监控来识别并阻止常见的高级威胁,以免它们危害您的 GraphQL API。 这种简单的架构可以保护 GraphQL API 免受一些最常见的 API 漏洞的侵害,包括缺少身份验证和授权、注入攻击、不受限制的资源消耗等。

立即试用 NGINX,享受API Connectivity Stack 30 天免费试用版,其中包括 NGINX Plus、NGINX App Protect 和 NGINX Management Suite。

其他资源


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”