Hostowanie ASP.NET Core w systemie Linux przy użyciu oprogramowania ApacheHost ASP.NET Core on Linux with Apache

Autor Shayne BoyerBy Shayne Boyer

Korzystając z tego przewodnika, Dowiedz się, jak skonfigurować Apache jako zwrotny serwer proxy w CentOS 7 , aby przekierować ruch HTTP do aplikacji internetowej ASP.NET Core działającej na serwerze Kestrel .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. Rozszerzenie mod_proxy i powiązane moduły tworzą zwrotny serwer proxy serwera.The mod_proxy extension and related modules create the server's reverse proxy.

Wymagania wstępnePrerequisites

  • Serwer z systemem CentOS 7 z kontem użytkownika standardowego z uprawnieniami sudo.Server running CentOS 7 with a standard user account with sudo privilege.
  • Zainstaluj środowisko uruchomieniowe platformy .NET Core na serwerze.Install the .NET Core runtime on the server.
    1. Odwiedź stronę pobieranie platformy .NET Core.Visit the Download .NET Core page.
    2. Wybierz najnowszą wersję programu .NET Core niebędącą podglądem.Select the latest non-preview .NET Core version.
    3. Pobierz najnowszą wersję środowiska uruchomieniowego bez podglądu w tabeli w obszarze Uruchamianie aplikacji — środowisko uruchomieniowe .Download the latest non-preview runtime in the table under Run apps - Runtime .
    4. Wybierz łącze instrukcje dotyczące Menedżera pakietów systemu Linux i postępuj zgodnie z instrukcjami CentOS.Select the Linux Package manager instructions link and follow the CentOS instructions.
  • Istniejąca aplikacja ASP.NET Core.An existing ASP.NET Core app.

W dowolnym momencie w przyszłości po uaktualnieniu struktury udostępnionej ponownie uruchom ASP.NET Core aplikacje hostowane przez serwer.At any point in the future after upgrading the shared framework, restart the ASP.NET Core apps hosted by the server.

Publikowanie i kopiowanie aplikacjiPublish and copy over the app

Skonfiguruj aplikację dla wdrożenia zależnego od platformy.Configure the app for a framework-dependent deployment.

Jeśli aplikacja jest uruchamiana lokalnie i nie jest skonfigurowana do nawiązywania bezpiecznych połączeń (HTTPS), należy zastosować jedną z następujących metod:If the app is run locally and isn't configured to make secure connections (HTTPS), adopt either of the following approaches:

  • Skonfiguruj aplikację do obsługi bezpiecznych połączeń lokalnych.Configure the app to handle secure local connections. Aby uzyskać więcej informacji, zobacz sekcję Konfiguracja protokołu HTTPS .For more information, see the HTTPS configuration section.
  • Usuń https://localhost:5001 (jeśli istnieje) z applicationUrl Właściwości we właściwościach/launchSettings.jsw pliku.Remove https://localhost:5001 (if present) from the applicationUrl property in the Properties/launchSettings.json file.

Uruchom dotnet Publish ze środowiska programistycznego, aby spakować aplikację do katalogu (na przykład bin/Release/ < target_framework_moniker > /Publish ), które można uruchomić na serwerze: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

Aplikację można również opublikować jako samodzielne wdrożenie , jeśli wolisz, aby nie obsługiwać środowiska uruchomieniowego .NET Core na serwerze.The app can also be published as a self-contained deployment if you prefer not to maintain the .NET Core runtime on the server.

Skopiuj aplikację ASP.NET Core na serwer przy użyciu narzędzia, które integruje się z przepływem pracy organizacji (na przykład SCP, SFTP).Copy the ASP.NET Core app to the server using a tool that integrates into the organization's workflow (for example, SCP, SFTP). Często można zlokalizować aplikacje sieci Web w katalogu var (na przykład var/www/helloapp ).It's common to locate web apps under the var directory (for example, var/www/helloapp ).

Uwaga

W obszarze scenariusza wdrożenia produkcyjnego przepływ pracy ciągłej integracji wykonuje zadania publikowania aplikacji i kopiowania zasobów na serwer.Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.

Konfigurowanie serwera proxyConfigure a proxy server

