AWS - Step Functions Enum

Unterstützen Sie HackTricks

Step Functions

AWS Step Functions ist ein Workflow-Dienst, der es Ihnen ermöglicht, mehrere AWS-Dienste in serverlosen Workflows zu koordinieren und zu orchestrieren. Mit AWS Step Functions können Sie Workflows entwerfen und ausführen, die verschiedene AWS-Dienste wie AWS Lambda, Amazon S3, Amazon DynamoDB und viele mehr in einer Abfolge von Schritten verbinden. Dieser Orchestrierungsdienst bietet eine visuelle Workflow-Oberfläche und bietet Zustandsmaschinen-Funktionen, die es Ihnen ermöglichen, jeden Schritt des Workflows in deklarativer Weise mit der JSON-basierten Amazon States Language (ASL) zu definieren.

Schlüsselkonzepte

Standard- vs. Express-Workflows

AWS Step Functions bietet zwei Arten von Zustandsmaschinen-Workflows: Standard und Express.

  • Standard-Workflow: Dieser Standard-Workflow-Typ ist für langlaufende, langlebige und prüfbare Prozesse konzipiert. Er unterstützt exactly-once execution, was sicherstellt, dass Aufgaben nur einmal ausgeführt werden, es sei denn, Wiederholungen sind angegeben. Er ist ideal für Workflows, die eine detaillierte Ausführungshistorie benötigen, und kann bis zu einem Jahr laufen.

  • Express-Workflow: Dieser Typ ist ideal für hochvolumige, kurzzeitige Aufgaben, die bis zu fünf Minuten laufen. Sie unterstützen at-least-once execution, geeignet für idempotente Aufgaben wie Datenverarbeitung. Diese Workflows sind auf Kosten und Leistung optimiert und berechnen Gebühren basierend auf Ausführungen, Dauer und Speicherverbrauch.

Zustände

Zustände sind die wesentlichen Einheiten von Zustandsmaschinen. Sie definieren die einzelnen Schritte innerhalb eines Workflows und können je nach Typ eine Vielzahl von Funktionen ausführen:

  • Aufgabe: Führt einen Job aus, oft unter Verwendung eines AWS-Dienstes wie Lambda.

  • Wahl: Trifft Entscheidungen basierend auf Eingaben.

  • Fehler/Erfolg: Beendet die Ausführung mit einem Fehler oder Erfolg.

  • Pass: Gibt Eingaben an Ausgaben weiter oder injiziert Daten.

  • Warten: Verzögert die Ausführung für eine festgelegte Zeit.

  • Parallel: Initiiert parallele Zweige.

  • Karte: Iteriert dynamisch über Schritte über Elemente.

Aufgabe

Ein Aufgaben-Zustand stellt eine einzelne Arbeitseinheit dar, die von einer Zustandsmaschine ausgeführt wird. Aufgaben können verschiedene Ressourcen aufrufen, einschließlich Aktivitäten, Lambda-Funktionen, AWS-Dienste oder Drittanbieter-APIs.

  • Aktivitäten: Benutzerdefinierte Arbeiter, die Sie verwalten, geeignet für langlaufende Prozesse.

  • Ressource: arn:aws:states:region:account:activity:name.

  • Lambda-Funktionen: Führt AWS Lambda-Funktionen aus.

  • Ressource: arn:aws:lambda:region:account:function:function-name.

  • AWS-Dienste: Integriert sich direkt mit anderen AWS-Diensten, wie DynamoDB oder S3.

  • Ressource: arn:partition:states:region:account:servicename:APIname.

  • HTTP-Aufgabe: Ruft Drittanbieter-APIs auf.

  • Ressourcenfeld: arn:aws:states:::http:invoke. Dann sollten Sie die Konfigurationsdetails des API-Endpunkts angeben, wie die API-URL, Methode und Authentifizierungsdetails.

Das folgende Beispiel zeigt eine Aufgaben-Zustandsdefinition, die eine Lambda-Funktion namens HelloWorld aufruft:

"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}

Choice

Ein Choice-Zustand fügt einer Arbeitsablaufbedingung Logik hinzu, die Entscheidungen basierend auf Eingabedaten ermöglicht. Er bewertet die angegebenen Bedingungen und wechselt zum entsprechenden Zustand basierend auf den Ergebnissen.

  • Comparison: Jede Wahlregel enthält einen Vergleichsoperator (z. B. NumericEquals, StringEquals), der eine Eingabevariable mit einem angegebenen Wert oder einer anderen Variablen vergleicht.

  • Next Field: Choice-Zustände unterstützen nicht das End-Feld, stattdessen definieren sie den Next-Zustand, zu dem gewechselt wird, wenn der Vergleich wahr ist.

Beispiel für den Choice-Zustand:

{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}

Fail/Succeed

Ein Fail-Zustand stoppt die Ausführung einer Zustandsmaschine und markiert sie als Fehler. Er wird verwendet, um einen Fehlernamen und eine Ursache anzugeben und Details über den Fehler bereitzustellen. Dieser Zustand ist terminal, was bedeutet, dass er den Ausführungsfluss beendet.

