Integridade do código da plataforma

Um desafio significativo ao operar um sistema complexo como o Microsoft Azure é garantir que apenas o software autorizado está em execução no sistema. O software não autorizado apresenta vários riscos para qualquer empresa:

  • Riscos de segurança, como ferramentas de ataque dedicadas, software maligno personalizado e software de terceiros com vulnerabilidades conhecidas
  • Riscos de conformidade quando o processo de gestão de alterações aprovado não é utilizado para trazer software novo
  • Risco de qualidade do software desenvolvido externamente, que pode não cumprir os requisitos operacionais da empresa

No Azure, enfrentamos o mesmo desafio e com uma complexidade significativa. Temos milhares de servidores a executar software desenvolvido e mantido por milhares de engenheiros. Isto apresenta uma grande superfície de ataque que não pode ser gerida apenas através de processos empresariais.

Adicionar uma porta de autorização

O Azure utiliza um processo de engenharia avançado que implementa portas na segurança, conformidade e qualidade do software que implementamos. Este processo inclui o controlo de acesso ao código fonte, a realização de revisões de código ponto a ponto, a realização de análises estáticas de vulnerabilidades de segurança, o seguimento do Ciclo de Vida de Desenvolvimento de Segurança (SDL) da Microsoft e a realização de testes funcionais e de qualidade. Temos de garantir que o software que implementamos passou por este processo. A integridade do código ajuda-nos a alcançar essa garantia.

Integridade do código como uma porta de autorização

A integridade do código é um serviço ao nível do kernel que ficou disponível a partir de Windows Server 2016. A integridade do código pode aplicar uma política de controlo de execução rigorosa sempre que um controlador ou uma biblioteca ligada dinamicamente (DLL) é carregada, um binário executável é executado ou um script é executado. Sistemas semelhantes, como DM-Verity, existem para Linux. Uma política de integridade de código consiste num conjunto de indicadores de autorização, certificados de assinatura de código ou hashes de ficheiro SHA256 , que o kernel corresponde antes de carregar ou executar um binário ou script.

A Integridade do Código permite que um administrador de sistema defina uma política que autorize apenas os binários e scripts assinados por certificados específicos ou que correspondam a hashes SHA256 especificados. O kernel impõe esta política ao bloquear a execução de tudo o que não cumpre a política definida.

Uma preocupação com uma política de integridade de código é que, a menos que a política esteja perfeitamente correta, pode bloquear software crítico na produção e causar uma falha. Tendo em conta esta preocupação, pode perguntar-se por que motivo não é suficiente utilizar a monitorização de segurança para detetar quando o software não autorizado é executado. A integridade do código tem um modo de auditoria que, em vez de impedir a execução, pode alertar quando o software não autorizado é executado. Alertar certamente pode acrescentar muito valor na resolução de riscos de conformidade, mas para riscos de segurança como ransomware ou software maligno personalizado, atrasar a resposta em alguns segundos pode ser a diferença entre a proteção e um adversário que ganha uma posição de pé persistente na sua frota. No Azure, investimos significativamente para gerir qualquer risco de integridade do código que contribua para um cliente com impacto na indisponibilidade.

Processo de compilação

Conforme abordado acima, o sistema de compilação do Azure tem um conjunto avançado de testes para garantir que as alterações de software são seguras e em conformidade. Depois de uma compilação ter progredido através da validação, o sistema de compilação assina-a com um certificado de compilação do Azure. O certificado indica que a compilação passou por todo o processo de gestão de alterações. O teste final que a compilação passa chama-se Validação de Assinatura de Código (CSV). O CSV confirma que os binários recém-criados cumprem a política de integridade do código antes de implementarmos na produção. Isto dá-nos uma confiança elevada de que não vamos causar um impacto sobre a indisponibilidade de um cliente devido a binários assinados incorretamente. Se o CSV encontrar um problema, as quebras de compilação e os engenheiros relevantes serão paginados para investigar e corrigir o problema.

Segurança durante a implementação

Apesar de executarmos CSV para cada compilação, ainda existe a possibilidade de alguma alteração ou inconsistência na produção poder causar uma falha relacionada com a integridade do código. Por exemplo, um computador pode estar a executar uma versão antiga da política de integridade do código ou pode estar num estado de mau estado de funcionamento que produz falsos positivos na integridade do código. (À escala do Azure, vimos tudo.) Como tal, temos de continuar a proteger contra o risco de uma falha durante a implementação.

Todas as alterações no Azure são necessárias para serem implementadas através de uma série de fases. As primeiras são instâncias de teste internas do Azure. A fase seguinte é utilizada apenas para servir outras equipas de produtos da Microsoft. A fase final serve clientes de terceiros. Quando uma alteração é implementada, move-se para cada uma destas fases por sua vez e coloca em pausa para medir o estado de funcionamento da fase. Se a alteração não tiver impacto negativo, passa para a fase seguinte. Se fizermos uma alteração incorreta a uma política de integridade de código, a alteração é detetada durante esta implementação faseada e revertida.

Resposta a incidentes

Mesmo com esta proteção em camadas, ainda é possível que algum servidor na frota possa bloquear software devidamente autorizado e causar um problema ao cliente, um dos nossos piores cenários. A nossa última camada de defesa é a investigação humana. Sempre que a integridade do código bloqueia um ficheiro, gera um alerta para que os engenheiros de serviço investiguem. O alerta permite-nos iniciar investigações de segurança e intervir, quer o problema seja um indicador de um ataque real, um falso positivo ou outra situação com impacto no cliente. Isto minimiza o tempo que demora a mitigar quaisquer problemas relacionados com a integridade do código.

Passos seguintes

Saiba como Windows 10 utiliza a integridade do código configurável.

Para saber mais sobre o que fazemos para impulsionar a integridade e segurança da plataforma, consulte: