Ich schreibe Ihnen, um mich nach der Unterstützung von IMDSv2 über Instanzprofile in Discourse zu erkundigen. Wir sind dabei, unseren Dienst auf die Verwendung von IMDSv2 umzustellen, da IMDSv1 keine sichere Option ist.
Wir möchten verstehen, ob Discourse derzeit IMDSv2 über Instanzprofile unterstützt und falls nicht, welche Pläne es gibt, dies in naher Zukunft zu unterstützen. Gibt es außerdem Workarounds oder Patches, die uns die Verwendung von IMDSv2 mit Discourse ermöglichen würden?
Es ist uns wichtig, sicherzustellen, dass unsere Sicherheitsanforderungen erfüllt werden, und wir glauben, dass die Verwendung temporärer Anmeldeinformationen über IMDSv2 ein kritischer Aspekt davon ist.
Das gewünschte Verhalten für den Zugriff auf Sicherheitsanmeldeinformationen, die über das Instanzprofil bereitgestellt werden, ist:
Eine Anwendung auf der Instanz ruft die von der Rolle bereitgestellten Sicherheitsanmeldeinformationen aus dem Instanzmetadatenelement iam/security-credentials/rollenname ab.
Die Anwendung erhält die Berechtigungen für die Aktionen und Ressourcen, die wir für die Rolle definiert haben, durch die mit der Rolle verbundenen Sicherheitsanmeldeinformationen. Diese Sicherheitsanmeldeinformationen sind temporär und werden automatisch rotiert. Wir stellen neue Anmeldeinformationen mindestens fünf Minuten vor Ablauf der alten Anmeldeinformationen zur Verfügung.
Wir haben festgestellt, dass es Unterschiede zwischen den IMDSv1- und IMDSv2-Aufrufen gibt.
Wir würden uns über jede Information freuen, die Sie uns zur Verfügung stellen können, wie wir IMDSv2 mit Discourse verwenden können oder ob es Workarounds oder Patches gibt.
Ich bin mir keiner Möglichkeit bewusst, dass Discourse selbst IMDS verwendet. Haben Sie Discourse irgendwie auf AWS installiert? Verwenden Sie IMDSv1 bereits mit Discourse?
Discourse verwendet eine Version des AWS SDK (3.130.2), die über die Mindestanforderungen hinausgeht, um IMDSv2 zu unterstützen, und soweit ich das anhand der Metrik MetadataNoToken in unseren AWS-Bereichen beurteilen kann, gibt es keine Aufrufe an IMDSv1.
Soweit ich das beurteilen kann, verwenden wir IMDSv2 bereits überall.
Wir haben vor einem Jahr begonnen, Discourse auf einer AWS EC2-Instanz zu verwenden. Diese Woche haben wir unsere Instanz aktualisiert, um nur IMDSv2 zu verwenden. Dies hat unsere AWS S3-Uploads mit der Fehlermeldung „unable to sign request without credentials set“ (Anfrage kann ohne gesetzte Anmeldeinformationen nicht signiert werden) unterbrochen. Wir verwenden auch die Einstellung „s3 use iam profile“.
Der lokale IMDS-Dienst wird von Discourse verwendet, um Anmeldeinformationen für andere AWS-bezogene Service-API-Aufrufe zu erhalten. Dies geschieht mit Ruby aws-sdk-s3
Wir sehen dieses Backup-Problem auch, nachdem wir IMDSv1 aus Sicherheitsgründen deaktiviert haben.
Wir können die Verwendung von IMDSv1 (in 3.3.0.beta1-dev) über die Metrik MetadataNoToken sehen, daher fragen wir uns, welche Version von Discourse auf die durchgängige Verwendung von v2 umgestellt hat?
Auch wir wurden heute davon gebissen, nachdem wir unsere AWS-Instanz auf die ausschließliche Verwendung von IMDSv2 umgestellt hatten: Unsere Benutzer konnten keine Bilder mehr nach S3 hochladen.
Wahrscheinlich relevant hier: Wir verwenden auch die Option s3 use iam profile.
Vorerst haben wir es auf “Optional” umgestellt, was im Grunde bedeutet, dass IMDSv1 immer noch aktiviert ist, was sicherheitstechnisch nicht optimal ist, aber das Hochladen funktionierte wieder.
Wir nehmen Änderungen vor, um mehr Konfigurationen über die Datei .aws/config zu ermöglichen/erwarten, was sich möglicherweise mit diesem überschneidet und es ermöglicht.
@supermathie Das Seltsamste, was ich nicht herausfinden kann, ist, dass ich persönlich 2 Discourse-Instanzen (Entwicklung/Produktion) eingerichtet habe, die identisch konfiguriert sind (S3-Uploads für Dateien und Backup mit IAM-Profil) und auf die identische Version (9436f5e3d4) aktualisiert wurden, und als ich IMDSv1 deaktivierte… in der Entwicklung funktionierte alles wie erwartet, während es in der Produktion nicht funktionierte und immer etwas wie „unable to sign request without credentials set“ ausgibt … ziemlich rätselhaft.
Wenn Sie eine Idee für Tests/Prüfungen haben, die ich durchführen könnte, lassen Sie es mich wissen.
@ducks hat die Timeouts im SDK für den Erwerb von IMDS-Anmeldeinformationen als sehr aggressiv (1 Sekunde, keine Wiederholungsversuche) identifiziert, sodass es möglich ist, dass dieser Timeout erreicht wird.
Aber das ist nur eine Vermutung.
Wenn Sie sich interaktiv in die Produktion einloggen können, z. B.:
Ich habe herausgefunden, was falsch war, und ich muss mir selbst die Schuld geben, aber das Problem war ziemlich subtil.
Das Problem lag bei „HttpPutResponseHopLimit“, das auf 1 gesetzt war und es IMDSv2 nicht erlaubte, aus dem Container heraus aufgerufen zu werden.
Als ich diesen Befehl ausführte, erhielt ich diese Antwort: