Integridade do código da plataforma
Um desafio significativo na operação de um sistema complexo como o Microsoft Azure é garantir que apenas software autorizado esteja em execução no sistema. O software não autorizado apresenta vários riscos para qualquer negócio:
- Riscos de segurança, como ferramentas de ataque dedicadas, malware personalizado e software de terceiros com vulnerabilidades conhecidas
- Riscos de conformidade quando o processo de gerenciamento de alterações aprovado não é usado para trazer novo software
- Risco de qualidade de software desenvolvido externamente, que pode não atender aos requisitos operacionais do negócio
No Azure, enfrentamos o mesmo desafio e uma complexidade significativa. Temos milhares de servidores executando software desenvolvido e mantido por milhares de engenheiros. Isso apresenta uma grande superfície de ataque que não pode ser gerenciada apenas por meio de processos de negócios.
Adicionando um portão de autorização
O Azure usa um processo de engenharia avançado que implementa portas na segurança, conformidade e qualidade do software que implantamos. Esse processo inclui controle de acesso ao código-fonte, realização de revisões de código entre pares, análise estática de vulnerabilidades de segurança, acompanhamento do ciclo de vida de desenvolvimento de segurança (SDL) da Microsoft e realização de testes funcionais e de qualidade. Precisamos garantir que o software que implantamos fluiu através desse processo. A integridade do código nos ajuda a alcançar essa garantia.
Integridade do código como uma porta de autorização
A integridade do código é um serviço de nível de kernel que ficou disponível a partir do Windows Server 2016. A integridade do código pode aplicar uma política de controle de execução estrita sempre que um driver ou uma biblioteca vinculada dinamicamente (DLL) é carregado, um binário executável é executado ou um script é executado. Sistemas semelhantes, como o DM-Verity, existem para Linux. Uma política de integridade de código consiste em um conjunto de indicadores de autorização, certificados de assinatura de código ou hashes de arquivo 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 binários e scripts que tenham sido assinados por certificados específicos ou correspondam a hashes SHA256 especificados. O kernel impõe 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 a política esteja perfeitamente correta, ela pode bloquear software crítico em produção e causar uma interrupção. Dada essa preocupação, pode-se perguntar por que não é suficiente usar o monitoramento de segurança para detetar quando um software não autorizado foi executado. A integridade do código tem um modo de auditoria que, em vez de impedir a execução, pode alertar quando software não autorizado é executado. Alertar certamente pode agregar muito valor ao lidar com riscos de conformidade, mas para riscos de segurança, como ransomware ou malware personalizado, atrasar a resposta em alguns segundos pode ser a diferença entre proteção e um adversário ganhando uma posição persistente em sua frota. No Azure, investimos significativamente para gerenciar qualquer risco de integridade do código que contribua para uma interrupção com impacto no cliente.
Processo de construção
Conforme discutido acima, o sistema de compilação do Azure tem um rico conjunto de testes para garantir que as alterações de software sejam seguras e compatíveis. Depois que uma compilação progredir na validação, o sistema de compilação a assina usando um certificado de compilação do Azure. O certificado indica que a compilação passou por todo o processo de gerenciamento de alterações. O teste final pelo qual a compilação passa é chamado de Validação de Assinatura de Código (CSV). O CSV confirma que os binários recém-criados atendem à política de integridade do código antes de implantarmos na produção. Isso nos dá alta confiança de que não causaremos uma interrupção que afete um cliente devido a binários assinados incorretamente. Se o CSV encontrar um problema, a compilação será interrompida e os engenheiros relevantes serão paginados para investigar e corrigir o problema.
Segurança durante a implantação
Embora executemos CSV 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 do código. Por exemplo, uma máquina pode estar executando uma versão antiga da política de integridade de código ou pode estar em um estado não íntegro que produz falsos positivos na integridade do código. (Na escala do Azure, vimos tudo.) Como tal, temos de continuar a proteger-nos contra o risco de uma interrupção durante a implantação.
Todas as alterações no Azure são necessárias para implantar por meio de uma série de estágios. A primeira delas são instâncias de teste internas do Azure. A próxima etapa é usada apenas para atender outras equipes de produto da Microsoft. A etapa final atende clientes terceirizados. Quando uma alteração é implantada, ela se move para cada um desses estágios por vez e faz uma pausa para medir a integridade do estágio. Se a alteração não tiver impacto negativo, passa para a fase seguinte. Se fizermos uma alteração incorreta em uma política de integridade de código, a alteração será detetada 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 da frota bloqueie software devidamente autorizado e cause um problema ao cliente, um dos nossos piores cenários. Nossa última camada de defesa é a investigação humana. Cada vez que a integridade do código bloqueia um arquivo, ele gera um alerta para os engenheiros de plantão investigarem. 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. Isso minimiza o tempo necessário para mitigar quaisquer problemas relacionados à integridade do código.
Próximos passos
Para saber mais sobre o que fazemos para promover a integridade e a segurança da plataforma, consulte: