Direkt zum Inhalt

Wie behebe ich den Fehler „The security token included in the request is expired“, der auftritt, wenn ich Java-Anwendungen auf Amazon EC2 ausführe?

Lesedauer: 5 Minute
0

Meine Java-Anwendungen verwenden das AWS SDK für Java auf meiner Amazon Elastic Compute Cloud (Amazon EC2)-Instance. Ich erhalte jedoch die Fehlermeldung „com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)“.

Kurzbeschreibung

Alle Anwendungs-API-Anfragen müssen mit den von AWS bereitgestellten Anmeldeinformationen digital signiert werden. Wenn die Anwendung temporäre Anmeldeinformationen verwendet, um einen AWS-Client zu erstellen, musst du diese Anmeldeinformationen erneuern, bevor sie ablaufen. Wenn die Anmeldeinformationen ablaufen, erhältst du die Fehlermeldung „security token included in the request is expired“.

Lösung

Sicherstellen, dass die Instance eine konsistente Zeitreferenz hat

Anmeldeinformationen laufen ab, wenn sie die falsche Uhrzeit verwenden. Stelle daher sicher, dass der Server die korrekte Uhrzeit hat. Die EC2-Instance muss über eine konsistente und genaue Uhrzeit- und Datumsreferenz verfügen. Konfiguriere den Amazon Time Sync Service oder eine andere Network Time Protocol (NTP)-Quelle auf der Instance. Weitere Informationen findest du unter Zeitzone der Instance ändern.

Sicherstellen, dass die temporären Anmeldeinformationen nicht abgelaufen sind

Wenn du temporäre Anmeldeinformationen verwendest, stelle sicher, dass diese nicht abgelaufen sind. Wenn die temporären Anmeldeinformationen abgelaufen sind, musst du einen neuen Satz temporärer Anmeldeinformationen generieren und diese verwenden. Es hat sich bewährt, temporäre Anmeldeinformationen fünf Minuten vor ihrem Ablauf zu aktualisieren.

IAM-Konfiguration überprüfen

Bei Anwendungen, die auf einer Instance ausgeführt werden, empfiehlt es sich, eine AWS Identity and Access Management (IAM)-Rolle für die Instance zu verwenden.

Wenn du eine IAM-Rolle verwendest, stelle sicher, dass du die Anmeldeinformationen der Rolle nur im Instance-Profil auflistest. Bei einer IAM-Rolle verwendet der Standard-Servicekonstruktor eine standardmäßige Anbieterkette für Anmeldeinformationen für die Suche nach Anmeldeinformationen in der folgenden Reihenfolge:

  1. In den Systemumgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY
  2. In den Java-Systemeigenschaften aws.accessKeyId und aws.secretKey
  3. In der Datei der Standard-Anmeldeinformationen
  4. In den Anmeldeinformationen für das Instance-Profil in den Instance-Metadaten, die der IAM-Rolle zugeordnet sind

Wenn du Anmeldeinformationen an einer beliebigen Stelle außer dem Instance-Profil auflistest, findet der Standard-Client-Konstruktor diese Anmeldeinformationen zuerst. Diese Konfiguration blockiert die IAM-Rollen-Anmeldeinformationen. Um dieses Problem zu beheben, suche an den anderen Speicherorten nach Anmeldeinformationen. Um die Standarddatei mit den Anmeldeinformationen zu überprüfen, überprüfe je nach Betriebssystem (OS) den folgenden Speicherort:

  • Überprüfe für Linux, macOS oder Unix * ~/.aws/credentials.
  • Überprüfe für Windows C:\Users\USERNAME\.aws\credentials
    Hinweis: Ersetze USERNAME durch deinen Benutzernamen.

Wenn du Anmeldeinformationen an einer beliebigen Stelle außer dem Instance-Profil findest, entferne sie. Weitere Informationen zu Konfigurationen temporärer Anmeldeinformationen findest du unter Temporäre Anmeldeinformationen für das AWS SDK für Java bereitstellen.

