Az - Function Apps
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Azure Functions é uma solução sem servidor que permite escrever menos código, manter menos infraestrutura e economizar custos. Em vez de se preocupar com a implantação e manutenção de servidores, a infraestrutura em nuvem fornece todos os recursos atualizados necessários para manter suas aplicações em funcionamento.
No portal do Azure, a integração entre Azure Functions e Azure API Management é facilitada, permitindo que os endpoints de função acionados por HTTP sejam expostos como APIs REST. As APIs expostas dessa maneira são descritas usando uma definição OpenAPI, fornecendo uma interface padrão e independente de linguagem para APIs RESTful.
O plano Flex Consumption oferece escalonamento dinâmico e orientado a eventos com opções de computação flexíveis. Ele adiciona ou remove automaticamente instâncias de função com base na demanda, garantindo uso eficiente de recursos e custo-benefício por meio de um modelo de pagamento conforme o uso. Este plano suporta redes virtuais para maior segurança e permite reduzir os inícios a frio por meio da pré-provisionamento de instâncias. É ideal para aplicações que experimentam cargas de trabalho variáveis e requerem escalonamento rápido sem a necessidade de suporte a contêineres.
O plano tradicional Consumption para Azure Functions é a opção padrão de hospedagem sem servidor, onde você paga apenas pelos recursos de computação quando suas funções estão em execução. Ele escala automaticamente com base no número de eventos recebidos, tornando-se altamente econômico para aplicações com cargas de trabalho intermitentes ou imprevisíveis. Embora não suporte implantações de contêiner, inclui otimizações para reduzir os tempos de início a frio e é adequado para uma ampla gama de aplicações sem servidor que requerem escalonamento automático sem a sobrecarga de gerenciar infraestrutura.
O plano Premium para Azure Functions é projetado para aplicações que precisam de desempenho consistente e recursos avançados. Ele escala automaticamente com base na demanda usando trabalhadores pré-aquecidos, eliminando inícios a frio e garantindo que as funções sejam executadas prontamente, mesmo após períodos de inatividade. Este plano oferece instâncias mais poderosas, tempos de execução estendidos e suporta conectividade de rede virtual. Além disso, permite o uso de imagens personalizadas do Linux, tornando-o adequado para aplicações críticas que requerem alto desempenho e maior controle sobre os recursos.
O plano Dedicado, também conhecido como plano App Service, executa suas funções em máquinas virtuais dedicadas dentro de um ambiente App Service. Este plano fornece faturamento previsível e permite escalonamento manual ou automático de instâncias, tornando-o ideal para cenários de longa duração onde Durable Functions não são adequadas. Ele suporta a execução de vários aplicativos web e de função no mesmo plano, oferece tamanhos de computação maiores e garante total isolamento de computação e acesso seguro à rede por meio de Ambientes de Serviço de Aplicativo (ASE). Esta opção é a melhor para aplicações que precisam de alocação consistente de recursos e personalização extensiva.
Container Apps permitem implantar aplicativos de função em contêineres dentro de um ambiente totalmente gerenciado hospedado pelo Azure Container Apps. Esta opção é perfeita para construir aplicações sem servidor orientadas a eventos que funcionam ao lado de outros microsserviços, APIs e fluxos de trabalho. Suporta o empacotamento de bibliotecas personalizadas com seu código de função, migrando aplicações legadas para microsserviços nativos da nuvem e aproveitando o poder de processamento de alto desempenho com recursos de GPU. Container Apps simplificam a implantação ao eliminar a necessidade de gerenciar clusters Kubernetes, tornando-os ideais para desenvolvedores que buscam flexibilidade e escalabilidade em um ambiente de contêiner.
Ao criar um novo Function App não contêinerizado (mas fornecendo o código para executar), os códigos e outros dados relacionados à função serão armazenados em uma conta de Armazenamento. Por padrão, o console da web criará um novo por função para armazenar o código.
Além disso, sempre que uma nova instância do aplicativo precisar ser executada, o código do aplicativo será coletado daqui e executado.
Isso é muito interessante do ponto de vista de um atacante, pois o acesso de gravação sobre este bucket permitirá que um atacante comprometa o código e eleve privilégios para as identidades gerenciadas dentro do Function App.
É possível dar acesso a uma função para toda a Internet sem exigir qualquer autenticação ou dar acesso baseado em IAM.
Também é possível dar ou restringir o acesso ao Function App a partir da Internet, dando acesso a uma rede interna (VPC) ao Function App.
Isso é muito interessante do ponto de vista de um atacante, pois pode ser possível pivotar para redes internas a partir de uma função Lambda vulnerável exposta à Internet.
Além disso, o Function App pode ter certos endpoints que requerem um certo nível de autenticação, como "admin" ou "anônimo". Um atacante poderia tentar acessar os endpoints permitidos anônimos para contornar as restrições e obter acesso a dados ou funcionalidades sensíveis.
Observe que não há permissões RBAC para dar acesso a usuários para invocar as funções. A invocação da função depende do gatilho selecionado quando foi criada e, se um Gatilho HTTP foi selecionado, pode ser necessário usar uma chave de acesso.
Ao criar um endpoint dentro de uma função usando um gatilho HTTP, é possível indicar o nível de autorização da chave de acesso necessário para acionar a função. Três opções estão disponíveis:
ANONYMOUS: Todos podem acessar a função pela URL.
FUNCTION: O endpoint é acessível apenas a usuários que utilizam uma chave de função, host ou mestre.
ADMIN: O endpoint é acessível apenas a usuários com uma chave mestre.
Tipo de chaves:
Chaves de Função: As chaves de função podem ser padrão ou definidas pelo usuário e são projetadas para conceder acesso exclusivamente a endpoints de função específicos dentro de um Function App. Isso permite um controle de segurança mais granular, garantindo que apenas usuários ou serviços autorizados possam invocar funções específicas sem expor toda a aplicação.
Chaves de Host: As chaves de host, que também podem ser padrão ou definidas pelo usuário, fornecem acesso a todos os endpoints de função dentro de um Function App. Isso é útil quando várias funções precisam ser acessadas usando uma única chave, simplificando a gestão e reduzindo o número de chaves que precisam ser distribuídas ou armazenadas com segurança.
Chave Mestre: A chave mestre (_master
) serve como uma chave administrativa que oferece permissões elevadas, incluindo acesso às APIs REST de tempo de execução de um Function App. Esta chave não pode ser revogada e deve ser tratada com o máximo cuidado. É crucial não compartilhar a chave mestre com terceiros ou incluí-la em aplicações cliente nativas para evitar acesso administrativo não autorizado.
Ao definir a autenticação de uma função como ADMIN (e não ANONYMOUS ou FUNCTION), é necessário usar esta chave.
Chaves de Sistema: As chaves de sistema são gerenciadas por extensões específicas e são necessárias para acessar endpoints de webhook usados por componentes internos. Exemplos incluem o gatilho do Event Grid e Durable Functions, que utilizam chaves de sistema para interagir de forma segura com suas respectivas APIs. As chaves de sistema podem ser regeneradas através do Portal do Azure ou APIs de chave para manter a segurança.
Exemplo para acessar um endpoint de API de função usando uma chave:
https://<function_uniq_name>.azurewebsites.net/api/<endpoint_name>?code=<access_key>
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)