Pular para conteúdo

Implantando a Imagem Docker do Wallarm na AWS

Este guia rápido fornece as etapas para implantar a imagem Docker do nó Wallarm baseado em NGINX na plataforma em nuvem da Amazon usando o Amazon Elastic Container Service (Amazon ECS).

Limitações das instruções

Essas instruções não abrangem a configuração de balanceamento de carga e escalonamento automático do nó. Se estiver configurando esses componentes sozinho, recomendamos que você reveja a parte apropriada das instruções da AWS.

Casos de uso

Dentre todas as opções de implantação da Wallarm suportadas, a implantação da Wallarm no AWS ECS usando a imagem Docker é recomendada nestes casos de uso:

  • Se suas aplicações utilizam uma arquitetura de microserviços, e já estão em contêineres e operacionais no AWS ECS.

  • Se você precisa de um controle maior e mais refinado sobre cada contêiner, a imagem Docker se destaca. Ela proporciona um maior nível de isolamento de recursos do que normalmente é possível com implantações baseadas em VM tradicionais.

Requisitos

  • Conta e usuário da AWS com permissões admin

  • AWS CLI 1 ou AWS CLI 2 devidamente instalada e configurada

  • Acesso à conta com a função Administrador e autenticação de dois fatores desativada no Console Wallarm para o US Cloud ou EU Cloud

Opções para a configuração do contêiner Docker do nó Wallarm

Os parâmetros de configuração do nó de filtragem devem ser passados para o contêiner Docker implantado de uma das seguintes maneiras:

  • Nas variáveis do ambiente. Esta opção permite a configuração de apenas os parâmetros básicos do nó de filtragem. A maioria das diretivas não pode ser configurada através de variáveis de ambiente.

  • No arquivo de configuração montado. Esta opção permite a configuração completa do nó de filtragem através de qualquer diretiva. Com este método de configuração, as variáveis de ambiente com as configurações de conexão do nó de filtragem e do Wallarm Cloud também são passadas para o contêiner.

Implantando o contêiner Docker do nó Wallarm configurado através de variáveis de ambiente

