Um serviço recentemente lançado no Azure proporciona uma maneira econômica e simplificada de assinatura de código, com integração no GitHub Actions.

Como podemos assegurar que o código que estamos instalando corresponde ao código enviado pelo fornecedor? Uma solução comumente utilizada é a assinatura de código, que envolve a adição de uma assinatura digital aos binários para garantir a autenticidade. Além disso, a assinatura inclui um hash que pode ser usado para verificar se o código recebido foi alterado após ter sido assinado.
A autenticação de código está se tornando cada vez mais essencial para assegurar a integridade do software e minimizar os perigos ligados ao roubo de programas maliciosos disfarçados como legítimos. É imprescindível ter a assinatura do código ao pretender disponibilizar seus aplicativos em plataformas como a Microsoft Store ou o Windows Package Manager, pois isso permite que o repositório verifique a origem do software.
Utilizando a infraestrutura de chave pública para assegurar a integridade do código.
A assinatura de código é um processo simples que utiliza técnicas de criptografia de chaves públicas. Envolve certificados e assinaturas digitais para verificar a identidade do editor e a autoridade de certificação responsável pela emissão dos certificados. A relação de confiança entre editor e código é estabelecida principalmente pela presença de uma lista de autoridades de certificação confiáveis, gerenciadas pelas lojas e pelo sistema operacional que o código certificado visa alcançar.
Por diversos motivos válidos, está se tornando cada vez mais desafiador administrar a sua própria infraestrutura de assinatura. Lojas não aceitam certificados autoassinados, embora eles possam ser utilizados para distribuição interna de código. Além disso, os certificados devem ser mantidos em módulos de segurança de hardware confiáveis e renovados regularmente para assegurar o uso de um certificado válido para o seu código.
A Microsoft disponibilizou diversas opções para certificar o código, utilizando essa abordagem para assegurar que apenas drivers confiáveis sejam instalados no Windows. Atualmente, essa prática foi expandida para abranger as atualizações de software da Microsoft e os instaladores da Windows Store.
Uma das estratégias utilizadas foi o Azure Code Signing, que não atraiu o interesse dos desenvolvedores, apesar de se integrar bem com o Visual Studio e a Windows Store. Contudo, o Azure Code Signing também não era a alternativa mais econômica e teve que competir com outras soluções locais.
Mostrando uma assinatura de confiança.
A Microsoft facilitou a opção de hospedagem em nuvem e incluiu as atualizações mais recentes para a segura infraestrutura de computação do Azure, lançando uma prévia do que está chamando de assinatura confiável. Além disso, como parte desse lançamento, a empresa está apresentando uma nova estrutura de preços e oferecendo integração com os pipelines de compilação do GitHub.
O Trusted Signing visa centralizar o processo de assinatura de código, facilitando a obtenção e armazenamento seguros dos certificados necessários, além de oferecer uma maneira segura e privada de assinar o código.
O serviço utiliza ferramentas conhecidas do Azure. Pode ser configurado através do Azure Portal, ao adicionar uma conta de assinatura confiável a um grupo de recursos dentro da assinatura. É recomendável criar um grupo de recursos exclusivo para a assinatura do código, sem outras finalidades, para um controle mais eficaz dos usuários e papéis com acesso.
Há duas alternativas disponíveis para a assinatura confiável: a opção básica e a premium. A principal distinção entre elas está na quantidade de validações de identidade e perfis de certificados que podem ser armazenados. A validação de identidade é utilizada para comprovar a identidade de quem você é (ou da sua organização), enquanto os perfis de certificados são empregados na geração dos certificados usados para assinar o seu código. Esses perfis contêm informações sobre a função da assinatura e o nível de confiabilidade da mesma.
Iniciar com Assinatura Confiável.
Iniciar é fácil. É possível utilizar o Azure Portal ou o Azure CLI, porém a validação da identidade só pode ser feita através do portal. É importante lembrar disso ao optar pelo CLI, já que isso adiciona uma etapa extra e dificulta a automatização do processo.
Você deve começar registrando um provedor de recursos de assinatura de código na sua assinatura do Azure. Na seção de configurações da sua conta, é possível encontrar uma lista de provedores de recursos, onde você pode escolher a opção CodeSigning da Microsoft. Ao fazer essa seleção, o status mudará de Não Registrado para Registrado, o que permitirá que você configure o Trusted Signing criando uma conta para armazenar seus detalhes de identidade e assinar perfis de certificados. Atualmente, a funcionalidade está disponível apenas nas regiões dos EUA e Europa do Azure, sendo que cada região possui sua própria URL de endpoint dedicada que pode ser utilizada para adicionar assinatura automatizada a serviços de compilação externos.
Posteriormente, é possível estabelecer uma conta de assinatura segura como uma nova funcionalidade do Azure. Assim como a maioria das funcionalidades do Azure, a criação deste recurso requer a utilização de um assistente simples, o preenchimento dos formulários necessários para criar um novo grupo de recursos, a escolha de um plano de preços e a implementação da sua conta em uma região específica do Azure. Após alguns minutos, a sua instância será implantada, permitindo a validação da identidade da sua organização.
Você precisará estar conectado ao Azure com uma conta que possua a função adequada de Verificador de Identidade de Assinatura confiável. Você terá que decidir se está autenticando uma identidade pública ou privada. Uma identidade pública requer uma identidade de negócios legal para o certificado, enquanto a privada precisa apenas do seu locatário Azure. Para as identidades públicas, é necessário ter um URL, um endereço de e-mail de contato e o ID do vendedor da Microsoft Store, caso planeje distribuir o código por meio da Microsoft Store.
Algumas restrições impedem que startups ou comerciantes exclusivos utilizem o Trusted Signing, já que é necessário possuir um histórico fiscal de três anos. A documentação sugere que essa exigência pode ser alterada posteriormente. Caso a Microsoft solicite, será necessário fornecer mais informações através do portal para verificação adicional. É importante ressaltar que a resposta não será imediata, podendo levar uma semana ou mais para obter a conta verificada.
Após essa etapa, é possível gerar um perfil de certificado para uso público ou privado. Inicie o processo preenchendo um formulário com os dados que serão codificados nos certificados de assinatura. Em seguida, você estará preparado para assinar o código utilizando as informações armazenadas em sua conta de assinatura confiável, conectando-se a diversas integrações de assinatura disponíveis.
Incluir uma assinatura confiável em um processo de compilação no GitHub.
Uma possibilidade interessante seria utilizar o suporte para implementar uma ação do GitHub que permite assinar o código assim que a compilação for concluída, por meio dos corredores do Windows. Para isso, é preciso acrescentar a ação após a finalização da compilação, utilizando as credenciais da conta e o endpoint do código de assinatura para a conta de assinatura confiável. Durante a configuração, é necessário especificar os tipos de pastas e arquivos a serem assinados, o tipo de hash utilizado e um timestamp RFC 3161. Caso esteja direcionando arquivos de saída específicos, é possível incluir um arquivo de catálogo de arquivos que liste os arquivos a serem assinados.
A consequência é uma maneira de entregar uma compilação assinada de forma automatizada: Basta enviar código para um ramo específico do seu repositório de produção, e a ação cuidará da compilação, empacotamento e assinatura do código. Ele também pode ser enviado para a loja do Windows ou um repositório do Windows Package Manager. O corredor está disponível na Visual Studio Store, permitindo que seja gerenciado e editado diretamente no Visual Studio.
Simplificar e agilizar o processo de validade do certificado.
Outro aspecto do serviço inclui o suporte ao ciclo de vida do certificado, seguindo o modelo padrão x.509 para certificados e chaves. É relevante destacar que os certificados têm um curto período de validade, sendo renovados diariamente e válidos por apenas 72 horas. Isso permite a rápida invalidação de possíveis comprometimentos. Todo o processo é automatizado, com os certificados emitidos registrados no Azure e armazenados e gerenciados em hardware criptográfico seguro.
Uma das principais questões é o preço, e a Assinatura confiável não tem um custo muito elevado. A opção básica, que permite um certificado de cada tipo, custa $9.99 para 5.000 assinaturas mensais (as assinaturas adicionais custam $0,005 cada). Caso necessite de mais certificados, há a opção premium por $99.99 com 100.000 assinaturas mensais e os mesmos preços para assinaturas adicionais, com 10 de cada tipo em cada conta.
A Microsoft está trabalhando duro para simplificar o processo de assinatura de código. Seria positivo ter uma opção gratuita semelhante ao Let’s Encrypt disponível para projetos de código aberto ou para desenvolvedores individuais, mas, atualmente, essa possibilidade não está sendo considerada.
O importante é ter uma infraestrutura de assinatura de código acessível e fácil de usar para que a assinatura de código se torne uma prática comum no desenvolvimento de software. Quanto mais código for assinado, menor será o risco para todos, incluindo a Microsoft e o Windows. Embora a implementação de um serviço de assinatura pública, como o Trusted Signing, possa ser a melhor opção a longo prazo, por enquanto, devemos utilizar o Trusted Signing disponível.