Você precisa garantir que ninguém faça modificações nos seus scripts e os passe como originais? Se sim, então você precisa aprender como assinar script PowerShell. Assinar adiciona a identidade do publicador ao script para que os usuários possam decidir se confiam na fonte do script.
Neste artigo, aprenda como garantir que apenas scripts confiáveis sejam executados no seu ambiente ao aprender a assinar scripts PowerShell.
Pré-requisitos
Se você pretende seguir os exemplos deste artigo, você precisa do seguinte.
- A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
- Windows PowerShell 5.1 ou PowerShell 6+. Os exemplos neste artigo utilizarão PowerShell v7.1.3.
- A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
Obtendo um Certificado de Assinatura de Código
Antes de aprender como assinar script PowerShell, você precisa obter um certificado de assinatura de código primeiro. No mundo da Microsoft, os certificados de assinatura de código também são conhecidos como certificados Authenticode.
A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.
Onde você obtém um certificado de assinatura de código depende de onde você pretende implantar ou distribuir seus scripts assinados. E como sempre, o custo também é um grande fator.
- Global / Público – Você precisará de um certificado emitido por uma Autoridade de Certificação (CA) globalmente confiável. Exemplos dessas CAs são a GeoTrust e a DigiCert. Esses certificados não são gratuitos. Por exemplo, um certificado Authenticode da DigiCert custará $474/ano na data desta escrita.
- Interno / Intranet Local – Se você tiver um servidor de Autoridade de Certificação (CA) interno, você pode solicitar e baixar um certificado de assinatura do seu servidor CA interno.
- Pessoal / Desenvolvimento – Para testes pessoais ou uso de desenvolvimento, um certificado autoassinado deve ser suficiente. Esse tipo de certificado de assinatura é o que você usará neste artigo.
Criando um Certificado Autoassinado para Assinatura de Código
Você leu na seção anterior que, ao aprender a assinar scripts do PowerShell, você primeiro precisa de um certificado de assinatura de código. Como você só estará fazendo testes pessoais neste tutorial, um certificado autoassinado será suficiente. Mas onde você o obtém?
Como o nome sugere, autoassinado significa que seu computador local emitirá um certificado de assinatura de código para si mesmo. Para gerar um certificado autoassinado, siga estas etapas.
1. Abra o PowerShell como administrador no seu computador.
2. Copie o comando abaixo e execute no PowerShell. Este comando utiliza o cmdlet New-SelfSignedCertificate
para criar um novo certificado de assinatura de código. O nome do certificado é ATA Authenticode dentro do repositório de certificados pessoais do computador local.
O cmdlet
New-SelfSignedCertificate
só suporta a criação de certificados no repositório de certificados pessoais do usuário atual (cert:\CurrentUser\My) ou no repositório de certificados pessoais do computador local (cert:\LocalMachine\My). Certificados em cert:\LocalMachine\My estão disponíveis em todo o computador.
O comando também armazena o objeto do certificado na variável $authenticode
para uso na próxima etapa.
3. Em seguida, para fazer com que o seu computador confie no novo certificado que você criou, adicione o certificado autoassinado ao repositório de certificados Autoridade de Certificação Raiz Confiável e Publicadores Confiáveis do computador. Para fazer isso, copie o código abaixo e execute no PowerShell.
Há três razões principais para instalar os certificados autoassinados em três lojas de certificados diferentes.
- O certificado que você criou na loja de certificados Personal é o que você usará como certificado de assinatura de código.
- A cópia do mesmo certificado na loja de certificados Trusted Publishers garante que o computador local confie no editor que assinou o script. O PowerShell verifica o certificado nesta loja para validar a assinatura de um script.
- Finalmente, adicionar o certificado autoassinado às Autoridades de Certificação Raiz Confiáveis garante que o seu computador local confie nos certificados nas lojas Pessoal e Editores Confiáveis.
4. Para confirmar que o certificado com o assunto ATA Authenticode está nas lojas de certificados Pessoal, Raiz e Editores Confiáveis, execute os comandos abaixo no PowerShell.

5. Para visualizar o certificado em uma GUI, abra o Snap-in de Certificados e procure o certificado que você criou na pasta Certificados dentro das lojas de certificados Pessoal, Autoridades de Certificação Raiz Confiáveis, e Editores Confiáveis.

Como Assinar Scripts do PowerShell
Agora que você criou e instalou o certificado de assinatura de código nos três repositórios de certificados, está pronto para usá-lo para assinar seu script de exemplo do PowerShell. Quando precisar assinar scripts, o cmdlet Set-AuthenticodeSignature
é a estrela principal.
Para assinar o script do PowerShell, execute o código abaixo no PowerShell. O primeiro comando obtém o certificado de assinatura de código do repositório de certificados pessoais da máquina local. O segundo comando adiciona uma assinatura digital ao arquivo do script do PowerShell.
A maioria dos provedores de certificados confiáveis possui um servidor de carimbo de data/hora que você pode encontrar nos sites dos provedores. Por exemplo, o servidor de carimbo de data/hora da DigiCert é http://timestamp.digicert.com e a Comodo possui http://timestamp.comodoca.com.
Após assinar o script, você deverá ver uma saída semelhante à captura de tela abaixo.

