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 ».

Dernière mise à jour : 25/09/2020

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 : elle passe immédiatement de l'état d'attente à l'état d'arrêt. J'ai exécuté la commande describe-instances de l'interface de ligne de commande AWS (AWS CLI) et j'ai obtenu cette erreur :

....
"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é client principale (CMK).

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

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 de clé CMK.

Solution

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

1    Ouvrez la console IAM, sélectionnez Stratégies, puis 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:Encrypt",
                "kms:RevokeGrant",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:DescribeKey",
                "kms:CreateGrant",
                "kms:ListGrants"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}

3    Sélectionnez Examiner une stratégie.

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

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

6    Sélectionnez l'onglet Utilisation de la stratégie, puis sélectionnez Attacher.

7    Dans Nom, sélectionnez l'entité IAM à laquelle vous souhaitez accorder l'autorisation à la CMK, puis sélectionnez Attacher la stratégie.

Accorder au mandataire IAM un accès explicite à une CMK

1    Ouvrez la console AWS KMS, puis sélectionnez Clés gérées par le client.

2    Dans ID de clé, sélectionnez votre ID de clé.

3    Sous Utilisateurs de clé, sélectionnez Ajouter.

4    Dans Nom, sélectionnez l'utilisateur ou le rôle IAM, puis sélectionnez Ajouter.

Remarque : si vous utilisez une stratégie de clé personnalisée au lieu de la stratégie de clé par défaut, la CMK 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 mandataires ont l'autorisation d'utiliser la CMK 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.