Um die Anmeldeinformationen für die IAM-Rolle zu überprüfen, führe je nach Betriebssystem den folgenden Befehl aus. Stelle sicher, dass du Windows PowerShell Version 3.0 oder höher oder von einer Linux-Shell aus verwendest.

Windows:

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Hinweis: Ersetze examplerole durch den Namen deiner IAM-Rolle. Wenn du temporäre Anmeldeinformationen verwendest, zeigt der vorherige Befehl die neuesten temporären Anmeldeinformationen für die Instance an.

Beispielausgabe:

Code            : SuccessLastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Linux:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Hinweis: Ersetze examplerole durch den Namen deiner IAM-Rolle. Wenn du temporäre Anmeldeinformationen verwendest, zeigt der vorherige Befehl die neuesten temporären Anmeldeinformationen für die Instance an. Wenn du beim Ausführen des vorherigen Befehls einen 404-Fehler erhältst, überprüfe, ob du den HTTP-Proxy für die Metadaten-IP-Adresse deaktiviert hast. Stelle außerdem sicher, dass du das Instance-Profil an die Instance angefügt hast.

Beispielausgabe:

{    "Code" : "Success",    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

Hinweis: Die Rollenanmeldeinformationen werden fünf Minuten vor Ablauf der zugewiesenen temporären Anmeldeinformationen automatisch rotiert oder aktualisiert.

Wiederholungsversuche konfigurieren

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Wenn weiterhin Probleme auftreten, stelle sicher, dass die Instance nicht mehrere gleichzeitige Anforderungen stellt oder mehrere Sitzungen parallel ausführt. Dieses Szenario kann dazu führen, dass der Instance Metadata Service (IMDS) die Abfrage drosselt. Verwende das Wiederholungsmuster mit exponentiellem Backoff, um dieses Problem zu beheben.

Um Wiederholungsversuche einzurichten, erhöhe den Wert von AWS_METADATA_SERVICE_NUM_ATTEMPTS, sodass Boto3 erneut versuchen kann, Anmeldeinformationen vom Instance Metadata Service abzurufen. Standardmäßig unternimmt Boto3 nur einen Versuch, bevor es zu einem Timeout kommt. Erhöhe außerdem den Wert von AWS_METADATA_SERVICE_TIMEOUT, um die Anzahl der Sekunden zu erhöhen, bevor die Verbindung zum Instance Metadata Service das Zeitlimit überschreitet. Standardmäßig läuft die Verbindung nach 1 Sekunde ab.

Beispielkonfiguration:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

Um die oben genannten Optionen zu konfigurieren, verwende Umgebungsvariablen, die Datei ~/.aws/config oder die botocore-Sitzung des Benutzers. Anweisungen findest du unter Configuration (Konfiguration) auf der Website „Boto3 documentation“ (Boto3-Dokumentation).

Wenn du den curl-Befehl in einem Docker-Container ausführst, führe den folgenden AWS-CLI-Befehl modify-instance-metadata-options aus, um das Hop-Limit auf 2 zu erhöhen:

aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled

Hinweis: Ersetze instance durch deine Instance-ID. Weitere Informationen findest du in In einer Containerumgebung solltest du eine Neukonfiguration oder eine Erhöhung des Hop-Limits auf 2 in Betracht ziehen unter Überlegungen zum Zugriff auf Instance-Metadaten.

Ähnliche Informationen

Authenticating with AWS using the AWS SDK for Java 2.x (Authentifizierung bei AWS mithilfe des AWS SDK für Java 2.x)

IAM-Rollen für Amazon EC2

Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the Amazon EC2 Instance Metadata Service (Erweiterter Schutz vor offenen Firewalls, Reverse-Proxys und SSRF-Schwachstellen mit Erweiterungen für den Amazon EC2 Instance Metadata Service)