Skip to main content

Client IP Filter on Windows Azure

Pornim de la următoarea problema:
  • Avem un site în cloud. Dorim sa restricționam accesul pe baza de IP. Vrem sa excludem o anumita clasa de IP-uri.
Cautînd pe google și prin blog-uri am găsit doua soluții propuse, care sa și funcționează pe Azure:
  1. IPSecurity
  2. IHttpModule
1. In prima varianta trebuie sa restricționam accesul la clasele de IP-uri din fișierul de configurare.
<location path="CarWebSite">
<system.webServer>
<security>
<ipSecurity>
<add ipAddress="123.456.0.0" subnetMask="255.255.0.0" allowed="false" />
</ipSecurity>
</security>
</system.webServer>
</location>
Mai sus am restrictionat accesul la IP-urile 123.254.0.1 pana la 123.254.255.255 pentru path-ul CarWebSite. Daca am fi pe un Windows Server 2003 acesta setare ar functiona fara nici o problema. In schimb pe Windows Azure o sa avem o mica surpriza. Din cauza ca pe IIS din cloud modulul pentru IP Security nu este (încă) instalat.
Pentru a putea totuși sa folosim aceasta funcționalitate trebuie sa facem un mic hack și sa instalam acest modul în momentul în care instanta pornește. Primul pas este sa ne definim task-ul în *.csdef.
<Startup>
<Task commandLine="Startup.cmd" taskType="simple" executionContext="elevated" />
</Startup>
In momentul in care instanta porneste, cmd cu numele specificat o sa ruleze intr-un context elevat (cu drepturi de administrator).
Atributul TaskType specifica modul în care as fie rulat acest task:
  • Simple - sistemul așteaptă comanda sa se termine de executat, înainte ca un alt task sa fie lansat;
  • Background - sistemul nu așteaptă ca cmd-ul sa se termine de executat și trece la următoarea comanda;
  • Foreground - la fel ca și Background, doar ca instanta nu se va restarta pana cînd comanda nu se termina de executat;
In fișierul Startup.cmd trebuie sa instalam modulele de care avem nevoie și sa facem unlock la secțiune ipSecurity:
%windir%\System32\ServerManagerCmd.exe -install Web-IP-Security
%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity
Acest fisier trebuie sa fie in root-ul proiectului si sa aibe setat flag-ul Content setat cu valoarea Copy Always. Dupa ce o sa facem deploy la solutie, filtrarea după ip-uri ar trebui sa functioneze.
Din cauza ca instalam un nou modul de IIS, inițializarea rolului s-ar putea sa dureze mai mult (~5 minute în plus în cazul unei instante de tip small).
2. Următoarea soluție pe care am găsito este sa implementam interfața IHttpModule și sa ne definim un modul http propriu. In momentul în care acesta se inițializează ar trebuii sa citească lista de IP-uri restricționate dintr-o anumita locație, iar apoi la fiecare acces, în funcție de IP-ul clientului sa nu permită accesul la aplicația pentru anumite IP-uri.
public class IPBlockHttpModule : IHttpModule
{
private void HandleBeginRequest( object sender, EventArgs evargs )
{
if (!sender is HttpApplication)
{
return;
}

HttpApplication app = (HttpApplication)sender;
string IPAddress = app.Context.Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(IPAddress))
{
return;
}
if (IsBlockedIP(IPAddress))
{
app.Context.Response.StatusCode = 404;
app.Context.Response.SuppressContent = true;
app.Context.Response.End();
return;
}
}
}
In momentul în care se face un request verificam dacă ip-ul clientului este are drepturi sa acceseze situl. In cazul în care acesta nu are drepturi returnam eroarea 404. Metoda IsBlockedIP verifica dacă IP-ul clientului are drepturi sa acceseze situl nostru.

Daca in prima varianta partea de filtrare o face în totalitate IIS-ul, în a doua varianta acest lucru o sa îl facă codul nostru. Ma aștept ca în viitor sa apară aceasta funcționalitate și în Azure, din aceasta cauza recomand prima varianta.

Comments

  1. Nu ar merge sa definesti un rule nou in firewall-ul de pe guest machine, cu un startup task care sa ruleze ceva gen:
    netsh advfirewall firewall add rule ...
    ?

    ReplyDelete
  2. Ba da, cred ca s-ar putea folosi fără probleme. Regula care ar trebui sa fie de forma:
    netsh advfirewall firewall add rule name=”Regula1” dir=in action=allow enable=yes remoteip=123.123.0.1,134.123.0.0/16,LocalSubnet profile=domain

    ReplyDelete

Post a Comment

Popular posts from this blog

How to check in AngularJS if a service was register or not

There are cases when you need to check in a service or a controller was register in AngularJS.
For example a valid use case is when you have the same implementation running on multiple application. In this case, you may want to intercept the HTTP provider and add a custom step there. This step don’t needs to run on all the application, only in the one where the service exist and register.
A solution for this case would be to have a flag in the configuration that specify this. In the core you would have an IF that would check the value of this flag.
Another solution is to check if a specific service was register in AngularJS or not. If the service was register that you would execute your own logic.
To check if a service was register or not in AngularJS container you need to call the ‘has’ method of ‘inhector’. It will return TRUE if the service was register.
if ($injector.has('httpInterceptorService')) { $httpProvider.interceptors.push('httpInterceptorService&#…

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

Run native .NET application in Docker (.NET Framework 4.6.2)

Scope
The main scope of this post is to see how we can run a legacy application written in .NET Framework in Docker.

Context
First of all, let’s define what is a legacy application in our context. By a legacy application we understand an application that runs .NET Framework 3.5 or higher in a production environment where we don’t have any more the people or documentation that would help us to understand what is happening behind the scene.
In this scenarios, you might want to migrate the current solution from a standard environment to Docker. There are many advantages for such a migration, like:

Continuous DeploymentTestingIsolationSecurity at container levelVersioning ControlEnvironment Standardization
Until now, we didn’t had the possibility to run a .NET application in Docker. With .NET Core, there was support for .NET Core in Docker, but migration from a full .NET framework to .NET Core can be costly and even impossible. Not only because of lack of features, but also because once you…