Lorsque je démarre mon instance avec des volumes chiffrés attachés, celle-ci s'arrête immédiatement avec l'erreur « client error on launch ».

Date de la dernière mise à jour : 22/09/2021

J'ai lancé une instance Amazon Elastic Compute Cloud (Amazon EC2) avec des volumes chiffrés attachés, mais l'instance ne démarre pas. L'instance  : elle passe immédiatement de l'état d'attente à l'état d'arrêt, puis finalement à un état résilié. J'ai exécuté la commande describe-instances d'AWS Command Line Interface (AWS CLI) sur l'instance résiliée et j'ai obtenu l'erreur suivante :

....
"StateReason": {
  "Code": "Client.InternalError"
  "Message": "Client.InternalError: Client error on launch"
},
....

Comment résoudre ce problème ?

Brève description

Ce problème se produit avec les instances EC2 avec des volumes chiffrés attachés si :

  • L'utilisateur AWS Key Management Service (AWS KMS) ou AWS Identity and Access Management (IAM) qui lance les instances ne dispose pas des autorisations requises.
  • L'utilisation de la clé KMS est limitée par la clé de condition SourceIp.

L'utilisateur IAM doit avoir l'autorisation d'AWS KMS pour déchiffrer la clé AWS KMS.

Pour autoriser l'accès au déchiffrement d'une clé KMS, vous devez utiliser la stratégie de clé avec des stratégies ou des autorisations IAM. Les politiques IAM ne suffisent pas à elles seules pour autoriser l'accès à une clé KMS. Néanmoins, vous pouvez les utiliser en combinaison avec la stratégie d'une clé KMS.

Par défaut, les clés KMS n'accordent l'accès qu'au compte racine. Lorsque le privilège complet EC2 est fourni à un utilisateur ou un rôle IAM, les autorisations AWS KMS doivent explicitement accorder l'accès à la stratégie des clés KMS.

Résolution

Création d'une stratégie IAM pour permettre au mandataire IAM d'appeler les API AWS KMS

Remarque : en cas d'erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

1.    Ouvrez la console IAM, choisissez Policies (Stratégies), puis Create policy (Créer une stratégie).

2.    Sélectionnez l'onglet JSON, puis copiez et collez cette stratégie :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:Encrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
  ]
}

3.    Choisissez Review policy (Examiner une stratégie).

4.    Dans Name (Nom), saisissez un nom dont vous pourrez aisément vous rappeler, puis sélectionnez Create policy (Créer une stratégie).

5.    Sélectionnez la stratégie que vous avez créée à l'étape 4.

6.    Choisissez l'onglet Policy usage (Utilisation de la stratégie), puis Attach (Attacher).

7.    Dans l'onglet Name (Nom), choisissez l'entité IAM à laquelle vous souhaitez accorder l'autorisation à la clé KMS, puis choisissezAttach policy (Attacher la stratégie).

Accorder au principal IAM un accès explicite à une clé KMS

1.    Ouvrez la console AWS KMS, puis choisissez Customer managed keys (Clés gérées par le client).

2.    Dans Key ID (ID de clé), sélectionnez votre ID de clé.

3.    Sous Key users (Utilisateurs de clé), sélectionnez Add (Ajouter).

4.    Dans l'onglet Name (Nom), choisissez l'utilisateur ou le rôle IAM, puis Add (Ajouter).

Remarque : si vous utilisez une stratégie de clé personnalisée au lieu de la stratégie de clé par défaut, la clé KMS doit explicitement accorder les autorisations suivantes :

{
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
        "arn:aws:iam::123456789012:role/MyRoleName"
          "arn:aws:iam::123456789012:user/MyUserName",
        ]
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
      "arn:aws:iam::123456789012:role/MyRoleName"
          "arn:aws:iam::123456789012:user/MyUserName",
        ]
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    }

Utiliser la condition d'adresse IP

Si vous utilisez AWS KMS pour protéger vos données dans un service intégré, faites attention lorsque vous spécifiez les opérateurs de condition d'adresse IP ou lorsque vous spécifiez la clé de condition aws:SourceIp dans la même instruction de stratégie d'accès. Lorsque vous attachez un volume chiffré Amazon Elastic Block Store (Amazon EBS) à une instance Amazon EC2, Amazon EC2 envoie une demande à AWS KMS pour déchiffrer la clé de données chiffrée du volume. Cette requête provient d'une adresse IP associée à l'instance EC2, et non de l'adresse IP de l'utilisateur. Cela signifie que la demande de déchiffrement est rejetée si vous avez une condition SourceIp définie et que l'instance échoue.

Utilisez la clé de condition kms:ViaService. AWS KMS autorise les interactions de ce service en votre nom. Assurez-vous que les principaux ont l'autorisation d'utiliser la clé KMS et le service intégré. Pour plus d'informations, consultez les limites des clés de condition kms :ViaService.

Remarque : les instances EC2 avec des utilisateurs connectés ne peuvent pas interagir avec cette condition. Seul le service en votre nom le peut. Cette interaction est enregistrée dans les journaux AWS CloudTrail que vous pouvez consulter.

"userIdentity": {
  "sessionContext": {
  "sessionIssuer": {
    "accountId": "450822418798",
    "principalId": "450822418798:aws:ec2-infrastructure",
    "userName": "aws:ec2-infrastructure",
    "arn": "arn:aws:iam::450822418798:role/aws:ec2-infrastructure",
    "type": "Role"
   },
...
  "eventType": "AwsApiCall",
  "@log_group": "CloudTrail/AllRegionLogGroup",
  "awsRegion": "eu-west-1",
  "requestParameters": {
    "encryptionContext": {
    "aws:ebs:id": "vol-0ca158925aa9c1883"
    }  
}

Dans cet exemple, l'entrée CloudTrail pour un appel d'API est effectuée vers AWS KMS. Ceci est demandé par l'infrastructure Amazon EC2, et non à partir d'une adresse IP spécifique. Lorsque vous ajoutez une stratégie à un utilisateur qui permet à AWS KMS d'interagir avec Amazon EC2, l'appel d'API peut se terminer.