Comment puis-je transmettre des secrets ou des informations sensibles en toute sécurité à des conteneurs dans une tâche Amazon ECS ?

Dernière mise à jour : 06/01/2021

Je voudrais transmettre des secrets ou des informations sensibles en toute sécurité à des conteneurs dans une tâche pour Amazon Elastic Container Service (Amazon ECS).

Brève description

Le passage de données sensibles en texte brut peut entraîner des problèmes de sécurité, car il est détectable dans AWS Management Console ou via des API AWS telles que DescribeTaskDefinition ou DescribeTask.

La bonne pratique en matière de sécurité consiste à transmettre les informations sensibles aux conteneurs en tant que variables d'environnement. Vous pouvez injecter en toute sécurité des données dans des conteneurs en référençant les valeurs stockées dans AWS Systems Manager Parameter Store ou AWS Secrets Manager dans la définition de conteneur d'une définition de tâche Amazon ECS. Ensuite, vous pouvez exposer vos informations sensibles comme variables d'environnement ou dans la configuration du journal d'un conteneur.

AWS prend en charge l'injection de données uniquement pour les éléments suivants :

Solution

Compléter les conditions préalables

1.    Stockez vos informations sensibles dans AWS Systems Manager Parameter Store ou Secrets Manager.

Pour AWS Systems Manager Parameter Store, exécutez la commande suivante :

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

Pour Secrets Manager, exécutez la commande suivante :

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

Remarque : l'agent de conteneur Amazon ECS utilise un rôle (IAM) d'exécution de tâche AWS Identity and Access Management pour récupérer les informations depuis AWS Systems Manager Parameter Store ou Secrets Manager. Les tâches d'exécution du rôle IAM doit accorder des autorisations pour les actions suivantes : ssm:GetParameters, secretsmanager:GetSecretValue et kms:Déchiffrer.

2.    Ouvrez la console IAM, puis créez un rôle avec une relation d'approbation pour ecs-tasks.amazonaws.com. Par exemple :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    Pour créer une stratégie en ligne pour votre rôle dans la console IAM, accédez à Roles (rôles), sélectionnez le rôle que vous avez créé à l'étape 2, puis sélectionnez Add inline policy (Ajouter une stratégie en ligne) sous l'onglet Permissions (Autorisations). Accédez à l'onglet JSON, puis créez une stratégie avec le code suivant :

{
  "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*"
      ]
    }
  ]
}

Remarque : remplacez us-east-1 et awsExampleAccountID par la région AWS et le compte dans lesquels vos paramètres sont stockés. Remplacez awsExampleParameter par le nom des paramètres que vous avez créés à l'étape 1.

Remarque : si vous utilisez une clé KMS gérée par le client pour le chiffrement de données dans AWS Systems Manager Parameter Store ou Secrets Manager, vous devez obtenir des autorisations pour kms:Decrypt.

4.    (Facultatif) Attachez la stratégie gérée AmazonECSTaskExecutionRolePolicy au rôle que vous avez créé à l'étape 2.

Important : Une stratégie gérée est requise pour les tâches qui utilisent des images stockées dans Amazon Elastic Container Registry (Amazon ECR) ou celles qui envoient des journaux à Amazon CloudWatch.

Référencer des informations sensibles dans la définition des tâches ECS

Dans AWS Management Console :

1.    Ouvrez la console Amazon ECS.

2.    Dans le volet de navigation, sélectionnez Task Definitions (Définitions de tâche), puis Create new Task Definition (Créer une nouvelle définition de tâche).

3.    Sélectionnez votre type de lancement, puis cliquez sur Next step (Étape suivante).

4.    Pour Task execution role (Rôle d'exécution des tâches), sélectionnez le rôle IAM que vous avez créé précédemment.

5.    Dans la section Container Definitions (Définitions de conteneur), sélectionnez Add container (Ajouter un conteneur).

6.    Dans la section Environment variables (Variables d'environnement) sous ENVIRONMENT (ENVIRONNEMENT), saisissez une clé pour votre variable d'environnement dans le champ Key (Clé).

7.    Dans la liste déroulante Valeur, sélectionnez ValueFrom.

8.    Dans la zone de texte pour la clé, saisissez le Amazon Resource Name (ARN) de votre ressource Parameter Store ou Secrets Manager.

Remarque : Vous pouvez également spécifier des secrets lors de la configuration d'un pilote de journal.

Depuis l'interface de ligne de commande AWS (AWS CLI) :

Remarque : Si vous recevez des erreurs lors de l'exécution des commandes de l'interface de ligne de commande AWS CLI, vérifiez que vous utilisez la toute dernière version de l’interface de ligne de commande AWS CLI.

1.    Référencez les ressources AWS Systems Manager Parameter Store ou Secrets Manager dans la définition de tâche en tant que variables d'environnement à l'aide de la section secrets ou comme option de configuration de journal à l'aide de la section secretOptions. Par exemple :

{
  "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"
}

Important : remplacez us-east-1 et awsExampleAccountID par votre région AWS et votre ID de compte. Remplacez awsExampleParameter par le paramètre que vous avez créé précédemment. Remplacez awsExampleRoleName par le rôle que vous avez créé précédemment.

2.    Pour enregistrer la définition de tâche, exécutez la commande suivante :

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

Lorsqu'une tâche est démarrée à l'aide de la définition de tâche que vous avez créée, l'agent de conteneur Amazon ECS résout automatiquement les secrets et injecte les valeurs en tant que variables d'environnement dans le conteneur.

Important : Les données sensibles sont injectées dans votre conteneur lors de son démarrage initial. Si le secret ou le paramètre Parameter Store est mis à jour ou fait l'objet d'une rotation, le conteneur ne reçoit pas la valeur mise à jour automatiquement. Vous devez lancer une nouvelle tâche. Si la tâche fait partie d'un service, mettez à jour le service et utilisez l'option Force new deployment (Forcer un nouveau déploiement) pour forcer le service à lancer une nouvelle tâche.

Pour forcer un nouveau déploiement :

1.    Ouvrez la console Amazon ECS.

2.    Sélectionnez Clusters (Groupes), puis sélectionnez le cluster associé à votre service.

3.    Cochez Force New Deployment (Forcer un nouveau déploiement), puis Update Service (Mettre à jour le service).

Remarque : Pour forcer un nouveau déploiement à partir de l'interface de ligne de commande AWS CLI, exécutez la commande update-service avec l'indicateur --force-new-deployment.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?