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ção | Configuraçã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 estrutural | Implantar 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
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.
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
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
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 --
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
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)
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"
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
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. |