Como bloquear endereços de IP no seu Azure Cloud Service.

No mundo On-Premises é possível configurar o IIS para bloquear endereços de IP utilizando a feature “IP and Domain Restrictions” assim como mostra esse artigo aqui. Porém, falando de Azure Cloud Services, será que é possível utilizar os mesmos passos? Sim, porém por se tratar de um ambiente Plataforma Como Serviço (PaaS), teremos que utilizar alguns passos adicionais.

 

De acordo com esse artigo Common Cloud Service startup tasks, você pode restringir o acesso de uma função Web do Azure a um conjunto de endereços IP especificados modificando o arquivo web.config do IIS e criando um arquivo de comando que desbloqueia a seção ipSecurity do arquivo ApplicationHost.config. Porém, se tratando de PaaS, por padrão as instâncias não têm a feature “IP and Domain Restrictions” instalada, na qual é fundamental para termos o bloqueio de IPs. Para atingir esse objetivo, vamos precisar utilizar as famosas “Startup Tasks” para que as configurações sejam executadas sempre que a Role for iniciada. Vamos para os passos:

 

Nesses passos, vamos precisar basicamente criar 2 startup tasks, uma para a instalação da feature “IP and Domain Restrictions” e a outra para a configuração de bloqueio de IP.

 

1) Para a instalação da “IP and Domain Restrictions”, crie um arquivo PowerShell (.ps1) chamado “install-ip-restrictions.ps1” e adicione o comando abaixo:

Install-WindowsFeature -Name Web-IP-Security

 

2) Crie um arquivo chamado .cmd (prompt de comando) chamado “run-ps1.cmd” e adicione o comando:

powershell.exe -noexit -file "startup\install-ip-restrictions.ps1"

 

Para a configuração do bloqueio de IP, vamos utilizar os passos do artigo Common Cloud Service startup tasks.

 

3) Crie um arquivo chamado “startup.cmd” e adicione o comando:

%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity

 

4) Crie uma nova pasta no nível raiz da sua Web Role chamada startup e, nessa pasta adicione os 3 arquivos criados nos passos acima:

[caption id="attachment_16815" align="alignnone" width="382"]Startup task files Startup task files[/caption]

5) Mude a propriedade “Copy to output directory” para “copy always” nos três arquivos:

[caption id="attachment_16825" align="alignnone" width="425"]Copy to output directory Copy to output directory[/caption]

 

6) Adicione a tarefa de inicialização a seguir ao arquivo ServiceDefinition.csdef.

<ServiceDefinition name="MyService" xmlns="https://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">   

  <WebRole name="WebRole1">       

   ...       

        <Startup>   

             <Task commandLine="startup\run-ps1.cmd" executionContext="elevated" taskType=”background” />         

              <Task commandLine="startup\startup.cmd" executionContext="elevated" />

       </Startup>

   </WebRole>

</ServiceDefinition>

 

Nota: A task “run-ps1.cmd” está configurada como “background”, o que significa que ela vai rodar no seu tempo, e a role irá iniciar enquanto a task ainda está em execução. Pode acontecer de a restrição de IP não funcionar nos primeiros 2 ou 3 minutos depois que a role iniciar, mas isso é esperado pois esse é o tempo que a instalação da feature leva. Porém, se esta task estiver com "simple" que é o tipo padrão, ela não irá funcionar pois no momento da execução das starup tasks o IIS ainda não estará instalado o que causara a reinicialização constante da role.

 

7) Por fim, modifique a seção system.webServer do arquivo web.config da sua Web Role para adicionar uma lista de endereços IP com acesso concedido, como mostrado neste exemplo:

Esta configuração de exemplo permite que todos os IPs acessem o servidor, exceto os dois definidos

<system.webServer>   

      <security>   

       <!--Unlisted IP addresses are granted access-->   

       <ipSecurity>       

       <!--The following IP addresses are denied access-->

       <add allowed="false" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />       

      <add allowed="false" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />

      </ipSecurity>

   </security>

</system.webServer>

 

Esta configuração de exemplo nega que todos os IPs acessem o servidor, exceto os dois definidos.

<system.webServer>   

     <security>

     <!--Unlisted IP addresses are denied access-->

     <ipSecurity allowUnlisted="false">

       <!--The following IP addresses are granted access-->

       <add allowed="true" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />

       <add allowed="true" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />

    </ipSecurity>

   </security>

</system.webServer>

 

8) Faça o deploy para o Azure.