Zwrotny serwer proxy to typowa konfiguracja służąca do obsługi dynamicznych aplikacji sieci Web.A reverse proxy is a common setup for serving dynamic web apps. Zwrotny serwer proxy przerywa żądanie HTTP i przekazuje go do aplikacji ASP.NET.The reverse proxy terminates the HTTP request and forwards it to the ASP.NET app.

Serwer proxy, który przekazuje żądania klientów na inny serwer zamiast zaspokajać same żądania.A proxy server is one which forwards client requests to another server instead of fulfilling requests itself. Zwrotny serwer proxy przesyła do stałego miejsca docelowego, zazwyczaj w imieniu dowolnych klientów.A reverse proxy forwards to a fixed destination, typically on behalf of arbitrary clients. W tym przewodniku program Apache jest skonfigurowany jako zwrotny serwer proxy uruchomiony na tym samym serwerze, na którym Kestrel obsługuje aplikację ASP.NET Core.In this guide, Apache is configured as the reverse proxy running on the same server that Kestrel is serving the ASP.NET Core app.

Ze względu na to, że żądania są przekazywane przez zwrotny serwer proxy, należy użyć oprogramowania pośredniczącego "przesłane nagłówki " z pakietu Microsoft. AspNetCore. HttpOverrides .Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides package. Oprogramowanie pośredniczące aktualizuje Request.Scheme , używając X-Forwarded-Proto nagłówka, tak aby identyfikatory URI przekierowania i inne zasady zabezpieczeń działały prawidłowo.The middleware updates the Request.Scheme, using the X-Forwarded-Proto header, so that redirect URIs and other security policies work correctly.

Wszelkie składniki, które są zależne od schematu, takie jak uwierzytelnianie, generowanie linków, przekierowania i geolokalizacja, muszą być umieszczone po wywołaniu bezpośrednich nagłówków.Any component that depends on the scheme, such as authentication, link generation, redirects, and geolocation, must be placed after invoking the Forwarded Headers Middleware.

Przekierowane nagłówki oprogramowanie pośredniczące powinno być uruchamiane przed innym programem pośredniczącym.Forwarded Headers Middleware should run before other middleware. Takie porządkowanie zapewnia, że oprogramowanie pośredniczące polegające na informacjach o przekazanych nagłówkach może zużywać wartości nagłówka do przetworzenia.This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing. Aby uruchomić przekazane nagłówki oprogramowania pośredniczącego po diagnostyki i obsłudze błędów oprogramowania pośredniczącego, zobacz kolejność wydawania w postaci nagłówków dalej.To run Forwarded Headers Middleware after diagnostics and error handling middleware, see Forwarded Headers Middleware order.

Wywołaj UseForwardedHeaders metodę w górnej części Startup.Configure przed wywołaniem innego oprogramowania pośredniczącego.Invoke the UseForwardedHeaders method at the top of Startup.Configure before calling other middleware. Skonfiguruj oprogramowanie pośredniczące do przesyłania dalej X-Forwarded-For X-Forwarded-Proto nagłówków i: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();

Jeśli wartość nie ForwardedHeadersOptions jest określona dla oprogramowania pośredniczącego, domyślne nagłówki są do przodu None .If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None.

Serwery proxy uruchomione na adresach sprzężenia zwrotnego (127.0.0.0/8, [:: 1]), w tym standardowy adres localhost (127.0.0.1), są domyślnie zaufane.Proxies running on loopback addresses (127.0.0.0/8, [::1]), including the standard localhost address (127.0.0.1), are trusted by default. Jeśli inne zaufane serwery proxy lub sieci w organizacji obsługują żądania między Internetem a serwerem sieci Web, należy dodać je do listy KnownProxies lub KnownNetworks z ForwardedHeadersOptions .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. Poniższy przykład dodaje zaufany serwer proxy pod adresem IP 10.0.0.100 do przesyłanych nagłówków pośredniczących KnownProxies w programie Startup.ConfigureServices :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"));
});

Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.For more information, see Konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.

Instalowanie oprogramowania ApacheInstall Apache

Aktualizowanie pakietów CentOS do najnowszych stabilnych wersji:Update CentOS packages to their latest stable versions:

sudo yum update -y

Zainstaluj serwer Apache Web Server w systemie CentOS za pomocą jednego yum polecenia:Install the Apache web server on CentOS with a single yum command:

sudo yum -y install httpd mod_ssl

Przykładowe dane wyjściowe po uruchomieniu polecenia: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!

Uwaga

W tym przykładzie dane wyjściowe odzwierciedlają httpd.86_64, ponieważ wersja CentOS 7 to 64 bit.In this example, the output reflects httpd.86_64 since the CentOS 7 version is 64 bit. Aby sprawdzić, gdzie jest zainstalowany program Apache, uruchom whereis httpd polecenie w wierszu polecenia.To verify where Apache is installed, run whereis httpd from a command prompt.

Konfiguruj ApacheConfigure Apache

Pliki konfiguracji dla oprogramowania Apache znajdują się w /etc/httpd/conf.d/ katalogu.Configuration files for Apache are located within the /etc/httpd/conf.d/ directory. Każdy plik z rozszerzeniem . conf jest przetwarzany w kolejności alfabetycznej oprócz plików konfiguracji modułu w programie /etc/httpd/conf.modules.d/ , które zawierają pliki konfiguracyjne niezbędne do załadowania modułów.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.

Utwórz plik konfiguracji o nazwie helloapp. conf dla aplikacji: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>

VirtualHostBlok może występować wiele razy, w co najmniej jednym pliku na serwerze.The VirtualHost block can appear multiple times, in one or more files on a server. W poprzednim pliku konfiguracyjnym Apache akceptuje ruch publiczny na porcie 80.In the preceding configuration file, Apache accepts public traffic on port 80. Domena www.example.com jest obsługiwana, a *.example.com alias jest rozpoznawany jako ta sama witryna sieci Web.The domain www.example.com is being served, and the *.example.com alias resolves to the same website. Aby uzyskać więcej informacji, zobacz Obsługa hosta wirtualnego opartego na nazwach .See Name-based virtual host support for more information. Żądania są przekazywane w katalogu głównym do portu 5000 serwera o wartości 127.0.0.1.Requests are proxied at the root to port 5000 of the server at 127.0.0.1. W przypadku komunikacji dwukierunkowej ProxyPass i ProxyPassReverse są wymagane.For bi-directional communication, ProxyPass and ProxyPassReverse are required. Aby zmienić adres IP/port Kestrel, zobacz Kestrel: Konfiguracja punktu końcowego.To change Kestrel's IP/port, see Kestrel: Endpoint configuration.

Ostrzeżenie

Niepowodzenie określenia odpowiedniej dyrektywy ServerName w bloku VirtualHost uwidacznia aplikację pod kątem luk w zabezpieczeniach.Failure to specify a proper ServerName directive in the VirtualHost block exposes your app to security vulnerabilities. Powiązanie symboli wieloznacznych z poddomeną (na przykład *.example.com ) nie ma znaczenia dla tego zagrożenia bezpieczeństwa, jeśli kontrolujesz całą domenę nadrzędną (w przeciwieństwie do *.com , który jest narażony).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). Aby uzyskać więcej informacji, zobacz sekcję rfc7230-5,4 .See rfc7230 section-5.4 for more information.

Rejestrowanie można skonfigurować za VirtualHost pomocą ErrorLog dyrektyw i CustomLog .Logging can be configured per VirtualHost using ErrorLog and CustomLog directives. ErrorLog jest lokalizacją, w której serwer rejestruje błędy i CustomLog ustawia nazwę pliku dziennika oraz jego format.ErrorLog is the location where the server logs errors, and CustomLog sets the filename and format of log file. W tym przypadku jest to miejsce, w którym rejestrowane są informacje o żądaniu.In this case, this is where request information is logged. Jeden wiersz dla każdego żądania.There's one line for each request.

Zapisz plik i przetestuj konfigurację.Save the file and test the configuration. Jeśli wszystko kończy się, odpowiedź powinna być Syntax [OK] .If everything passes, the response should be Syntax [OK].

sudo service httpd configtest

Uruchom ponownie Apache:Restart Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

Monitorowanie aplikacjiMonitor the app

Program Apache jest teraz skonfigurowany do przesyłania dalej żądań wysyłanych do http://localhost:80 aplikacji ASP.NET Core działającej w usłudze Kestrel pod adresem http://127.0.0.1:5000 .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. Program Apache nie jest jednak skonfigurowany do zarządzania procesem Kestrel.However, Apache isn't set up to manage the Kestrel process. Użyj systemu i Utwórz plik usługi, aby uruchomić i monitorować podstawową aplikację sieci Web.Use systemd and create a service file to start and monitor the underlying web app. system to system inicjujący, który udostępnia wiele zaawansowanych funkcji uruchamiania, zatrzymywania i zarządzania procesami.systemd is an init system that provides many powerful features for starting, stopping, and managing processes.

Utwórz plik usługiCreate the service file

Utwórz plik definicji usługi:Create the service definition file:

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

Przykładowy plik usługi dla aplikacji: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

W poprzednim przykładzie użytkownik zarządzający usługą jest określony przez User opcję.In the preceding example, the user that manages the service is specified by the User option. Użytkownik ( apache ) musi istnieć i mieć właściwy własność plików aplikacji.The user (apache) must exist and have proper ownership of the app's files.

Użyj TimeoutStopSec , aby skonfigurować czas oczekiwania na wyłączenie aplikacji po odebraniu początkowego sygnału przerwania.Use TimeoutStopSec to configure the duration of time to wait for the app to shut down after it receives the initial interrupt signal. Jeśli aplikacja nie zostanie zamknięta w tym okresie, SIGKILL jest wystawiony, aby zakończyć działanie aplikacji.If the app doesn't shut down in this period, SIGKILL is issued to terminate the app. Podaj wartość jako bezjednostkowe sekundy (na przykład 150 ), wartość przedziału czasu (na przykład 2min 30s ) lub infinity Aby wyłączyć limit czasu.Provide the value as unitless seconds (for example, 150), a time span value (for example, 2min 30s), or infinity to disable the timeout. TimeoutStopSec Wartością domyślną jest wartość DefaultTimeoutStopSec w pliku konfiguracji Menedżera ( systemd-system. conf , System. conf. d , systemed-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 ). Domyślny limit czasu dla większości dystrybucji wynosi 90 sekund.The default timeout for most distributions is 90 seconds.

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

Niektóre wartości (na przykład parametry połączenia SQL) muszą zostać zmienione dla dostawców konfiguracji, aby odczytywać zmienne środowiskowe.Some values (for example, SQL connection strings) must be escaped for the configuration providers to read the environment variables. Użyj poniższego polecenia, aby wygenerować poprawną wartość ucieczki do użycia w pliku konfiguracji:Use the following command to generate a properly escaped value for use in the configuration file:

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

Separatory dwukropek ( : ) nie są obsługiwane w nazwach zmiennych środowiskowych.Colon (:) separators aren't supported in environment variable names. Użyj podwójnego podkreślenia ( __ ) zamiast dwukropka.Use a double underscore (__) in place of a colon. Dostawca konfiguracji zmiennych środowiskowych konwertuje podwójne podkreślenie na dwukropek, gdy zmienne środowiskowe są odczytywane w konfiguracji.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. W poniższym przykładzie klucz parametrów połączenia ConnectionStrings:DefaultConnection jest ustawiany na plik definicji usługi jako ConnectionStrings__DefaultConnection :In the following example, the connection string key ConnectionStrings:DefaultConnection is set into the service definition file as ConnectionStrings__DefaultConnection:

Separatory dwukropek ( : ) nie są obsługiwane w nazwach zmiennych środowiskowych.Colon (:) separators aren't supported in environment variable names. Użyj podwójnego podkreślenia ( __ ) zamiast dwukropka.Use a double underscore (__) in place of a colon. Dostawca konfiguracji zmiennych środowiskowych konwertuje podwójne podkreślenie na dwukropek, gdy zmienne środowiskowe są odczytywane w konfiguracji.The Environment Variables configuration provider converts double-underscores into colons when environment variables are read into configuration. W poniższym przykładzie klucz parametrów połączenia ConnectionStrings:DefaultConnection jest ustawiany na plik definicji usługi jako ConnectionStrings__DefaultConnection :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}

