AWS - EKS - Loab Balancer - HTTPS

Bonjour,

Je rencontre une difficulté sur le projet de fin de formation pour la mise en place du https pour l’accès à notre app de façon sécurisé.

  • Nous déployons notre un app sur un cluster EKS au sein d’AWS, le cluster et toute l’infra est déployé via Terraform.

  • La configuration des services FastApi et de la base de données se font via des charts HELM.

  • La solution fonctionne très bien en http sur le port 80 avec la mise en place automatique d’un ALB grâce a un ingress.

  • L’ ALB ingress controller a été ajouté via Terraform sur le cluster EKS.

  • Un certificat pour notre domaine a été généré et issued via ACM

  • Voici la configuration de l’ingress :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: fastapi-ingress
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: ‘[{“HTTPS”:443}, {“HTTP”:80}]’
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:eu-west-3:203271543287:certificate/19fdb8cd-f089-4c68-9bcb-**********

spec:
ingressClassName: alb
rules:

  • http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: fastapi
    port:
    number: {{ .Values.service.port }}

  • Lors de l’application du chart Helm, le load balancer est bien créé sur AWS avec un listener sur le port 80 mais pas sur le port 443.

  • Et dans les logs, j’ai l’erreur suivante :

failed deploy model due to access denied : Access denied to certificate arn:xxxxxx

  • J’ajoute que si je crée le listener 443 avec le certificat en mode manuel avec l’interface graphique cela fonctionne …

  • Egalement si je fais la commande :

aws acm get-certificate --certificate-arn arn:aws:acm:eu-west-3:XXXXXXXXXX:certificate/xxxxx-

  • J’ai bien accès au certificat depuis la machine qui applique le char helm ( donc les mêmes credentials )

Pouvez-vous m’apporter votre aide à ce sujet ?

Merci.

Arnaud

Hello Arnaud,

Il semble que le problème provienne d’un souci de permissions associé à l’utilisation du certificat ACM dans l’Ingress.

Pourrais-je voir les politiques (policies) de l’utilisateur ou du rôle qui fait appel au certificat ? Normalement, le rôle EKS doit inclure des permissions spécifiques pour ACM dans sa politique pour accéder au certificat. Sans ces permissions, aucun accès n’est accordé par défaut sur AWS.

Il serait utile de tester et de vérifier en attribuant temporairement des droits étendus à EKS pour observer le résultat, puis d’affiner les permissions ensuite.

Voici un exemple de politique qui pourrait être utilisé :

# Exemple à ajouter en plus de l'existant au sein du rôle utilisé par EKS
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "acm:DescribeCertificate",
                "acm:ListCertificates",
                "acm:GetCertificate"
            ],
            "Resource": "*"
        }
    ]
}

Tiens-moi au courant,

Anthony

Quelques infos supplémentaires, je ne t’ai pas indiqué comment retrouver le rôle utilisé par EKS :slight_smile:

Connecte-toi à la console AWS et navigue jusqu’au service EKS.
Ensuite, dans le tableau de bord EKS, sélectionne le cluster qui t’intéresse. Une fois dans la section des détails du cluster, tu devrais trouver l’information relative au rôle IAM utilisé par le cluster.

Cette information est généralement disponible sous la section “Configuration” ou “Details”.

Bien à toi,

Anthony

Bonjour Anthony,

Je viens de regarder ce matin et mon cluster EKS à les droits suivants :

AmazonEKSClusterPolicy
AWSCertificateManagerReadOnly

Dans le doute, J’ai également donné le “AWSCertificateManagerReadOnly” au role du Node Group.

Mais j’ai toujours la même erreur :confused:

Warning FailedDeployModel 11s (x3 over 20s) ingress (combined from similar events): Failed deploy model due to AccessDenied: Access denied to certificate ‘arn:aws:acm:eu-west-3:203271543287:certificate/19fdb8cd-f089-4c68-9bcb-*********’
status code: 403, request id: 8966a6c7-5896-4176-8301-a1eb11b85516

J’ai trouvé quasiment aucune info à ce sujet sur Internet …

Si jamais t as une autre idée, je suis preneur :smiley:

Merci.

Bonne Journée,

Arnaud

Hello Arnaud,

Il faudrait ajouter ces policies sur EKS et l’ALB Ingress pour tester :

acm:DescribeCertificate, acm:ListCertificates, et acm:GetCertificate

Soit créer un nouveau rôle, soit ajouter quelques chose comme ceci aux rôles existants :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "acm:DescribeCertificate", # A ajouter
                "acm:ListCertificates", # A ajouter
                "acm:GetCertificate" # A ajouter
            ],
            "Resource": "*" # ou spécifier le certificat concerné
        }
    ]
}

