越来越多的开发者将GraphQL作为构建API的首选方法。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注入等攻击。
按照以下各节中的步骤完成本教程:
- 检查先决条件
- 安装和配置NGINX Management Suite Security Monitoring
- 部署NGINX Unit并安装Apollo GraphQL Server
- 将NGINX Plus部署为API网关并安装NGINX App Protect WAF
- 测试配置
图 1:架构中,NGINX Plus和NGINX App Protect WAF为GraphQL API提供安全防护和身份验证,NGINX Management Suite监控攻击,Apollo GraphQL服务器在NGINX Unit上运行
先决条件
开始本教程前,需要准备以下内容:
- 用于访问API Connectivity Stack 30 天免费试用版,以使用 NGINX Plus、NGINX App Protect 和 NGINX Management Suite
- Linux/Unix或其他兼容环境
- 基本熟悉Linux命令行
- 文本编辑器(Vi 或 Vim)
- Curl
安装和配置NGINX Management Suite Security Monitoring
NGINX Management Suite将多项高级功能集成到统一平台中,简化NGINX实例的配置、监控和故障排除流程。该平台还有助于管理和治理API、优化应用负载均衡,并提升组织的整体安全性。
按照以下步骤安装和配置NGINX Management Suite:
- 按照虚拟机或裸机页面上的说明操作,该页面位于安装页面中。此页面包含安全监控模块(本教程使用此模块),以及可按需安装的其他模块。
- 添加许可证 为每个已安装的模块添加许可证。
- 从NGINX Management Suite主机安装NGINX Agent软件包,并按照此处的说明为NGINX App Protect实例设置安全监控。
部署NGINX Unit并安装Apollo GraphQL Server
NGINX Unit是一款高效、精简且设计轻量的应用运行时,适合希望在不牺牲速度或敏捷性的情况下实现高性能的组织。作为一款开源服务器,它可以处理TLS和请求路由,并运行应用代码。有关NGINX Unit的更多信息,请参阅其“主要功能”页面。
本教程使用Express作为Node.js Web应用框架,并在NGINX Unit上运行。该框架提供丰富的功能,可用于构建Apollo GraphQL服务器。撰写本文时,当前版本为Apollo Server 4。
按照以下步骤部署NGINX Unit并安装Apollo GraphQL服务器:
将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:
- 安装NGINX Plus,操作系统须为受支持的操作系统。
- 安装NGINX JavaScript模块(njs)。
- 在
load_modules目录中添加nginx.conf。
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;- 在受支持的操作系统上安装NGINX App Protect WAF。
- 将NGINX App Protect WAF模块添加到nginx.conf 文件的主上下文中:
load_module modules/ngx_http_app_protect_module.so;- 在nginx.conf文件的 http/server/location 上下文中启用 NGINX App Protect WAF:
app_protect_enable on;- 在目录/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
}
]
} - 要强制执行GraphQL设置,请在
app_protect_policy_file字段中填入GraphQL策略名称,该字段位于nginx.conf文件中。更新文件后,请重新加载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
}
}
}- 运行以下命令以重启NGINX Plus:
$ nginx -s reload测试配置
现在可以按照以下步骤测试配置:
- 导航到NGINX Unit服务器并输入以下命令,启动Apollo GraphQL应用程序:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config- 更新成功后,应会看到该应用可通过侦听器的IP地址和端口访问:
{ "success": "Reconfiguration done."
}- 要访问Apollo GraphQL服务器,请打开Web浏览器并粘贴服务器的公网IP地址。例如:http://3..X.X.X:4003/graphql(本示例使用4003端口)。
- 要测试应用程序,请输入正确的GraphQL查询并运行。
图 2:Apollo GraphQL UI 操作区
- 假设有人在查询中输入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>- 要查看攻击详情,请参阅NGINX Plus实例的日志。日志位于/var/log/app_protect/security.log。
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",- 在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。这种简单的架构可保护GraphQL API免受一些常见API漏洞的影响,包括缺少身份验证和授权、注入攻击、不受限制的资源消耗等。
立即试用NGINX,享受API Connectivity Stack 30天免费试用,其中包括NGINX Plus、NGINX App Protect和NGINX Management Suite。
其他资源
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
