Je vous écris pour me renseigner sur la prise en charge d’IMDSv2 via les profils d’instance dans Discourse. Nous sommes en train de migrer notre service pour utiliser IMDSv2, car IMDSv1 n’est pas une option sécurisée.
Nous aimerions savoir si Discourse prend actuellement en charge IMDSv2 via les profils d’instance et, si ce n’est pas le cas, quels sont les plans pour le prendre en charge dans un avenir proche. De plus, existe-t-il des solutions de contournement ou des correctifs disponibles qui nous permettraient d’utiliser IMDSv2 avec Discourse ?
Il est important pour nous de nous assurer que nos exigences de sécurité sont satisfaites, et nous pensons que l’utilisation d’identifiants temporaires via IMDSv2 en est un aspect essentiel.
Le comportement souhaité pour accéder aux identifiants de sécurité fournis via le profil d’instance est :
Une application sur l’instance récupère les identifiants de sécurité fournis par le rôle à partir de l’élément de métadonnées de l’instance iam/security-credentials/role-name.
L’application se voit accorder les autorisations pour les actions et les ressources que nous avons définies pour le rôle via les identifiants de sécurité associés au rôle. Ces identifiants de sécurité sont temporaires et sont automatiquement mis à jour. Nous rendons de nouveaux identifiants disponibles au moins cinq minutes avant l’expiration des anciens identifiants.
Nous avons noté qu’il existe des différences entre les appels IMDSv1 et IMDSv2.
Nous apprécierions toute information que vous pourrez nous fournir sur la manière dont nous pouvons utiliser IMDSv2 avec Discourse, ou s’il existe des solutions de contournement ou des correctifs disponibles.
Je ne connais aucun moyen par lequel Discourse lui-même utilise IMDS. Avez-vous installé Discourse sur AWS d’une manière ou d’une autre ? Utilisez-vous déjà IMDSv1 avec Discourse ?
Discourse utilise une version du SDK AWS (3.130.2) supérieure au minimum requis pour prendre en charge IMDSv2 et d’après ce que je peux voir en examinant la métrique MetadataNoToken dans nos déploiements AWS, nous n’avons aucun appel à IMDSv1.
D’après ce que je peux dire, nous utilisons déjà IMDSv2 partout.
Nous avons commencé à utiliser Discourse sur une instance AWS EC2 il y a un an. Et cette semaine, nous avons mis à jour notre instance pour n’utiliser que IMDSv2, cela a cassé nos téléchargements AWS S3 avec le message d’erreur « unable to sign request without credentials set ». Nous utilisons également le paramètre « s3 use iam profile ».
Le service IMDS local est utilisé par Discourse pour obtenir les identifiants nécessaires à d’autres appels d’API de services liés à AWS. Ceci est fait en utilisant Ruby aws-sdk-s3
Nous constatons également ce problème de sauvegarde après avoir désactivé IMDSv1 pour des raisons de sécurité.
Nous pouvons voir l’utilisation d’IMDSv1 (dans 3.3.0.beta1-dev) via la métrique MetadataNoToken, nous nous demandons donc à quelle version de Discourse est passée à l’utilisation de v2 partout ?
Nous avons également été affectés par cela aujourd’hui une fois que nous avons configuré notre instance AWS pour utiliser uniquement IMDSv2 : nos utilisateurs ne pouvaient plus télécharger d’images sur S3.
Probablement pertinent ici : nous utilisons également l’option s3 use iam profile.
Pour l’instant, nous l’avons basculée sur « Facultatif », ce qui signifie essentiellement que IMDSv1 est toujours activé, ce qui n’est pas idéal en termes de sécurité, mais cela a permis aux téléchargements de fonctionner à nouveau.
Nous apportons des modifications pour permettre/s’attendre à ce que plus de configuration soit possible via le fichier .aws/config, ce qui pourrait coïncider avec cela et le rendre possible.
@supermathie la chose la plus étrange que je n’arrive pas à comprendre, c’est que j’ai personnellement configuré 2 instances de Discourse (dev/prod) qui sont configurées de manière identique (téléchargements S3 pour les fichiers et sauvegarde à l’aide du profil IAM) et mises à jour vers une version identique (9436f5e3d4) et lorsque j’ai désactivé IMDSv1… en dev, tout a continué à fonctionner comme prévu, tandis qu’en prod, cela ne fonctionne pas et continue de renvoyer quelque chose comme « impossible de signer la requête sans identifiants définis »… assez déroutant.
Si vous avez une idée de test/vérification que je pourrais faire, faites-le moi savoir.
@ducks a identifié que les délais d’attente dans le SDK pour l’acquisition des informations d’identification IMDS sont très agressifs (1 seconde, sans nouvelles tentatives), il est donc possible que ce soit ce délai d’attente qui soit atteint.
Mais ce n’est qu’une supposition.
Si vous vous connectez à la production via la console, pouvez-vous le faire interactivement, par exemple :
J’ai compris ce qui n’allait pas et je dois m’en vouloir, mais le problème était assez subtil.
Le problème venait de « HttpPutResponseHopLimit » réglé sur 1, ce qui ne permettait pas d’appeler IMDSv2 depuis l’intérieur du conteneur.
En exécutant cette commande, j’ai obtenu cette réponse :