Tiens moi au courant,

Anthony

Bonjour Anthony,

Mon rôle EKS et mon rôle ALB possèdent bien ces permissions.
Mais j’ai toujours le problème …

Bonne fin de journée,

Peux tu m’envoyer un screen des policies des deux rôles stp ?
Tu peux tester avec une politique plus large en attendant comme acm:*

Bonjour Anthony,

Après avoir creusé un peu et grâce à cloudtrail, je pense avoir trouvé d’ou vient le problème :

“eventTime”: “2024-02-07T11:52:06Z”,
“eventSource”: “kms.amazonaws.com”,
“eventName”: “CreateGrant”,
“awsRegion”: “eu-west-3”,
“sourceIPAddress”: “acm.amazonaws.com”,
“userAgent”: “acm.amazonaws.com”,
“errorCode”: “AccessDenied”,
“errorMessage”: “User: arn:aws:sts::2032715xxxxx:assumed-role/role_eks_lb/170730360166xxxx is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:eu-west-3:203271xxxx:key/a6cb187b-955f-495b-axxxxxxxx with an explicit deny in a service control policy”

Le rôle “role_eks_lb” n’a pas les droits sur la clé géré par KMS pour le certificat.
Le problème c’est que cette clé a été généré automatiquement par AWS lors de la création du certificat et la policy n’est pas modifiable.

J’essaie de trouver un moyen de contourner cela.

Bonne journée,

Arnaud

D’ailleurs je viens de voir que le deny provient d’une SCP.
Je suis pas sur d’être en mesure de faire quelque chose à ce niveau là …

Bonjour Arnaud,

Je trouve ton retour très intéressant et pertinent ! À ce sujet, pourrais-tu vérifier quelque chose dans le service AWS KMS ? Tu peux te rendre dans la section “cmk” (customer managed key) et vérifier si des clés ont été générées.

Je suspecte qu’il ne s’agit pas d’une clé gérée par AWS, car sinon, tu n’aurais pas reçu de message “denied”.

Cependant, j’ai précédemment mis en place une restriction concernant la création des clés KMS. Cette restriction stipule que les clés ne peuvent être explicitement créées que par l’utilisateur original “student”. Et ce user “student” original ne peut pas être supprimé.

Le problème majeur dont j’ai du faire face est lié à l’utilisation des CMK par les apprenants. Ils spécifiaient parfois un rôle ou un utilisateur qui était ensuite supprimé. En conséquence, la clé devient “non manageable” parce que le propriétaire initial de la clé n’existe plus.

Je préfère t’épargner la procédure compliquée imposée par Amazon pour supprimer ces clées.

Dans le contexte de KMS, le compte AWS n’est pas implicitement le propriétaire de la ressource. Cela signifie que même le compte “root” ne peut pas supprimer ou modifier la clé si le compte n’est pas spécifié dans la key policy comme ceci :

{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root" # Ligne obligatoire a ajouter lors de la création qui donne le droit au "compte de gérer la clef"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
 

Si tu souhaites absoluement passer par CMK et ACM je peux voir pour débloquer ça, mais je préfèrerais largement que tu passes par un certbot.

Tiens moi au courant,

Anthony

Tu pourras cependant normalement gérer les droits CMK et ajouter l’action “creategrant” depuis le user “student” mais je te propose vivement d’ajouter le principal plus haut également en 2ème policy.

Il y a une bien une CMK sur le compte mais c’est moi qui l’ai créé à des fins de test, j’ai d’ailleurs demandé sa suppression mais avec la politique AWS, il faut attendre 7 jours …

Cependant la clé lié au certificat est bien une clé Managé par AWS :

Description : Default key that protects my ACM private keys when no other key is defined

Et sa date de création correspond bien à la première fois que j’ai généré un certificat via ACM, et il n’y avait pas de CMK sur le compte auparavant.
D’après la Doc ACM il s’agit du comportement par défaut, si pas de clé présente, AWS crée une clé “aws/acm” par défaut.

Je crois que je vais laisser tomber ACM et passer sur du let’s encrypt.

Merci de ton aide en tout cas.

Arnaud

Dans ce cas, il doit y avoir une relation implicite lors de la création entre l’ALB et ACM, comme c’est l’ALB qui va appeller le certificat. Je vais essayer de creuser pourquoi EKS à besoin de “grant” sur ACM, car normalement lui se positionne en tant que client

Anthony