BLOG | NGINX

Tutorial: Entregue e proteja APIs GraphQL com F5 NGINX

NGINX-Parte-de-F5-horiz-preto-tipo-RGB
Miniatura de Akash Ananthanarayanan
Akash Ananthanarayanan
Publicado em 20 de julho de 2023

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.

A segurança é crítica para APIs GraphQL

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.

Visão geral do tutorial

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:

Arquitetura com NGINX fornecendo segurança e autenticação para APIs GraphQL, monitoramento de ataques e o servidor Apollo GraphQL em execução na unidade NGINX
Figura 1: Arquitetura com NGINX Plus e NGINX App Protect WAF fornecendo segurança e autenticação para APIs GraphQL, monitoramento do NGINX Management Suite para ataques e o servidor Apollo GraphQL em execução no NGINX Unit

Pré-requisitos

Antes de começar este tutorial, você precisa do seguinte:

Instalar e configurar o monitoramento de segurança do NGINX Management Suite

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:

Implantar a unidade NGINX e instalar o servidor Apollo GraphQL

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:

  1. Instale a unidade NGINX em um sistema operacional compatível .
  2. Siga o repositório do GitHub para criar um servidor Apollo GraphQL e criar seu aplicativo Apollo GraphQL hello.

Implante o NGINX Plus como um API Gateway e instale o NGINX App Protect WAF

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:

  1. Instale o NGINX Plus em um sistema operacional compatível .
  2. Instale o módulo JavaScript NGINX (njs).
  3. Adicione o load_modules no diretório nginx.conf .
  4. load_module módulos/ngx_http_js_module.so;load_module módulos/ngx_stream_js_module.so;
    
  5. Instale o NGINX App Protect WAF em um sistema operacional compatível.
  6. Adicione o módulo NGINX App Protect WAF ao contexto principal no arquivo nginx.conf :
  7. load_module módulos/ngx_http_app_protect_module.so;
  8. Habilite o NGINX App Protect WAF em um contexto http/server/location no arquivo nginx.conf :
  9. app_protect_enable ativado;
  10. 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:

  11. {   "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
                }
            ]
        } 
  12. 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:

  13. 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         
            }     } }
  14. Reinicie o NGINX Plus executando este comando:
  15.    

    $ nginx -s recarregar
    

Teste a configuração

Agora você pode testar sua configuração seguindo estes passos:

  1. Inicie o aplicativo Apollo GraphQL navegando até o servidor NGINX Unit e digitando este comando:
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. Após uma atualização bem-sucedida, você verá que o aplicativo está disponível no endereço IP e na porta do ouvinte:
  4. {         "sucesso": "Reconfiguração concluída."
    }
  5. Para acessar o servidor Apollo GraphQL, abra seu 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).
  6. Para testar o aplicativo, insira a consulta GraphQL correta e execute-a.
  7. Captura de tela do playground Apollo GraphQL UI
    Figura 2: Playground da interface do usuário Apollo GraphQL
  8. Considere uma situação em que um indivíduo insere uma injeção de SQL em uma consulta. Nesse caso, o NGINX App Protect WAF protege o servidor Apollo GraphQL e produz um ID de suporte que descreve a natureza do ataque.
  9. $ 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>
  10. Para verificar os detalhes do ataque, consulte os logs da instância do NGINX Plus, que estão localizados em /var/log/app_protect/security.log.
  11. 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 ",
  12. No módulo NGINX Management Security Monitoring, você pode monitorar os dados de suas instâncias e analisar possíveis ameaças, bem como ajustar políticas conforme necessário para proteção ideal.
  13. Captura de tela da visão geral do módulo de monitoramento de segurança do NGINX Management Suite
    Figura 3: Visão geral do módulo de monitoramento de segurança do NGINX Management Suite
    Captura de tela do resumo abrangente de violações de segurança no módulo Monitoramento de Segurança
    Figura 4: Resumo abrangente das violações de segurança no módulo Monitoramento de Segurança

Conclusão

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.

Recursos adicionais


"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."