Proteger o Azure Functions
De muitas maneiras, planejar o desenvolvimento, a implantação e a operação seguros de funções sem servidor é muito parecido com o de qualquer aplicativo Web ou hospedado na nuvem. O Serviço de Aplicativo do Azure fornece a infraestrutura de hospedagem para seus aplicativos de funções. Este artigo fornece estratégias de segurança para executar o código de função e como o Serviço de Aplicativo pode ajudá-lo a proteger suas funções.
Os componentes de plataforma do Serviço de Aplicativo, incluindo VMs do Azure, armazenamento, conexões de rede, estruturas da Web, recursos de integração e gerenciamento, são ativamente seguros e protegidos. O Serviço de Aplicativo passa por verificações de conformidade rigorosas continuamente para garantir que:
- Os recursos do aplicativo estejam protegidos dos recursos do Azure de outros clientes.
- Instâncias de VM e software de runtime são atualizados regularmente para tratar vulnerabilidades recentemente descobertas.
- A comunicação de segredos (como cadeias de conexão) entre o aplicativo e outros recursos do Azure (como Banco de Dados SQL) permanece no Azure e não ultrapassa limites de rede. Segredos sempre são criptografados quando armazenados.
- Toda a comunicação sobre os recursos de conectividade do Serviço de Aplicativo, como conexão híbrida, é criptografada.
- As conexões com ferramentas de gerenciamento remoto como Azure PowerShell, CLI do Azure, SDKs do Azure, APIs REST são todas criptografadas.
- O gerenciamento de ameaças 24 horas protege a infraestrutura e a plataforma contra malware, ataque de DDoS (negação de serviço distribuído), MITM (man-in-the-middle) e outras ameaças.
Para saber mais sobre segurança de plataforma e infraestrutura no Azure, confira Centro de Confiabilidade do Azure.
Para obter um conjunto de recomendações de segurança que seguem o Microsoft Cloud Security Benchmark, confira a Linha de Base de Segurança do Azure para Azure Functions.
Operação segura
Esta seção orienta você sobre como configurar e executar seu aplicativo de funções da maneira mais segura possível.
Defender para Nuvem
O Defender para Nuvem se integra ao aplicativo de funções no portal. Ele fornece, gratuitamente, uma avaliação rápida de possíveis vulnerabilidades de segurança relacionadas à configuração. Os aplicativos de funções em execução em um plano dedicado também podem usar os recursos de segurança aprimorados do Defender para Nuvem mediante um custo extra. Para saber mais, confira Proteger seus aplicativos Web e APIs do Azure App Service.
Registrar e monitorar
Uma maneira de detectar ataques é por meio do monitoramento de atividades e da análise de logs. O Functions oferece integração com o Application Insights para coletar dados de log, de desempenho e de erro para seu aplicativo de funções. O Application Insights detecta automaticamente anomalias de desempenho e inclui ferramentas de análise avançadas para ajudar a diagnosticar problemas e entender como suas funções são usadas. Para saber mais, consulte Monitorar Azure Functions.
As funções também se integram aos logs do Azure Monitor para permitir que você consolide logs do aplicativo de funções com eventos do sistema para uma análise mais fácil. Você pode usar as configurações de diagnóstico para definir a exportação de streaming de métricas e logs de plataforma das suas funções para o destino de sua escolha, como um espaço de trabalho do Log Analytics. Para saber mais, confira Monitoramento do Azure Functions com Logs do Azure Monitor.
Para detecção de ameaças de nível empresarial e automação de resposta, transmita seus logs e eventos para um espaço de trabalho do Log Analytics. Depois você pode conectar o Microsoft Sentinel com este workspace. Para saber mais, confira O que é o Microsoft Azure Sentinel.
Para obter mais recomendações de segurança para a observação, consulte a Linha de base de segurança do Azure para Azure Functions.
Pontos de extremidade HTTP seguros
Os pontos de extremidade HTTP expostos publicamente fornecem um vetor de ataque para atores mal-intencionados. Ao proteger seus pontos de extremidade HTTP, você deve usar uma abordagem de segurança em camadas. Essas técnicas podem ser usadas para reduzir a vulnerabilidade de pontos de extremidade HTTP expostos publicamente, ordenados do mais básico para o mais seguro e restritivo:
- Exigir HTTPS
- Exigir chaves de acesso
- Habilitar a autenticação/autorização do Serviço de Aplicativo
- Usar o Gerenciamento de API do Azure (APIM) para autenticar solicitações
- Implantar seu aplicativo de funções em uma rede virtual
- Implantar seu aplicativo de funções em isolamento
Solicitar HTTPS
Por padrão, os clientes podem se conectar a pontos de extremidade de função usando HTTP ou HTTPS. Você deve redirecionar HTTP para HTTPS, pois HTTPS usa o protocolo TLS/SSL para fornecer uma conexão segura, que é criptografada e autenticada. Para saber como, consulte Impor HTTPS.
Quando você exigir HTTPS, também deverá exigir a versão mais recente do TLS. Para saber como, consulte Impor versões de TLS.
Para obter mais informações, consulte Conexões seguras (TLS).
Chaves de acesso de função
O Functions permite que você use chaves para dificultar o acesso aos pontos de extremidade de função. Exceto se o nível de acesso HTTP em uma função disparada por HTTP estiver definido como anonymous
, as solicitações devem incluir uma chave de acesso na solicitação. Para obter mais informações, consulte Trabalhar com chaves de acesso no Azure Functions.
Embora as chaves de acesso possam oferecer alguma mitigação para o acesso indesejado, a única maneira de realmente proteger seus pontos de extremidade de função é implementando a autenticação positiva dos clientes que acessam suas funções. Em seguida, você pode tomar decisões de autorização com base na identidade.
Para o nível mais alto de segurança, você também pode proteger toda a arquitetura do aplicativo dentro de uma rede virtual usando pontos de extremidade privados ou executando em isolamento.
Desabilitar pontos de extremidade administrativos
Os aplicativos de funções podem fornecer pontos de extremidade administrativos na rota /admin
que podem ser usados para operações como obter informações de status do host e executar invocações de testes. Quando expostas, as solicitações relativas a esses pontos de extremidade precisam incluir a chave mestra do aplicativo. As operações administrativas também estão disponíveis por meio da API Microsoft.Web/sites
do Azure Resource Manager, que oferece o RBAC do Azure. Você pode desabilitar os pontos de extremidade de /admin
ao definir a propriedade functionsRuntimeAdminIsolationEnabled
do site como true
. Essa propriedade não pode ser definida para aplicativos em execução no SKU de Consumo em Linux e não pode ser definida para aplicativos em execução na versão 1.x do Azure Functions. Se você estiver usando a versão 1.x, primeiro deverá migrar para a versão 4.x.
Habilitar a Autenticação/Autorização do Serviço de Aplicativo
A plataforma do Serviço de Aplicativo permite que você use o Microsoft Entra ID e vários provedores de identidade de terceiros para autenticar clientes. Você pode usar essa estratégia para implementar regras de autorização personalizadas para suas funções e trabalhar com informações de usuário por meio do código da função. Para saber mais, consulte Autenticação e autorização no Serviço de Aplicativo do Azure e Trabalhando com identidades do cliente.
Use o APIM (Gerenciamento de API do Azure) para autenticar solicitações
O APIM oferece várias opções de segurança de API para solicitações de entrada. Para saber mais, confira Políticas de autenticação do Gerenciamento de API. Com o APIM em vigor, você pode configurar o aplicativo de funções para aceitar solicitações somente do endereço IP da sua instância do APIM. Para saber mais, confira Restrições de endereço IP.
Permissões
Assim como ocorre com qualquer aplicativo ou serviço, a meta é executar seu aplicativo de funções com as permissões mais baixas possíveis.
Permissões de gerenciamento do usuário
O Functions dá suporte ao controle de acesso baseado em função (RBAC) do Azure interno. As funções do Azure compatíveis com o Functions são Colaborador, Proprietário e Leitor.
As permissões são efetivas no nível do aplicativo de funções. A função de Colaborador é necessária para executar a maioria das tarefas de nível de aplicativo de função. Você também precisa da função Colaborador e da permissão de Leitor de Monitoramento para exibir dados de log no Aplicativo Insights. Somente a função de Proprietário pode excluir um aplicativo de funções.
Organizar funções por privilégio
As cadeias de conexão e outras credenciais armazenadas nas configurações do aplicativo dão a todas as funções no aplicativo de funções o mesmo conjunto de permissões no recurso associado. Considere minimizar o número de funções com acesso a credenciais específicas movendo funções que não usam essas credenciais para um aplicativo de funções separado. Você sempre pode usar técnicas como encadeamento de funções para passar dados entre funções em diferentes aplicativos de funções.
Identidades gerenciadas
Uma identidade gerenciada do Microsoft Entra ID permite que seu aplicativo acesse facilmente outros recursos protegidos pelo Microsoft Entra, como o Azure Key Vault. A identidade é gerenciada pela plataforma do Azure e não exige provisionamento ou giro de nenhum segredo. Para saber mais sobre identidades gerenciadas no Microsoft Entra ID, confira Identidades gerenciadas para recursos do Azure.
Seu aplicativo pode receber dois tipos de identidades:
- Uma identidade atribuída pelo sistema está vinculada ao aplicativo e será excluída se o aplicativo for excluído. Um aplicativo só pode ter uma identidade atribuída pelo sistema.
- Uma identidade atribuída pelo usuário é um recurso independente do Azure que pode ser atribuído ao seu aplicativo. Um aplicativo pode ter várias identidades atribuídas pelo usuário e uma identidade atribuída pelo usuário pode ser atribuída a vários recursos do Azure, como dois aplicativos do Serviço de Aplicativo.
Identidades gerenciadas podem ser usadas no lugar de segredos para conexões de alguns gatilhos e associações. Consulte conexões baseadas em identidade.
Para obter mais informações, consulte Como usar identidades gerenciadas para o Serviço de Aplicativo e o Azure Functions.
Restringir o acesso CORS
O CORS (compartilhamento de recursos entre origens) é uma maneira de permitir que aplicativos Web em execução em outro domínio façam solicitações para seus pontos de extremidade de gatilho HTTP. O Serviço de Aplicativo fornece suporte interno para a entrega dos cabeçalhos CORS necessários em solicitações HTTP. As regras de CORS são definidas em um nível de aplicativo de funções.
Embora seja tentador usar um curinga que permite que todos os sites acessem seu ponto de extremidade, isso elimina a finalidade do CORS, que é ajudar a evitar ataques de script entre sites. Em vez disso, adicione uma entrada CORS separada para o domínio de cada aplicativo Web que deve acessar seu ponto de extremidade.
Gerenciamento de segredos
Para se conectar aos vários serviços e recursos necessários para executar seu código, os aplicativos de função precisam ser capazes de acessar segredos, como cadeias de conexão e chaves de serviço. Esta seção descreve como armazenar segredos exigidos por suas funções.
Nunca armazene segredos no seu código de função.
Configurações do aplicativo
Por padrão, armazene cadeias de conexão e segredos usados pelo seu aplicativo de funções e associações como configurações de aplicativo. Isso disponibiliza essas credenciais tanto para o código de função quanto para as várias associações usadas pela função. O nome da configuração do aplicativo (chave) é usado para recuperar o valor real, que é o segredo.
Por exemplo, cada aplicativo de funções requer uma conta de armazenamento associada, que é usada pelo tempo de execução. Por padrão, a conexão com essa conta de armazenamento é armazenada em uma configuração de aplicativo chamada AzureWebJobsStorage
.
As configurações do aplicativo e cadeias de conexão são armazenadas e criptografadas no Azure. Elas são descriptografadas somente antes de serem injetadas na memória do processo do aplicativo quando o aplicativo é iniciado. As chaves de criptografia são giradas regularmente. Se você preferir gerenciar o armazenamento seguro de seus segredos, as configurações do aplicativo deverão fazer referência aos segredos do Azure Key Vault.
Você também pode criptografar as configurações por padrão no arquivo local.settings.json
ao desenvolver funções no computador local. Para obter mais informações, confira Criptografar o arquivo de configurações local.
Referências de Key Vault
Embora as configurações do aplicativo sejam suficientes para a maioria das funções, talvez você queira compartilhar os mesmos segredos em vários serviços. Nesse caso, o armazenamento redundante de segredos resulta em mais vulnerabilidades potenciais. Uma abordagem mais segura é usar um serviço de armazenamento de segredo central e usar referências a esse serviço em vez dos próprios segredos.
Azure Key Vault é um serviço que fornece gerenciamento centralizado de segredos, com controle total sobre políticas de acesso e histórico de auditoria. Você pode usar uma referência de Key Vault no lugar de uma cadeia de conexão ou chave em suas configurações de aplicativo. Para saber mais, consulte Usar as referências do Key Vault para o Serviço de Aplicativo e o Azure Functions.
Conexões baseadas em identidade
As identidades podem ser usadas no lugar de segredos para se conectar a alguns recursos. Isso tem a vantagem de não exigir o gerenciamento de um segredo e fornece auditoria e controle de acesso mais refinados.
Ao escrever um código que cria a conexão com os Serviços do Azure que dão suporte à autenticação do Microsoft Entra, opte por usar uma identidade em vez de um segredo ou cadeia de conexão. Os detalhes de ambos os métodos de conexão são abordados na documentação de cada serviço.
Algumas extensões de associação do Azure Functions podem ser configuradas para acessar serviços usando conexões baseadas em identidade. Para obter mais informações, consulte Configurar uma conexão baseada em identidade.
Definir cotas de uso
Considere definir uma cota de uso para funções em execução em um plano de consumo. Quando você define um limite diário de GB por segundo na execução total de funções em seu aplicativo de funções, a execução é interrompida quando o limite é atingido. Isso poderia ajudar a reduzir o código mal-intencionado que executa suas funções. Para saber como estimar o consumo para suas funções, consulte Estimar os custos do plano de consumo.
Validação de dados
Os gatilhos e as associações usadas pelas suas funções não fornecem validação de dados adicional. Seu código deve validar todos os dados recebidos de um gatilho ou uma associação de entrada. Caso um serviço de upstream esteja comprometido, você não quer que entradas não validadas fluam por meio de suas funções. Por exemplo, se sua função armazena dados de uma fila de Armazenamento do Azure em um banco de dados relacional, você deve validar os dados e parametrizar seus comandos para evitar ataques de injeção de SQL.
Não presuma que os dados que chegam à sua função já tenham sido validados ou corrigidos. Também é uma boa ideia verificar se os dados que estão sendo gravados em associações de saída são válidos.
Tratar erros
Embora pareça básico, é importante escrever um bom tratamento de erro em suas funções. Erros não tratados se acumulam para o host e são manipulados pelo runtime. Associações diferentes tratam do processamento de erros de forma diferente. Para saber mais, consulte Tratamento de erro do Azure Functions.
Desabilitar depuração remota
Verifique se a depuração remota está desabilitada, exceto quando você estiver depurando ativamente suas funções. Você pode desabilitar a depuração remota na guia Configurações gerais do seu aplicativo de funções de Configuração no portal.
Restringir o acesso CORS
O Azure Functions oferece suporte a compartilhamento de recursos entre origens (CORS). O CORS está configurado no portal e por meio do CLI do Azure. A lista de origens permitidas pelo CORS aplica-se ao nível do aplicativo de funções. Com o CORS habilitado, as respostas incluem o cabeçalho Access-Control-Allow-Origin
. Para obter mais informações, consulte Compartilhamento de recursos entre origens.
Não use caracteres curinga em sua lista de origens permitidas. Em vez disso, liste os domínios específicos dos quais você espera obter solicitações.
Armazenar dados criptografados
O Armazenamento do Azure criptografa todos os dados em uma conta de armazenamento em repouso. Para obter mais informações, consulte Criptografia do Armazenamento do Azure para dados em repouso.
Por padrão, os dados são criptografados com chaves gerenciadas pela Microsoft. Para obter controle adicional sobre as chaves de criptografia, você pode fornecer chaves gerenciadas pelo cliente para usar para criptografia de dados de blob e arquivo. Essas chaves devem estar presentes no Azure Key Vault para que o Functions possa acessar a conta de armazenamento. Para saber mais, confira Criptografia em repouso usando chaves gerenciadas pelo cliente.
Proteger recursos relacionados
Um aplicativo de funções geralmente depende de recursos adicionais, portanto, parte da proteção do aplicativo é proteger esses recursos externos. A maioria dos aplicativos de funções inclui, no mínimo, uma dependência do Application Insights e do Armazenamento do Azure. Consulte a linha de base de segurança do Azure para o Azure Monitor e a linha de base de segurança do Azure para Armazenamento para obter diretrizes sobre como proteger esses recursos.
Importante
A conta de armazenamento é usada para armazenar dados importantes do aplicativo, às vezes incluindo o próprio código do aplicativo. Você deve limitar o acesso de outros aplicativos e usuários à conta de armazenamento.
Você também deve consultar as diretrizes para todos os tipos de recursos dos quais a lógica do aplicativo depende, como gatilhos e associações, além do código de função.
Implantação segura
A integração de ferramentas do Azure Functions facilita a publicação do código do projeto de função local no Azure. É importante entender como a implantação funciona ao considerar a segurança de uma topologia de Azure Functions.
Credenciais de implantação
As implantações do Serviço de Aplicativo exigem um conjunto de credenciais de implantação. Essas credenciais de implantação são usadas para proteger suas implantações de aplicativo de funções. As credenciais de implantação são gerenciadas pela plataforma do Serviço de Aplicativo e são criptografadas em repouso.
Há dois tipos de credenciais de implantação:
Credenciais de nível de usuário: um conjunto de credenciais para toda a conta do Azure. Ele pode ser usado para implantar no Serviço de Aplicativo para qualquer aplicativo e em qualquer assinatura que a conta do Azure tem permissão para acessar. É o conjunto padrão que aparece na GUI do portal (como a Visão geral e Propriedades da página de recursos do aplicativo). Quando um usuário recebe acesso ao aplicativo por meio de RBAC (Controle de Acesso Baseado na Função) ou permissões coadmin, esse usuário pode usar suas próprias credenciais em nível de usuário até que o acesso seja revogado. Não compartilhe essas credenciais com outros usuários do Azure.
Credenciais de nível de aplicativo: um conjunto de credenciais para cada aplicativo. Podem ser usadas para implantar nesse aplicativo somente. As credenciais de cada aplicativo são geradas automaticamente na criação do aplicativo. Eles não podem ser configurados manualmente, mas podem ser redefinidos a qualquer momento. Para que um usuário tenha acesso às credenciais no nível do aplicativo via (RBAC), esse usuário deve ser colaborador ou superior no aplicativo (incluindo a função interna de colaborador do site). Os leitores não têm permissão para publicar e não pode acessar essas credenciais.
Neste momento, não há suporte para Key Vault para credenciais de implantação. Para obter mais informações sobre como configurar as credenciais de implantação, consulte Configurar as credenciais de implantação para o Serviço de Aplicativo do Azure.
Desabilitar FTP
Por padrão, cada aplicativo de funções tem um ponto de extremidade de FTP habilitado. O ponto de extremidade de FTP é acessado usando credenciais de implantação.
O FTP não é recomendado para implantação de código de função. As implantações de FTP são manuais e exigem a sincronização de gatilhos. Para saber mais, confira Implantação de FTP.
Quando não estiver planejando usar o FTP, você deverá desabilitá-lo no portal. Se você optar por usar o FTP, deverá impor FTPS.
Proteger o ponto de extremidade scm
Cada aplicativo de funções tem um ponto de extremidade de serviço scm
correspondente que é usado pelo serviço Ferramentas Avançadas (Kudu) para implantações e outras extensões de site do Serviço de Aplicativo. O ponto de extremidade scm
para um aplicativo de funções é sempre um URL no formato https://<FUNCTION_APP_NAME>.scm.azurewebsites.net
. Ao usar o isolamento de rede para proteger suas funções, você também deve considerar esse ponto de extremidade.
Ao ter um ponto de extremidade scm
separado, você pode controlar as implantações e outras funcionalidades de Ferramentas Avançadas para aplicativos de funções que estão isoladas ou em execução em uma rede virtual. O ponto de extremidade scm
dá suporte à autenticação básica (usando credenciais de implantação) e ao logon único com suas credenciais do portal do Azure. Para saber mais, confira Acessar o serviço Kudu.
Avaliação contínua de segurança
Como a segurança precisa ser considerada a cada etapa do processo de desenvolvimento, faz sentido implementar também validações de segurança em um ambiente de implantação contínua. Isso às vezes é chamado de DevSecOps. Usar o Azure DevOps para seu pipeline de implantação permite que você integre a validação ao processo de implantação. Para obter mais informações, consulte Saiba como adicionar validação de segurança contínua ao seu pipeline de CI/CD.
Segurança de rede
Restringir o acesso à rede para seu aplicativo de funções permite controlar quem pode acessar seus pontos de extremidade de funções. As funções aproveitam a infraestrutura do Serviço de Aplicativo para permitir que suas funções acessem recursos sem usar endereços roteáveis pela Internet ou para restringir o acesso à Internet a um ponto de extremidade de função. Para saber mais sobre essas opções de rede, confira Opções de rede do Azure Functions.
Definir restrições de acesso
As restrições de acesso permitem definir listas de regras de permissão/negação para controlar o tráfego para seu aplicativo. As regras são avaliadas em ordem de prioridade. Se nenhuma regra for definida, o aplicativo aceitará o tráfego de qualquer endereço. Para saber mais, confira Restrições de acesso ao serviço do Serviço de Aplicativo do Azure .
Proteger a conta de armazenamento
Quando você cria um aplicativo de funções, é necessário criar ou vincular uma conta de Armazenamento do Azure de uso geral que dá ao armazenamento de Tabelas, Blobs e Filas. Você pode substituir essa conta de armazenamento por uma protegida por uma rede virtual com acesso habilitado por pontos de extremidade de serviço ou pontos de extremidade privados. Para obter mais informações, confira Restringir a conta de armazenamento a uma rede virtual.
Implantar seu aplicativo de funções em uma rede virtual
O Ponto de Extremidade Privado do Azure é um adaptador de rede que conecta você de maneira privada e segura a um serviço que conta com o Link Privado do Azure. O Ponto de Extremidade Privado usa um endereço IP privado da rede virtual, colocando efetivamente o serviço na sua rede virtual.
Você pode usar o ponto de extremidade privado para as funções hospedadas nos planos Consumo Flex, Elastic Premium e Dedicado (Serviço de Aplicativo).
Se você quiser fazer chamadas para Pontos de extremidade privados, deverá certificar-se de que suas pesquisas de DNS sejam resolvidas em relação ao ponto de extremidades privado. Você pode impor esse comportamento de uma das seguintes maneiras:
- Integrar com as zonas privadas do DNS do Azure. Quando sua rede virtual não tem um servidor DNS personalizado, isso é feito automaticamente.
- Gerenciar o ponto de extremidade privado no servidor DNS usado pelo seu aplicativo. Para gerenciar um ponto de extremidade privado que você esteja tentando acessar, é preciso conhecer o endereço dele e usar um registro A para referenciá-lo.
- Configure seu próprio servidor DNS para encaminhar para as zonas privadas do DNS do Azure.
Para saber mais, confira usar Pontos de extremidade privados para Aplicativos Web.
Implante o aplicativo de funções isoladamente
O Ambiente do Serviço de Aplicativo do Azure oferece um ambiente de hospedagem dedicado para que você execute suas funções. Esses ambientes permitem configurar um único gateway de front-end que você pode usar para autenticar todas as solicitações de entrada. Para obter mais informações, confira Configurando um WAF (firewall do aplicativo Web) para o Ambiente do Serviço de Aplicativo.
Use um serviço do gateway
Os serviços de gateway, como Gateway de Aplicativo do Azure e Azure Front Door, permitem configurar um WAF (firewall do aplicativo Web). As regras WAF são usadas para monitorar ou bloquear ataques detectados, que fornecem uma camada extra de proteção para suas funções. Para configurar um WAF, seu aplicativo de funções precisa estar em execução em um ASE ou usando pontos de extremidade privados (versão prévia). Para saber mais, confira Usar pontos de extremidade privados.