Para implantar o nó de filtragem Wallarm contêinerizado configurado apenas por meio de variáveis de ambiente, são usados o Console de Gerenciamento da AWS e o AWS CLI.

  1. Obtenha o token Wallarm do tipo apropriado:

    1. Abra o Console Wallarm → ConfiguraçõesTokens de API no US Cloud ou EU Cloud.
    2. Encontre ou crie um token de API com a função Deploy.
    3. Copie este token.
    1. Abra o Console Wallarm → Nós no US Cloud ou EU Cloud.
    2. Faça uma das seguintes ações:
      • Crie o nó do tipo Nó Wallarm e copie o token gerado.
      • Use o grupo de nó existente - copie o token usando o menu do nó → Copiar token.
  2. Faça login no AWS Management Console → lista de ServiçosElastic Container Service.

  3. Prossiga para a criação do cluster pelo botão Criar Cluster:

    1. Selecione o modelo EC2 Linux + Networking.
    2. Especifique o nome do cluster, por exemplo: wallarm-cluster.
    3. Se necessário, defina outras configurações de acordo com as instruções da AWS.
    4. Salve o cluster.
  4. Criptografe os dados sensíveis necessários para conectar ao Wallarm Cloud (token do nó) usando o AWS Secrets Manager ou AWS Systems Manager → Parameter Store.

    Nestas instruções, os dados sensíveis são armazenados no AWS Secrets Manager.

    Acesso ao armazenamento de dados sensíveis

    Para permitir que o contêiner Docker leia os dados sensíveis criptografados, certifique-se de que as configurações da AWS atendem aos seguintes requisitos:

  5. Crie o seguinte arquivo JSON local com a definição de tarefa (a definição de tarefa define o cenário operacional do contêiner Docker):

    {
        "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole",
        "containerDefinitions": [
            {
                "memory": 128,
                "portMappings": [
               {
                   "hostPort": 80,
                   "containerPort": 80,
                   "protocol": "tcp"
               }
           ],
           "essential": true,
           "environment": [
               {
                   "name": "WALLARM_API_HOST",
                   "value": "us1.api.wallarm.com"
               },
               {
                   "name": "NGINX_BACKEND",
                   "value": "<HOST_PARA_PROTEGER_COM_WALLARM>"
               }
           ],
           "secrets": [
               {
                   "name": "WALLARM_API_TOKEN",
                   "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::"
               }
           ],
           "name": "wallarm-container",
           "image": "registry-1.docker.io/wallarm/node:4.8.0-1"
           }
       ],
       "family": "wallarm-api-security-node"
       }
    
    {
        "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole",
        "containerDefinitions": [
            {
                "memory": 128,
                "portMappings": [
               {
                   "hostPort": 80,
                   "containerPort": 80,
                   "protocol": "tcp"
               }
           ],
           "essential": true,
           "environment": [
               {
                   "name": "NGINX_BACKEND",
                   "value": "<HOST_PARA_PROTEGER_COM_WALLARM>"
               }
           ],
           "secrets": [
               {
                   "name": "WALLARM_API_TOKEN",
                   "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::"
               }
           ],
           "name": "wallarm-container",
           "image": "registry-1.docker.io/wallarm/node:4.8.0-1"
           }
       ],
       "family": "wallarm-api-security-node"
       }
    
    • <AWS_ACCOUNT_ID>: seu ID da conta AWS.
    • O objeto environment estabelece as variáveis de ambiente que devem ser passadas para o contêiner Docker em formato de texto. O conjunto de variáveis de ambiente disponíveis é descrito na tabela abaixo. Recomenda-se passar a variável WALLARM_API_TOKEN no objeto secrets.
    • O objeto secret estabelece as variáveis de ambiente que devem ser passadas para o contêiner Docker como os links para o armazenamento de dados sensíveis. O formato dos valores depende do armazenamento selecionado (veja mais detalhes na documentação do AWS Secrets Manager ou AWS Systems Manager → Parameter Store).

      É recomendado passar a variável WALLARM_API_TOKEN no objeto secrets.

      Variável de ambiente Descrição Obrigatório
      WALLARM_API_TOKEN Token de nó ou API do Wallarm. Sim
      NGINX_BACKEND Domínio ou endereço IP do recurso a ser protegido com a solução Wallarm. Sim
      WALLARM_API_HOST Servidor de API Wallarm:
      • us1.api.wallarm.com para a Nuvem dos EUA
      • api.wallarm.com para a Nuvem da UE
      Por padrão: api.wallarm.com.
      Não
      WALLARM_MODE Modo de nó:
      • block para bloquear solicitações maliciosas
      • safe_blocking para bloquear apenas aquelas solicitações maliciosas originadas de endereços IP em lista cinza
      • monitoring para analisar, mas não bloquear solicitações
      • off para desativar a análise e processamento de tráfego
      Por padrão: monitoring.
      Descrição detalhada dos modos de filtragem →
      Não
      WALLARM_APPLICATION Identificador único do aplicativo protegido a ser usado na Nuvem Wallarm. O valor pode ser um número inteiro positivo, exceto 0.

      O valor padrão (se a variável não for passada para o contêiner) é -1, o que indica o aplicativo padrão exibido na Console Wallarm → ConfiguraçõesAplicativo.

      Mais detalhes sobre a configuração de aplicativos →
      Não
      TARANTOOL_MEMORY_GB Quantidade de memória alocada para o Tarantool. O valor pode ser um número inteiro ou um float (um ponto . é um separador decimal). Por padrão: 0.2 gigabytes. Não
      NGINX_PORT Define uma porta que o NGINX usará dentro do contêiner Docker.

      A partir da imagem Docker 4.0.2-1, o serviço wallarm-status é executado automaticamente na mesma porta que o NGINX.

      O valor padrão (se a variável não for passada para o contêiner) é 80.

      A sintaxe é NGINX_PORT='443'.
      Não
      DISABLE_IPV6 A variável com qualquer valor que não seja um vazio exclui a linha listen [::]:80 default_server ipv6only=on; do arquivo de configuração NGINX, o que impedirá o NGINX de processar conexões IPv6.

      Se a variável não for especificada explicitamente ou tiver um valor vazio "", o NGINX processará conexões IPv6 e IPv4.
      Não
      WALLARM_LABELS

      Disponível a partir do nó 4.6. Funciona apenas se WALLARM_API_TOKEN estiver configurado para token de API com o papel Deploy. Define a etiqueta group para a agrupamento de instâncias de nó, por exemplo:

      WALLARM_LABELS="group=<GRUPO>"

      ...colocará a instância do nó no grupo de instâncias <GRUPO> (existente, ou, se não existir, será criado).

      Sim (para tokens de API)
    • Todos os parâmetros do arquivo de configuração são descritos na documentação da AWS.

  6. Registre a definição de tarefa com base no arquivo de configuração JSON usando o comando aws ecs register‑task‑definition:

    aws ecs register-task-definition --cli-input-json file://<PATH_TO_JSON_FILE>/<JSON_FILE_NAME>
    
    • <PATH_TO_JSON_FILE>: caminho para o arquivo JSON com a definição de tarefa na máquina local.
    • <JSON_FILE_NAME>: nome e extensão do arquivo JSON com a definição de tarefa.
  7. Execute a tarefa no cluster usando o comando aws ecs run-task:

    aws ecs run-task --cluster <CLUSTER_NAME> --launch-type EC2 --task-definition <FAMILY_PARAM_VALUE>
    
    • <CLUSTER_NAME>: nome do cluster criado na primeira etapa. Por exemplo, wallarm-cluster.
    • <FAMILY_PARAM_VALUE>: nome da definição de tarefa criada. O valor deve corresponder ao valor do parâmetro family especificado no arquivo JSON com a definição de tarefa. Por exemplo, wallarm-api-security-node.
  8. Abra o AWS Management Console → Elastic Container Service → cluster com a tarefa em execução → Tasks e certifique-se de que a tarefa está exibida na lista.

  9. Teste a operação do nó de filtragem.