Ein Succeed-Zustand stoppt die Ausführung erfolgreich. Er wird typischerweise verwendet, um den Workflow zu beenden, wenn er erfolgreich abgeschlossen ist. Dieser Zustand benötigt kein Next-Feld.

"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}

Pass

Ein Pass-Zustand überträgt seine Eingabe an seine Ausgabe, entweder ohne Arbeit zu verrichten oder indem er die JSON-Zustandeingabe mithilfe von Filtern transformiert und dann die transformierten Daten an den nächsten Zustand übergibt. Es ist nützlich zum Testen und Konstruieren von Zustandsmaschinen, da es Ihnen ermöglicht, statische Daten einzufügen oder sie zu transformieren.

"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}

Wait

Ein Wait-Zustand verzögert die Ausführung der Zustandsmaschine für eine bestimmte Dauer. Es gibt drei Hauptmethoden, um die Wartezeit zu konfigurieren:

  • X Sekunden: Eine feste Anzahl von Sekunden zu warten.

"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
  • Absolute Zeitstempel: Eine genaue Zeit, bis zu der gewartet werden soll.

"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
  • Dynamisches Warten: Basierend auf Eingaben mit SecondsPath oder TimestampPath.

jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}

Parallel

Ein Parallel-Zustand ermöglicht es Ihnen, mehrere Aufgabenäste gleichzeitig innerhalb Ihres Workflows auszuführen. Jeder Ast läuft unabhängig und verarbeitet seine eigene Sequenz von Zuständen. Die Ausführung wartet, bis alle Äste abgeschlossen sind, bevor sie zum nächsten Zustand übergeht. Die wichtigsten Felder sind:

  • Branches: Ein Array, das die parallelen Ausführungspfade definiert. Jeder Ast ist eine separate Zustandsmaschine.

  • ResultPath: Definiert, wo (in der Eingabe) die kombinierte Ausgabe der Äste platziert werden soll.

  • Retry und Catch: Fehlerbehandlungs-Konfigurationen für den parallelen Zustand.

"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}

Map

Ein Map-Zustand ermöglicht die Ausführung einer Reihe von Schritten für jedes Element in einem Datensatz. Es wird für die parallele Verarbeitung von Daten verwendet. Je nachdem, wie Sie die Elemente des Datensatzes verarbeiten möchten, bietet Step Functions die folgenden Modi an:

  • Inline-Modus: Führt eine Teilmenge von Zuständen für jedes JSON-Array-Element aus. Geeignet für Aufgaben im kleinen Maßstab mit weniger als 40 parallelen Iterationen, die jeweils im Kontext des Workflows ausgeführt werden, der den Map-Zustand enthält.

"MapState": {
"Type": "Map",
"ItemsPath": "$.arrayItems",
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "INLINE"
},
"StartAt": "AddState",
"States": {
"AddState": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:add-function"
},
"End": true
}
}
},
"End": true
"ResultPath": "$.detail.added",
"ItemsPath": "$.added"
}
  • Verteilter Modus: Entwickelt für die parallele Verarbeitung im großen Maßstab mit hoher Parallelität. Unterstützt die Verarbeitung großer Datensätze, wie sie in Amazon S3 gespeichert sind, und ermöglicht eine hohe Parallelität von bis zu 10.000 parallelen Kind-Workflow-Ausführungen, die als separate Kind-Ausführung ausgeführt werden.

"DistributedMapState": {
"Type": "Map",
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"Parameters": {
"Bucket": "my-bucket",
"Key": "data.csv"
}
},
"ItemProcessor": {
"ProcessorConfig": {
"Mode": "DISTRIBUTED",
"ExecutionType": "EXPRESS"
},
"StartAt": "ProcessItem",
"States": {
"ProcessItem": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:account-id:function:my-function",
"End": true
}
}
},
"End": true
"ResultWriter": {
"Resource": "arn:aws:states:::s3:putObject",
"Parameters": {
"Bucket": "myOutputBucket",
"Prefix": "csvProcessJobs"
}
}
}

Versionen und Aliase

