Hosten von ASP.NET Core unter Linux mit ApacheHost ASP.NET Core on Linux with Apache

Von Shayne BoyerBy Shayne Boyer

In diesem Leitfaden finden Sie Informationen zur Einrichtung von Apache als Reverseproxyserver für CentOS 7 zur Weiterleitung von HTTP-Datenverkehr an eine ASP.NET Core-Web-App, die auf einem Kestrel-Server ausgeführt wird.Using this guide, learn how to set up Apache as a reverse proxy server on CentOS 7 to redirect HTTP traffic to an ASP.NET Core web app running on Kestrel server. Durch die Erweiterung mod_proxy und zugehörige Module wird der Reverseproxy des Servers erstellt.The mod_proxy extension and related modules create the server's reverse proxy.

VoraussetzungenPrerequisites

  • Ein Server, auf dem CentOS 7 ausgeführt wird, mit einem Standardbenutzerkonto mit sudo-Berechtigung.Server running CentOS 7 with a standard user account with sudo privilege.
  • 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 CentOS-Anweisungen aus.Select the Linux Package manager instructions link and follow the CentOS instructions.
  • 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.

Konfigurieren eines ProxyserversConfigure a 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. Der Reverseproxy beendet die HTTP-Anforderung und leitet diese an die ASP.NET-App weiter.The reverse proxy terminates the HTTP request and forwards it to the ASP.NET app.

Ein Proxyserver dient zum Weiterleiten von Clientanforderungen an einen anderen Server, anstatt Anforderungen selbst zu erfüllen.A proxy server is one which forwards client requests to another server instead of fulfilling requests itself. Ein Reverseproxy leitet Daten an ein festes Ziel meist im Auftrag beliebiger Clients weiter.A reverse proxy forwards to a fixed destination, typically on behalf of arbitrary clients. In diesem Handbuch wird Apache als Reverseproxy konfiguriert, der auf demselben Server ausgeführt wird, auf dem Kestrel die ASP.NET Core-App verarbeitet.In this guide, Apache is configured as the reverse proxy running on the same server that Kestrel is serving the ASP.NET Core app.

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.

Jede vom Schema abhängige Komponente, wie etwa Authentifizierung, Linkgenerierung, Umleitungen und Geolocation, muss nach dem Aufrufen der Middleware für weitergeleitete Header eingefügt werden.Any component that depends on the scheme, such as authentication, link generation, redirects, and geolocation, must be placed after invoking the Forwarded Headers Middleware.

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 ApacheInstall Apache

So aktualisieren Sie CentOS-Pakete auf ihre aktuellsten stabilen Versionen:Update CentOS packages to their latest stable versions:

sudo yum update -y

Installieren Sie die Apache-Webserver unter CentOS mit einem einzelnen yum-Befehl:Install the Apache web server on CentOS with a single yum command:

sudo yum -y install httpd mod_ssl

Beispielausgabe nach der Ausführung des Befehls:Sample output after running the command:

Downloading packages:
httpd-2.4.6-40.el7.centos.4.x86_64.rpm               | 2.7 MB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 
Verifying  : httpd-2.4.6-40.el7.centos.4.x86_64      1/1 

Installed:
httpd.x86_64 0:2.4.6-40.el7.centos.4

Complete!

Hinweis

In diesem Beispiel enthält die Ausgabe „httpd.86_64“, da die CentOS 7-Version eine 64-Bit-Version ist.In this example, the output reflects httpd.86_64 since the CentOS 7 version is 64 bit. Um zu prüfen, wo Apache installiert ist, führen Sie an einer Eingabeaufforderung whereis httpd aus.To verify where Apache is installed, run whereis httpd from a command prompt.

Konfigurieren von ApacheConfigure Apache

Konfigurationsdateien für Apache befinden sich im Verzeichnis /etc/httpd/conf.d/.Configuration files for Apache are located within the /etc/httpd/conf.d/ directory. Dateien mit der Erweiterung .conf werden in alphabetischer Reihenfolge zusätzlich zu den Modulkonfigurationsdateien im Verzeichnis /etc/httpd/conf.modules.d/ verarbeitet, das Konfigurationsdateien enthält, die zum Laden von Modulen erforderlich sind.Any file with the .conf extension is processed in alphabetical order in addition to the module configuration files in /etc/httpd/conf.modules.d/, which contains any configuration files necessary to load modules.

So erstellen Sie eine Konfigurationsdatei mit dem Namen helloapp.conf für die App:Create a configuration file, named helloapp.conf, for the app:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ServerName www.example.com
    ServerAlias *.example.com
    ErrorLog ${APACHE_LOG_DIR}helloapp-error.log
    CustomLog ${APACHE_LOG_DIR}helloapp-access.log common
</VirtualHost>

Der Block VirtualHost kann mehrmals erscheinen, in mindestens einer Datei auf einem Server.The VirtualHost block can appear multiple times, in one or more files on a server. In der vorangehenden Konfigurationsdatei akzeptiert Apache öffentlichen Datenverkehr über Port 80.In the preceding configuration file, Apache accepts public traffic on port 80. Die Domäne www.example.com wird bearbeitet, und der Alias *.example.com wird auf der gleichen Website aufgelöst.The domain www.example.com is being served, and the *.example.com alias resolves to the same website. Weitere Informationen finden Sie unter Namensbasierte virtuelle Hostunterstützung.See Name-based virtual host support for more information. Anforderungen werden über einen Proxy auf Stammebene an Port 5000 des Servers unter 127.0.0.1 übergeben.Requests are proxied at the root to port 5000 of the server at 127.0.0.1. Für bidirektionale Kommunikation sind ProxyPass und ProxyPassReverse erforderlich.For bi-directional communication, ProxyPass and ProxyPassReverse are required. 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 ServerName-Anweisung im Block VirtualHost fehl, ist Ihre App Sicherheitsrisiken ausgesetzt.Failure to specify a proper ServerName directive in the VirtualHost block 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.

Die Protokollierung kann über VirtualHost mit den ErrorLog- und CustomLog-Anweisungen konfiguriert werden.Logging can be configured per VirtualHost using ErrorLog and CustomLog directives. ErrorLog ist der Speicherort, an dem der Server Fehler protokolliert. CustomLog legt den Dateinamen und das Format der Protokolldatei fest.ErrorLog is the location where the server logs errors, and CustomLog sets the filename and format of log file. In diesem Fall werden hier Anforderungsinformationen protokolliert.In this case, this is where request information is logged. Für jede Anforderung gibt es eine Zeile.There's one line for each request.

Speichern Sie die Datei, und testen Sie die Konfiguration.Save the file and test the configuration. Wenn alle Anforderungen durchgehen, muss die Antwort Syntax [OK] lauten.If everything passes, the response should be Syntax [OK].

sudo service httpd configtest

So starten Sie Apache neu:Restart Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

Überwachen der AppMonitor the app

Apache ist jetzt dafür eingerichtet, Anforderungen an http://localhost:80 an die ASP.NET Core-App weiterzuleiten, die unter Kestrel unter http://127.0.0.1:5000 ausgeführt wird.Apache is now setup to forward requests made to http://localhost:80 to the ASP.NET Core app running on Kestrel at http://127.0.0.1:5000. Apache ist jedoch nicht dafür eingerichtet, den Kestrel-Prozess zu verwalten.However, Apache isn't set up to manage the Kestrel process. Verwenden Sie systemd, und erstellen eine Dienstdatei, um die zugrunde liegende Web-App zu starten und zu überwachen.Use systemd and 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

Eine Beispieldienstdatei für die App:An example service file for the app:

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

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/local/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=apache
Environment=ASPNETCORE_ENVIRONMENT=Production 

[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 (apache) muss vorhanden und der ordnungsgemäße Besitzer der App-Dateien sein.The user (apache) 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

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}

So speichern Sie die Datei und aktivieren den Dienst:Save the file and enable the service:

sudo systemctl enable kestrel-helloapp.service

So starten Sie den Dienst und überprüfen, 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 CentOS 7
    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 Web-App 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. Beim Überprüfen der Antwortheader wird im Header Server angezeigt, dass die ASP.NET Core-App von Kestrel verarbeitet wird:Inspecting the response headers, the Server header indicates that the ASP.NET Core app is 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 von Kestrel verwendete Web-App von systemd verwaltet wird, werden Ereignisse und Protokolle in einem zentralen Journal protokolliert.Since the web app using Kestrel is managed using systemd, events and processes are logged to a centralized journal. Dieses Journal enthält jedoch Einträge für alle Dienste und Prozesse, die von systemd verwaltet werden.However, this journal includes entries for all of the 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

Geben Sie für die Uhrzeitfilterung mit dem Befehl Uhrzeitoptionen an.For time filtering, specify time options with the command. Verwenden Sie beispielsweise --since today zum Filtern für den aktuellen Tag oder --until 1 hour ago, um die Einträge der letzten Stunde anzuzeigen.For example, use --since today to filter for the current day or --until 1 hour ago to see the previous hour's entries. Weitere Informationen finden Sie auf der Manpage für „journalctl“.For more information, see the man page for journalctl.

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:

Sichern der AppSecure the app

