AWS - Step Functions Enum

Suporte ao HackTricks

Funções de Passo

AWS Step Functions é um serviço de fluxo de trabalho que permite coordenar e orquestrar vários serviços AWS em fluxos de trabalho sem servidor. Usando o AWS Step Functions, você pode projetar e executar fluxos de trabalho que conectam vários serviços AWS, como AWS Lambda, Amazon S3, Amazon DynamoDB e muitos mais, em uma sequência de etapas. Este serviço de orquestração fornece uma interface visual de fluxo de trabalho e oferece capacidades de máquina de estado, permitindo que você defina cada etapa do fluxo de trabalho de maneira declarativa usando a Linguagem de Estados da Amazon (ASL) baseada em JSON.

Conceitos-chave

Fluxos de Trabalho Padrão vs. Express

AWS Step Functions oferece dois tipos de fluxos de trabalho de máquina de estado: Padrão e Express.

  • Fluxo de Trabalho Padrão: Este tipo de fluxo de trabalho padrão é projetado para processos de longa duração, duráveis e auditáveis. Ele suporta execução exatamente uma vez, garantindo que as tarefas sejam executadas apenas uma vez, a menos que as tentativas sejam especificadas. É ideal para fluxos de trabalho que precisam de um histórico de execução detalhado e pode durar até um ano.

  • Fluxo de Trabalho Express: Este tipo é ideal para tarefas de alto volume e curta duração, com duração de até cinco minutos. Eles suportam execução pelo menos uma vez, adequado para tarefas idempotentes, como processamento de dados. Esses fluxos de trabalho são otimizados para custo e desempenho, cobrando com base em execuções, duração e uso de memória.

Estados

Os estados são as unidades essenciais das máquinas de estado. Eles definem as etapas individuais dentro de um fluxo de trabalho, podendo realizar uma variedade de funções dependendo de seu tipo:

  • Tarefa: Executa um trabalho, muitas vezes usando um serviço AWS como Lambda.

  • Escolha: Toma decisões com base na entrada.

  • Falha/Sucesso: Termina a execução com uma falha ou sucesso.

  • Passar: Passa a entrada para a saída ou injeta dados.

  • Esperar: Atraso na execução por um tempo definido.

  • Paralelo: Inicia ramificações paralelas.

  • Mapa: Itera dinamicamente etapas sobre itens.

Tarefa

Um estado de Tarefa representa uma única unidade de trabalho executada por uma máquina de estado. As tarefas podem invocar vários recursos, incluindo atividades, funções Lambda, serviços AWS ou APIs de terceiros.

  • Atividades: Trabalhadores personalizados que você gerencia, adequados para processos de longa duração.

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

  • Funções Lambda: Executa funções AWS Lambda.

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

  • Serviços AWS: Integra-se diretamente com outros serviços AWS, como DynamoDB ou S3.

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

  • Tarefa HTTP: Chama APIs de terceiros.

  • Campo de recurso: arn:aws:states:::http:invoke. Em seguida, você deve fornecer os detalhes de configuração do endpoint da API, como a URL da API, método e detalhes de autenticação.

O seguinte exemplo mostra uma definição de estado de Tarefa que invoca uma função Lambda chamada HelloWorld:

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

Choice

Um Choice state adiciona lógica condicional a um fluxo de trabalho, permitindo decisões com base em dados de entrada. Ele avalia as condições especificadas e transita para o estado correspondente com base nos resultados.

  • Comparação: Cada regra de escolha inclui um operador de comparação (por exemplo, NumericEquals, StringEquals) que compara uma variável de entrada a um valor especificado ou outra variável.

  • Campo Next: Os estados de escolha não suportam o campo End, em vez disso, eles definem o estado Next para transitar se a comparação for verdadeira.

Exemplo de Choice state:

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

Falha/Sucesso

Um Fail estado interrompe a execução de uma máquina de estados e a marca como uma falha. É usado para especificar um nome de erro e uma causa, fornecendo detalhes sobre a falha. Este estado é terminal, o que significa que encerra o fluxo de execução.

Um Succeed estado interrompe a execução com sucesso. É tipicamente usado para encerrar o fluxo de trabalho quando ele é concluído com sucesso. Este estado não requer um campo Next.

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

Pass

Um estado Pass passa sua entrada para sua saída, seja sem realizar qualquer trabalho ou transformando a entrada do estado JSON usando filtros, e então passando os dados transformados para o próximo estado. É útil para testar e construir máquinas de estado, permitindo que você injete dados estáticos ou os transforme.

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

Wait

Um Wait state atrasa a execução da máquina de estados por uma duração especificada. Existem três métodos principais para configurar o tempo de espera:

  • X Segundos: Um número fixo de segundos para esperar.

"WaitState": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
  • Timestamp Absoluto: Um horário exato para esperar até.

