Como usar o PowerShell para configurar o IIS em vários servidores

Como usar o PowerShell para configurar o IIS em vários servidores

O PowerShell é uma ótima ferramenta para gerenciar tudo relacionado ao Windows. No entanto, ele também pode fazer um pouco de trabalho para você ao configurar os Serviços de Informações da Internet (IIS) e fica ainda melhor quando você pode usá-lo para configurar servidores IIS em massa.

À medida que você ganha cada vez mais experiência em design/administração de sistema, tende a se perguntar: “O PowerShell pode facilitar isso para mim?” Quase sempre começa com um tutorial que só ajuda você a entender melhor o PowerShell. Considerando a tarefa de configurar vários componentes do IIS para vários servidores, as etapas podem ser divididas em etapas lógicas, que são basicamente as etapas que você precisa concluir em uma GUI em um único servidor Windows. Vamos trabalhar com uma pequena lista de etapas para você começar e que você pode adicionar opcionalmente para outras configurações:

  • Importando um certificado PFX de um compartilhamento remoto
  • Crie uma nova ligação para https no IIS
  • Anexe o certificado importado à âncora https
  • Marque a caixa “Exigir SSL” no Gerenciador do IIS.
  • Adicione o log personalizado para obter o valor X-Forwarded-For do balanceador de carga.

A maioria dessas etapas são simples cliques na GUI, então por que tudo isso não foi feito com alguns comandos do PowerShell? Ou melhor ainda, executar uma lista de vários servidores remotos para realizar a mesma tarefa? A maioria das etapas que serão demonstradas nesta postagem são trechos de código que você pode inserir em sua estrutura típica do PowerShell. Você pode ter logs personalizados e itens exclusivos para depurar scripts do PowerShell. Caso contrário, você pode vinculá-los facilmente para fazer rapidamente o que você precisa para suas configurações do IIS.

Algumas coisas para configurar antes

Para começar, você precisa de algumas variáveis. Uma lista de servidores para configurar e uma pasta de rede disponível onde o arquivo de certificado PFX está localizado:

$Servers = Get-Content -Path C:WebServers.txt

$CertFolder = '\FileServer01SharedCerts'

Isso pegará a lista de servidores do arquivo .txt e definirá o local onde o certificado de importação será encontrado.

Se você estiver executando isso em vários servidores, eventualmente desejará ter certeza de que está executando em servidores que estão online. O próximo uso do cmdlet Test-Connection é fazer ping em cada servidor pelo menos uma vez para garantir que ele esteja ativo antes de prosseguir. Se o servidor estiver online, a lógica copiará a pasta do compartilhamento de rede que contém o certificado para a pasta C:WindowsTemp no servidor remoto. Dessa forma, o cmdlet Invoke-Command para importar o certificado não terá problemas de permissão ao copiar de um local de rede:

foreach ($Server in $Servers) {

if (Test-Connection -ComputerName $Server -Quiet -Count 1) {

Copy-Item -Path $CertFolder`

-Destino \\$Server\C$\Windows\Temp\CertAssets `

-Recurse -Força

Write-Host “Ativos copiados com sucesso!”

}

senão {

Write-Host “$Server parece estar offline!”

}

…código demonstrado abaixo…

}

Observe que é útil fornecer feedback ao console com linhas Write-Host ao executar isso. Também seria bom adicionar a um log existente se você envolver seu script com ele. Agora sabemos quais servidores estão online e temos ativos copiados localmente. Agora estamos prontos para seguir em frente.

Importe o certificado e crie uma nova ligação

Essa ação é executada usando o cmdlet Invoke-Command, que executa essa ação localmente em cada servidor. Dependendo do nível de segurança que você deseja implementar, você pode fazer algumas coisas com a senha necessária para importar o certificado PFX. Você pode salvá-lo em tempo real usando Get-Credential, ou pode simplesmente inserir a senha em texto simples incorporado no comando usado para importar. Eu sugeriria pelo menos proteger a senha com Get-Credential, embora existam muitas outras maneiras de inserir uma senha com segurança aqui. Para coletar a senha, você pode usar:

$MyPwd = Get-Credential -UserName 'Enter password below' -Message 'Enter password below'

Isso armazenará a senha do certificado sem precisar ter a senha em texto simples dentro do seu script. Passaremos essa variável local para o comando remoto usando o componente $Using:. Como o Invoke-Command e seu bloco de script que o acompanha são executados em um escopo diferente (local para a máquina remota), ele não tem conhecimento de nenhuma variável local definida fora do bloco de script. Isso permite passar quaisquer variáveis ​​locais para a sessão remota e usá-las adequadamente.

