开发人员越来越多地选择GraphQL作为构建 API 的首选方法。 GraphQL 简化了从多个来源检索数据,简化了数据访问和聚合。 通过从单个端点使用一个 POST 请求查询多个数据源,使用 GraphQL 的开发人员可以从各种来源精确地请求他们需要的数据。 这种方法有助于解决REST API架构中遇到的限制,其中可能会出现查询不足(请求缺少所有必要的数据)或查询过度(请求发送到多个端点并收集过多数据)等问题。
GraphQL 是微服务架构的最佳选择,因为它允许客户端从每个服务或数据源仅检索必要的数据。 这有利于提高灵活性和敏捷性,这是在现代商业环境中蓬勃发展的关键因素。
由于具有更高的访问度和灵活性,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 管理套件将多个高级功能集成到统一平台中,以简化配置、监控和排除 NGINX 实例故障的过程。 它还促进了 API 的管理和治理,优化了应用负载均衡,并增强了组织的整体安全性。
按照以下步骤安装并配置 NGINX 管理套件:
NGINX Unit是一款高效、精简的运行时应用,具有轻量级设计,是追求高性能而不影响速度或灵活性的组织的理想选择。 它是一个可以处理 TLS、请求路由和运行应用代码的开源服务器。 您可以在 NGINX Unit 的主要功能页面上了解有关它的更多信息。
在本教程中,我们使用Express作为NGINX Unit 上的Node.js Web应用框架,它提供了构建 Apollo GraphQL 服务器的广泛功能。 在撰写本文时,当前版本是 Apollo Server 4。
按照以下步骤部署 NGINX Unit 并安装 Apollo GraphQL 服务器:
选择合适的环境来部署NGINX Plus实例。 在本教程中,我们使用 AWS Ubuntu 实例并使用 NGINX Plus 设置 API 网关反向代理。 然后,我们在 API 网关前部署 NGINX App Protect WAF,以增强安全性。
按照以下说明安装 NGINX Plus 和 NGINX App Protect WAF:
load_modules
。 load_module 模块/ngx_http_js_module.so;load_module 模块/ngx_stream_js_module.so;
load_module 模块/ngx_http_app_protect_module.so;
app_protect_enable 开启;
在目录 /etc/app_protect/conf 中创建 GraphQL 策略配置。 有关如何创建 NGINX App Protect WAF 策略的更多信息,请参阅相关指南。
以下是 GraphQL 策略配置的示例:
{ “名称”:“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
}
]
}
要强制执行 GraphQL 设置,请使用nginx.conf文件中的 GraphQL 策略名称更新app_protect_policy_file
字段。 更新文件后,执行 NGINX 重新加载以强制执行 GraphQL 设置。
以下是包含 NGINX App Protect 策略的nginx.conf文件的示例:
用户 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>
}
}
}
$ nginx -s 重新加载
现在您可以按照以下步骤测试您的配置:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
{ “成功”: “重新配置完成。”
}
$ 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>
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 ",
在本教程中,您学习了如何在 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 内容。”