Os desenvolvedores estão adotando cada vez mais o GraphQL como método preferencial para criar APIs. O GraphQL simplifica a recuperação de dados de várias fontes, otimizando o acesso e a agregação de dados. Ao consultar várias fontes de dados com uma única solicitação POST a partir de um único endpoint, os desenvolvedores que usam GraphQL podem solicitar com precisão os dados de que precisam de diversas fontes. Essa abordagem ajuda a solucionar limitações encontradas em arquiteturas de API REST, nas quais podem ocorrer problemas como consultas insuficientes (solicitações que não retornam todos os dados necessários) ou consultas excessivas (solicitações enviadas a vários endpoints que coletam dados em excesso).
O GraphQL é a escolha ideal para arquiteturas de microsserviços, pois permite que os clientes recuperem apenas os dados essenciais de cada serviço ou fonte de dados. Isso proporciona maior flexibilidade e agilidade, componentes fundamentais para prosperar em um ambiente de negócios moderno.
A segurança é fundamental para APIs GraphQL
Com um maior grau de acesso e flexibilidade, as APIs GraphQL também apresentam uma superfície de ataque mais ampla, o que as torna atraentes para agentes mal-intencionados. Apesar de ser relativamente novo, o GraphQL ainda está sujeito a muitas das mesmas vulnerabilidades encontradas em outras arquiteturas de API. Felizmente, você pode proteger as APIs GraphQL contra essas ameaças comuns aproveitando parte da sua infraestrutura e das suas ferramentas existentes.
Visão geral do tutorial
Este tutorial ajuda a entender como disponibilizar e proteger APIs GraphQL. Mostramos como implantar um servidor Apollo GraphQL no F5 NGINX Unit com o F5 NGINX Plus como gateway de API. Além disso, mostramos como implantar o F5 NGINX App Protect WAF no gateway de API para oferecer segurança avançada e usar o F5 NGINX Management Suite para configurar seu WAF e monitorar possíveis ameaças. Essa configuração também permite usar o NGINX App Protect WAF para detectar ataques como injeção de SQL.
Siga as etapas destas seções para concluir o tutorial:
- Verifique os pré-requisitos
- Instalar e configurar o monitoramento de segurança do NGINX Management Suite
- Implantar o NGINX Unit e instalar o servidor Apollo GraphQL
- Implante o NGINX Plus como um gateway de API e instale o NGINX App Protect WAF
- Testar a configuração
Figura 1: Arquitetura com NGINX Plus e NGINX App Protect WAF fornecendo segurança e autenticação para APIs GraphQL, o NGINX Management Suite monitorando ataques e o servidor Apollo GraphQL em execução no NGINX Unit
Pré-requisitos
Antes de começar este tutorial, você precisará do seguinte:
- A avaliação gratuita de 30 dias do API Connectivity Stack para acessar o NGINX Plus, o NGINX App Protect e o NGINX Management Suite
- Linux/Unix ou outro ambiente compatível
- Conhecimento básico da linha de comando do Linux
- Um editor de texto (Vi ou Vim)
- Curl
Instalar e configurar o monitoramento de segurança do NGINX Management Suite
NGINX Management Suite integra vários recursos avançados em uma plataforma unificada para simplificar o processo de configuração, monitoramento e solução de problemas de instâncias do NGINX. Ela também facilita o gerenciamento e a governança de APIs, otimiza o balanceamento de carga de aplicações e aprimora a segurança geral das organizações.
Siga estas etapas para instalar e configurar o NGINX Management Suite:
- Siga as instruções na página Máquina virtual ou bare metal da seção de Instalação. Essa página inclui o módulo de Monitoramento de segurança (usado neste tutorial) e outros módulos que você pode instalar a seu critério.
- Adicione a licença para cada módulo instalado.
- Instale o pacote NGINX Agent a partir do host do NGINX Management Suite e configure o Monitoramento de Segurança para instâncias do NGINX App Protect seguindo as instruções disponíveis aqui.
Implante o NGINX Unit e instale o Apollo GraphQL Server
NGINX Unit é uma aplicação de runtime eficiente e otimizada, com um design leve, o que a torna a escolha ideal para organizações que buscam alto desempenho sem comprometer a velocidade ou a agilidade. É um servidor de código aberto capaz de processar TLS, rotear solicitações e executar código de aplicações. Saiba mais sobre o NGINX Unit na página de Principais recursos.
Neste tutorial, usamos o Express como um framework de aplicações web Node.js no NGINX Unit que oferece amplos recursos para criar um servidor Apollo GraphQL. No momento da redação deste artigo, a versão atual é o Apollo Server 4.
Siga estas etapas para implantar o NGINX Unit e instalar o servidor Apollo GraphQL:
- Instale o NGINX Unit em um sistema operacional compatível.
- Siga as instruções do repositório do GitHub para criar um servidor Apollo GraphQL e desenvolver seu aplicativo Hello World com Apollo GraphQL.
Implante o NGINX Plus como um gateway de API e instale o WAF do NGINX App Protect
Selecione um ambiente adequado para implantar uma instância do NGINX Plus. Neste tutorial, usamos uma instância do Ubuntu na AWS e configuramos um proxy reverso de gateway de API usando o NGINX Plus. Em seguida, implantamos o NGINX App Protect WAF à frente do nosso gateway de API para aumentar a segurança.
Siga estas instruções para instalar o NGINX Plus e o NGINX App Protect WAF:
- Instale o NGINX Plus em um sistema operacional compatível.
- Instale o módulo JavaScript do NGINX (njs).
- Adicione
load_modulesao diretório nginx.conf.
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;- Instale o NGINX App Protect WAF em um sistema operacional compatível.
- Adicione o módulo do NGINX App Protect WAF ao contexto principal no arquivo nginx.conf :
load_module modules/ngx_http_app_protect_module.so;- Habilite o NGINX App Protect WAF em um contexto http/server/location no arquivo nginx.conf:
app_protect_enable on;- Crie uma configuração de política do GraphQL no diretório /etc/app_protect/conf. Para obter mais informações sobre como criar uma política do NGINX App Protect WAF, consulte as diretrizes relevantes. Veja a seguir um exemplo de configuração de política do 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
}
]
} - Para aplicar as configurações do GraphQL, atualize o campo
app_protect_policy_filecom o nome da política do GraphQL no arquivo nginx.conf. Depois de atualizar o arquivo, recarregue o NGINX para aplicar as configurações do GraphQL. Veja um exemplo do arquivo nginx.conf que inclui uma política do NGINX App Protect:
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
}
}
}- Reinicie o NGINX Plus executando este comando:
$ nginx -s reloadTeste a configuração
Agora você pode testar sua configuração seguindo estas etapas:
- Inicie a aplicação Apollo GraphQL acessando o servidor NGINX Unit e digitando este comando:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config- Após uma atualização bem-sucedida, você verá que o aplicativo está disponível no endereço IP e na porta do listener:
{ "success": "Reconfiguration done."
}- Para acessar o servidor Apollo GraphQL, abra o navegador e cole o endereço IP público do seu servidor. Por exemplo: http://3..X.X.X:4003/graphql (este exemplo usa a porta 4003).
- Para testar a aplicação, insira a consulta GraphQL correta e execute-a.
Figura 2: Playground da interface do Apollo GraphQL
- Considere uma situação em que uma pessoa insere uma injeção de SQL em uma consulta. Nesse caso, o NGINX App Protect WAF protege o servidor Apollo GraphQL e gera um ID de suporte que descreve a natureza do ataque.
$ 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>- Para verificar os detalhes do ataque, consulte os logs da instância do NGINX Plus, localizados em /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",- No módulo Security Monitoring do NGINX Management, você pode monitorar os dados das suas instâncias e analisar possíveis ameaças, além de ajustar as políticas conforme necessário para garantir a proteção ideal.
Figura 3: Visão geral do módulo Security Monitoring do NGINX Management SuiteFigura 4: Resumo abrangente das violações de segurança no módulo Security Monitoring
Conclusão
Neste tutorial, você aprendeu a configurar um Apollo GraphQL Server no NGINX Unit, implantar o NGINX Plus como um gateway de API e proteger suas APIs GraphQL com o NGINX App Protect WAF à frente do seu gateway de API.
Você também pode usar o NGINX Management Suite Security Monitoring para identificar e bloquear ameaças avançadas comuns antes que elas comprometam suas APIs GraphQL. Essa arquitetura simples protege as APIs GraphQL contra algumas das vulnerabilidades de API mais comuns, incluindo ausência de autenticação e autorização, ataques de injeção, consumo irrestrito de recursos e muito mais.
Experimente o NGINX hoje mesmo com uma avaliação gratuita de 30 dias do API Connectivity Stack, que inclui NGINX Plus, NGINX App Protect e NGINX Management Suite.
Recursos adicionais
- Blog: Proteja seu gateway de API com o NGINX App Protect WAF
- Blog: Proteja suas APIs de streaming bidirecional GraphQL e gRPC com o F5 NGINX App Protect WAF
Sobre o autor

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
Descubra como o F5 NGINX One aprimora o gerenciamento e a observabilidade de ambientes híbridos e multicloud ao oferecer um console web centralizado baseado em SaaS, com insights em tempo real, conformidade automatizada e gerenciamento simplificado de configurações.

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa
Descubra como transformar uma definição de esquema OpenAPI em uma configuração NGINX totalmente funcional, operando como um API Gateway com a segurança de um Web Application Firewall e um Portal do Desenvolvedor, usando uma abordagem declarativa de API.

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor
Picos de tráfego e sobrecarga de servidores são preocupações sérias para varejistas online em qualquer época, mas especialmente durante a “Cyber Season” de compras de fim de ano. Detalhamos como você pode aproveitar as soluções de entrega de aplicações de nível de produção da NGINX para se preparar para aumentos repentinos de tráfego.

Distribuição segura de chaves privadas SSL com o NGINX
Descrevemos três maneiras progressivamente mais seguras de proteger chaves privadas SSL ao configurar o NGINX para processar tráfego HTTPS: permitir acesso de leitura apenas ao usuário root, criptografar as chaves com senhas armazenadas separadamente e distribuir as senhas a partir de um repositório central.
Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX
O módulo JavaScript do NGINX lançado com o NGINX Plus R15 oferece suporte a subsolicitações, possibilitando uma classe totalmente nova de casos de uso para o NGINX Plus. Este exemplo completo também usa a API do NGINX Plus e os módulos de chave-valor para converter solicitações de API dos clientes em solicitações separadas para as APIs dos microsserviços que compõem um aplicativo.
Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus
Confira dicas para evitar o esgotamento de portas efêmeras com ajustes no kernel do Linux, conexões keepalive e conexões vinculadas dinamicamente a endereços IP locais.