Nesta aula, vamos explorar um dos aspectos mais críticos da automação com PowerShell: o gerenciamento de credenciais. Em qualquer script que interaja com serviços remotos, APIs ou sistemas que exigem autenticação, você precisará lidar com nomes de usuário e senhas. Fazer isso de forma insegura pode comprometer seriamente a segurança do seu ambiente. Aqui, você aprenderá as ferramentas nativas do PowerShell para capturar, armazenar e utilizar credenciais, além de entender os riscos envolvidos e como mitigá-los com boas práticas.

Começaremos com o cmdlet Get-Credential, que permite solicitar credenciais ao usuário de forma interativa e segura, e depois mergulharemos na classe PSCredential, que é a espinha dorsal do armazenamento de credenciais no PowerShell. Em seguida, apresentaremos o módulo Microsoft.PowerShell.SecretManagement, que oferece uma camada de abstração para armazenar segredos em cofres seguros. Por fim, discutiremos os principais riscos ao lidar com credenciais e como evitá-los.

Get-Credential

O cmdlet Get-Credential é a forma mais simples e segura de obter credenciais de um usuário em um script interativo. Ele exibe uma janela gráfica (ou uma solicitação no console) pedindo nome de usuário e senha, e retorna um objeto PSCredential. A senha nunca é exibida em texto claro e é armazenada como uma SecureString, o que adiciona uma camada de proteção.

Por padrão, Get-Credential usa o nome de usuário atual como valor inicial, mas você pode especificar um nome de usuário pré-definido usando o parâmetro -Credential ou -UserName. Além disso, é possível personalizar a mensagem exibida ao usuário com o parâmetro -Message.

Exemplo básico:

$cred = Get-Credential -Message "Digite suas credenciais para acessar o sistema"

Se você quiser usar um nome de usuário específico:

$cred = Get-Credential -UserName "admin" -Message "Senha do administrador"

O objeto retornado pode ser usado diretamente em cmdlets que aceitam o parâmetro -Credential, como New-PSSession, Invoke-Command, Get-WmiObject (em versões mais antigas) e muitos outros.

É importante notar que Get-Credential bloqueia a execução até que o usuário forneça as credenciais ou cancele. Em scripts não interativos (como tarefas agendadas), você deve evitar essa abordagem e usar outras técnicas, como armazenar credenciais de forma segura (veremos mais adiante).

PSCredential

A classe PSCredential é a representação de credenciais no PowerShell. Ela contém duas propriedades principais: UserName (uma string) e Password (uma SecureString). Você pode criar um objeto PSCredential manualmente, útil quando você tem a senha de outra forma (por exemplo, de um arquivo seguro).

Para criar um PSCredential manualmente, você precisa de uma senha como SecureString. A forma mais comum é converter uma string comum para SecureString usando ConvertTo-SecureString, mas isso deve ser feito com cuidado, pois a string original pode ficar na memória. Em scripts, é preferível obter a senha de forma segura, como via Get-Credential ou de um cofre de segredos.

Exemplo de criação manual:

$securePassword = ConvertTo-SecureString "MinhaSenhaForte" -AsPlainText -Force
$cred = [PSCredential]::new("usuario", $securePassword)

Você também pode acessar as propriedades do objeto:

$cred.UserName
$cred.Password  # Retorna a SecureString

Para obter a senha em texto claro (apenas para testes ou quando necessário), você pode usar GetNetworkCredential():

$cred.GetNetworkCredential().Password

Evite fazer isso em produção, pois expõe a senha na memória.

Muitos cmdlets aceitam um parâmetro -Credential do tipo PSCredential, o que facilita a passagem de credenciais de forma consistente.

Armazenamento seguro (SecretManagement, visão geral)

Manter credenciais em arquivos de script é uma péssima prática, pois elas podem ser lidas por qualquer pessoa com acesso ao arquivo. O módulo Microsoft.PowerShell.SecretManagement (introduzido no PowerShell 7.1) fornece uma interface unificada para armazenar e recuperar segredos (como senhas, chaves de API, tokens) em cofres seguros. Ele se integra com provedores de cofre como Windows Credential Manager, Azure Key Vault, HashiCorp Vault, entre outros.

Para começar, instale o módulo:

Install-Module -Name Microsoft.PowerShell.SecretManagement -Scope CurrentUser

Depois, registre um cofre (vault). Por exemplo, com o módulo SecretStore (que usa o Credential Manager do Windows):

Install-Module -Name Microsoft.PowerShell.SecretStore -Scope CurrentUser
Register-SecretVault -Name MyVault -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault

Agora você pode armazenar um segredo (como uma credencial) com Set-Secret:

Set-Secret -Name "MyCred" -Secret $cred

E recuperá-lo com Get-Secret:

$cred = Get-Secret -Name "MyCred"

O SecretManagement também oferece Get-SecretInfo para listar segredos, Remove-Secret para excluir, e Set-SecretVaultDefault para definir o cofre padrão.

Essa abordagem permite que você não exponha credenciais em texto claro em seus scripts. Você pode até usar chaves de API e outros valores sensíveis. É a forma recomendada para automações em produção.

No contexto de credenciais, você pode armazenar o objeto PSCredential diretamente, pois ele é serializado de forma segura.

Riscos

Lidar com credenciais envolve vários riscos que podem comprometer a segurança se não forem tratados adequadamente. Vamos listar os principais:

  • Exposição em texto claro: Incluir senhas em scripts ou arquivos de configuração é extremamente perigoso. Qualquer pessoa com acesso ao arquivo pode ler a senha. Sempre use SecureString ou um cofre de segredos.
  • Logs e rastreamento: Comandos que aceitam credenciais podem registrar a senha em logs de transcrição ou no histórico do PowerShell. Evite passar credenciais como argumentos de linha de comando.
  • Memória do processo: Objetos PSCredential armazenam a senha como SecureString, que é criptografada na memória, mas a conversão para texto claro (como em GetNetworkCredential()) a expõe na memória não gerenciada. Minimize essas conversões.
  • Phishing e engenharia social: Usuários podem ser induzidos a digitar credenciais em janelas falsas. Sempre valide a origem da solicitação.
  • Armazenamento em arquivos de script versionados: Se você versionar scripts com Git, credenciais podem vazar no repositório. Nunca inclua segredos em código versionado.
  • Permissões excessivas: Contas usadas em automações devem ter o menor privilégio possível. Isso limita o dano se as credenciais forem comprometidas.

Para mitigar esses riscos, siga as boas práticas: use Get-Credential para interação, armazene credenciais em cofres com SecretManagement, evite converter para texto claro, não coloque segredos em scripts ou repositórios, e use contas com privilégios mínimos.

Boas práticas e observações finais

Aqui estão algumas recomendações adicionais para trabalhar com credenciais no PowerShell:

  • Sempre que possível, utilize autenticação baseada em certificados ou tokens (como OAuth) em vez de senhas.
  • Para tarefas agendadas, use contas de serviço com senhas gerenciadas pelo sistema (gMSA) ou cofres de segredos.
  • Teste seus scripts em um ambiente de desenvolvimento com credenciais fictícias.
  • Revise periodicamente as credenciais armazenadas e remova as que não são mais necessárias.

Dominar o gerenciamento de credenciais é essencial para qualquer profissional de automação. Com as ferramentas e práticas apresentadas, você poderá criar scripts mais seguros e confiáveis.

Referências

Exercícios

  1. Escreva um comando que solicite credenciais ao usuário com a mensagem "Digite suas credenciais de administrador" e armazene em uma variável chamada $adminCred.

    ✓ Resposta: $adminCred = Get-Credential -Message "Digite suas credenciais de administrador"
  2. Como você criaria manualmente um objeto PSCredential com o nome de usuário "svc_backup" e a senha "P@ssw0rdForte"?

    ✓ Resposta:
    $securePass = ConvertTo-SecureString "P@ssw0rdForte" -AsPlainText -Force
    $cred = [PSCredential]::new("svc_backup", $securePass)
  3. Explique por que você não deve armazenar senhas em texto claro dentro de scripts PowerShell e cite uma alternativa segura.

    ✓ Resposta: Armazenar senhas em texto claro é perigoso porque qualquer pessoa com acesso ao arquivo pode lê-las. Alternativa: usar o módulo SecretManagement para armazenar segredos em um cofre seguro (ex.: SecretStore) e recuperá-los com Get-Secret.
  4. Qual comando do módulo SecretManagement você usaria para registrar um novo cofre chamado "MyVault" usando o módulo SecretStore?

    ✓ Resposta: Register-SecretVault -Name MyVault -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
  5. Liste pelo menos três riscos de segurança ao lidar com credenciais no PowerShell e como mitigá-los.

    ✓ Resposta: Riscos: exposição em texto claro, vazamento em logs, credenciais em repositórios versionados. Mitigações: usar SecureString e cofres, evitar logs de credenciais, nunca versionar segredos.