Translated ['src/README.md', 'src/banners/hacktricks-training.md', 'src/

This commit is contained in:
Translator
2024-12-31 20:10:24 +00:00
parent 192d97f7b7
commit 536671c61c
245 changed files with 10169 additions and 12893 deletions

View File

@@ -4,266 +4,253 @@
## Step Functions
AWS Step Functions is a workflow service that enables you to coordinate and orchestrate multiple AWS services into serverless workflows. By using AWS Step Functions, you can design and run workflows that connect various AWS services such as AWS Lambda, Amazon S3, Amazon DynamoDB, and many more, in a sequence of steps. This orchestration service provides a visual workflow interface and offers **state machine** capabilities, allowing you to define each step of the workflow in a declarative manner using JSON-based **Amazon States Language** (ASL).
AWS Step Functions es un servicio de flujo de trabajo que te permite coordinar y orquestar múltiples servicios de AWS en flujos de trabajo sin servidor. Al usar AWS Step Functions, puedes diseñar y ejecutar flujos de trabajo que conectan varios servicios de AWS como AWS Lambda, Amazon S3, Amazon DynamoDB y muchos más, en una secuencia de pasos. Este servicio de orquestación proporciona una interfaz visual de flujo de trabajo y ofrece capacidades de **máquina de estados**, permitiéndote definir cada paso del flujo de trabajo de manera declarativa utilizando **Amazon States Language** (ASL) basado en JSON.
## Key concepts
### Standard vs. Express Workflows
AWS Step Functions offers two types of **state machine workflows**: Standard and Express.
AWS Step Functions ofrece dos tipos de **flujos de trabajo de máquina de estados**: Estándar y Expreso.
- **Standard Workflow**: This default workflow type is designed for long-running, durable, and auditable processes. It supports **exactly-once execution**, ensuring tasks run only once unless retries are specified. It is ideal for workflows needing detailed execution history and can run for up to one year.
- **Express Workflow**: This type is ideal for high-volume, short-duration tasks, running up to five minutes. They support **at-least-once execution**, suitable for idempotent tasks like data processing. These workflows are optimized for cost and performance, charging based on executions, duration, and memory usage.
- **Standard Workflow**: Este tipo de flujo de trabajo predeterminado está diseñado para procesos duraderos, auditables y de larga duración. Soporta **ejecución exactamente una vez**, asegurando que las tareas se ejecuten solo una vez a menos que se especifiquen reintentos. Es ideal para flujos de trabajo que necesitan un historial de ejecución detallado y puede ejecutarse durante hasta un año.
- **Express Workflow**: Este tipo es ideal para tareas de alto volumen y corta duración, que se ejecutan hasta cinco minutos. Soportan **ejecución al menos una vez**, adecuado para tareas idempotentes como el procesamiento de datos. Estos flujos de trabajo están optimizados para costo y rendimiento, cobrando según las ejecuciones, duración y uso de memoria.
### States
States are the essential units of state machines. They define the individual steps within a workflow, being able to perform a variety of functions depending on its type:
Los estados son las unidades esenciales de las máquinas de estados. Definen los pasos individuales dentro de un flujo de trabajo, pudiendo realizar una variedad de funciones dependiendo de su tipo:
- **Task:** Executes a job, often using an AWS service like Lambda.
- **Choice:** Makes decisions based on input.
- **Fail/Succeed:** Ends the execution with a failure or success.
- **Pass:** Passes input to output or injects data.
- **Wait:** Delays execution for a set time.
- **Parallel:** Initiates parallel branches.
- **Map:** Dynamically iterates steps over items.
- **Task:** Ejecuta un trabajo, a menudo utilizando un servicio de AWS como Lambda.
- **Choice:** Toma decisiones basadas en la entrada.
- **Fail/Succeed:** Termina la ejecución con un fallo o éxito.
- **Pass:** Pasa la entrada a la salida o inyecta datos.
- **Wait:** Retrasa la ejecución por un tiempo establecido.
- **Parallel:** Inicia ramas paralelas.
- **Map:** Itera dinámicamente pasos sobre elementos.
### Task
A **Task** state represents a single unit of work executed by a state machine. Tasks can invoke various resources, including activities, Lambda functions, AWS services, or third-party APIs.
Un estado de **Task** representa una unidad de trabajo única ejecutada por una máquina de estados. Las tareas pueden invocar varios recursos, incluyendo actividades, funciones Lambda, servicios de AWS o APIs de terceros.
- **Activities**: Custom workers you manage, suitable for long-running processes.
- Resource: **`arn:aws:states:region:account:activity:name`**.
- **Lambda Functions**: Executes AWS Lambda functions.
- Resource: **`arn:aws:lambda:region:account:function:function-name`**.
- **AWS Services**: Integrates directly with other AWS services, like DynamoDB or S3.
- Resource: **`arn:partition:states:region:account:servicename:APIname`**.
- **HTTP Task**: Calls third-party APIs.
- Resource field: **`arn:aws:states:::http:invoke`**. Then, you should provide the API endpoint configuration details, such as the API URL, method, and authentication details.
The following example shows a Task state definition that invokes a Lambda function called HelloWorld:
- **Activities**: Trabajadores personalizados que gestionas, adecuados para procesos de larga duración.
- Resource: **`arn:aws:states:region:account:activity:name`**.
- **Lambda Functions**: Ejecuta funciones de AWS Lambda.
- Resource: **`arn:aws:lambda:region:account:function:function-name`**.
- **AWS Services**: Se integra directamente con otros servicios de AWS, como DynamoDB o S3.
- Resource: **`arn:partition:states:region:account:servicename:APIname`**.
- **HTTP Task**: Llama a APIs de terceros.
- Resource field: **`arn:aws:states:::http:invoke`**. Luego, debes proporcionar los detalles de configuración del endpoint de la API, como la URL de la API, el método y los detalles de autenticación.
El siguiente ejemplo muestra una definición de estado de Task que invoca una función Lambda llamada HelloWorld:
```json
"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"Payload.$": "$",
"FunctionName": "arn:aws:lambda:<region>:<account-id>:function:HelloWorld"
},
"End": true
}
```
### Choice
A **Choice** state adds conditional logic to a workflow, enabling decisions based on input data. It evaluates the specified conditions and transitions to the corresponding state based on the results.
Un **Choice** state añade lógica condicional a un flujo de trabajo, permitiendo decisiones basadas en datos de entrada. Evalúa las condiciones especificadas y transiciona al estado correspondiente según los resultados.
- **Comparison**: Each choice rule includes a comparison operator (e.g., **`NumericEquals`**, **`StringEquals`**) that compares an input variable to a specified value or another variable.
- **Next Field**: Choice states do not support don't support the **`End`** field, instead, they define the **`Next`** state to transition to if the comparison is true.
Example of **Choice** state:
- **Comparison**: Cada regla de elección incluye un operador de comparación (por ejemplo, **`NumericEquals`**, **`StringEquals`**) que compara una variable de entrada con un valor especificado u otra variable.
- **Next Field**: Los estados de elección no soportan el campo **`End`**, en su lugar, definen el estado **`Next`** al que transicionar si la comparación es verdadera.
Ejemplo de **Choice** state:
```json
{
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
"Variable": "$.timeStamp",
"TimestampEquals": "2000-01-01T00:00:00Z",
"Next": "TimeState"
}
```
### Fail/Succeed
A **`Fail`** state stops the execution of a state machine and marks it as a failure. It is used to specify an error name and a cause, providing details about the failure. This state is terminal, meaning it ends the execution flow.
Un **`Fail`** estado detiene la ejecución de una máquina de estados y la marca como un fallo. Se utiliza para especificar un nombre de error y una causa, proporcionando detalles sobre el fallo. Este estado es terminal, lo que significa que finaliza el flujo de ejecución.
A **`Succeed`** state stops the execution successfully. It is typically used to terminate the workflow when it completes successfully. This state does not require a **`Next`** field.
Un **`Succeed`** estado detiene la ejecución con éxito. Se utiliza típicamente para terminar el flujo de trabajo cuando se completa con éxito. Este estado no requiere un campo **`Next`**.
{{#tabs }}
{{#tab name="Fail example" }}
```json
"FailState": {
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
"Type": "Fail",
"Error": "ErrorName",
"Cause": "Error details"
}
```
{{#endtab }}
{{#tab name="Succeed example" }}
{{#tab name="Ejemplo de éxito" }}
```json
"SuccessState": {
"Type": "Succeed"
"Type": "Succeed"
}
```
{{#endtab }}
{{#endtabs }}
### Pass
A **Pass** state passes its input to its output either without performing any work or transformin JSON state input using filters, and then passing the transformed data to the next state. It is useful for testing and constructing state machines, allowing you to inject static data or transform it.
Un **Pass** state pasa su entrada a su salida ya sea sin realizar ningún trabajo o transformando la entrada del estado JSON utilizando filtros, y luego pasando los datos transformados al siguiente estado. Es útil para probar y construir máquinas de estado, permitiéndote inyectar datos estáticos o transformarlos.
```json
"PassState": {
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
"Type": "Pass",
"Result": {"key": "value"},
"ResultPath": "$.newField",
"Next": "NextState"
}
```
### Wait
Un **Wait** state retrasa la ejecución de la máquina de estados por una duración especificada. Hay tres métodos principales para configurar el tiempo de espera:
- **X Seconds**: Un número fijo de segundos para esperar.
```json
"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
```
### Wait
- **Absolute Timestamp**: Un tiempo exacto hasta el cual esperar.
A **Wait** state delays the execution of the state machine for a specified duration. There are three primary methods to configure the wait time:
```json
"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
```
- **X Seconds**: A fixed number of seconds to wait.
- **Dynamic Wait**: Basado en la entrada usando **`SecondsPath`** o **`TimestampPath`**.
```json
"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
```
- **Absolute Timestamp**: An exact time to wait until.
```json
"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
```
- **Dynamic Wait**: Based on input using **`SecondsPath`** or **`TimestampPath`**.
```json
jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}
```
```json
jsonCopiar código
"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}
```
### Parallel
A **Parallel** state allows you to execute multiple branches of tasks concurrently within your workflow. Each branch runs independently and processes its own sequence of states. The execution waits until all branches complete before proceeding to the next state. Its key fields are:
- **Branches**: An array defining the parallel execution paths. Each branch is a separate state machine.
- **ResultPath**: Defines where (in the input) to place the combined output of the branches.
- **Retry and Catch**: Error handling configurations for the parallel state.
Un **Parallel** state te permite ejecutar múltiples ramas de tareas de manera concurrente dentro de tu flujo de trabajo. Cada rama se ejecuta de forma independiente y procesa su propia secuencia de estados. La ejecución espera hasta que todas las ramas se completen antes de proceder al siguiente estado. Sus campos clave son:
- **Branches**: Un array que define las rutas de ejecución paralela. Cada rama es una máquina de estados separada.
- **ResultPath**: Define dónde (en la entrada) colocar la salida combinada de las ramas.
- **Retry and Catch**: Configuraciones de manejo de errores para el estado paralelo.
```json
"ParallelState": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
"Type": "Parallel",
"Branches": [
{
"StartAt": "Task1",
"States": { ... }
},
{
"StartAt": "Task2",
"States": { ... }
}
],
"Next": "NextState"
}
```
### Mapa
Un **Mapa** permite la ejecución de un conjunto de pasos para cada elemento en un conjunto de datos. Se utiliza para el procesamiento paralelo de datos. Dependiendo de cómo desees procesar los elementos del conjunto de datos, Step Functions proporciona los siguientes modos:
- **Modo en línea**: Ejecuta un subconjunto de estados para cada elemento del arreglo JSON. Adecuado para tareas a pequeña escala con menos de 40 iteraciones paralelas, ejecutando cada una de ellas en el contexto del flujo de trabajo que contiene el estado **`Map`**.
```json
"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"
}
```
### Map
- **Modo distribuido**: Diseñado para el procesamiento paralelo a gran escala con alta concurrencia. Soporta el procesamiento de grandes conjuntos de datos, como los almacenados en Amazon S3, permitiendo una alta concurrencia de hasta 10,000 ejecuciones de flujos de trabajo hijos paralelos, ejecutando estos hijos como una ejecución hija separada.
A **Map** state enables the execution of a set of steps for each item in an dataset. It's used for parallel processing of data. Depending on how you want to process the items of the dataset, Step Functions provides the following modes:
```json
"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"
}
}
}
```
- **Inline Mode**: Executes a subset of states for each JSON array item. Suitable for small-scale tasks with less than 40 parallel iterations, running each of them in the context of the workflow that contains the **`Map`** state.
### Versiones y alias
```json
"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"
}
```
Step Functions también te permite gestionar implementaciones de flujos de trabajo a través de **versiones** y **alias** de máquinas de estado. Una versión representa una instantánea de una máquina de estado que puede ser ejecutada. Los alias sirven como punteros a hasta dos versiones de una máquina de estado.
- **Distributed Mode**: Designed for large-scale parallel processing with high concurrency. Supports processing large datasets, such as those stored in Amazon S3, enabling a high concurrency of up 10,000 parallel child workflow executions, running these child as a separate child execution.
- **Versiones**: Estas instantáneas inmutables de una máquina de estado se crean a partir de la revisión más reciente de esa máquina de estado. Cada versión se identifica por un ARN único que combina el ARN de la máquina de estado con el número de versión, separado por dos puntos (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number`**). Las versiones no pueden ser editadas, pero puedes actualizar la máquina de estado y publicar una nueva versión, o usar la versión de máquina de estado deseada.
- **Alias**: Estos punteros pueden hacer referencia a hasta dos versiones de la misma máquina de estado. Se pueden crear múltiples alias para una sola máquina de estado, cada uno identificado por un ARN único construido combinando el ARN de la máquina de estado con el nombre del alias, separado por dos puntos (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName`**). Los alias permiten el enrutamiento de tráfico entre una de las dos versiones de una máquina de estado. Alternativamente, un alias puede apuntar a una versión específica de la máquina de estado, pero no a otros alias. Pueden ser actualizados para redirigir a una versión diferente de la máquina de estado según sea necesario, facilitando implementaciones controladas y gestión de flujos de trabajo.
```json
"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"
}
}
}
```
Para más información detallada sobre **ASL**, consulta: [**Amazon States Language**](https://states-language.net/spec.html).
### Versions and aliases
## Roles de IAM para máquinas de estado
Step Functions also lets you manage workflow deployments through **versions** and **aliases** of state machines. A version represents a snapshot of a state machine that can be executed. Aliases serve as pointers to up to two versions of a state machine.
AWS Step Functions utiliza roles de AWS Identity and Access Management (IAM) para controlar el acceso a recursos y acciones dentro de las máquinas de estado. Aquí están los aspectos clave relacionados con la seguridad y los roles de IAM en AWS Step Functions:
- **Versions**: These immutable snapshots of a state machine are created from the most recent revision of that state machine. Each version is identified by a unique ARN that combines the state machine ARN with the version number, separated by a colon (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number`**). Versions cannot be edited, but you can update the state machine and publish a new version, or use the desired state machine version.
- **Aliases**: These pointers can reference up to two versions of the same state machine. Multiple aliases can be created for a single state machine, each identified by a unique ARN constructed by combining the state machine ARN with the alias name, separated by a colon (**`arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName`**). Aliases enable routing of traffic between one of the two versions of a state machine. Alternatively, an alias can point to a single specific version of the state machine, but not to other aliases. They can be updated to redirect to a different version of the state machine as needed, facilitating controlled deployments and workflow management.
- **Rol de ejecución**: Cada máquina de estado en AWS Step Functions está asociada con un rol de ejecución de IAM. Este rol define qué acciones puede realizar la máquina de estado en tu nombre. Cuando una máquina de estado transita entre estados que interactúan con servicios de AWS (como invocar funciones Lambda, acceder a DynamoDB, etc.), asume este rol de ejecución para llevar a cabo esas acciones.
- **Permisos**: El rol de ejecución de IAM debe ser configurado con permisos que permitan las acciones necesarias en otros servicios de AWS. Por ejemplo, si tu máquina de estado necesita invocar funciones de AWS Lambda, el rol de IAM debe tener permisos de **`lambda:InvokeFunction`**. De manera similar, si necesita escribir en DynamoDB, se deben otorgar los permisos apropiados (**`dynamodb:PutItem`**, **`dynamodb:UpdateItem`**, etc.).
For more detailed information about **ASL**, check: [**Amazon States Language**](https://states-language.net/spec.html).
## IAM Roles for State machines
AWS Step Functions utilizes AWS Identity and Access Management (IAM) roles to control access to resources and actions within state machines. Here are the key aspects related to security and IAM roles in AWS Step Functions:
- **Execution Role**: Each state machine in AWS Step Functions is associated with an IAM execution role. This role defines what actions the state machine can perform on your behalf. When a state machine transitions between states that interact with AWS services (like invoking Lambda functions, accessing DynamoDB, etc.), it assumes this execution role to carry out those actions.
- **Permissions**: The IAM execution role must be configured with permissions that allow the necessary actions on other AWS services. For example, if your state machine needs to invoke AWS Lambda functions, the IAM role must have **`lambda:InvokeFunction`** permissions. Similarly, if it needs to write to DynamoDB, appropriate permissions (**`dynamodb:PutItem`**, **`dynamodb:UpdateItem`**, etc.) must be granted.
## Enumeration
ReadOnlyAccess policy is enough for all the following enumeration actions.
## Enumeración
La política ReadOnlyAccess es suficiente para todas las siguientes acciones de enumeración.
```bash
# State machines #
@@ -310,35 +297,30 @@ 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 the following page, you can check how to **abuse Step Functions permissions to escalate privileges**:
En la siguiente página, puedes verificar cómo **abusar de los permisos de Step Functions para escalar privilegios**:
{{#ref}}
../aws-privilege-escalation/aws-stepfunctions-privesc.md
{{#endref}}
## Post Exploitation
## Post Explotación
{{#ref}}
../aws-post-exploitation/aws-stepfunctions-post-exploitation.md
{{#endref}}
## Persistence
## Persistencia
{{#ref}}
../aws-persistence/aws-step-functions-persistence.md
{{#endref}}
## References
## Referencias
- [https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsstepfunctions.html](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsstepfunctions.html)
- [https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)
- [https://states-language.net/spec.html](https://states-language.net/spec.html)
{{#include ../../../banners/hacktricks-training.md}}