Zapisz plik i Włącz usługę:Save the file and enable the service:

sudo systemctl enable kestrel-helloapp.service

Uruchom usługę i sprawdź, czy jest uruchomiona: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

Gdy zwrotny serwer proxy został skonfigurowany i Kestrel zarządzany za pomocą systemu , aplikacja sieci Web jest w pełni skonfigurowana i można uzyskać do niej dostęp z przeglądarki na komputerze lokalnym pod adresem http://localhost .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. Sprawdzanie nagłówków odpowiedzi, nagłówek serwera wskazuje, że aplikacja ASP.NET Core jest obsługiwana przez Kestrel: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

Wyświetlanie dziennikówView logs

Ponieważ aplikacja sieci Web używająca Kestrel jest zarządzana przy użyciu systemu , zdarzenia i procesy są rejestrowane w scentralizowanym dzienniku.Since the web app using Kestrel is managed using systemd , events and processes are logged to a centralized journal. Ten dziennik zawiera jednak wpisy dla wszystkich usług i procesów zarządzanych przez system .However, this journal includes entries for all of the services and processes managed by systemd . Aby wyświetlić kestrel-helloapp.service konkretne elementy, użyj następującego polecenia:To view the kestrel-helloapp.service-specific items, use the following command:

sudo journalctl -fu kestrel-helloapp.service

W przypadku filtrowania czasu określ opcje czasu za pomocą polecenia.For time filtering, specify time options with the command. Na przykład użyj, --since today Aby odfiltrować bieżący dzień lub --until 1 hour ago zobaczyć poprzednią godzinę.For example, use --since today to filter for the current day or --until 1 hour ago to see the previous hour's entries. Aby uzyskać więcej informacji, zobacz stronę Man for 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"

Ochrona danychData protection