Importaremos o certificado para o armazenamento de certificados da conta do computador pessoal (Meu).

O código a seguir executa essas etapas:

  1. Iniciando um processo em um servidor remoto
  2. Ação de importação usando a senha fornecida na etapa Get-Credential
  3. Crie uma ligação https na porta 443.
  4. Adicionando um certificado importado a uma âncora https

*Isso ainda está dentro do loop foreach definido acima:

Invoke-Command -ComputerName $Server -ScriptBlock {

$SiteName = “Meu site”

Import-PfxCertificate -Password $Using:MyPwd.Password`

-CertStoreLocation Cert:\LocalMachine\My `

-FilePath C:\Windows\Temp\CertAssets\MyCert.pfx

Administração da Web do Módulo de Importação

New-WebBinding -Name $SiteName -IP “*” -Porta 443 -Protocol https

$SSLCert = Get-ChildItem -Path Cert:\LocalMachine\My `

| Where-Object {$_.Subject.Contains(“CertFriendlyName”)}

$Binding = Get-WebBinding -Name $SiteName -Protocol “https”

$Binding.AddSslCertificate($SSLCert.GetCertHashString(), “Meu”)

Write-Host “Configuração bem-sucedida em: $env:COMPUTERNAME”

}

Além de qualquer saída que você forçar a saída para o console como parte de sua própria configuração, também haverá alguma saída para a ação de importação do certificado após a importação com êxito.

Também é bom limpar sua bagunça, então adicione algumas linhas para remover a pasta de arquivos. pfx que foi copiado para a máquina. Isso estará dentro do loop foreach, de preferência perto do final:

Remove-Item -Path "\\$Server\C$\Windows\temp\CertAssets"-Recurse -Force

Write-Host "Cleanup on $Server completed!"

Exigir SSL em seu site

Este próximo snippet de comando será usado ao implantar a implantação. Se você quiser que ele seja necessário imediatamente, basta adicioná-lo ao restante do código acima e pronto. Você pode ter uma distribuição em fases onde você pode querer habilitar isso em servidores específicos. De qualquer forma, você o cria, a essência do trabalho estará nestas poucas linhas:

Import-Module WebAdministration

Set-WebConfiguration -Location “Meu Web Site”`

-Filter 'system.webserver/security/access' -Value "Ssl"

Observe que o parâmetro -Location é o nome do site IIS que requer SSL. Isso agora forçará todas as conexões seguras à sua nova âncora com o certificado apropriado. Na GUI, isso seria equivalente a clicar no ícone “Configurações de SSL” no Gerenciador do IIS para seu site específico e marcar a caixa “Exigir SSL”:

Configurando as opções de log do IIS

Se você gerencia uma frota de servidores IIS que estão atrás de um balanceador de carga, pode aproveitar as informações que o balanceador de carga coleta de conexões de entrada. Supondo que seu balanceador de carga específico esteja configurado para capturar o valor X-Forwarded-For, você pode obter os endereços IP de entrada de todas as conexões de entrada para seus servidores IIS e exibi-los nos logs IIS conhecidos. Isso é especialmente útil quando se trata de solucionar problemas de rastreamento de conexão de determinados recursos que podem ter causado erros em um servidor específico.

Portanto, o IIS não coleta o valor X-Forwarded-For. Ele precisa ser configurado como um valor personalizado para que o IIS possa capturá-lo e registrá-lo. Também há uma maneira de configurar isso na GUI, mas você pode adicionar este comando ao nosso script de provisionamento atual para tê-lo em vigor desde o início:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `

-Filter “system.applicationHost/sites/siteDefaults/logFile/customFields”`

-Nome “.”`

-Value @{logFieldName='X-Forwarded-For';sourceName='X-Forwarded-For';sourceType='RequestHeader'}

Depois de concluído, você pode verificar se esse campo personalizado foi adicionado ao IIS no nível do servidor abrindo o Gerenciador do IIS e clicando em Meu servidor > Log > Arquivo de log: Selecionar campos…

Feito isso, você poderá ver os endereços IP das conexões de entrada para seus servidores IIS nos logs tradicionais do IIS.

Estes são apenas alguns exemplos das configurações que você pode definir em seus servidores IIS. Quanto mais servidores você gerencia e configura da mesma forma, mais cliques você economiza, o que é sempre bom. Sugiro testar comandos diferentes para as configurações desejadas no mesmo servidor. Uma vez que você tenha um processo para aquele servidor, ele pode ser repetido em quantos servidores você quiser com a estrutura dada aqui neste post.

Isso deve ser mais do que suficiente para começar a economizar tempo e ter uma implantação IIS mais padronizada em seu ambiente.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *