Automação do Azure com Windows PowerShell Desired State Configuration

Com o IIS instalado na máquina virtual é necessário abrir os portos de acesso ao IIS por defeito é 80 para Hypertext Transfer Protocol (HTTP) e 443 para Hypertext Transfer Protocol Secure (HTTPS). É preciso definir em dois lugares no firewall da máquina virtual e na segurança no Azure Network Security Groups (NSG).

Para configurar a firewall na máquina virtual vai ser utilizado um outro script DSC.

Ambiente da configuraçãoConfiguração com identificação DSCFirewallConfig.
configuration DSCFirewallConfig

{
Tem um parâmetro que define qual a máquina que vai ser afetada.
param
(
[string[]]$NodeName = 'localhost'
)
Importação dos módulos DSC necessários.
Import-DSCResource -ModuleName xNetworking
Configuração estruturalImplantar a configuração na máquina definido pelo parâmetro.
Node $NodeName
{
Configuração da Firewall na máquina Virtual.
xFirewall Firewall
{
Name = "IISFirewallRule"
DisplayName = "Firewall Rule for IIS"
Ensure = "Present"
Action = "Allow"
Profile = ("Domain", "Private", "Public")
Direction = "OutBound"
RemotePort = (443, "80", "8080")
LocalPort = (443, "80", "8080")
Protocol = "TCP"
Description = "Firewall Rule for IIS"
Service = "WinRM"
}
}
}

O método de aplicação é exatamente igual ao anterior DSC do IIS. O script é validado se for válido é publicado e pode ser utilizado.

<#
+----------------------------------------------------------------+
| Desired State Configuration (DSC) |
| Firewall Open TCP Ports for IIS |
+----------------------------------------------------------------+
#>
# -- Install xNetworking module current user --
Install-Module -Name xNetworking -Scope CurrentUser
# -- Publish DSC --
#Remove-AzureStorageBlob -Blob DSCFirewallConfig.ps1.zip -Container windows-powershell-dsc -Context $StorageContext -Verbose
Publish-AzureRmVMDscConfiguration -ConfigurationPath ".\DSCFirewallConfig.ps1" -ResourceGroupName $ResourceGroup -StorageAccountName $StorageAccountName -Verbose
# -- View Published Blob File --
#Get-AzureStorageBlob -Blob DSCFirewallConfig.ps1.zip -Container windows-powershell-dsc -Context $StorageContext -ErrorAction Stop
# -- Configure DSC in the VM --
Set-AzureRmVMDscExtension -ResourceGroupName $ResourceGroup -VMName $VMName -ConfigurationArchiveBlob “DSCFirewallConfig.ps1.zip” -ArchiveStorageAccountName $StorageAccount.StorageAccountName -ArchiveResourceGroupName $StorageAccount.ResourceGroupName -ArchiveContainerName $DSCArchiveStorageAccountName -ConfigurationName “DSCFirewallConfig” -Version $DSCExtVersion -AutoUpdate:$true -Force
Get-AzureRmVM -Name $VMName -ResourceGroupName $ResourceGroup | Update-AzureRmVM
Azure com PowerShell: Execução do DSC para firewall da máquina virtual
Execução do DSC para firewall da máquina virtual

Com a firewall definida na máquina virtual define-se agora o Azure NSG. O NSG são listas de acesso ou Access Control List (ACL) que permitem ou negam o tráfego exterior com o Azure de uma sub-rede da rede virtual (VNet). Como qualquer sistema de segurança o NSG contém dois tipos de regras, regras de entrada e regras de saída e é necessário definir as prioridades da regra.

Azure com PowerShell: Mostra como as regras do NSG são processadas (docs.microsoft.com).
Mostra como as regras do NSG são processadas (docs.microsoft.com).