"WaitState": {
"Type": "Wait",
"Timestamp": "2024-03-14T01:59:00Z",
"Next": "NextState"
}
  • Espera Dinâmica: Baseada em entrada usando SecondsPath ou TimestampPath.

"WaitState": {
"Type": "Wait",
"TimestampPath": "$.expirydate",
"Next": "NextState"
}

Parallel

Um Parallel state permite que você execute múltiplos ramos de tarefas simultaneamente dentro do seu fluxo de trabalho. Cada ramo é executado de forma independente e processa sua própria sequência de estados. A execução espera até que todos os ramos sejam concluídos antes de prosseguir para o próximo estado. Seus campos principais são:

  • Branches: Um array definindo os caminhos de execução paralela. Cada ramo é uma máquina de estados separada.

  • ResultPath: Define onde (na entrada) colocar a saída combinada dos ramos.

  • Retry e Catch: Configurações de tratamento de erros para o estado paralelo.

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

Mapa

Um Map state permite a execução de um conjunto de etapas para cada item em um conjunto de dados. É usado para processamento paralelo de dados. Dependendo de como você deseja processar os itens do conjunto de dados, o Step Functions fornece os seguintes modos:

  • Modo Inline: Executa um subconjunto de estados para cada item do array JSON. Adequado para tarefas em pequena escala com menos de 40 iterações paralelas, executando cada uma delas no contexto do fluxo de trabalho que contém o Map state.

"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"
}
  • Modo Distribuído: Projetado para processamento paralelo em larga escala com alta concorrência. Suporta o processamento de grandes conjuntos de dados, como aqueles armazenados no Amazon S3, permitindo uma alta concorrência de até 10.000 execuções de fluxo de trabalho filho paralelas, executando esses filhos como uma execução separada.

"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"
}
}
}

Versões e aliases

O Step Functions também permite gerenciar implantações de fluxo de trabalho através de versões e aliases de máquinas de estado. Uma versão representa uma captura instantânea de uma máquina de estado que pode ser executada. Aliases servem como ponteiros para até duas versões de uma máquina de estado.

  • Versões: Essas capturas instantâneas imutáveis de uma máquina de estado são criadas a partir da revisão mais recente dessa máquina de estado. Cada versão é identificada por um ARN exclusivo que combina o ARN da máquina de estado com o número da versão, separado por dois pontos (arn:aws:states:region:account-id:stateMachine:StateMachineName:version-number). Versões não podem ser editadas, mas você pode atualizar a máquina de estado e publicar uma nova versão, ou usar a versão desejada da máquina de estado.

  • Aliases: Esses ponteiros podem referenciar até duas versões da mesma máquina de estado. Múltiplos aliases podem ser criados para uma única máquina de estado, cada um identificado por um ARN exclusivo construído combinando o ARN da máquina de estado com o nome do alias, separado por dois pontos (arn:aws:states:region:account-id:stateMachine:StateMachineName:aliasName). Aliases permitem o roteamento de tráfego entre uma das duas versões de uma máquina de estado. Alternativamente, um alias pode apontar para uma única versão específica da máquina de estado, mas não para outros aliases. Eles podem ser atualizados para redirecionar para uma versão diferente da máquina de estado conforme necessário, facilitando implantações controladas e gerenciamento de fluxo de trabalho.

Para mais informações detalhadas sobre ASL, consulte: Amazon States Language.

Funções IAM para Máquinas de Estado

O AWS Step Functions utiliza funções do AWS Identity and Access Management (IAM) para controlar o acesso a recursos e ações dentro das máquinas de estado. Aqui estão os principais aspectos relacionados à segurança e funções IAM no AWS Step Functions:

  • Função de Execução: Cada máquina de estado no AWS Step Functions está associada a uma função de execução IAM. Essa função define quais ações a máquina de estado pode realizar em seu nome. Quando uma máquina de estado transita entre estados que interagem com serviços AWS (como invocar funções Lambda, acessar DynamoDB, etc.), ela assume essa função de execução para realizar essas ações.

  • Permissões: A função de execução IAM deve ser configurada com permissões que permitam as ações necessárias em outros serviços AWS. Por exemplo, se sua máquina de estado precisar invocar funções AWS Lambda, a função IAM deve ter permissões lambda:InvokeFunction. Da mesma forma, se precisar gravar no DynamoDB, permissões apropriadas (dynamodb:PutItem, dynamodb:UpdateItem, etc.) devem ser concedidas.

Enumeração

A política ReadOnlyAccess é suficiente para todas as seguintes ações de enumeração.

# 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

Na página a seguir, você pode verificar como abusar das permissões do Step Functions para escalar privilégios:

AWS - Step Functions Privesc

Pós Exploração

AWS - Step Functions Post Exploitation

Persistência

AWS - Step Functions Persistence

Referências

Support HackTricks

Last updated