Wie kann ich den AWS-STS-Fehler „Das in der Anfrage enthaltene Sicherheitstoken ist abgelaufen“ beheben, wenn ich die AWS-CLI verwende, um eine IAM-Rolle anzunehmen?

Letzte Aktualisierung: 17.05.2022

Ich habe versucht mithilfe von AWS Command Line Interface (AWS CLI) eine Rolle aus dem AWS Identity and Access Management (IAM) übernehmen. Es wurde jedoch ein Fehler ähnlich dem folgenden gemeldet:

„Das in der Anfrage enthaltene Sicherheitstoken ist abgelaufen“

Kurzbeschreibung

Temporäre Anmeldeinformationen für IAM-Benutzer werden mithilfe des AWS-Security-Token-Service-Dienstes (AWS STS) angefordert. Temporäre Anmeldeinformationen, die mit der AssumeRole-API-Aktion erstellt wurden, dauern standardmäßig eine Stunde. Nach Ablauf temporärer Anmeldeinformationen können sie nicht wiederverwendet werden. Weitere Informationen finden Sie unter Temporäre Sicherheitsanmeldeinformationen in IAM.

Auflösung

Verwende die folgenden Schritte zur Fehlerbehebung für deinen Anwendungsfall.

Hinweis: Wenn du beim Ausführen von AWS-CLI-Befehlen Fehler erhältst, stelle sicher, dass du die neueste AWS-CLI-Version verwendest.

Stelle sicher, dass deine temporären Anfragen zu Sicherheitsanmeldeinformationen AWS-Endpunkte erreichen können

Das Einrichten von Anmeldeinformationen für eine Rolle erfordert eine Zugriffsschlüssel-ID, einen geheimen Zugriffsschlüssel und ein Sitzungstoken. Gesendete Anfragen müssen den AWS-Endpunkt innerhalb von fünf Minuten nach dem Zeitstempel auf der Anfrage erreichen, andernfalls wird die Anfrage abgelehnt. Weitere Informationen findest du unter Warum Anfragen signiert werden.

Verwenden von Profilen zur Übernahme einer IAM-Rolle

Ein benanntes Profil ist eine Sammlung von Einstellungen und Anmeldeinformationen, die du auf einen AWS-CLI-Befehl anwenden kannst. Du musst überprüfen, ob du die richtigen Anmeldeinformationen verwendest.

Der folgende AWS-CLI-Befehl verwendet die Standardprofilanmeldeinformationen:

aws s3 ls

Dieser Beispielbefehl verwendet die Anmeldeinformationen für das project1-Profil, die in der .config-Datei konfiguriert sind:

aws s3 ls --profile project1

Beispielausgabe mit abgelaufenen Anmeldeinformationen:

"An error occurred (ExpiredToken) when calling the ListBuckets operation: The provided token has expired."

Diese Profile sind in Ihrem .aws-Ordner definiert, der die. Anmeldeinformationen und .config-Dateien enthält.

Die Konfigurationsdatei befindet sich unter ~/.aws/config für Linux/macOS und C:\Users\%USERPROFILE%\.aws\config für Windows. Die Datei mit den Anmeldeinformationen befindet sich unter ~/.aws/credentials für Linux/macOS und C:\Users\ %USERPROFILE%\ .aws\ credentials für Windows.

Führe den folgenden Befehl aus, um deine Standardprofilanmeldeinformationen zu überprüfen:

aws configure list --profile default

Beispielausgabe:

Name Value Type Location
---- ----- ---- --------
profile default manual —profile
access_key TGN7 shared-credentials-file
secret_key SbXb shared-credentials-file
region us-east-1 config-file ~/.aws/config

Führe den folgenden Befehl aus, um zu bestätigen, dass dieselben Anmeldeinformationen für das Profil Projekt1 verwendet werden:

aws configure list --profile project1

Beispielausgabe:

Name Value Type Location
---- ----- ---- --------
profile project1 manual —profile
access_key QN2X config-file
secret_key LPYI config-file
region eu-west-1 config-file ~/.aws/config

Beachte in der Beispielausgabe, dass möglicherweise unterschiedliche Anmeldeinformationen für die Standard- und project1-Profile konfiguriert werden.

Du kannst ein Profil in deiner .aws/config-Datei mit dem folgenden Format erstellen:

[profile project1]
region = eu-west-1
aws_access_key_id = <access-Key-for-an-IAM-role>
aws_secret_access_key = <secret-access-Key-for-an-IAM-role>
aws_session_token = <session-token>

Diese Anmeldeinformationen werden dir bereitgestellt, wenn du den AWS-STS-Befehl assume-role ähnlich dem Folgenden ausführst:

aws sts assume-role --role-arn arn:aws:iam::<account-number>:role/Prod-Role --role-session-name environment-prod

Beispielausgabe:

{
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXX:environment-prod",
"Arn": "arn:aws:sts::<account-number>:assumed-role/Prod-Role/environment-prod"
},
"Credentials": {
"SecretAccessKey": "<secret-access-Key-for-an-IAM-role>,
"SessionToken": "<session-token>",
"Expiration": "2020-03-31T17:17:53Z",
"AccessKeyId": "<access-Key-for-an-IAM-role>"
}

Hinweis: Du kannst den maximalen Ablauf der Sitzungsdauer für temporäre Anmeldeinformationen für IAM-Rollen mithilfe des Parameters DurationSeconds für deinen Anwendungsfall erhöhen.

Der neue API-Aufruf assume-Role ruft dann einen neuen Satz gültiger Anmeldeinformationen ab. Nach dem API-Aufruf musst du die Datei ~/.aws/config manuell mit den neuen temporären Anmeldeinformationen aktualisieren.

Du kannst vermeiden, die Konfigurationsdatei jedes Mal zu aktualisieren, wenn eine Sitzung abläuft. Definiere ein Profil für die IAM-Rolle zusammen mit dem Benutzer, der die Rolle in der Datei ~/.aws/config oder ~/.aws/credentials übernimmt, ähnlich dem Folgenden:

[profile project1]
role_arn = <arn-of-IAM-role>
source_profile = user1
region = <region>

Beachte, dass user1 in deiner Datei ~/.aws/credentials ähnlich der folgenden definiert ist:

[user1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Das Definieren von source_profile bedeutet, dass du deine temporären Anmeldeinformationen in der Datei ~/.aws/config oder ~/.aws/credentials nicht aktualisieren musst.

Der folgende AWS-CLI-Befehl listet die Amazon-Simple-Storage-Service-Buckets (Amazon S3) mit Anmeldeinformationen für Benutzer1 auf, die sich in der Datei ~/.aws/credentials befinden.

aws s3 ls --profile project1

Wenn du die AWS-CLI mit einem source_profile-Element verwendest, legt der API-Aufruf assume-role Anmeldeinformationen in die Datei .aws/cli/cache ab. Abgelaufene Anmeldeinformationen werden automatisch in der Datei .aws/cli/cache aktualisiert. Wenn du einen Fehler für abgelaufene Anmeldeinformationen erhältst, kannst du den Cache mit den folgenden Befehlen leeren:

Linux/macOS:

$ rm -r ~/.aws/cli/cache

Windows:

C:\> del /s /q %UserProfile%\.aws\cli\cache

Die AWS-CLI erstellt neue Anmeldeinformationen im Cache.

Erstelle Umgebungsvariablen, um die IAM-Rolle zu übernehmen und dann den Zugriff zu überprüfen

Du kannst IAM-Rollenanmeldeinformationen verwenden, um drei Umgebungsvariablen zu erstellen, die die IAM-Rolle annehmen, die der folgenden ähnelt:

Linux/macOS:

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

Windows:

C:\> setx AWS_ACCESS_KEY_ID RoleAccessKeyID
C:\> setx AWS_SECRET_ACCESS_KEY RoleSecretKey
C:\> setx AWS_SESSION_TOKEN RoleSessionToken

Führe den folgenden Befehl aus, um sicherzustellen, dass du die richtige IAM-Rolle übernommen hast:

aws sts get-caller-identity

Der Befehl get-caller-identity zeigt Informationen über die IAM-Identität an, die zur Authentifizierung der Anforderung verwendet wurde. Weitere Informationen findest du unter Wie übernehme ich eine IAM-Rolle mithilfe der AWS-CLI?

Umgebungsvariablen enthalten temporär zwischengespeicherte Anmeldeinformationen, auch wenn sie ablaufen, und werden nicht automatisch erneuert. Verwende die folgenden Befehle, um zu überprüfen, ob die Umgebungsvariablen für Anmeldeinformationen gesetzt sind:

Linux/macOS:

$ printenv | grep AWS

Windows:

C:\>set AWS

Du kannst abgelaufene Umgebungsvariablen mit den folgenden Befehlen entfernen:

Linux/macOS:

$ unset AWS_ACCESS_KEY_ID
$ unset AWS_SECRET_ACCESS_KEY
$ unset AWS_SESSION_TOKEN

Windows:

C:\>set AWS_ACCESS_KEY_ID=
C:\>set AWS_SECRET_ACCESS_KEY=
C:\>set AWS_SESSION_TOKEN=

Du kannst jetzt den API-Aufruf von assume-role erneut verwenden, um neue, gültige Anmeldeinformationen abzurufen und die Umgebungsvariablen erneut festzulegen.

Wichtig: Die Dateien .aws/credentials und .aws/config enthalten Anmeldeinformationen für deine IAM-Entitäten. Achte bei der Verwaltung Ihrer Anmeldeinformationen darauf, dass du die Best Practices für die Sicherheit in IAM befolgst.