Antes de criar um NSG primeiro criam-se as regras de acesso só depois se cria o NSG e é associado a um NIC. Vão ser criadas duas regras para permitir tráfego externo do protocolo HyperText Transfer Protocol (HTTP) que utiliza a porta 80 e Remote Desktop Protocol (RDP) para acesso remoto da máquina virtual que utiliza a porta 3389. Para criar as regras utiliza-se o cmdlet New-AzureRmNetworkSecurityRuleConfig que, como indica o nome é a descrição da regra, os portos de origem e destino, e a sua permissão se autoriza ou nega. Um dos pontos fundamentais ao definir uma regra é a sua prioridade que é numerada entre 100 a 4096 a prioridade é definida do menor para o maior.

<#
+----------------------------------------------------------------+
| Azure Network Security Groups (NSG) |
+----------------------------------------------------------------+
#>
# -- Create NSG Rules --
$NSGRDPRule = New-AzureRmNetworkSecurityRuleConfig -Name "rdp-rule" -Description "Allow RDP" -Access "Allow" -Protocol "Tcp" -Direction "Inbound" -Priority 100 -SourceAddressPrefix "Internet" -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389
$NSGHTTPRule = New-AzureRmNetworkSecurityRuleConfig -Name "web-rule" -Description "Allow HTTP" -Access "Allow" -Protocol "Tcp" -Direction "Inbound" -Priority 101 -SourceAddressPrefix "Internet" -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 80
Azure com PowerShell: cmdlet New-AzureRmNetworkSecurityRuleConfig
cmdlet New-AzureRmNetworkSecurityRuleConfig

Com as regras de acesso criadas pode associar a criação do NSG, para tal utiliza-se o comando New-AzureRmNetworkSecurityGroup que tem que definir o grupo de recursos, localização e as regras a adicionar. Pode adicionar uma ou várias regras em simultâneo.

# -- Create NSG --
$NSG = New-AzureRmNetworkSecurityGroup -ResourceGroupName $ResourceGroup -Location $Location -Name "NSG-FrontEnd" -SecurityRules $NSGRDPRule, $NSGHTTPRule

# -- Associate NSG to NIC --
$NIC.NetworkSecurityGroup = $NSG
Set-AzureRmNetworkInterface -NetworkInterface $NIC
Azure com PowerShell: cmdlets New-AzureRmNetworkSecurityGroup e Set-AzureRmNetworkInterface
cmdlets New-AzureRmNetworkSecurityGroup e Set-AzureRmNetworkInterface

Pode sempre ver o estado das regras com o cmdlet Get-AzureRmNetworkSecurityGroup a que grupo de recursos pretende que os resultados sejam mostrados como uma tabela numa janela utilizando Out-GridView.

# -- View NetWork Security Group --
#Get-AzureRmNetworkSecurityGroup -Name $NSG.Name -ResourceGroupName $ResourceGroup | Sort-Object Direction, Access, Priority | Out-GridView --
Azure com PowerShell: cmdlet Get-AzureRmNetworkSecurityGroup com Out-GridVew
cmdlet Get-AzureRmNetworkSecurityGroup com Out-GridVew

Pode fazer um filtro das regras com o cmdlet Get-AzureRmEffectiveNetworkSecurityGroup indicando a NIC e a que grupo de recursos pretende que os resultados sejam mostrados como uma tabela numa janela utilizando Out-GridView.

# -- View filtering --
#$EffNSG = Get-AzureRmEffectiveNetworkSecurityGroup -NetworkInterfaceName $NIC.Name -ResourceGroupName $ResourceGroup
#$EffNSG.EffectiveSecurityRules | Sort-Object Direction, Access, Priority | Out-GridView
Azure com PowerShell: cmdlet Get-AzureRmEffectiveNetworkSecurityGroup
cmdlet Get-AzureRmEffectiveNetworkSecurityGroup

Com as regras criadas está finalizado o script de automação e pode ser utilizado quando quiser apenas tem de mudar as variáveis existentes para o ambiente pretendido.

