Os desenvolvedores estão cada vez mais adotando o GraphQL como método preferencial para criar APIs. O GraphQL simplifica a recuperação de dados de diversas fontes, otimizando o acesso e a agregação de dados. Ao consultar diversas fontes de dados com uma solicitação POST de um único endpoint, os desenvolvedores que usam GraphQL podem solicitar precisamente os dados necessários de várias fontes. Essa abordagem ajuda a resolver limitações encontradas em arquiteturas de API REST , onde podem ocorrer problemas como subconsulta (solicitações sem todos os dados necessários) ou excesso de consulta (solicitações indo para vários endpoints e coletando dados excessivos).
GraphQL é a escolha ideal para arquiteturas de microsserviços, pois concede aos clientes a capacidade de recuperar apenas os dados essenciais de cada serviço ou fonte de dados. Isso promove maior flexibilidade e agilidade, que são componentes essenciais para prosperar em um ambiente de negócios moderno.
Com um maior grau de acesso e flexibilidade, as APIs GraphQL também apresentam uma superfície de ataque mais extensa, que atrai agentes mal-intencionados. Apesar de ser relativamente novo, o GraphQL ainda é propenso a muitas das mesmas vulnerabilidades encontradas em outras arquiteturas de API. Felizmente, você pode proteger as APIs GraphQL dessas ameaças comuns aproveitando parte de sua infraestrutura e ferramentas existentes.
Este tutorial ajuda a compreender como entregar e proteger APIs GraphQL. Ilustramos 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 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 que você use o NGINX App Protect WAF para detectar ataques como injeção de SQL.
Siga as etapas nestas seções para concluir o tutorial:
Antes de começar este tutorial, você precisa do seguinte:
O 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. Ele também facilita o gerenciamento e a governança de APIs, otimiza o balanceamento de carga de aplicativos e melhora a segurança geral das organizações.
Siga estas etapas para instalar e configurar o NGINX Management Suite:
O NGINX Unit é um aplicativo de tempo de execução eficiente e simplificado com um design leve, o que o torna a escolha ideal para organizações que buscam alto desempenho sem comprometer a velocidade ou a agilidade. É um servidor de código aberto que pode lidar com TLS, solicitar roteamento e executar código de aplicativo. Você pode aprender mais sobre a unidade NGINX na página Principais recursos .
Neste tutorial, usamos o Express como uma estrutura de aplicativo web Node.js no NGINX Unit que oferece amplos recursos para construir um servidor Apollo GraphQL. No momento em que este artigo foi escrito, a versão atual era o Apollo Server 4.
Siga estas etapas para implantar o NGINX Unit e instalar o servidor Apollo GraphQL:
Selecione um ambiente adequado para implantar uma instância do NGINX Plus. Neste tutorial, usamos uma instância do AWS Ubuntu e configuramos um proxy reverso de gateway de API usando o NGINX Plus. Em seguida, implantamos o NGINX App Protect WAF na frente do nosso gateway de API para maior segurança.
Siga estas instruções para instalar o NGINX Plus e o NGINX App Protect WAF:
load_modules
no diretório nginx.conf . load_module módulos/ngx_http_js_module.so;load_module módulos/ngx_stream_js_module.so;
load_module módulos/ngx_http_app_protect_module.so;
app_protect_enable ativado;
Crie uma configuração de política 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 .
Aqui está um exemplo de configuração de política GraphQL:
{ "nome": "graphql_policy",
"modelo": {
"nome": "POLICY_TEMPLATE_NGINX_BASE"
},
"applicationLanguage": "utf-8",
"caseInsensitive": falso,
"enforcementMode": "bloqueio",
"blocking-settings": {
"violações": [
{
"nome": "VIOL_GRAPHQL_FORMAT",
"alarme": verdadeiro,
"bloco": falso
},
{
"nome": "VIOL_GRAPHQL_MALFORMED",
"alarme": verdadeiro,
"bloco": falso
},
{
"nome": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
"alarme": verdadeiro,
"bloco": falso
},
{
"nome": "VIOL_GRAPHQL_ERROR_RESPONSE",
"alarme": verdadeiro,
"bloqueio": falso
}
]
}
Para aplicar as configurações do GraphQL, atualize o campo app_protect_policy_file
com o nome da política GraphQL no arquivo nginx.conf . Depois de atualizar o arquivo, execute uma recarga do NGINX para aplicar as configurações do GraphQL.
Aqui está um exemplo do arquivo nginx.conf que inclui uma política NGINX App Protect:
usuário nginx; processos_de_trabalhador 4;
módulos_de_carga/ngx_http_js_module.so;
módulos_de_carga/ngx_stream_js_module.so;
módulos_de_carga/ngx_http_app_protect_module.so;
log_de_erro /var/log/nginx/error.log debug;
eventos {
conexões_de_trabalhador 65536;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen <port>;
server_name <nome>;
app_protect_enable on;
app_protect_security_log_enable on; # Esta seção habilita a capacidade de registro
app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # É aqui que o registrador remoto é definido em termos de: opções de registro (definidas no arquivo referenciado), IP do servidor de registro, porta do servidor de registro
app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
proxy_http_version 1.1;
localização / {
client_max_body_size 0;
default_type text/html;
proxy_pass http://<endereço IP>:<porta>$request_uri;#<endereço IP> da unidade Nginx
}
localização /graphql {
tamanho_máximo_do_corpo_do_cliente 0;
tipo_padrão texto/html;
arquivo_de_política_de_proteção_do_aplicativo "/etc/app_protect/conf/graphql_policy.json";
senha_do_proxy http://<endereço_ip>:<porta>$$uri_de_solicitação; #<endereço IP> da unidade Nginx
} } }
$ nginx -s recarregar
Agora você pode testar sua configuração seguindo estes passos:
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
{ "sucesso": "Reconfiguração concluída."
}
$ 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>Solicitação rejeitada</title></head><body>A URL solicitada foi rejeitada. Consulte seu administrador.<br><br>Seu ID de suporte é: 7313092578494613509<br><br><ahref='javascript:history.back();'>[Voltar]</a></body><html>
attack_type="Cliente sem navegador, Abuso de funcionalidade, Injeção de SQL, Outra atividade de aplicativo, Ataque de analisador HTTP", blocking_exception_reason="N/D", 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", gravidade="Crítica", sig_cves="N/D, N/D", sig_ids="200002147,200002476", sig_names="Expressões SQL-INJ como ""ou 1=1"" (3), Expressões SQL-INJ como ""ou 1=1"" (6) (Parâmetro)",sig_set_names="{Assinaturas de injeção de SQL},{Assinaturas de injeção de SQL}",src_port="64257",sub_violations="Falha na conformidade do protocolo HTTP: o cabeçalho do host contém o endereço IP", support_id="7313092578494613509 ",
Neste tutorial, você aprendeu como 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 na 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 defende as APIs GraphQL de algumas das vulnerabilidades de API mais comuns, incluindo autenticação e autorização ausentes, ataques de injeção, consumo irrestrito de recursos e muito mais.
Teste 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.
"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."