Compartilhar via


Integridade do código de plataforma

Um desafio significativo na operação de um sistema complexo como o Microsoft Azure é garantir que somente softwares autorizados sejam executados no sistema. Os softwares não autorizados apresentam diversos riscos a qualquer empresa:

  • Riscos de segurança, como ferramentas dedicadas de ataque, malwares personalizados e softwares de terceiros com vulnerabilidades conhecidas
  • Riscos de conformidade quando o processo de gerenciamento de alterações aprovadas não é usado ao incluir novos softwares
  • Riscos de qualidade de softwares desenvolvidos externamente, que podem não atender aos requisitos operacionais do negócio

No Azure, enfrentamos o mesmo desafio com uma complexidade significativa. Temos milhares de servidores executando softwares desenvolvidos e mantidos por milhares de engenheiros. Isso apresenta uma grande superfície de ataque que não pode ser gerenciada somente por meio de processos de negócios.

Adicionando uma porta de autorização

O Azure usa um processo de engenharia avançado que implementa portas para a segurança, a conformidade e a qualidade do software implantado. Esse processo inclui controle de acesso ao código-fonte, realização de revisões de código por outros profissionais, realização de análise estática quanto a vulnerabilidades de segurança, atendimento do SDL (Security Development Lifecycle) da Microsoft e realização de testes funcionais e de qualidade. Precisamos garantir que os softwares implantados tenham sido transmitidos por esse processo. A integridade do código nos ajuda a atingir essa garantia.

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

A integridade de código é um serviço de nível de kernel que se tornou disponível a partir do Windows Server 2016. Ela pode aplicar uma política rígida de controle de execução sempre que um driver ou uma biblioteca vinculada dinamicamente (DLL) forem carregados ou um binário executável ou um script forem executados. Há sistemas semelhantes, como o DM-Verity, para o Linux. Uma política de integridade de código consiste em um conjunto de indicadores de autorização, com certificados de assinatura de código ou hashes de arquivo SHA256, que são correspondidos por kernel antes de carregar ou executar um binário ou script.

A integridade de código permite que um administrador de sistema defina uma política que autorize somente os binários e scripts assinados por determinados certificados ou que correspondam a hashes SHA256 especificados. O kernel aplica essa política bloqueando a execução de tudo o que não atende à política definida.

Uma preocupação com uma política de integridade de código é que, a menos que ela esteja perfeitamente correta, pode bloquear softwares críticos na produção e causar uma interrupção. Com base nessa preocupação, é possível se perguntar por que não basta usar o monitoramento de segurança para detectar quando um software não autorizado foi executado. A integridade de código tem um modo de auditoria que, em vez de impedir a execução, pode alertar quando um software não autorizado é executado. O alerta certamente pode adicionar muito valor ao lidar com riscos de conformidade, mas atrasar a resposta em até mesmo alguns segundos no caso de riscos de segurança, como ransomware ou malware personalizado, pode ser a diferença entre a proteção e a vantagem da concorrência. No Azure, investimos significativamente para gerenciar qualquer risco de integridade de código que contribua para uma interrupção que impacte o cliente.

Processo de compilação

Conforme discutido acima, o sistema de compilação do Azure oferece um conjunto avançado de testes para garantir que as alterações de software estejam seguras e em conformidade. Depois de passar pela validação, o sistema de compilação assina a compilação usando um certificado do Azure. Esse certificado indica que a compilação passou por todo o processo de gerenciamento de alterações. O teste final da compilação é chamado de validação de assinatura de código (CSV). O CSV confirma se os binários recém-criados atendem à política de integridade de código antes de implantá-los na produção. Isso garante que não causaremos uma interrupção que impacte o cliente devido a binários assinados incorretamente. Se o CSV encontrar um problema, a compilação é invalidada e os engenheiros relevantes são incumbidos de investigar e corrigir o problema.

Segurança durante a implantação

Embora o CSV seja executado para cada compilação, ainda há uma chance de que alguma alteração ou inconsistência na produção possa causar uma interrupção relacionada à integridade de código. Por exemplo, um computador pode estar executando uma versão antiga da política de integridade de código ou estar em um estado não íntegro que produza falsos positivos na integridade de código. (Na escala do Azure, tudo é possível.) Portanto, precisamos continuar protegendo as operações contra o risco de uma interrupção durante a implantação.

Todas as alterações no Azure devem ser implantadas por meio de uma série de estágios. O primeiro deles consiste nas instâncias de teste internas do Azure. O próximo estágio é usado somente para atender a outras equipes de produtos da Microsoft. O estágio final atende a clientes de terceiros. Quando uma alteração é implantada, ela passa por cada um desses estágios e é pausada para a medição da integridade do estágio. Se for considerado que a alteração não tem impacto negativo, ela passará para o próximo estágio. Se fizermos uma alteração inadequada em uma política de integridade de código, a alteração será detectada durante essa implantação em estágios e revertida.

Resposta a incidentes

Mesmo com essa proteção em camadas, ainda é possível que algum servidor na frota possa bloquear softwares autorizados corretamente e causar um problema para o cliente, o que representa um dos nossos piores cenários. Nossa camada final de defesa é a investigação humana. Sempre que a integridade de código bloqueia um arquivo, ela gera um alerta para que os engenheiros responsáveis façam a investigação. O alerta nos permite iniciar investigações de segurança e intervir caso o problema seja um indicador de um ataque real, um falso positivo ou outra situação que impacte o cliente. Isso minimiza o tempo necessário para corrigir quaisquer problemas relacionados à integridade de código.

Próximas etapas

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