Verificando a Assinatura Digital de um Script do PowerShell
Até agora, você assinou um script do PowerShell usando o certificado autoassinado que você criou. Mas como você sabe se o script realmente possui uma assinatura digital?
Abrindo o Código
Uma maneira de confirmar a assinatura digital de um script é abrir o script e visualizar o código em um editor de texto. Como no exemplo abaixo, o script assinado possui um bloco de assinatura no final do código. O bloco de assinatura começa com # SIG # Início do bloco de assinatura
e termina com # SIG # Fim do bloco de assinatura
.

Excluir o bloco de assinatura digital do código do script o tornará não assinado.
Abrindo as Propriedades do Arquivo do Script
Outra maneira de verificar a assinatura digital do script é abrir as propriedades do arquivo do script no Windows Explorer. Para fazer isso:
- No Windows Explorer, navegue até o local do script do PowerShell. Neste exemplo, o script está em C:\ATA\myscript.ps1.
- Clique com o botão direito no script e clique em Propriedades.
- Na janela de Propriedades do arquivo, clique na guia Assinaturas Digitais, e você deverá ver uma assinatura digital na lista de assinaturas.

Usando Get-AuthenticodeSignature
Você ficaria surpreso ao saber que também pode verificar a assinatura de um script dentro do PowerShell? Provavelmente não. O cmdlet que você pode invocar para recuperar a assinatura de um arquivo é Get-AuthenticodeSignature
.
Para obter a assinatura digital do script, execute o comando abaixo. Este comando obtém a assinatura do arquivo C:\ATA\myscript.ps1. O cmdlet Select-Object -Property *
exibe todos os detalhes da assinatura.
Após executar o comando, você deverá ver um resultado semelhante ao da captura de tela abaixo. Como pode ver, a propriedade SignerCertificate
mostra os detalhes do certificado de assinatura. Enquanto a propriedade TimerStamperCertificate
mostra o certificado do servidor de carimbo de data e hora.

Executando um Script do PowerShell Assinado
Neste ponto, você assinou um script do PowerShell e confirmou que a assinatura digital está presente. Mas, o teste final para verificar se você seguiu todos os passos corretamente é executar o script e confirmar que ele funciona.
O PowerShell possui uma característica de segurança que protege os usuários contra a execução não intencional de scripts. Essa característica de segurança é chamada de Políticas de Execução. Dependendo da política de execução, o PowerShell pode impedir ou permitir a execução de scripts.
Para aprender sobre as diferentes políticas de execução e como elas afetam a execução de scripts, consulte Políticas de Execução do PowerShell: Compreensão e Gerenciamento.
Para executar um script do PowerShell assinado, siga estas etapas.
Primeiro, altere a política de execução para AllSigned para garantir que apenas scripts assinados possam ser executados. Sem fazer esta etapa, você não pode testar com precisão se o seu script assinado funciona. Para fazer isso, invoque o cmdlet Set-ExecutionPolicy
executando o comando abaixo no PowerShell como administrador.
Em seguida, execute o script do PowerShell assinado.
O script deve ser executado sem erros ou avisos, como você pode ver no resultado abaixo.

Mas, se por algum motivo o script não estiver corretamente assinado ou não estiver assinado de todo, você receberá um erro semelhante à imagem abaixo. Nesse caso, releia seus passos e tente assinar o script novamente.

E se eventualmente você atualizou seu script? A assinatura digital ainda será válida? A resposta é não. Qualquer modificação no script assinado invalidará a assinatura digital do script. Executar o script modificado resultará em falha e erro.
Siga estes passos para testar um script modificado e assinado.
1. Abra o script myscript.ps1 assinado em um editor de código ou texto.
2. Modifique o código para adicionar um caractere, como um sublinhado neste exemplo. Não altere mais nada.

3. Salve o script após modificar o código.
4. Finalmente, execute o script modificado no PowerShell executando o comando abaixo.
Como você modificou o script assinado, a execução do script resultará no erro mostrado abaixo. Você precisará assinar o script novamente para atualizar e corrigir sua assinatura digital.

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.
Conclusão
Neste artigo, você aprendeu por que assinar scripts do PowerShell pode ser necessário, dependendo das políticas de execução. Você também aprendeu como distinguir entre um script assinado e não assinado. Por fim, aprendeu como assinar scripts do PowerShell digitalmente e como testá-los e executá-los.
Agora que você sabe como assinar scripts do PowerShell, começará a assinar os scripts antes de distribuí-los ou implantá-los?
Source:
https://adamtheautomator.com/how-to-sign-powershell-script/