Step Functions ermöglicht es Ihnen auch, Workflow-Bereitstellungen durch Versionen und Aliase von Zustandsmaschinen zu verwalten. Eine Version stellt einen Snapshot einer Zustandsmaschine dar, der ausgeführt werden kann. Aliase dienen als Zeiger auf bis zu zwei Versionen einer Zustandsmaschine.

  • Versionen: Diese unveränderlichen Snapshots einer Zustandsmaschine werden aus der neuesten Revision dieser Zustandsmaschine erstellt. Jede Version wird durch eine eindeutige ARN identifiziert, die die ARN der Zustandsmaschine mit der Versionsnummer kombiniert, getrennt durch einen Doppelpunkt (arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number). Versionen können nicht bearbeitet werden, aber Sie können die Zustandsmaschine aktualisieren und eine neue Version veröffentlichen oder die gewünschte Version der Zustandsmaschine verwenden.

  • Aliase: Diese Zeiger können auf bis zu zwei Versionen derselben Zustandsmaschine verweisen. Mehrere Aliase können für eine einzelne Zustandsmaschine erstellt werden, die jeweils durch eine eindeutige ARN identifiziert werden, die die ARN der Zustandsmaschine mit dem Aliasnamen kombiniert, getrennt durch einen Doppelpunkt (arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName). Aliase ermöglichen das Routing des Datenverkehrs zwischen einer der beiden Versionen einer Zustandsmaschine. Alternativ kann ein Alias auf eine bestimmte Version der Zustandsmaschine verweisen, jedoch nicht auf andere Aliase. Sie können aktualisiert werden, um auf eine andere Version der Zustandsmaschine umzuleiten, wenn dies erforderlich ist, was kontrollierte Bereitstellungen und Workflow-Management erleichtert.

Für detailliertere Informationen über ASL siehe: Amazon States Language.

IAM-Rollen für Zustandsmaschinen

AWS Step Functions nutzt AWS Identity and Access Management (IAM)-Rollen, um den Zugriff auf Ressourcen und Aktionen innerhalb von Zustandsmaschinen zu steuern. Hier sind die wichtigsten Aspekte in Bezug auf Sicherheit und IAM-Rollen in AWS Step Functions:

  • Ausführungsrolle: Jede Zustandsmaschine in AWS Step Functions ist mit einer IAM-Ausführungsrolle verknüpft. Diese Rolle definiert, welche Aktionen die Zustandsmaschine in Ihrem Namen ausführen kann. Wenn eine Zustandsmaschine zwischen Zuständen wechselt, die mit AWS-Diensten interagieren (wie das Aufrufen von Lambda-Funktionen, den Zugriff auf DynamoDB usw.), übernimmt sie diese Ausführungsrolle, um diese Aktionen durchzuführen.

  • Berechtigungen: Die IAM-Ausführungsrolle muss mit Berechtigungen konfiguriert werden, die die erforderlichen Aktionen auf anderen AWS-Diensten zulassen. Wenn Ihre Zustandsmaschine beispielsweise AWS Lambda-Funktionen aufrufen muss, muss die IAM-Rolle über die Berechtigung lambda:InvokeFunction verfügen. Ebenso müssen, wenn sie in DynamoDB schreiben muss, entsprechende Berechtigungen (dynamodb:PutItem, dynamodb:UpdateItem usw.) gewährt werden.

Aufzählung

Die ReadOnlyAccess-Richtlinie reicht für alle folgenden Aufzählungsaktionen aus.

# State machines #

## List state machines
aws stepfunctions list-state-machines
## Retrieve informatio about the specified state machine
aws stepfunctions describe-state-machine --state-machine-arn <value>

## List versions for the specified state machine
aws stepfunctions list-state-machine-versions --state-machine-arn <value>
## List aliases for the specified state machine
aws stepfunctions list-state-machine-aliases --state-machine-arn <value>
## Retrieve information about the specified state machine alias
aws stepfunctions describe-state-machine-alias --state-machine-alias-arn <value>

## List executions of a state machine
aws stepfunctions list-executions --state-machine-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]
## Retrieve information and relevant metadata about a state machine execution (output included)
aws stepfunctions describe-execution --execution-arn <value>
## Retrieve information about the state machine associated to the specified execution
aws stepfunctions describe-state-machine-for-execution --execution-arn <value>
## Retrieve the history of the specified execution as a list of events
aws stepfunctions get-execution-history --execution-arn <value> [--reverse-order | --no-reverse-order] [--include-execution-data | --no-include-execution-data]

## List tags for the specified step Functions resource
aws stepfunctions list-tags-for-resource --resource-arn <value>

## Validate the definition of a state machine without creating the resource
aws stepfunctions validate-state-machine-definition --definition <value> [--type <STANDARD | EXPRESS>]

# Activities #

## List existing activities
aws stepfunctions list-activities
## Retrieve information about the specified activity
aws stepfunctions describe-activity --activity-arn <value>

# Map Runs #

## List map runs of an execution
aws stepfunctions list-map-runs --execution-arn <value>
## Provide information about the configuration, progress and results of a Map Run
aws stepfunctions describe-map-run --map-run-arn <value>
## Lists executions of a Map Run
aws stepfunctions list-executions --map-run-arn <value> [--status-filter <RUNNING | SUCCEEDED | FAILED | TIMED_OUT | ABORTED | PENDING_REDRIVE>] [--redrive-filter <REDRIVEN | NOT_REDRIVEN>]

Privesc

In der folgenden Seite können Sie überprüfen, wie Sie Step Functions-Berechtigungen missbrauchen, um Privilegien zu eskalieren:

AWS - Step Functions Privesc

Post Exploitation

AWS - Step Functions Post Exploitation

Persistence

AWS - Step Functions Persistence

References

Support HackTricks

Last updated