Implantando o contêiner Docker do nó Wallarm configurado através do arquivo montado

Para implantar o nó de filtragem Wallarm contêinerizado configurado por meio de variáveis de ambiente e arquivo montado, são usados o Console de Gerenciamento da AWS e o AWS CLI.

Nestas instruções, o arquivo de configuração é montado a partir do sistema de arquivos AWS EFS. Você pode revisar outros métodos para montar o arquivo na documentação da AWS.

Para implantar o contêiner com variáveis de ambiente e arquivo de configuração montado a partir da AWS EFS:

  1. Obtenha o token Wallarm do tipo apropriado:

    1. Abra o Console Wallarm → ConfiguraçõesTokens de API no US Cloud ou EU Cloud.
    2. Encontre ou crie um token de API com a função Deploy.
    3. Copie este token.
    1. Abra o Console Wallarm → Nós no US Cloud ou EU Cloud.
    2. Faça uma das seguintes ações:
      • Crie o nó do tipo Nó Wallarm e copie o token gerado.
      • Use o grupo de nó existente - copie o token usando o menu do nó → Copiar token.
  2. Faça login no AWS Management Console → lista de ServiçosElastic Container Service.

  3. Prossiga para a criação do cluster pelo botão Criar Cluster:

    • Modelo: EC2 Linux + Networking.
    • Nome do cluster: wallarm-cluster (como exemplo).
    • Modelo de provisionamento: On-Demand Instance.
    • Tipo de instância EC2: t2.micro.
    • Número de instâncias: 1.
    • EC2 AMI ID: Amazon Linux 2 Amazon ECS-optimized AMI.
    • Par de chaves: par de chaves para conexão SSH com a instância. Você precisará se conectar à instância via SSH para enviar o arquivo de configuração para o armazenamento.
    • As outras configurações podem ser mantidas padrão. Ao alterar outras configurações, é recomendável seguir as instruções de configuração do AWS EFS.
  4. Configure o armazenamento AWS EFS seguindo as etapas 2-4 das instruções da AWS.

  5. Na 4ª etapa das instruções da AWS, crie o arquivo de configuração default e coloque o arquivo no diretório que armazena os arquivos para montagem por padrão. O arquivo default deve cobrir a configuração do nó de filtragem. Um exemplo do arquivo com configurações mínimas:

    server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
        #listen 443 ssl;
    
        server_name localhost;
    
        #ssl_certificate cert.pem;
        #ssl_certificate_key cert.key;
    
        root /usr/share/nginx/html;
    
        index index.html index.htm;
    
        wallarm_mode monitoring;
        # wallarm_application 1;
    
        location / {
                proxy_pass http://example.com;
                include proxy_params;
        }
    }
    

    Conjunto de diretivas do nó de filtragem que podem ser especificadas no arquivo de configuração →

  6. Criptografe os dados sensíveis necessários para conectar ao Wallarm Cloud (token do nó) usando o AWS Secrets Manager ou AWS Systems Manager → Parameter Store.

    Nestas instruções, os dados sensíveis são armazenados no AWS Secrets Manager.

    Acesso ao armazenamento de dados sensíveis

    Para permitir que o contêiner Docker leia os dados sensíveis criptografados, certifique-se de que as configurações da AWS atendem aos seguintes requisitos:

  7. Crie o seguinte arquivo JSON local com a definição de tarefa (a definição de tarefa define o cenário operacional do contêiner Docker):

    {
        "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole",
        "containerDefinitions": [
            {
                "memory": 128,
                "portMappings": [
               {
                   "hostPort": 80,
                   "containerPort": 80,
                   "protocol": "tcp"
               }
           ],
           "essential": true,
           "mountPoints": [
               {
                   "containerPath": "<PATH_FOR_MOUNTED_CONFIG>",
                   "sourceVolume": "<NAME_FROM_VOLUMES_OBJECT>"
               }
           ],
           "environment": [
               {
                   "name": "WALLARM_API_HOST",
                   "value": "us1.api.wallarm.com"
               }
           ],
           "secrets": [
               {
                   "name": "WALLARM_API_TOKEN",
                   "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::"
               }
           ],
           "name": "wallarm-container",
           "image": "registry-1.docker.io/wallarm/node:4.8.0-1"
           }
       ],
       "volumes": [
           {
               "name": "<VOLUME_NAME>",
               "efsVolumeConfiguration": {
                   "fileSystemId": "<EFS_FILE_SYSTEM_ID>",
                   "transitEncryption": "ENABLED"
               }
           }
       ],
       "family": "wallarm-api-security-node"
       }
    
    {
        "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole",
        "containerDefinitions": [
            {
                "memory": 128,
                "portMappings": [
               {
                   "hostPort": 80,
                   "containerPort": 80,
                   "protocol": "tcp"
               }
           ],
           "essential": true,
           "mountPoints": [
               {
                   "containerPath": "/etc/nginx/sites-enabled",
                   "sourceVolume": "default"
               }
           ],
           "secrets": [
               {
                   "name": "WALLARM_API_TOKEN",
                   "valueFrom": "arn:aws:secretsmanager:<SECRETS_MANAGER_AWS_REGION>:<AWS_ACCOUNT_ID>:secret:<SECRET_NAME>:<WALLARM_API_TOKEN_PARAMETER_NAME>::"
               }
           ],
           "name": "wallarm-container",
           "image": "registry-1.docker.io/wallarm/node:4.8.0-1"
           }
       ],
       "volumes": [
           {
               "name": "default",
               "efsVolumeConfiguration": {
                   "fileSystemId": "<EFS_FILE_SYSTEM_ID>",
                   "transitEncryption": "ENABLED"
               }
           }
       ],
       "family": "wallarm-api-security-node"
       }
    
    • <AWS_ACCOUNT_ID>: seu ID da conta AWS.
    • <PATH_FOR_MOUNTED_CONFIG>: diretório do contêiner para o qual o arquivo de configuração deve ser montado. Os arquivos de configuração podem ser montados nos seguintes diretórios de contêineres usados pelo NGINX:

      • /etc/nginx/conf.d — configurações comuns
      • /etc/nginx/sites-enabled — configurações do host virtual
      • /var/www/html — arquivos estáticos

      As diretivas do nó de filtragem devem ser descritas no arquivo /etc/nginx/sites-enabled/default.

    • <NAME_FROM_VOLUMES_OBJECT>: nome do objeto volumes que contém a configuração do armazenamento AWS EFS do arquivo montado (o valor deve ser o mesmo que <VOLUME_NAME>).

    • <VOLUME_NAME>: nome do objeto volumes que contém a configuração do armazenamento AWS EFS do arquivo montado.
    • <EFS_FILE_SYSTEM_ID>: ID do sistema de arquivos AWS EFS que contém o arquivo que deve ser montado no contêiner. ID é exibido no AWS Management Console → ServiçosEFSSistemas de arquivos.
    • O objeto environment estabelece as variáveis de ambiente que devem ser passadas para o contêiner Docker em formato de texto. O conjunto de variáveis de ambiente disponíveis é descrito na tabela abaixo. Recomenda-se passar a variável WALLARM_API_TOKEN no objeto secrets.
    • O objeto secret estabelece as variáveis de ambiente que devem ser passadas para o contêiner Docker como os links para o armazenamento de dados sensíveis. O formato dos valores depende do armazenamento selecionado (veja mais detalhes na documentação do AWS Secrets Manager ou AWS Systems Manager → Parameter Store).

      É recomendado passar a variável WALLARM_API_TOKEN no objeto secrets.

      Variável de ambiente Descrição Obrigatório
      WALLARM_API_TOKEN Token de nó Wallarm ou API. Sim
      WALLARM_API_HOST Servidor API Wallarm:
      • us1.api.wallarm.com para a Nuvem dos EUA
      • api.wallarm.com para a Nuvem da UE
      Por padrão: api.wallarm.com.
      Não
      WALLARM_LABELS

      Disponível a partir do nó 4.6. Funciona apenas se WALLARM_API_TOKEN estiver configurado para token da API com a função Deploy. Define a etiqueta group para agrupamento de instâncias de nó, por exemplo:

      WALLARM_LABELS="group=<GROUP>"

      ...colocará a instância de nó no grupo de instâncias <GROUP> (existente, ou, se não existir, será criado).

      Sim (para tokens de API)
    • Todos os parâmetros do arquivo de configuração são descritos na documentação da AWS.

  8. Registre a definição de tarefa com base no arquivo de configuração JSON usando o comando aws ecs register‑task‑definition:

    aws ecs register-task-definition --cli-input-json file://<PATH_TO_JSON_FILE>/<JSON_FILE_NAME>
    
    • <PATH_TO_JSON_FILE>: caminho para o arquivo JSON com a definição de tarefa na máquina local.
    • <JSON_FILE_NAME>: nome e extensão do arquivo JSON com a definição de tarefa.
  9. Execute a tarefa no cluster usando o comando aws ecs run-task:

    aws ecs run-task --cluster <CLUSTER_NAME> --launch-type EC2 --task-definition <FAMILY_PARAM_VALUE>
    
    • <CLUSTER_NAME>: nome do cluster criado na primeira etapa. Por exemplo, wallarm-cluster.
    • <FAMILY_PARAM_VALUE>: nome da definição de tarefa criada. O valor deve corresponder ao valor do parâmetro family especificado no arquivo JSON com a definição de tarefa. Por exemplo, wallarm-api-security-node.
  10. Abra o AWS Management Console → Elastic Container Service → cluster com a tarefa em execução → Tasks e certifique-se de que a tarefa está exibida na lista.

  11. Teste a operação do nó de filtragem.

Testando a operação do nó de filtragem

  1. No AWS Management Console, abra a tarefa em execução e copie o endereço IP do contêiner do campo Link Externo.

    Configurando a instância do contêiner

    Se o endereço IP estiver vazio, certifique-se de que o contêiner está no status RUNNING.

  2. Envie a solicitação com o teste Path Traversal para o endereço copiado:

    curl http://<COPIED_IP>/etc/passwd
    
  3. Abra o Wallarm Console → Events na US Cloud ou EU Cloud e certifique-se de que o ataque está exibido na lista.
    Ataques na UI

Os detalhes sobre erros que ocorreram durante a implantação do contêiner são exibidos nos detalhes da tarefa no AWS Management Console. Se o contêiner estiver indisponível, certifique-se de que os parâmetros necessários do nó de filtragem com valores corretos são passados para o contêiner.