No entanto o PowerShell permite fazer muito mais, como abrir a página do IIS através do endereço público de internet da máquina virtual. Se quiser utilizar o endereço de internet é necessário configurar o Fully Qualified Domain Name (FQDN) no NIC associado a máquina virtual. Pode abrir o navegador de Internet preferencial através do Dot Net com [System.Diagnostics.Process]::Start(). O endereço IP é obtido com o cmdelt Get-AzureRmPublicIpAddress.

<#
+----------------------------------------------------------------+
| Open VM IIS WebSite |
+----------------------------------------------------------------+
#>
# -- Open IIS WebSite in the Default Browser
$VMIP = (Get-AzureRmPublicIpAddress -Name PIP -ResourceGroupName $ResourceGroup).IpAddress
[System.Diagnostics.Process]::Start("http://" + $VMIP)
Azure com PowerShell: Execução do navegador de Internet por PowerShell
Execução do navegador de Internet por PowerShell

Também pode abrir uma ligação de ambiente de trabalho remoto ou outra aplicação com Start-Process.

<#
+----------------------------------------------------------------+
| Open Remote Desktop Session |
+----------------------------------------------------------------+
#>
# -- Launh Microsoft Terminal Server Connection
#Start-Process “mstsc” -ArgumentList "/V:$VMIP /w:1024 /h:768"
Azure com PowerShell: Execução do Start-Process
Execução do Start-Process

Se pretender destruir o grupo de recurso utilizado utilize o cmdlet Remove-AzureRmResourceGroup indicando o nome do grupo de recursos.

<#
+----------------------------------------------------------------+
| Destroy module 5 demo environment |
+----------------------------------------------------------------+
#>
# -- Warning: Delete the Resource Group
#Remove-AzureRmResourceGroup -Name $ResourceGroup -Verbose
Azure com PowerShell: Confirmação da remoção do grupo de recursos
Confirmação da remoção do grupo de recursos
Azure com PowerShell: Remoção do grupo de recursos com sucesso
Remoção do grupo de recursos com sucesso

O nível de segurança da conta do Azure é a mesma, nunca é mantido nenhum perfil na máquina a não ser que grave o seu perfil com cmdlet Save-AzureRmProfile.

Em conclusão o DSC é ótimo para automação não apenas para administradores de sistemas mas também para DevOps, administradores de bases dados e muitos mais. Pode fazer quase tudo incluindo implementar uma atualização de segurança em várias máquinas com o xWindowsUpdate o seguinte exemplo vai instalar a atualização KB2908279 que está na própria máquina.

Configuration UpdateWindowsWithPath
{
  Import-DSCResource –ModuleName 'PSDesiredStatedConfiguration',' xWindowsUpdate'
Node 'NodeName'
  {
    xHotfix HotfixInstall
    {
      Ensure = "Present"
      Path = "c:/temp/Windows8.1-KB2908279-v2-x86.msu"
      Id = "KB2908279"
    }
  }
}

O DSC não funciona apenas no Azure também funciona em máquinas locais. O processo é quase idêntico, enquanto no Azure o repositório e a implementação na máquina são tratados automaticamente, enquanto localmente é necessário gerir o repositório/ficheiros para serem aplicados nas máquinas remotas e a sua implementação. A vantagem do Azure é que trata disso tudo por nós.

Scripting Guy (Microsoft)

Se pretende saber mais sobre Windows PowerShell convido a consultar o blog oficial do PowerShell em https://blogs.msdn.microsoft.com/powershell/, a documentação da Microsoft em https://technet.microsoft.com/en-us/library/bb978526.aspx e o Microsoft Script Center em https://technet.microsoft.com/pt-pt/scriptcenter/.

Também está convidado a participar na comunidade PowerShell Portugal (https://pt-pt.facebook.com/PowerShellPortugal/) como participante e/ou orador.

Publicado na edição 55 (PDF) da Revista PROGRAMAR.