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

Date de la dernière mise à jour : 26/07/2019

Comment puis-je 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

La transmission des informations sensibles en texte brut présente des risques en matière de sécurité. Ces informations sont détectables dans AWS Management Console ou via les API AWS comme DescribeTaskDefinition ou DescribeTasks.

Pour assurer leur sécurité, transmettez 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 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 :

Ré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 pour récupérer les informations depuis AWS Systems Manager Parameter Store ou Secrets Manager. Le rôle d'exécution des tâches AWS Identity and Access Management (IAM) doit accorder des autorisations pour les actions suivantes : ssm:GetParameters, secretsmanager:GetSecretValue, et kms:Decrypt.

2.    Ouvrez la console IAM, puis créez un rôle avec une relation d'approbation pour ecs-tasks.amazonaws.com. Voici un 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.

Remarque : la stratégie gérée est requise si la tâche utilise une image stockée dans Amazon Elastic Container Registry (Amazon ECR) ou envoie des journaux à Amazon CloudWatch.

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

À partir d'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 le menu déroulant Value (Valeur), sélectionnez ValueFrom.

8.    Dans la zone de texte pour la clé, saisissez l'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.

À partir de l'interface de ligne de commande AWS (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. Voici un 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 register-task-definition 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 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, mettre à jour le service et utiliser 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, puis 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, exécutez la commande update-service avec l'indicateur --force-new-deployment.


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

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?