Konfigurieren der FirewallConfigure firewall

Firewalld ist ein dynamischer Daemon zum Verwalten der Firewall mit Unterstützung für Netzwerkzonen.Firewalld is a dynamic daemon to manage the firewall with support for network zones. Ports und Paketfilterung können weiterhin mit „iptables“ verwaltet werden.Ports and packet filtering can still be managed by iptables. Firewalld sollte standardmäßig installiert werden.Firewalld should be installed by default. yum kann für die Installation oder zur Überprüfung einer erfolgreichen Installation verwendet werden.yum can be used to install the package or verify it's installed.

sudo yum install firewalld -y

Mit firewalld können Sie nur die für die App erforderlichen Ports öffnen.Use firewalld to open only the ports needed for the app. In diesem Fall werden die Ports 80 und 443 verwendet.In this case, port 80 and 443 are used. Über die folgenden Befehle werden die Ports 80 und 443 dauerhaft geöffnet:The following commands permanently set ports 80 and 443 to open:

sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --add-port=443/tcp --permanent

Laden Sie die Firewalleinstellungen erneut.Reload the firewall settings. Überprüfen Sie die verfügbaren Dienste und Ports in der Standardzone.Check the available services and ports in the default zone. Über firewall-cmd -h können Sie verfügbare Optionen ermitteln.Options are available by inspecting firewall-cmd -h.

sudo firewall-cmd --reload
sudo firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources: 
services: dhcpv6-client
ports: 443/tcp 80/tcp
masquerade: no
forward-ports: 
icmp-blocks: 
rich rules: 

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

Für die Konfiguration von Apache für HTTPS wird das Modul mod_ssl verwendet.To configure Apache for HTTPS, the mod_ssl module is used. Wenn das Modul httpd installiert wurde, wurde das Modul mod_ssl ebenfalls installiert.When the httpd module was installed, the mod_ssl module was also installed. Wurde es nicht installiert, fügen Sie es mit yum zur Konfiguration hinzu.If it wasn't installed, use yum to add it to the configuration.

sudo yum install mod_ssl

Installieren Sie zur Erzwingung von HTTPS das Modul mod_rewrite, um eine URL-Umschreibung zu aktivieren:To enforce HTTPS, install the mod_rewrite module to enable URL rewriting:

sudo yum install mod_rewrite

Ändern Sie die Datei helloapp.conf, um eine URL-Umschreibung und sichere Kommunikation an Port 443 zu aktivieren:Modify the helloapp.conf file to enable URL rewriting and secure communication on port 443:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ErrorLog /var/log/httpd/helloapp-error.log
    CustomLog /var/log/httpd/helloapp-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

Hinweis

In diesem Beispiel wird ein lokal generiertes Zertifikat verwendet.This example is using a locally-generated certificate. SSLCertificateFile muss die primäre Zertifikatdatei für den Domänennamen sein.SSLCertificateFile should be the primary certificate file for the domain name. SSLCertificateKeyFile muss die Schlüsseldatei sein, die beim Erstellen der Zertifikatsignaturanforderung (Certificate Signing Request, CSR) generiert wurde.SSLCertificateKeyFile should be the key file generated when CSR is created. SSLCertificateChainFile muss die Zwischenzertifikatdatei (falls vorhanden) sein, die von der Zertifizierungsstelle bereitgestellt wurde.SSLCertificateChainFile should be the intermediate certificate file (if any) that was supplied by the certificate authority.

So speichern Sie die Datei und testen die Konfiguration:Save the file and test the configuration:

sudo service httpd configtest

So starten Sie Apache neu:Restart Apache:

sudo systemctl restart httpd

Weitere Vorschläge für ApacheAdditional Apache suggestions

Neustarten von Apps bei Updates für das freigegebene FrameworkRestart apps with shared framework updates

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 HeaderAdditional headers

Als Schutz gegen böswillige Angriffe müssen einige Header geändert oder hinzugefügt werden.In order to secure against malicious attacks, there are a few headers that should either be modified or added. So stellen Sie sicher, dass das Modul mod_headers installiert wurde:Ensure that the mod_headers module is installed:

sudo yum install mod_headers

Schützen von Apache vor Clickjacking-AngriffenSecure Apache from clickjacking attacks

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. So bearbeiten Sie die Datei httpd.conf:Edit the httpd.conf file:

    sudo nano /etc/httpd/conf/httpd.conf
    

    Fügen Sie die Zeile Header append X-FRAME-OPTIONS "SAMEORIGIN" hinzu.Add the line Header append X-FRAME-OPTIONS "SAMEORIGIN".

  2. Speichern Sie die Datei.Save the file.

  3. Starten Sie Apache neu.Restart Apache.

