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:

    • Os dados sensíveis são armazenados na região usada para executar o contêiner Docker.
    • A função de execução de tarefa ECS especificada no parâmetro executionRoleArn da definição de tarefa deve ter uma política de leitura com privilégios mínimos, limitada ao ARN específico do segredo. Se você usar uma chave KMS gerenciada pelo cliente para criptografar o segredo, conceda também a permissão kms:Decrypt para essa chave. Mais detalhes sobre a configuração das políticas IAM →

      Exemplo de política IAM:

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Sid": "ReadSpecificSecret",
            "Effect": "Allow",
            "Action": [
              "secretsmanager:GetSecretValue",
              "secretsmanager:DescribeSecret"
            ],
            "Resource": "arn:aws:secretsmanager:<REGION>:<ACCOUNT>:secret:<SECRET_NAME>*"
          },
          {
            "Sid": "DecryptForSecret",
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:<REGION>:<ACCOUNT>:key/<KMS_KEY_ID>",
            "Condition": {
              "StringEquals": {
                "kms:ViaService": "secretsmanager.<REGION>.amazonaws.com"
              }
            }
          }
        ]
      }
      

      Se você usar a chave gerenciada padrão da AWS para o Secrets Manager, pode omitir a declaração DecryptForSecret.

  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:

    • Os dados sensíveis são armazenados na região usada para executar o contêiner Docker.
    • A função de execução de tarefa ECS especificada no parâmetro executionRoleArn da definição de tarefa deve ter uma política de leitura com privilégios mínimos, limitada ao ARN específico do segredo. Se você usar uma chave KMS gerenciada pelo cliente para criptografar o segredo, conceda também a permissão kms:Decrypt para essa chave. Consulte o exemplo de política acima e a documentação de políticas IAM →
  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.