Ir para o conteúdo

Como posso transmitir informações secretas ou confidenciais com segurança para contêineres em uma tarefa do Amazon ECS?

7 minuto de leitura
0

Quero transmitir informações secretas ou confidenciais com segurança para contêineres em uma tarefa para o Amazon Elastic Container Service (Amazon ECS).

Breve descrição

Se você transmitir dados sensíveis em texto sem formatação, poderá causar problemas de segurança. Os dados podem ser descobertos no Console de Gerenciamento da AWS ou por meio da API da AWS DescribeTaskDefinition.

Como prática recomendada de segurança, passe informações confidenciais para contêineres como variáveis de ambiente. Para injetar dados com segurança em contêineres, referencie os valores armazenados no Parameter Store, um recurso do AWS Systems Manager. Também é possível usar o AWS Secrets Manager em uma definição de tarefa do Amazon ECS. Em seguida, é possível expor suas informações confidenciais como variáveis de ambiente ou na configuração de log de um contêiner.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Pré-requisitos:

  • Suas tarefas devem usar a versão 1.3.0 ou posterior da plataforma AWS Fargate com o tipo de inicialização do AWS Fargate.
  • Suas instâncias de contêiner devem usar amazon-ecs-agent versão 1.22.0 ou posterior com o tipo de inicialização do Amazon Elastic Compute Cloud (Amazon EC2). Para obter mais informações, consulte Changelog no site do GitHub.
  • Sua plataforma Fargate deve ter a versão 1.4.0 ou posterior para Linux ou 1.0.0 para Windows para injetar uma chave JSON.
  • Para usar versões específicas de chaves ou segredos JSON, o agente de contêiner do ECS da sua instância de contêiner deve executar a versão 1.37.0 ou posterior para injeção de segredo.
  • O agente de contêiner do ECS da sua instância de contêiner deve executar a versão 1.22.0 ou posterior para injetar todo o conteúdo dos segredos nas configurações de log ou nas variáveis de ambiente.

Criar o perfil e as políticas do IAM

Conclua as etapas a seguir:

  1. Armazene suas informações confidenciais no Parameter Store ou no Secrets Manager.

    Para o Parameter Store, execute o seguinte comando put-parameter da AWS CLI:

    aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue

    Observação: substitua awsExampleParameter por seus próprios parâmetros. Substitua awsExampleValue pelo seu valor do segredo.

    Para o Secrets Manager, execute o seguinte comando create-secret da AWS CLI:

    aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue

    Observação: substitua awsExampleParameter por seus próprios parâmetros. Substitua awsExampleValue pelo seu valor do segredo. O agente de contêiner do ECS usa um perfil de execução de tarefas para buscar as informações do Parameter Store ou do Secrets Manager. O perfil de execução de tarefas deve conceder permissões às ações ssm:GetParameters, secretsmanager:GetSecretValue e kms:Decrypt.

  2. Abra o console do AWS Identity and Access Management (AWS IAM).

  3. Crie um perfil com uma relação de confiança para ecs-tasks.amazonaws.com.
    Exemplo de política de confiança do perfil:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "ecs-tasks.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  4. Escolha Perfis e, em seguida, selecione o perfil que você criou.

  5. Na guia Permissões, escolha a lista suspensa Adicionar permissões.

  6. Escolha Criar política em linha e, em seguida, escolha a guia JSON.

  7. Anexe a política a seguir:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ssm:GetParameters",
            "secretsmanager:GetSecretValue"
          ],
          "Resource": [
            "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter",
            "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter*"
          ]
        }
      ]
    }

    Observação: substitua us-east-1 e awsExampleAccountID pela região da AWS e pela conta em que seus parâmetros estão armazenados. Substitua awsExampleParameter pelo nome dos parâmetros que você criou. É possível usar uma chave gerenciada pelo cliente do AWS Key Management Service (AWS KMS) para criptografar dados no Parameter Store ou no Secrets Manager. Para usar a chave gerenciada pelo cliente, obtenha permissões para kms:Decrypt.

  8. (Opcional) Anexe a política gerenciada AmazonECSTaskExecutionRolePolicy ao perfil que você criou.

