Como podemos garantir que o código que estamos instalando seja, no mínimo, o código enviado por um fornecedor? A solução geralmente aceita é a assinatura de código, adicionando uma assinatura digital aos binários que pode ser usada para garantir a autoria. Ao mesmo tempo, a assinatura inclui um hash que pode ser usado para mostrar que o código que você recebeu não foi alterado depois de assinado.
A assinatura de código é cada vez mais importante como parte da garantia de listas de materiais de software e da redução dos riscos associados ao sequestro de binários legítimos por malware. A assinatura é necessária se você planeja usar serviços como a Microsoft Store ou o Gerenciador de Pacotes do Windows para distribuir seus aplicativos, permitindo que o repositório verifique as fontes de software.
Usando infraestrutura de chave pública para proteger código
O processo de assinatura de código é simples, baseado em técnicas familiares de criptografia de chave pública. Como estes, requer certificados e assinaturas digitais, verificando a identidade do editor e a autoridade certificadora que emitiu os certificados subjacentes. Esse último recurso é fundamental para estabelecer a relação de confiança entre o editor e o código, com uma lista de autoridades de certificação confiáveis gerenciadas tanto pelas lojas quanto pelo sistema operacional subjacente ao qual o código certificado se destina.
Por vários bons motivos, está se tornando muito mais difícil gerenciar sua própria infraestrutura de assinatura. Certificados autoassinados não são aceitos pelas lojas, embora possam ser usados para distribuição interna de código, e os certificados agora precisam ser mantidos em módulos de segurança de hardware confiáveis, onde devem ser renovados regularmente para garantir que você esteja sempre usando um certificado válido. certificado para o seu código.
A Microsoft há muito oferece várias maneiras diferentes de assinar código, usando a técnica para garantir que o Windows instale apenas drivers confiáveis. Desde então, o processo foi estendido às atualizações de software da própria Microsoft e aos instaladores usados pela Windows Store.
Uma dessas formas foi o Azure Code Signing, que realmente não chamou a atenção dos desenvolvedores, apesar de se integrar bem ao Visual Studio e à Windows Store. No entanto, o Azure Code Signing também não era a opção mais barata e teve de competir com soluções locais.
Apresentando a assinatura confiável
A Microsoft simplificou sua opção hospedada na nuvem e incorporou as atualizações mais recentes à infraestrutura de computação segura do Azure, lançando uma prévia do que chama de Assinatura Confiável. Como parte do lançamento, a Microsoft está introduzindo uma nova estrutura de preços e fornecendo integração com os pipelines de construção do GitHub.
O objetivo por trás da assinatura confiável é reunir todo o ciclo de vida da assinatura de código em um só lugar, simplificando o processo de aquisição dos certificados necessários, armazenando-os com segurança e fornecendo uma maneira segura e privada de assinar código.
O serviço baseia-se em ferramentas familiares do Azure. Você pode configurá-lo no Portal do Azure, adicionando uma conta de assinatura confiável a um grupo de recursos dentro da sua assinatura. É melhor configurar um grupo de recursos separado para assinatura de código que não seja usado para mais nada, pois isso permite controlar de forma mais eficaz os usuários e funções que têm acesso.
Existem duas opções de assinatura confiável: básica e premium. A principal diferença entre os dois é o número de validações de identidade e perfis de certificado que você pode armazenar. A validação de identidade é usada para provar quem você (ou sua organização) é, enquanto os perfis de certificado são usados para gerar os certificados usados para assinar seu código. Os perfis de certificado contêm informações sobre a função da assinatura e como a assinatura é confiável.
Primeiros passos com assinatura confiável
Começar é simples. Você pode usar o Portal do Azure ou a CLI do Azure, embora só possa validar a identidade por meio do portal. Você deve ter isso em mente se estiver usando a CLI, pois ela adiciona outra etapa e impede a automatização do processo.
O primeiro passo é registar um fornecedor de recursos de assinatura de código na sua subscrição do Azure. Há uma lista de provedores de recursos nas configurações da sua conta, onde você pode selecionar a opção Microsoft.CodeSigning. Isso alterna de NotRegistered para Registered, permitindo que você configure a assinatura confiável criando uma conta para manter seus detalhes de identidade e assinar perfis de certificado. Atualmente está limitado às regiões dos EUA e da Europa do Azure, com cada região a ter o seu próprio URL de ponto final dedicado que pode ser usado para adicionar assinatura automatizada a serviços de construção externos.
Em seguida, você cria uma conta de Assinatura Confiável como um novo recurso do Azure. Tal como a maioria dos recursos do Azure, a criação do recurso envolve passar por um assistente básico, preencher os formulários necessários para criar um novo grupo de recursos, escolher um plano de preços e implementar a sua conta numa região do Azure. Leva alguns minutos para implantar sua instância e então você pode validar a identidade da sua organização.
Você precisará estar conectado ao Azure com uma conta que tenha a função apropriada de Verificador de Identidade de Assinatura Confiável. Você precisará escolher se está validando uma identidade pública ou privada. Uma identidade pública precisa de uma identidade comercial legal para o certificado, enquanto a privada requer apenas o seu locatário do Azure. As identidades públicas deverão ter uma URL, um endereço de email de contato e seu ID de Vendedor da Microsoft Store, caso você pretenda entregar o código por meio da Microsoft Store.
Existem algumas limitações que impossibilitam o uso do Trusted Signing para startups ou empresários individuais, pois é necessário ter três anos de histórico fiscal. (A documentação indica que isso pode mudar no futuro.) Talvez seja necessário fornecer informações adicionais por meio do portal se a Microsoft precisar de verificação adicional. Não espere uma resposta instantânea. Pode levar uma semana ou mais para que uma conta seja verificada.
Quando isso acontecer, você poderá criar um perfil de certificado, novamente para uso público ou privado. Comece preenchendo um formulário com as informações que serão codificadas nos seus certificados de assinatura. Agora você deve estar pronto para começar a assinar o código usando os detalhes armazenados em sua conta Trusted Signing, vinculando-o a um conjunto crescente de integrações de assinatura.
Adicionando assinatura confiável a uma ação de build do GitHub
Talvez a opção mais interessante seja o suporte ao uso de uma ação do GitHub para assinar seu código assim que uma compilação for concluída, usando um dos executores do Windows. Basta adicionar a ação após a conclusão de uma compilação, usando os segredos da sua conta e o endpoint de assinatura de código da sua conta de assinatura confiável. Como parte do processo de configuração, você precisa adicionar os tipos de pasta e arquivo que estão sendo assinados, o tipo de hash que você está usando e um carimbo de data/hora RFC 3161. Se você estiver direcionando arquivos de saída específicos, poderá incluir um arquivo de catálogo de arquivos que liste os arquivos que estão sendo assinados.
O resultado é uma abordagem prática para entregar uma compilação assinada: envie algum código para uma ramificação de produção específica do seu repositório, e a ação cuidará da construção, do empacotamento e da assinatura do código. Ele até mesmo o entregará na Windows Store ou em um repositório do Gerenciador de Pacotes do Windows. O executor está disponível na Visual Studio Store, portanto pode ser gerenciado e editado dentro do Visual Studio.
Automatizando o ciclo de vida do certificado
Outro aspecto do serviço é o suporte ao ciclo de vida do seu certificado. O modelo subjacente é a abordagem x.509 padrão para certificados e suas chaves. É importante observar que os certificados têm vida curta: são renovados diariamente e são válidos por apenas 72 horas. Isso permite invalidar rapidamente compilações específicas que podem ter sido comprometidas. Você não precisa fazer nada. Todo o processo é automático, com certificados emitidos logados no Azure e armazenados e gerenciados em hardware criptográfico seguro.
Obviamente, uma das principais questões é o custo, e a assinatura confiável não é muito cara. A opção básica, que permite um de cada tipo de perfil de certificado, custa US$ 9,99 para 5.000 assinaturas por mês (assinaturas adicionais custam US$ 0,005 por assinatura). Se precisar de mais certificados, você pode escolher a opção premium de US$ 99,99 com 100.000 assinaturas por mês e o mesmo preço para excedentes, com 10 de cada tipo em cada conta.
A Microsoft está percorrendo um longo caminho para tornar a assinatura de código mais simples de usar. Seria bom se houvesse uma opção gratuita nos moldes do Let's Encrypt para projetos de código aberto ou para desenvolvedores individuais, mas por enquanto isso não está em questão.
O que é necessário é uma infraestrutura de assinatura de código que seja simples de usar e esteja disponível para todos, para que possamos tornar a assinatura de código uma parte natural do ciclo de vida de desenvolvimento de software. Quanto mais código for assinado, menor será o risco para todos nós, inclusive para Microsoft e Windows. Fornecer um serviço de assinatura como o Trusted Signing como serviço público pode ser a melhor abordagem no longo prazo, mas, por enquanto, o Trusted Signing é o que temos.