Hosten von ASP.NET Core unter Linux mit NginxHost ASP.NET Core on Linux with Nginx

Von Sourabh ShirhattiBy Sourabh Shirhatti

In diesem Leitfaden wird das Einrichten einer produktionsbereiten ASP.NET Core-Umgebung auf einem Ubuntu 16.04-Server erläutert.This guide explains setting up a production-ready ASP.NET Core environment on an Ubuntu 16.04 server. Diese Anweisungen sind wahrscheinlich auf neuere Versionen von Ubuntu anwendbar, sie wurden jedoch noch nicht mit neueren Versionen getestet.These instructions likely work with newer versions of Ubuntu, but the instructions haven't been tested with newer versions.

Weitere Informationen zu anderen Linux-Distributionen, die von ASP.NET Core unterstützt werden, finden Sie unter Voraussetzungen für .NET Core unter Linux.For information on other Linux distributions supported by ASP.NET Core, see Prerequisites for .NET Core on Linux.

Hinweis

Für Ubuntu 14.04 wird supervisord für die Überwachung des Kestrel-Prozesses empfohlen.For Ubuntu 14.04, supervisord is recommended as a solution for monitoring the Kestrel process. systemd ist unter Ubuntu 14.04 nicht verfügbar.systemd isn't available on Ubuntu 14.04. Anweisungen zu Ubuntu 14.04 finden Sie in der vorherigen Version dieses Themas.For Ubuntu 14.04 instructions, see the previous version of this topic.

In diesem Leitfaden:This guide:

  • Wird eine bestehende ASP.NET Core-App hinter einem Reverseproxyserver eingefügt.Places an existing ASP.NET Core app behind a reverse proxy server.
  • Wird der Reverseproxyserver eingerichtet, um Anforderungen an den Kestrel-Webserver weiterzuleiten.Sets up the reverse proxy server to forward requests to the Kestrel web server.
  • Wird sichergestellt, dass die Web-App beim Start als Daemon ausgeführt wird.Ensures the web app runs on startup as a daemon.
  • Wird ein Prozessverwaltungstool konfiguriert, das die Web-App beim Neustarten unterstützt.Configures a process management tool to help restart the web app.

VoraussetzungenPrerequisites

  1. Greifen Sie auf einen Ubuntu 16.04-Server mit einem Standardbenutzerkonto mit sudo-Berechtigung zu.Access to an Ubuntu 16.04 server with a standard user account with sudo privilege.
  2. Installieren Sie die .NET Core-Runtime auf dem Server.Install the .NET Core runtime on the server.
    1. Besuchen Sie die .NET Core-Downloadseite.Visit the Download .NET Core page.
    2. Wählen Sie die neueste Version von .NET Core aus, die keine Vorschauversion ist.Select the latest non-preview .NET Core version.
    3. Laden Sie die neueste Runtime aus der Tabelle unter Run apps - Runtime (App-Ausführung – Runtime) herunter, bei der es sich nicht um eine Vorschauversion handelt.Download the latest non-preview runtime in the table under Run apps - Runtime.
    4. Klicken Sie auf den Link zu den Anweisungen zum Linux-Paket-Manager, und führen Sie die Ubuntu-Anweisungen zu Ihrer Version von Ubuntu aus.Select the Linux Package manager instructions link and follow the Ubuntu instructions for your version of Ubuntu.
  3. Eine vorhandene ASP.NET Core-App.An existing ASP.NET Core app.

Starten Sie die vom Server gehosteten ASP.NET Core-Apps zu einem beliebigen Zeitpunkt nach dem Upgrade des freigegebenen Frameworks neu.At any point in the future after upgrading the shared framework, restart the ASP.NET Core apps hosted by the server.

Veröffentlichen und Kopieren der AppPublish and copy over the app

Konfigurieren Sie die App für eine Framework-abhängige Bereitstellung.Configure the app for a framework-dependent deployment.

Wenn die App lokal ausgeführt wird und nicht so konfiguriert wurde, dass sie sichere Verbindungen (HTTPS) herstellt, können Sie einen der folgenden Ansätze verwenden:If the app is run locally and isn't configured to make secure connections (HTTPS), adopt either of the following approaches:

  • Konfigurieren der App, sodass diese sichere lokale Verbindungen verarbeitet.Configure the app to handle secure local connections. Weitere Informationen finden Sie im Abschnitt HTTPS-Konfiguration.For more information, see the HTTPS configuration section.
  • Entfernen Sie https://localhost:5001 (falls vorhanden) aus der applicationUrl-Eigenschaft in der Datei Properties/launchSettings.json.Remove https://localhost:5001 (if present) from the applicationUrl property in the Properties/launchSettings.json file.

Führen Sie dotnet publish in der Entwicklungsumgebung aus, um eine App in ein Verzeichnis zu packen (z.B. bin/Release/<target_framework_moniker>/publish), das auf dem Server ausgeführt werden kann:Run dotnet publish from the development environment to package an app into a directory (for example, bin/Release/<target_framework_moniker>/publish) that can run on the server:

dotnet publish --configuration Release

Die App kann auch als eine eigenständige Bereitstellung veröffentlicht werden, wenn Sie die .NET Core-Runtime nicht auf dem Server verwalten möchten.The app can also be published as a self-contained deployment if you prefer not to maintain the .NET Core runtime on the server.

Kopieren Sie die ASP.NET Core-App auf den Server, indem Sie ein beliebiges Tool verwenden, das in den Workflow der Organisation integriert ist (z.B. SCP oder SFTP).Copy the ASP.NET Core app to the server using a tool that integrates into the organization's workflow (for example, SCP, SFTP). Web-Apps befinden sich üblicherweise im Verzeichnis var (z.B. var/www/helloapp).It's common to locate web apps under the var directory (for example, var/www/helloapp).

Hinweis

In einem Szenario für die Bereitstellung in der Produktion übernimmt ein Continuous Integration-Workflow die Veröffentlichung der App und das Kopieren der Objekte auf den Server.Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.

Testen der App:Test the app:

  1. Führen Sie die App über die Befehlszeile aus: dotnet <app_assembly>.dll.From the command line, run the app: dotnet <app_assembly>.dll.
  2. Navigieren Sie in einem Browser zu http://<serveraddress>:<port>, und überprüfen Sie, ob die App lokal unter Linux funktioniert.In a browser, navigate to http://<serveraddress>:<port> to verify the app works on Linux locally.

Konfigurieren eines ReverseproxyserversConfigure a reverse proxy server

Ein Reverseproxy wird im Allgemeinen zur Unterstützung dynamischer Web-Apps eingerichtet.A reverse proxy is a common setup for serving dynamic web apps. Ein Reverseproxy beendet die HTTP-Anforderung und leitet diese an die ASP.NET Core-App weiter.A reverse proxy terminates the HTTP request and forwards it to the ASP.NET Core app.

Verwenden eines ReverseproxyserversUse a reverse proxy server

Kestrel eignet sich hervorragend für die Bereitstellung dynamischer Inhalte aus ASP.NET Core.Kestrel is great for serving dynamic content from ASP.NET Core. Die Webbereitstellungsfunktionen sind jedoch nicht so umfangreich wie bei Servern wie IIS, Apache oder Nginx.However, the web serving capabilities aren't as feature rich as servers such as IIS, Apache, or Nginx. Ein Reverseproxyserver kann Arbeiten wie das Verarbeiten von statischen Inhalten, das Zwischenspeichern und Komprimieren von Anforderungen und das Beenden von HTTPS vom HTTP-Server auslagern.A reverse proxy server can offload work such as serving static content, caching requests, compressing requests, and HTTPS termination from the HTTP server. Ein Reverseproxyserver kann sich auf einem dedizierten Computer befinden oder zusammen mit einem HTTP-Server bereitgestellt werden.A reverse proxy server may reside on a dedicated machine or may be deployed alongside an HTTP server.

Für diesen Leitfaden wird eine einzelne Instanz von Nginx verwendet.For the purposes of this guide, a single instance of Nginx is used. Diese wird auf demselben Server ausgeführt, zusammen mit dem HTTP-Server.It runs on the same server, alongside the HTTP server. Je nach Anforderungen kann ein anderes Setup ausgewählt werden.Based on requirements, a different setup may be chosen.

Da Anforderungen vom Reverseproxy weitergeleitet werden, sollten Sie die Middleware für weitergeleitete Header aus dem Paket Microsoft.AspNetCore.HttpOverrides verwenden.Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides package. Diese Middleware aktualisiert Request.Scheme mithilfe des X-Forwarded-Proto-Headers, sodass Umleitungs-URIs und andere Sicherheitsrichtlinien ordnungsgemäß funktionieren.The middleware updates the Request.Scheme, using the X-Forwarded-Proto header, so that redirect URIs and other security policies work correctly.

Die Middleware für weitergeleitete Header muss noch vor einer anderen Middleware ausgeführt werden.Forwarded Headers Middleware should run before other middleware. Mit dieser Reihenfolge wird sichergestellt, dass die auf Informationen von weitergeleiteten Headern basierende Middleware die zu verarbeitenden Headerwerte nutzen kann.This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing. Unter Middleware für weitergeleitete Header: Auftrag finden Sie Informationen zum Ausführen der Middleware für weitergeleitete Header nach der diagnostischen Middleware und der Middleware für die Fehlerbehandlung.To run Forwarded Headers Middleware after diagnostics and error handling middleware, see Forwarded Headers Middleware order.

Rufen Sie die Methode UseForwardedHeaders am Anfang von Startup.Configure auf, bevor Sie andere Middleware aufrufen.Invoke the UseForwardedHeaders method at the top of Startup.Configure before calling other middleware. Konfigurieren Sie die Middleware so, dass die Header X-Forwarded-For und X-Forwarded-Proto weitergeleitet werden:Configure the middleware to forward the X-Forwarded-For and X-Forwarded-Proto headers:

// using Microsoft.AspNetCore.HttpOverrides;

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

Wenn für die Middleware keine ForwardedHeadersOptions angegeben sind, lauten die weiterzuleitenden Standardheader None.If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None.

Proxys, die unter Loopbackadressen (127.0.0.0/8, [::1]) ausgeführt werden, einschließlich der standardmäßigen Localhostadresse (127.0.0.1), werden standardmäßig als vertrauenswürdig eingestuft.Proxies running on loopback addresses (127.0.0.0/8, [::1]), including the standard localhost address (127.0.0.1), are trusted by default. Wenn andere vertrauenswürdige Proxys oder Netzwerke innerhalb des Unternehmens Anforderungen zwischen dem Internet und dem Webserver verarbeiten, fügen Sie diese der Liste der KnownProxies oder KnownNetworks mit ForwardedHeadersOptions hinzu.If other trusted proxies or networks within the organization handle requests between the Internet and the web server, add them to the list of KnownProxies or KnownNetworks with ForwardedHeadersOptions. Das folgende Beispiel fügt einen vertrauenswürdigen Proxyserver mit der IP-Adresse 10.0.0.0.100 der Middleware für weitergeleitete Header KnownProxies in Startup.ConfigureServices hinzu:The following example adds a trusted proxy server at IP address 10.0.0.100 to the Forwarded Headers Middleware KnownProxies in Startup.ConfigureServices:

// using System.Net;

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});

Weitere Informationen finden Sie unter Konfigurieren von ASP.NET Core zur Verwendung mit Proxyservern und Lastenausgleich.For more information, see Konfigurieren von ASP.NET Core zur Verwendung mit Proxyservern und Lastenausgleich.

Installieren von NginxInstall Nginx

Verwenden Sie apt-get zum Installieren von Nginx.Use apt-get to install Nginx. Das Installationsprogramm erstellt ein systemd-Initialisierungsskript, das Nginx beim Systemstart als Dämon ausführt.The installer creates a systemd init script that runs Nginx as daemon on system startup. Befolgen Sie die Installationsanleitungen für Ubuntu auf NGINX: Official Debian/Ubuntu packages.Follow the installation instructions for Ubuntu at Nginx: Official Debian/Ubuntu packages.

Hinweis

Wenn optionale Nginx-Module benötigt werden, kann die Erstellung von Nginx aus der Quelle erforderlich sein.If optional Nginx modules are required, building Nginx from source might be required.

Da Nginx zum ersten Mal installiert wurde, starten Sie es explizit, indem Sie Folgendes ausführen:Since Nginx was installed for the first time, explicitly start it by running:

sudo service nginx start

Stellen Sie sicher, dass ein Browser die Standardangebotsseite für Nginx anzeigt.Verify a browser displays the default landing page for Nginx. Die Landing Page ist unter http://<server_IP_address>/index.nginx-debian.html erreichbar.The landing page is reachable at http://<server_IP_address>/index.nginx-debian.html.

Konfigurieren von NginxConfigure Nginx

Ändern Sie /etc/nginx/sites-available/default, um Nginx als Reverseproxy für die Weiterleitung von Anforderungen zu Ihrer ASP.NET Core-App zu konfigurieren.To configure Nginx as a reverse proxy to forward requests to your ASP.NET Core app, modify /etc/nginx/sites-available/default. Öffnen Sie die Datei in einem Text-Editor und ersetzen Sie den Inhalt durch den Folgendes:Open it in a text editor, and replace the contents with the following:

server {
    listen        80;
    server_name   example.com *.example.com;
    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Wenn es sich bei der App um eine Blazor Server-App handelt, die auf SignalR-Websockets basiert, finden Sie unter Hosten und Bereitstellen von ASP.NET Core Blazor Server weitere Informationen dazu, wie Sie den Connection-Header festlegen.If the app is a Blazor Server app that relies on SignalR WebSockets, see Hosten und Bereitstellen von ASP.NET Core Blazor Server for information on how to set the Connection header.

Wenn keine Übereinstimmung mit server_name gefunden wird, verwendet Nginx den Standardserver.When no server_name matches, Nginx uses the default server. Wenn kein Server definiert ist, ist der erste Server in der Konfigurationsdatei der Standardserver.If no default server is defined, the first server in the configuration file is the default server. Als bewährte Methode gilt, einen bestimmten Standardserver hinzuzufügen, der den Statuscode 444 in Ihrer Konfigurationsdatei zurückgibt.As a best practice, add a specific default server which returns a status code of 444 in your configuration file. Im Folgenden wird ein Beispiel für eine Standardserverkonfiguration aufgeführt:A default server configuration example is:

server {
    listen   80 default_server;
    # listen [::]:80 default_server deferred;
    return   444;
}

Mit der vorhergehenden Konfigurationsdatei und dem vorhergehenden Standardserver akzeptiert Nginx den öffentlichen Datenverkehr über Port 80 mit dem Hostheader example.com oder *.example.com.With the preceding configuration file and default server, Nginx accepts public traffic on port 80 with host header example.com or *.example.com. Anforderungen, die mit diesen Hosts nicht übereinstimmen, werden nicht an Kestrel weitergeleitet.Requests not matching these hosts won't get forwarded to Kestrel. Nginx leitet die übereinstimmenden Anforderungen unter http://localhost:5000 an Kestrel weiter.Nginx forwards the matching requests to Kestrel at http://localhost:5000. Weitere Informationen finden Sie unter Verarbeitung einer Anforderung mit Nginx.See How nginx processes a request for more information. Informationen zum Ändern der IP-Adresse bzw. des Ports von Kestrel finden Sie unter Kestrel: Endpoint configuration (Kestrel: Endpunktkonfiguration).To change Kestrel's IP/port, see Kestrel: Endpoint configuration.

Warnung

Schlägt die Angabe einer ordnungsgemäßen server_name-Anweisung fehlt, ist Ihre App Sicherheitsrisiken ausgesetzt.Failure to specify a proper server_name directive exposes your app to security vulnerabilities. Platzhalterbindungen in untergeordneten Domänen (z.B. *.example.com) verursachen kein Sicherheitsrisiko, wenn Sie die gesamte übergeordnete Domäne steuern (im Gegensatz zu *.com, das angreifbar ist).Subdomain wildcard binding (for example, *.example.com) doesn't pose this security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Weitere Informationen finden Sie unter rfc7230 im Abschnitt 5.4.See rfc7230 section-5.4 for more information.

Wenn die Nginx-Konfiguration eingerichtet ist, können Sie zur Überprüfung der Syntax der Konfigurationsdateien sudo nginx -t ausführen.Once the Nginx configuration is established, run sudo nginx -t to verify the syntax of the configuration files. Wenn der Test der Konfigurationsdatei erfolgreich ist, können Sie durch Ausführen von sudo nginx -s reload erzwingen, dass Nginx die Änderungen übernimmt.If the configuration file test is successful, force Nginx to pick up the changes by running sudo nginx -s reload.

Gehen Sie wie folgt vor, um die App auf dem Server direkt auszuführen:To directly run the app on the server:

  1. Navigieren Sie zum Verzeichnis der App.Navigate to the app's directory.
  2. Führen Sie die App dotnet <app_assembly.dll> aus, wobei app_assembly.dll der Name der Assemblydatei der App ist.Run the app: dotnet <app_assembly.dll>, where app_assembly.dll is the assembly file name of the app.

Wenn die App auf dem Server ausgeführt wird, über das Internet jedoch nicht reagiert, sollten Sie die Firewall des Servers überprüfen und sicherstellen, dass Port 80 geöffnet ist.If the app runs on the server but fails to respond over the Internet, check the server's firewall and confirm that port 80 is open. Fügen Sie bei Verwendung einer Azure-Ubuntu-VM eine Regel der Netzwerksicherheitsgruppe (NSG) zur Aktivierung des eingehenden Datenverkehrs an Port 80 hinzu.If using an Azure Ubuntu VM, add a Network Security Group (NSG) rule that enables inbound port 80 traffic. Eine Regel für ausgehenden Datenverkehr an Port 80 muss nicht aktiviert werden, da der ausgehende Datenverkehr automatisch gewährt wird, wenn die Regel für den eingehenden Datenverkehr aktiviert ist.There's no need to enable an outbound port 80 rule, as the outbound traffic is automatically granted when the inbound rule is enabled.

Nach dem Testen der App können Sie die App mit Ctrl+C in der Eingabeaufforderung beenden.When done testing the app, shut the app down with Ctrl+C at the command prompt.

Überwachen der AppMonitor the app

Der Server ist dafür eingerichtet, Anforderungen an http://<serveraddress>:80 an die ASP.NET Core-App weiterzuleiten, die unter http://127.0.0.1:5000 unter Kestrel ausgeführt wird.The server is setup to forward requests made to http://<serveraddress>:80 on to the ASP.NET Core app running on Kestrel at http://127.0.0.1:5000. Nginx wurde jedoch nicht dafür eingerichtet, den Kestrel-Prozess zu verwalten.However, Nginx isn't set up to manage the Kestrel process. systemd kann für die Erstellung einer Dienstdatei verwendet werden, um die zugrunde liegende Web-App zu starten und zu überwachen.systemd can be used to create a service file to start and monitor the underlying web app. SystemD ist ein Initialisierungssystem, das viele leistungsstarke Features zum Starten, Beenden und Verwalten von Prozessen bereitstellt.systemd is an init system that provides many powerful features for starting, stopping, and managing processes.

Erstellen der DienstdateiCreate the service file

Erstellen Sie die Dienstdefinitionsdatei:Create the service definition file:

sudo nano /etc/systemd/system/kestrel-helloapp.service

Im Folgenden wird ein Beispiel für eine Dienstdatei der App aufgeführt:The following is an example service file for the app:

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

Im vorherigen Beispiel wird der Benutzer, der den Dienst verwaltet, durch die Option User angegeben.In the preceding example, the user that manages the service is specified by the User option. Der Benutzer (www-data) muss vorhanden und der ordnungsgemäße Besitzer der App-Dateien sein.The user (www-data) must exist and have proper ownership of the app's files.

Verwenden Sie TimeoutStopSec, um die Dauer der Wartezeit bis zum Herunterfahren der App zu konfigurieren, nachdem diese das anfängliche Interruptsignal empfangen hat.Use TimeoutStopSec to configure the duration of time to wait for the app to shut down after it receives the initial interrupt signal. Wenn die App in diesem Zeitraum nicht heruntergefahren wird, wird SIGKILL ausgegeben, um die App zu beenden.If the app doesn't shut down in this period, SIGKILL is issued to terminate the app. Geben Sie den Wert als einheitenlose Sekunden (z.B. 150), einen Zeitspannenwert (z.B. 2min 30s) oder infinity an, um das Timeout zu deaktivieren.Provide the value as unitless seconds (for example, 150), a time span value (for example, 2min 30s), or infinity to disable the timeout. TimeoutStopSec ist standardmäßig der Wert DefaultTimeoutStopSec in der Manager-Konfigurationsdatei (systemd-system.conf, system.conf.d, systemd-user.conf, user.conf.d).TimeoutStopSec defaults to the value of DefaultTimeoutStopSec in the manager configuration file (systemd-system.conf, system.conf.d, systemd-user.conf, user.conf.d). Das Standardtimeout für die meisten Distributionen beträgt 90 Sekunden.The default timeout for most distributions is 90 seconds.

# The default value is 90 seconds for most distributions.
TimeoutStopSec=90

Linux verfügt über ein Dateisystem, bei dem die Groß-/Kleinschreibung beachtet wird.Linux has a case-sensitive file system. Das Festlegen von ASPNETCORE_ENVIRONMENT auf „Production“ führt dazu, dass nach der Konfigurationsdatei appsettings.Production.json und nicht nach appsettings.production.json gesucht wird.Setting ASPNETCORE_ENVIRONMENT to "Production" results in searching for the configuration file appsettings.Production.json, not appsettings.production.json.

Einige Werte (z.B. SQL-Verbindungszeichenfolgen) müssen mit Escapezeichen versehen werden, damit die Konfigurationsanbieter die Umgebungsvariablen lesen können.Some values (for example, SQL connection strings) must be escaped for the configuration providers to read the environment variables. Mit dem folgenden Befehl können Sie einen ordnungsgemäß mit Escapezeichen versehenen Wert für die Verwendung in der Konfigurationsdatei generieren:Use the following command to generate a properly escaped value for use in the configuration file:

systemd-escape "<value-to-escape>"

Doppelpunkte (:) als Trennzeichen werden in Umgebungsvariablennamen nicht unterstützt.Colon (:) separators aren't supported in environment variable names. Verwenden Sie statt eines Doppelpunkts zwei Unterstriche (__).Use a double underscore (__) in place of a colon. Der Umgebungsvariablen-Konfigurationsanbieter konvertiert jeweils die zwei Unterstriche in einen Doppelpunkt, wenn die Umgebungsvariablen in die Konfiguration gelesen werden.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. Im folgenden Beispiel wird der Verbindungszeichenfolgeschlüssel ConnectionStrings:DefaultConnection als ConnectionStrings__DefaultConnection in die Dienstdefinitionsdatei platziert:In the following example, the connection string key ConnectionStrings:DefaultConnection is set into the service definition file as ConnectionStrings__DefaultConnection:

Doppelpunkte (:) als Trennzeichen werden in Umgebungsvariablennamen nicht unterstützt.Colon (:) separators aren't supported in environment variable names. Verwenden Sie statt eines Doppelpunkts zwei Unterstriche (__).Use a double underscore (__) in place of a colon. Der Umgebungsvariablen-Konfigurationsanbieter konvertiert jeweils die zwei Unterstriche in einen Doppelpunkt, wenn die Umgebungsvariablen in die Konfiguration gelesen werden.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. Im folgenden Beispiel wird der Verbindungszeichenfolgeschlüssel ConnectionStrings:DefaultConnection als ConnectionStrings__DefaultConnection in die Dienstdefinitionsdatei platziert:In the following example, the connection string key ConnectionStrings:DefaultConnection is set into the service definition file as ConnectionStrings__DefaultConnection:

Environment=ConnectionStrings__DefaultConnection={Connection String}

Speichern Sie die Datei, und aktivieren Sie den Dienst.Save the file and enable the service.

sudo systemctl enable kestrel-helloapp.service

Starten Sie den Dienst, und überprüfen Sie, ob er ausgeführt wird.Start the service and verify that it's running.

sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service

◝ kestrel-helloapp.service - Example .NET Web API App running on Ubuntu
    Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

Wenn der Reverseproxy konfiguriert ist und Kestrel durch „systemd“ verwaltet wird, ist die Webanwendung vollständig konfiguriert. Auf diese kann dann über einen Browser auf dem lokalen Computer unter http://localhost zugegriffen werden.With the reverse proxy configured and Kestrel managed through systemd, the web app is fully configured and can be accessed from a browser on the local machine at http://localhost. Der Zugriff ist auch von einem Remotecomputer aus möglich, sofern keine Firewall diesen blockiert.It's also accessible from a remote machine, barring any firewall that might be blocking. Beim Überprüfen der Antwortheader zeigt der Header Server die ASP.NET Core-App an, die von Kestrel verarbeitet wird.Inspecting the response headers, the Server header shows the ASP.NET Core app being served by Kestrel.

HTTP/1.1 200 OK
Date: Tue, 11 Oct 2016 16:22:23 GMT
Server: Kestrel
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked

Protokoll anzeigen...View logs

Da die Web-App, die Kestrel verwendet, von systemd verwaltet wird, werden alle Ereignisse und Prozesse in einem zentralen Journal protokolliert.Since the web app using Kestrel is managed using systemd, all events and processes are logged to a centralized journal. Dieses Journal enthält jedoch alle Einträge für alle Dienste und Prozesse, die von systemd verwaltet werden.However, this journal includes all entries for all services and processes managed by systemd. Verwenden Sie folgenden Befehl, um die kestrel-helloapp.service-spezifischen Elemente anzuzeigen:To view the kestrel-helloapp.service-specific items, use the following command:

sudo journalctl -fu kestrel-helloapp.service

Für weiteres Filtern können Zeitoptionen wie --since today, --until 1 hour ago oder eine Kombination aus diesen die Menge der zurückgegebenen Einträge verringern.For further filtering, time options such as --since today, --until 1 hour ago or a combination of these can reduce the amount of entries returned.

sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"

Schutz von DatenData protection

Der Stapel zum Schutz von Daten in ASP.NET Core wird von mehreren ASP.NET Core-Middlewares verwendet. Hierzu gehören die Authentifizierungsmiddleware (zum Beispiel die Cookiemiddleware) und Maßnahmen zum Schutz vor websiteübergreifenden Anforderungsfälschungen (CSRF).The ASP.NET Core Data Protection stack is used by several ASP.NET Core middlewares, including authentication middleware (for example, cookie middleware) and cross-site request forgery (CSRF) protections. Selbst wenn Datenschutz-APIs nicht im Benutzercode aufgerufen werden, sollte der Schutz von Daten konfiguriert werden, um einen persistenten kryptografischen Schlüsselspeicher zu erstellen.Even if Data Protection APIs aren't called by user code, data protection should be configured to create a persistent cryptographic key store. Wenn der Schutz von Daten nicht konfiguriert ist, werden die Schlüssel beim Neustarten der App im Arbeitsspeicher gespeichert und verworfen.If data protection isn't configured, the keys are held in memory and discarded when the app restarts.

Falls der Schlüsselbund im Arbeitsspeicher gespeichert wird, wenn die App neu gestartet wird, gilt Folgendes:If the key ring is stored in memory when the app restarts:

  • Alle cookiebasierten Authentifizierungstoken für ungültig erklärt.All cookie-based authentication tokens are invalidated.
  • Benutzer müssen sich bei ihrer nächsten Anforderung erneut anmelden.Users are required to sign in again on their next request.
  • Alle mit dem Schlüsselbund geschützte Daten können nicht mehr entschlüsselt werden.Any data protected with the key ring can no longer be decrypted. Dies kann CSRF-Token und ASP.NET Core-MVC-TempData-Cookies einschließen.This may include CSRF tokens and ASP.NET Core MVC TempData cookies.

Wenn Sie den Schutz von Daten konfigurieren möchten, um den Schlüsselring persistent zu speichern und zu verschlüsseln, finden Sie in den folgenden Artikeln weitere Informationen:To configure data protection to persist and encrypt the key ring, see:

Lange AnforderungsheaderfelderLong request header fields

Die Standardeinstellungen für den Proxyserver schränken die Anforderungsheaderfelder in der Regel je nach Plattform auf 4 K oder 8 K ein.Proxy server default settings typically limit request header fields to 4 K or 8 K depending on the platform. Eine App erfordert möglicherweise Felder, die länger als die Standardwerte sind (z. B. Apps, die Azure Active Directory verwenden).An app may require fields longer than the default (for example, apps that use Azure Active Directory). Wenn längere Felder erforderlich sind, müssen die Standardeinstellungen des Proxyservers angepasst werden.If longer fields are required, the proxy server's default settings require adjustment. Die anzuwendenden Werte hängen vom jeweiligen Szenario ab.The values to apply depend on the scenario. Weitere Informationen finden Sie in der Dokumentation Ihres Servers.For more information, see your server's documentation.

Warnung

Erhöhen Sie die Standardwerte der Proxypuffer nur dann, wenn dies absolut erforderlich ist.Don't increase the default values of proxy buffers unless necessary. Ein Erhöhen dieser Werte vergrößert das Risiko von Pufferüberlauf- (Überlauf-) und Denial-of-Service-Angriffen durch böswillige Benutzer.Increasing these values increases the risk of buffer overrun (overflow) and Denial of Service (DoS) attacks by malicious users.

Sichern der AppSecure the app

Aktivieren von AppArmorEnable AppArmor

Bei Linux Security Modules (LSM) handelt es sich um ein Framework, das seit Linux 2.6 Teil des Linux-Kernels ist.Linux Security Modules (LSM) is a framework that's part of the Linux kernel since Linux 2.6. LSM unterstützt verschiedene Implementierungen von Sicherheitsmodulen.LSM supports different implementations of security modules. AppArmor ist ein LSM, das ein obligatorisches Zugriffssteuerungssystem implementiert, das das Programm auf einen beschränkten Satz von Ressourcen begrenzt.AppArmor is a LSM that implements a Mandatory Access Control system which allows confining the program to a limited set of resources. Versichern Sie sich, dass AppArmor aktiviert und ordnungsgemäß konfiguriert ist.Ensure AppArmor is enabled and properly configured.

Konfigurieren der FirewallConfigure the firewall

Schließen Sie alle externen Ports, die nicht verwendet werden.Close off all external ports that are not in use. „Uncomplicated Firewall“ (UFW) stellt ein Front-End für iptables bereit, indem eine CLI zum Konfigurieren der Firewall bereitgestellt wird.Uncomplicated firewall (ufw) provides a front end for iptables by providing a CLI for configuring the firewall.

Warnung

Eine Firewall verhindert den Zugriff auf das gesamte System, wenn dieses nicht ordnungsgemäß konfiguriert ist.A firewall will prevent access to the whole system if not configured correctly. Falls Sie SSH zum Verbindungsaufbau verwenden und den falschen SSH-Port angeben, können Sie nicht mehr auf das System zugreifen.Failure to specify the correct SSH port will effectively lock you out of the system if you are using SSH to connect to it. Der Standardport ist 22.The default port is 22. Weitere Informationen finden Sie unter introduction to ufw (Einführung in ufw) und in den Manpages.For more information, see the introduction to ufw and the manual.

Installieren Sie ufw, und konfigurieren Sie das Tool so, dass der Datenverkehr auf allen erforderlich Ports zugelassen wird.Install ufw and configure it to allow traffic on any ports needed.

sudo apt-get install ufw

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

sudo ufw enable

Sichern von NginxSecure Nginx

Ändern des Namens der Nginx-AntwortChange the Nginx response name

Bearbeiten Sie src/http/ngx_http_header_filter_module.c:Edit src/http/ngx_http_header_filter_module.c:

static char ngx_http_server_string[] = "Server: Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Web Server" CRLF;

Konfigurieren von OptionenConfigure options

Konfigurieren Sie den Server mit zusätzlichen erforderlichen Modulen.Configure the server with additional required modules. Erwägen Sie zum Schutz der App die Verwendung einer Web-App-Firewall wie z.B. ModSecurity.Consider using a web app firewall, such as ModSecurity, to harden the app.

HTTPS-KonfigurationHTTPS configuration

Konfigurieren der App für sichere (HTTPS) lokale VerbindungenConfigure the app for secure (HTTPS) local connections

Der dotnet run-Befehl verwendet die Properties/launchSettings.json-Datei der App, die die App so konfiguriert, dass diese an den URLs lauscht, die von der applicationUrl-Eigenschaft bereitgestellt werden, z. B. https://localhost:5001;http://localhost:5000.The dotnet run command uses the app's Properties/launchSettings.json file, which configures the app to listen on the URLs provided by the applicationUrl property (for example, https://localhost:5001;http://localhost:5000).

Konfigurieren Sie mithilfe eines der folgenden Ansätze die App so, dass sie bei der Entwicklung für den Befehl dotnet run oder die Entwicklungsumgebung (F5 oder STRG+F5 in Visual Studio Code) ein Zertifikat verwendet:Configure the app to use a certificate in development for the dotnet run command or development environment (F5 or Ctrl+F5 in Visual Studio Code) using one of the following approaches:

Konfigurieren des Reverseproxys für sichere (HTTPS) ClientverbindungenConfigure the reverse proxy for secure (HTTPS) client connections

  • Konfigurieren Sie den Server, damit dieser für den HTTPS-Datenverkehr an Port 443 empfangsbereit ist, indem Sie ein gültiges Zertifikat angeben, das von einer vertrauenswürdigen Zertifizierungsstelle (Certificate Authority, CA) ausgestellt wurde.Configure the server to listen to HTTPS traffic on port 443 by specifying a valid certificate issued by a trusted Certificate Authority (CA).

  • Stärken Sie Ihre Sicherheit, indem Sie einige der in der folgenden Datei ( /etc/nginx/nginx.conf) dargestellten Methoden verwenden.Harden the security by employing some of the practices depicted in the following /etc/nginx/nginx.conf file. Die Beispiele schließen das Auswählen einer stärkeren Verschlüsselung und das Weiterleiten allen Datenverkehrs über HTTP auf HTTPS ein.Examples include choosing a stronger cipher and redirecting all traffic over HTTP to HTTPS.

  • Durch das Hinzufügen eines HTTP Strict-Transport-Security-Headers (HSTS) wird sichergestellt, dass alle nachfolgenden Anforderungen vom Client über HTTPS erfolgen.Adding an HTTP Strict-Transport-Security (HSTS) header ensures all subsequent requests made by the client are over HTTPS.

  • Wenn HTTPS in Zukunft deaktiviert wird, halten Sie sich an einen der folgenden Ansätze:If HTTPS will be disabled in the future, use one of the following approaches:

    • Fügen Sie den HSTS-Header nicht hinzu.Don't add the HSTS header.
    • Wählen Sie einen kurzen max-age-Wert aus.Choose a short max-age value.

Fügen Sie die Konfigurationsdatei /etc/nginx/proxy.conf hinzu:Add the /etc/nginx/proxy.conf configuration file:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Bearbeiten Sie die Konfigurationsdatei /etc/nginx/nginx.conf.Edit the /etc/nginx/nginx.conf configuration file. Das Beispiel enthält die Abschnitte http und server in einer Konfigurationsdatei.The example contains both http and server sections in one configuration file.

http {
    include        /etc/nginx/proxy.conf;
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    server_tokens  off;

    sendfile on;
    keepalive_timeout   29; # Adjust to the lowest possible value that makes sense for your use case.
    client_body_timeout 10; client_header_timeout 10; send_timeout 10;

    upstream helloapp{
        server localhost:5000;
    }

    server {
        listen     *:80;
        add_header Strict-Transport-Security max-age=15768000;
        return     301 https://$host$request_uri;
    }

    server {
        listen                    *:443 ssl;
        server_name               example.com;
        ssl_certificate           /etc/ssl/certs/testCert.crt;
        ssl_certificate_key       /etc/ssl/certs/testCert.key;
        ssl_protocols             TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers               "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve            secp384r1;
        ssl_session_cache         shared:SSL:10m;
        ssl_session_tickets       off;
        ssl_stapling              on; #ensure your cert is capable
        ssl_stapling_verify       on; #ensure your cert is capable

        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        #Redirects all traffic
        location / {
            proxy_pass http://helloapp;
            limit_req  zone=one burst=10 nodelay;
        }
    }
}

Sichern von Nginx vor ClickjackingSecure Nginx from clickjacking

Clickjacking, auch bekannt als UI Redress-Angriff, ist ein böswilliger Angriff, bei dem ein Websitebesucher dazu verleitet wird, auf einen Link oder eine Schaltfläche zu klicken, der bzw. die sich auf einer anderen Seite als der aktuell besuchten Seite befindet.Clickjacking, also known as a UI redress attack, is a malicious attack where a website visitor is tricked into clicking a link or button on a different page than they're currently visiting. Verwenden Sie X-FRAME-OPTIONS zum Sichern der Website.Use X-FRAME-OPTIONS to secure the site.

So wehren Sie Clickjacking-Angriffe ab:To mitigate clickjacking attacks:

  1. Bearbeiten Sie die Datei nginx.conf:Edit the nginx.conf file:

    sudo nano /etc/nginx/nginx.conf
    

    Fügen Sie die Zeile add_header X-Frame-Options "SAMEORIGIN"; hinzu.Add the line add_header X-Frame-Options "SAMEORIGIN";.

  2. Speichern Sie die Datei.Save the file.

  3. Starten Sie Nginx neu.Restart Nginx.

MIME-TypermittlungMIME-type sniffing

Dieser Header hindert die meisten Browser an der MIME-Ermittlung einer Antwort vom deklarierten Inhaltstyp weg, da der Header den Browser anweist, den Inhaltstyp der Antwort nicht zu überschreiben.This header prevents most browsers from MIME-sniffing a response away from the declared content type, as the header instructs the browser not to override the response content type. Durch die Option nosniff wird der Inhalt vom Browser als „text/html“ gerendert, wenn der Server sagt, dass es sich bei diesem um „text/html“ handelt.With the nosniff option, if the server says the content is "text/html", the browser renders it as "text/html".

Bearbeiten Sie die Datei nginx.conf:Edit the nginx.conf file:

sudo nano /etc/nginx/nginx.conf

Fügen Sie die Zeile add_header X-Content-Type-Options "nosniff"; hinzu, und speichern Sie die Datei. Starten Sie Nginx dann neu.Add the line add_header X-Content-Type-Options "nosniff"; and save the file, then restart Nginx.

Zusätzliche Vorschläge zu NginxAdditional Nginx suggestions

Starten Sie die vom Server gehosteten ASP.NET Core-Apps nach dem Upgrade des freigegebenen Frameworks neu.After upgrading the shared framework on the server, restart the ASP.NET Core apps hosted by the server.

Zusätzliche RessourcenAdditional resources