MIME-TypermittlungMIME-type sniffing

Der Header X-Content-Type-Options verhindert, dass eine MIME-Ermittlung über Internet Explorer (dabei wird der Content-Type einer Datei aus dem Dateiinhalt bestimmt) erfolgt.The X-Content-Type-Options header prevents Internet Explorer from MIME-sniffing (determining a file's Content-Type from the file's content). Wenn der Server den Header Content-Type auf text/html festlegt und die Option nosniff festgelegt ist, rendert Internet Explorer den Inhalt unabhängig vom Dateiinhalt als text/html.If the server sets the Content-Type header to text/html with the nosniff option set, Internet Explorer renders the content as text/html regardless of the file's content.

So bearbeiten Sie die Datei httpd.conf:Edit the httpd.conf file:

sudo nano /etc/httpd/conf/httpd.conf

Fügen Sie die Zeile Header set X-Content-Type-Options "nosniff" hinzu.Add the line Header set X-Content-Type-Options "nosniff". Speichern Sie die Datei.Save the file. Starten Sie Apache neu.Restart Apache.

LastenausgleichLoad Balancing

Dieses Beispiel veranschaulicht das Einrichten und Konfigurieren von Apache unter CentOS 7 und Kestrel auf demselben Instanzcomputer.This example shows how to setup and configure Apache on CentOS 7 and Kestrel on the same instance machine. Damit es zu keinem Single Point of Failure kommt, ermöglicht die Verwendung von mod_proxy_balancer und das Ändern von VirtualHost das Verwalten mehrerer Instanzen der Web-Apps hinter dem Apache-Proxyserver.In order to not have a single point of failure; using mod_proxy_balancer and modifying the VirtualHost would allow for managing multiple instances of the web apps behind the Apache proxy server.

sudo yum install mod_proxy_balancer

In der unten dargestellten Konfigurationsdatei wird eine zusätzliche Instanz von helloapp zur Ausführung an Port 5001 eingerichtet.In the configuration file shown below, an additional instance of the helloapp is set up to run on port 5001. Der Abschnitt Proxy wird mit einer Lastenausgleichskonfiguration mit zwei Mitgliedern für den Lastenausgleich von byrequests festgelegt.The Proxy section is set with a balancer configuration with two members to load balance byrequests.

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPass / balancer://mycluster/ 

    ProxyPassReverse / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5001/

    <Proxy balancer://mycluster>
        BalancerMember http://127.0.0.1:5000
        BalancerMember http://127.0.0.1:5001 
        ProxySet lbmethod=byrequests
    </Proxy>

    <Location />
        SetHandler balancer
    </Location>
    ErrorLog /var/log/httpd/helloapp-error.log
    CustomLog /var/log/httpd/helloapp-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

Begrenzung der BandbreiteRate Limits

Mit dem Modul mod_ratelimit, das im Modul httpd enthalten ist, kann die Bandbreite von Clients begrenzt werden:Using mod_ratelimit, which is included in the httpd module, the bandwidth of clients can be limited:

sudo nano /etc/httpd/conf.d/ratelimit.conf

In der Beispieldatei wird die Bandbreite am Stammspeicherort auf 600 KB/Sek. begrenzt:The example file limits bandwidth as 600 KB/sec under the root location:

<IfModule mod_ratelimit.c>
    <Location />
        SetOutputFilter RATE_LIMIT
        SetEnv rate-limit 600
    </Location>
</IfModule>

Lange AnforderungsheaderfelderLong request header fields

Die Standardeinstellungen für den Proxyserver schränken die Anforderungsheaderfelder in der Regel auf 8.190 Bytes ein.Proxy server default settings typically limit request header fields to 8,190 bytes. 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, muss die Anweisung LimitRequestFieldSize des Proxyservers angepasst werden.If longer fields are required, the proxy server's LimitRequestFieldSize directive requires adjustment. Der anzuwendende Wert hängt vom jeweiligen Szenario ab.The value to apply depends on the scenario. Weitere Informationen finden Sie in der Dokumentation Ihres Servers.For more information, see your server's documentation.

Warnung

Erhöhen Sie den Standardwert von LimitRequestFieldSize nur dann, wenn dies absolut erforderlich ist.Don't increase the default value of LimitRequestFieldSize unless necessary. Ein Erhöhen dieses Werts vergrößert das Risiko von Pufferüberlauf- (Überlauf-) und Denial-of-Service-Angriffen durch böswillige Benutzer.Increasing the value increases the risk of buffer overrun (overflow) and Denial of Service (DoS) attacks by malicious users.

Zusätzliche RessourcenAdditional resources