Como posso transmitir informações secretas ou confidenciais com segurança para contêineres em uma tarefa do Amazon ECS?
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
A transmissão de dados confidenciais em texto simples pode causar problemas de segurança, pois eles podem ser descobertos no Console de Gerenciamento da AWS ou por meio de APIs da AWS, como DescribeTaskDefinition ou DescribeTasks.
Como prática recomendada de segurança, passe informações confidenciais para contêineres como variáveis de ambiente. Você pode injetar dados com segurança em contêineres referenciando valores armazenados no AWS Systems Manager Parameter Store ou no AWS Secrets Manager na definição de contêiner de uma definição de tarefa do Amazon ECS. Em seguida, você pode expor suas informações confidenciais como variáveis de ambiente ou na configuração de log de um contêiner.
A AWS oferece suporte à injeção de dados somente para o seguinte:
- Tarefas que usam a versão 1.3.0 ou posterior da plataforma AWS Fargate com o tipo de inicialização do AWS Fargate
- Instâncias de contêiner que usam amazon-ecs-agent versão 1.22.0 ou posterior com o tipo de inicialização do Amazon Elastic Compute Cloud (Amazon EC2)
Resolução
Pré-requisitos concluídos
1. Armazene suas informações confidenciais no AWS Systems Manager Parameter Store ou no Secrets Manager.
Para o AWS Systems Manager Parameter Store, execute o comando a seguir. Substitua awsExampleParameter por seus próprios parâmetros e substitua awsExampleValue por seu valor protegido:
aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue
Para o Secrets Manager, execute o comando a seguir. Substitua awsExampleParameter por seus próprios parâmetros e substitua awsExampleValue por seu valor secreto:
aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue
Observação: O agente de contêiner do Amazon ECS usa um perfil de execução de tarefas do AWS Identity and Access Management (IAM) para obter as informações do AWS Systems Manager Parameter Store ou Secrets Manager. O perfil do IAM de execução da tarefa deve conceder permissões às seguintes ações: ssm:GetParameters, secretsmanager:GetSecretValue e kms:Decrypt.
2. Abra o console do IAM e, em seguida, crie um perfil com uma relação de confiança para ecs-tasks.amazonaws.com. Por exemplo:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
3. Para criar uma política embutida para seu perfil no console do IAM, escolha Perfis, selecione o perfil que você criou na etapa 2 e escolha Adicionar política embutida na guia Permissões. Escolha a guia JSON e crie uma política com o código a seguir. 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 na etapa 1:
{ "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: Se você usa uma chave KMS gerenciada pelo cliente para criptografar dados no AWS Systems Manager Parameter Store ou no Secrets Manager, deve obter permissões para kms:Decrypt.
4. (Opcional) Anexe a política gerenciada AmazonECSTaskExecutionRolePolicy ao perfil que você criou na etapa 2.
Importante: É necessária uma política gerenciada para tarefas que usam imagens armazenadas no Amazon Elastic Container Registry (Amazon ECR) ou que enviam logs para o Amazon CloudWatch.
Referenciar informações confidenciais na definição de tarefas do ECS
No Console de Gerenciamento da AWS:
1. Abra o console do Amazon ECS.
2. No painel de navegação, escolha Definições de tarefas e, em seguida, escolha Criar nova definição de tarefa.
3. Escolha seu tipo de inicialização e, em seguida, escolha Próxima etapa.
4. Em Perfil de execução de tarefa, escolha o perfil do IAM de execução de tarefas que você criou anteriormente.
5. Na seção Definições de contêiner, escolha Adicionar contêiner.
6. Na seção de variáveis Ambiente em ENVIRONMENT, em Chave, insira uma chave para sua variável de ambiente.
7. Na lista suspensa Valor, escolha ValueFrom.
8. 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: Você também pode especificar segredos na configuração do driver de log.
Na AWS Command Line Interface (AWS CLI):
Observação: Se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.
1. Consulte os recursos do AWS Systems Manager Parameter Store ou do Secrets Manager na definição da tarefa como variáveis de ambiente usando a seção secrets ou como opções de configuração de log usando a seção secretOptions. No exemplo abaixo, substitua us-east-1 e awsExampleAccountID por sua região da AWS e ID da conta. Substitua awsExampleParameter pelo parâmetro que você criou anteriormente. Substitua awsExampleRoleName pelo perfil que você criou anteriormente.
{ "requiresCompatibilities": [ "EC2" ], "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" }
2. Para registrar a definição da tarefa, execute o seguinte comando:
aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile
Quando uma tarefa é iniciada usando a definição de tarefa que você cria, o agente de contêiner do Amazon ECS resolve automaticamente os segredos e injeta os valores como variáveis de ambiente no contêiner.
Importante: Dados confidenciais são injetados em seu contêiner quando o contêiner é iniciado pela primeira vez. Se o parâmetro secreto ou do Parameter Store for atualizado ou rotacionado, o contêiner não receberá o valor atualizado automaticamente. Você deverá iniciar uma nova tarefa. Se sua tarefa fizer parte de um serviço, atualize o serviço. Em seguida, use a opção Forçar nova implantação para forçar o serviço a iniciar uma nova tarefa.
Para forçar uma nova implantação:
1. Abra o console do Amazon ECS.
2. Escolha Clusters e, em seguida, selecione o cluster com seu serviço.
3. Marque a caixa de seleção Forçar nova implantação e escolha Atualizar serviço.
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.
Vídeos relacionados
Conteúdo relevante
- AWS OFICIALAtualizada há 5 meses
- AWS OFICIALAtualizada há 6 meses
- AWS OFICIALAtualizada há 2 anos