ASP.NET Core stosu ochrony danych jest używany przez kilka ASP.NET Core middlewares, w tym uwierzytelniania oprogramowania pośredniczącego (na przykład cookie oprogramowania pośredniczącego) i ochrony przez wiele lokacji (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. Nawet jeśli interfejsy API ochrony danych nie są wywoływane przez kod użytkownika, należy skonfigurować ochronę danych w celu utworzenia trwałego magazynu kluczykryptograficznych.Even if Data Protection APIs aren't called by user code, data protection should be configured to create a persistent cryptographic key store. Jeśli ochrona danych nie jest skonfigurowana, klucze są przechowywane w pamięci i usuwane po ponownym uruchomieniu aplikacji.If data protection isn't configured, the keys are held in memory and discarded when the app restarts.

Jeśli pierścień kluczy jest przechowywany w pamięci po ponownym uruchomieniu aplikacji:If the key ring is stored in memory when the app restarts:

  • cookieTokeny uwierzytelniania na podstawie wszystkich są unieważnione.All cookie-based authentication tokens are invalidated.
  • Użytkownicy muszą ponownie zalogować się przy następnym żądaniu.Users are required to sign in again on their next request.
  • Nie można już odszyfrować żadnych danych chronionych za pomocą dzwonka klucza.Any data protected with the key ring can no longer be decrypted. Może to obejmować tokeny CSRF i ASP.NET Core MVC TempData cookie s.This may include CSRF tokens and ASP.NET Core MVC TempData cookies.

Aby skonfigurować ochronę danych w celu utrwalenia i szyfrowania pierścienia kluczy, zobacz:To configure data protection to persist and encrypt the key ring, see:

Zabezpieczanie aplikacjiSecure the app

Konfigurowanie zaporyConfigure firewall

Zapora jest demonem dynamicznym do zarządzania zaporą z obsługą stref sieciowych.Firewalld is a dynamic daemon to manage the firewall with support for network zones. Porty i filtrowanie pakietów nadal mogą być zarządzane przez dołączenie iptables.Ports and packet filtering can still be managed by iptables. Zapora powinna być instalowana domyślnie.Firewalld should be installed by default. yum można go użyć, aby zainstalować pakiet lub sprawdzić jego instalację.yum can be used to install the package or verify it's installed.

sudo yum install firewalld -y

Służy firewalld do otwierania tylko portów wymaganych dla aplikacji.Use firewalld to open only the ports needed for the app. W takim przypadku używane są porty 80 i 443.In this case, port 80 and 443 are used. Następujące polecenia trwale ustawiają porty 80 i 443, aby otworzyć: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

Załaduj ponownie ustawienia zapory.Reload the firewall settings. Sprawdź dostępne usługi i porty w strefie domyślnej.Check the available services and ports in the default zone. Opcje są dostępne przez sprawdzenie firewall-cmd -h .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: 

Konfiguracja protokołu HTTPSHTTPS configuration

Konfigurowanie aplikacji do połączeń lokalnych (HTTPS)Configure the app for secure (HTTPS) local connections

Polecenie dotnet Run używa Właściwości/launchSettings.jsaplikacji w pliku, co umożliwia skonfigurowanie aplikacji do nasłuchiwania na adresach URL dostarczonych przez applicationUrl Właściwość (na przykład 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).

Skonfiguruj aplikację do korzystania z certyfikatu podczas opracowywania dla dotnet run polecenia lub środowiska programistycznego (F5 lub CTRL + F5 w Visual Studio Code), korzystając z jednej z następujących metod: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:

Konfigurowanie zwrotnego serwera proxy dla połączeń zabezpieczonych za pośrednictwem protokołu HTTPSConfigure the reverse proxy for secure (HTTPS) client connections

Aby skonfigurować Apache for HTTPS, używany jest moduł mod_ssl .To configure Apache for HTTPS, the mod_ssl module is used. Po zainstalowaniu modułu http zainstalowano również moduł mod_ssl .When the httpd module was installed, the mod_ssl module was also installed. Jeśli nie została zainstalowana, użyj, yum Aby dodać ją do konfiguracji.If it wasn't installed, use yum to add it to the configuration.

sudo yum install mod_ssl

Aby wymusić protokół HTTPS, zainstaluj mod_rewrite moduł, aby włączyć ponowne zapisywanie adresów URL:To enforce HTTPS, install the mod_rewrite module to enable URL rewriting:

sudo yum install mod_rewrite

Zmodyfikuj plik helloapp. conf , aby umożliwić ponowne zapisywanie adresów URL i bezpieczną komunikację na porcie 443: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>

Uwaga

W tym przykładzie użyto certyfikatu wygenerowanego lokalnie.This example is using a locally-generated certificate. SSLCertificateFile powinien być podstawowym plikiem certyfikatu dla nazwy domeny.SSLCertificateFile should be the primary certificate file for the domain name. SSLCertificateKeyFile powinien być plikiem klucza generowanym podczas tworzenia CSR.SSLCertificateKeyFile should be the key file generated when CSR is created. SSLCertificateChainFile powinien być pośrednim plikiem certyfikatu (jeśli istnieje), który został dostarczony przez urząd certyfikacji.SSLCertificateChainFile should be the intermediate certificate file (if any) that was supplied by the certificate authority.

Zapisz plik i przetestuj konfigurację:Save the file and test the configuration:

sudo service httpd configtest

Uruchom ponownie Apache:Restart Apache:

sudo systemctl restart httpd

Dodatkowe sugestie ApacheAdditional Apache suggestions

Ponowne uruchamianie aplikacji przy użyciu aktualizacji platformy udostępnionejRestart apps with shared framework updates

Po uaktualnieniu platformy udostępnionej na serwerze uruchom ponownie ASP.NET Core aplikacje hostowane przez serwer.After upgrading the shared framework on the server, restart the ASP.NET Core apps hosted by the server.

Dodatkowe nagłówkiAdditional headers

Aby zabezpieczyć przed złośliwymi atakami, istnieje kilka nagłówków, które należy zmodyfikować lub dodać.In order to secure against malicious attacks, there are a few headers that should either be modified or added. Upewnij się, że mod_headers moduł jest zainstalowany:Ensure that the mod_headers module is installed:

sudo yum install mod_headers

Zabezpiecz ataki Apache from clickjackingSecure Apache from clickjacking attacks

Clickjacking, znana także jako atak polegająca na zaskarżeniu interfejsu użytkownika , to złośliwy atak polegający na tym, że odwiedzanie witryny sieci Web jest trudne do kliknięcia linku lub przycisku na innej stronie niż aktualnie odwiedzane.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. Użyj X-FRAME-OPTIONS , aby zabezpieczyć lokację.Use X-FRAME-OPTIONS to secure the site.

Aby wyeliminować ataki clickjacking:To mitigate clickjacking attacks:

  1. Edytuj plik http. conf :Edit the httpd.conf file:

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

    Dodaj wiersz Header append X-FRAME-OPTIONS "SAMEORIGIN".Add the line Header append X-FRAME-OPTIONS "SAMEORIGIN".

  2. Zapisz plik.Save the file.

  3. Uruchom ponownie Apache.Restart Apache.

Wykrywanie typu MIMEMIME-type sniffing

X-Content-Type-OptionsNagłówek uniemożliwia Internet Explorer z wykrywania MIME (określenie pliku Content-Type z zawartości pliku).The X-Content-Type-Options header prevents Internet Explorer from MIME-sniffing (determining a file's Content-Type from the file's content). Jeśli serwer ustawi Content-Type nagłówek text/html z nosniff zestawem opcji, program Internet Explorer renderuje zawartość text/html niezależnie od zawartości pliku.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.

Edytuj plik http. conf :Edit the httpd.conf file:

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

Dodaj wiersz Header set X-Content-Type-Options "nosniff".Add the line Header set X-Content-Type-Options "nosniff". Zapisz plik.Save the file. Uruchom ponownie Apache.Restart Apache.

Równoważenie obciążeniaLoad Balancing

W tym przykładzie przedstawiono sposób konfigurowania i konfigurowania oprogramowania Apache w systemie CentOS 7 i Kestrel na tym samym komputerze wystąpienia.This example shows how to setup and configure Apache on CentOS 7 and Kestrel on the same instance machine. Aby nie mieć single point of failure; Używanie mod_proxy_balancer i modyfikowanie VirtualHost umożliwi zarządzanie wieloma wystąpieniami aplikacji sieci Web za serwerem Apache proxy.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

W pliku konfiguracyjnym przedstawionym poniżej dodatkowe wystąpienie helloapp jest skonfigurowane do uruchamiania na porcie 5001.In the configuration file shown below, an additional instance of the helloapp is set up to run on port 5001. Sekcja proxy jest ustawiana z konfiguracją modułu równoważenia obciążenia z dwoma elementami członkowskimi w celu zrównoważenia byrequests .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>

Limity szybkościRate Limits

Za pomocą mod_ratelimit , który jest uwzględniony w module http , przepustowość klientów może być ograniczona: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

Przykładowy plik ogranicza przepustowość jako 600 KB/s w lokalizacji głównej: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>

Długie pola nagłówka żądaniaLong request header fields

Ustawienia domyślne serwera proxy zwykle ograniczają pola nagłówka żądania do 8 190 bajtów.Proxy server default settings typically limit request header fields to 8,190 bytes. Aplikacja może wymagać pól, które są dłuższe niż domyślne (na przykład aplikacje, które używają Azure Active Directory).An app may require fields longer than the default (for example, apps that use Azure Active Directory). Jeśli są wymagane dłuższe pola, dyrektywa LimitRequestFieldSize serwera proxy wymaga korekty.If longer fields are required, the proxy server's LimitRequestFieldSize directive requires adjustment. Wartość, która ma zostać zastosowana, zależy od scenariusza.The value to apply depends on the scenario. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją serwera.For more information, see your server's documentation.

Ostrzeżenie

Nie należy zwiększać wartości domyślnej, LimitRequestFieldSize chyba że jest to konieczne.Don't increase the default value of LimitRequestFieldSize unless necessary. Zwiększenie wartości zwiększa ryzyko ataków przepełnienia buforu (przepełnienie) i ataki typu "odmowa usługi" (DoS) przez złośliwych użytkowników.Increasing the value increases the risk of buffer overrun (overflow) and Denial of Service (DoS) attacks by malicious users.

Dodatkowe zasobyAdditional resources