Importante: as tarefas que enviam logs para o Amazon CloudWatch ou usam imagens armazenadas no Amazon Elastic Container Registry (Amazon ECR) devem ter uma política gerenciada.

Referenciar informações confidenciais na definição de tarefas do ECS

Use o console do Amazon ECS ou a AWS CLI para referenciar informações confidenciais na definição de tarefas do ECS.

Usar o console do Amazon ECS

Conclua as etapas a seguir:

  1. Abra o console do Amazon ECS.
  2. No painel de navegação, escolha Definições de tarefa e, em seguida, Criar nova definição de tarefa.
    Em Família de definição de tarefas, insira um nome.
    Em Tipo de inicialização, escolha instâncias AWS Fargate ou Amazon EC2 para o tipo de inicialização.
  3. Em Perfil de execução de tarefa, escolha o perfil do IAM de execução de tarefas que você criou.
  4. Na seção Definições de contêiner, na seção Variáveis de ambiente, escolha Adicionar variável de ambiente.
  5. Em Chave, insira uma chave para sua variável de ambiente.
  6. Na lista suspensa ValueType, escolha ValueFrom.
  7. Na caixa de texto da chave, insira o nome do recurso da Amazon (ARN) do seu recurso do Parameter Store ou do Secrets Manager.
    Observação: também é possível especificar segredos na configuração do driver de log.

Use a AWS CLI

Use a seção segredos para referenciar os recursos do Parameter Store ou do Secrets Manager na definição da tarefa como variáveis de ambiente. Ou use a seção secretOptions para referenciar o Parameter Store ou o Secrets Manager como opções de configuração de log.

Exemplo de definição de tarefa:

{
  "requiresCompatibilities": [
    "EC2"
  ],
  "family": "Web",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "httpd",
      "memory": 128,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "splunk",
        "options": {
          "splunk-url": "https://sample.splunk.com:8080"
        },
        "secretOptions": [
          {
            "name": "splunk-token",
            "valueFrom": "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter"
          }
        ]
      },
      "secrets": [
        {
          "name": "DATABASE_PASSWORD",
          "valueFrom": "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter"
        }
      ]
    }
  ],
  "executionRoleArn": "arn:aws:iam::awsExampleAccountID:role/awsExampleRoleName"
}

Observação: substitua us-east-1 e awsExampleAccountID pela sua região e pelo ID da conta. Substitua awsExampleParameter pelo parâmetro que você criou. Substitua awsExampleRoleName pelo perfil que você criou.

Em seguida, execute o seguinte comando register-task-definition da AWS CLI para registrar a definição da tarefa:

aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile

Observação: substitua yourTaskDefinitionFamily pelo nome da família de definição de tarefa.

Quando você inicia uma tarefa com essa definição, o agente de contêiner do ECS resolve automaticamente os segredos. Em seguida, o agente do contêiner injeta os valores como variáveis de ambiente no contêiner.

Atualizar segredos e implementar alterações

Quando você inicia o contêiner do ECS, o contêiner injeta dados sensíveis nele. Se você atualizar ou alternar o segredo ou o parâmetro do Parameter Store, o contêiner não receberá automaticamente o valor atualizado. Você deverá iniciar uma nova tarefa. Se sua tarefa fizer parte de um serviço, atualize-o. Para forçar o serviço a iniciar uma nova tarefa, use a opção Forçar nova implantação.

Para forçar uma nova implantação, conclua as seguintes etapas:

  1. Abra o console do Amazon ECS.
  2. Escolha Clusters e, em seguida, selecione o cluster com seu serviço.
  3. Selecione Forçar nova implantação na lista suspensa Atualizar.
    Observação: para forçar uma nova implantação a partir da AWS CLI, execute o comando update-service com a sinalização --force-new-deployment.

Informações relacionadas

Como atualizar o agente de contêiner do Amazon ECS

AWS OFICIALAtualizada há 7 meses