Héberger ASP.NET Core sur Linux avec ApacheHost ASP.NET Core on Linux with Apache

Par Shayne BoyerBy Shayne Boyer

À l’aide de ce guide, découvrez comment configurer Apache comme serveur proxy inverse sur CentOS 7 pour rediriger le trafic HTTP vers une application web ASP.NET Core s’exécutant sur 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. L’extension mod_proxy et les modules associés créent le proxy inverse du serveur.The mod_proxy extension and related modules create the server's reverse proxy.

PrérequisPrerequisites

  1. Serveur exécutant CentOS 7 avec un compte d’utilisateur standard disposant du privilège sudo.Server running CentOS 7 with a standard user account with sudo privilege.
  2. Installez le runtime .NET Core sur le serveur.Install the .NET Core runtime on the server.
    1. Visitez la page All Downloads de .NET Core.Visit the .NET Core All Downloads page.
    2. Dans la liste Runtime, sélectionnez le runtime le plus récent qui n’est pas une préversion.Select the latest non-preview runtime from the list under Runtime.
    3. Sélectionnez et suivez les instructions pour CentOS/Oracle.Select and follow the instructions for CentOS/Oracle.
  3. Une application ASP.NET Core existante.An existing ASP.NET Core app.

Publier et copier sur l’applicationPublish and copy over the app

Configurez l’application pour un déploiement dépendant du framework.Configure the app for a framework-dependent deployment.

Exécutez dotnet publish à partir de l’environnement de développement pour empaqueter une application dans un répertoire (par exemple, bin/Release/<moniker_framework_target>/publish) exécutable sur le serveur :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

L’application peut également être publiée en tant que déploiement autonome si vous préférez ne pas gérer le runtime .NET Core sur le serveur.The app can also be published as a self-contained deployment if you prefer not to maintain the .NET Core runtime on the server.

Copiez l’application ASP.NET Core sur le serveur à l’aide d’un outil qui s’intègre au flux de travail de l’organisation (par exemple, SCP ou SFTP).Copy the ASP.NET Core app to the server using a tool that integrates into the organization's workflow (for example, SCP, SFTP). Il est courant de placer les applications web sous le répertoire var (par exemple, var/www/helloapp).It's common to locate web apps under the var directory (for example, var/www/helloapp).

Note

Dans un scénario de déploiement en production, un workflow d’intégration continue effectue le travail de publication de l’application et de copie des composants sur le serveur.Under a production deployment scenario, a continuous integration workflow does the work of publishing the app and copying the assets to the server.

Configurer un serveur proxyConfigure a proxy server

Un proxy inverse est une configuration courante pour traiter les applications web dynamiques.A reverse proxy is a common setup for serving dynamic web apps. Le proxy inverse met fin à la requête HTTP et la transfère à l’application ASP.NET.The reverse proxy terminates the HTTP request and forwards it to the ASP.NET app.

Un serveur proxy est un serveur qui transfère les requêtes des clients à un autre serveur, au lieu de traiter celles-ci lui-même.A proxy server is one which forwards client requests to another server instead of fulfilling requests itself. Un proxy inverse transfère à une destination fixe, en général pour le compte de clients arbitraires.A reverse proxy forwards to a fixed destination, typically on behalf of arbitrary clients. Dans ce guide, Apache est configuré comme proxy inverse s’exécutant sur le même serveur où Kestrel traite l’application 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.

Les requêtes étant transférées par le proxy inverse, utilisez le middleware (intergiciel) des en-têtes transférés à partir du package Microsoft.AspNetCore.HttpOverrides.Because requests are forwarded by reverse proxy, use the Forwarded Headers Middleware from the Microsoft.AspNetCore.HttpOverrides package. Le middleware met à jour le Request.Scheme, à l’aide de l’en-tête X-Forwarded-Proto, afin que les URI de redirection et d’autres stratégies de sécurité fonctionnent correctement.The middleware updates the Request.Scheme, using the X-Forwarded-Proto header, so that redirect URIs and other security policies work correctly.

Tout composant qui dépend du schéma, tel que l’authentification, la génération de lien, les redirections et la géolocalisation, doit être placé après l’appel du middleware des en-têtes transférés.Any component that depends on the scheme, such as authentication, link generation, redirects, and geolocation, must be placed after invoking the Forwarded Headers Middleware. En règle générale, le middleware des en-têtes transférés doit être exécuté avant les autres middlewares, à l’exception des middlewares de gestion des erreurs et de diagnostic.As a general rule, Forwarded Headers Middleware should run before other middleware except diagnostics and error handling middleware. Cet ordre permet au middleware qui repose sur les informations des en-têtes transférés d’utiliser les valeurs d’en-tête pour le traitement.This ordering ensures that the middleware relying on forwarded headers information can consume the header values for processing.

Appelez la méthode UseForwardedHeaders dans Startup.Configure avant d’appeler UseAuthentication ou un middleware de schéma d’authentification similaire.Invoke the UseForwardedHeaders method in Startup.Configure before calling UseAuthentication or similar authentication scheme middleware. Configurez le middleware pour transférer les en-têtes X-Forwarded-For et X-Forwarded-Proto :Configure the middleware to forward the X-Forwarded-For and X-Forwarded-Proto headers:

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

app.UseAuthentication();

Appelez la méthode UseForwardedHeaders dans Startup.Configure avant d’appeler UseIdentity et UseFacebookAuthentication ou un middleware de schéma d’authentification similaire.Invoke the UseForwardedHeaders method in Startup.Configure before calling UseIdentity and UseFacebookAuthentication or similar authentication scheme middleware. Configurez le middleware pour transférer les en-têtes X-Forwarded-For et X-Forwarded-Proto :Configure the middleware to forward the X-Forwarded-For and X-Forwarded-Proto headers:

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

app.UseIdentity();
app.UseFacebookAuthentication(new FacebookOptions()
{
    AppId = Configuration["Authentication:Facebook:AppId"],
    AppSecret = Configuration["Authentication:Facebook:AppSecret"]
});

Si aucune option ForwardedHeadersOptions n’est spécifiée au middleware, les en-têtes par défaut à transférer sont None.If no ForwardedHeadersOptions are specified to the middleware, the default headers to forward are None.

Seuls les proxys en cours d’exécution sur localhost (127.0.0.1, [::1]) sont approuvés par défaut.Only proxies running on localhost (127.0.0.1, [::1]) are trusted by default. Si d’autres proxys ou réseaux approuvés au sein de l’organisation gèrent les requêtes entre Internet et le serveur web, ajoutez-les à la liste des KnownProxies ou des KnownNetworks avec 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. L’exemple suivant ajoute un serveur proxy approuvé avec l’adresse IP 10.0.0.100 au middleware des en-têtes transférés KnownProxies dans 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:

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

Pour plus d'informations, consultez Configurer ASP.NET Core pour l’utilisation de serveurs proxy et d’équilibreurs de charge.For more information, see Configurer ASP.NET Core pour l’utilisation de serveurs proxy et d’équilibreurs de charge.

Installer ApacheInstall Apache

Mettez à jour les packages CentOS vers leur dernière version stable :Update CentOS packages to their latest stable versions:

sudo yum update -y

Installez le serveur web Apache sur CentOS avec une seule commande yum :Install the Apache web server on CentOS with a single yum command:

sudo yum -y install httpd mod_ssl

Exemple de sortie après exécution de la commande :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!

Note

Dans cet exemple, la sortie correspond à httpd.86_64, car la version de CentOS 7 est en 64 bits.In this example, the output reflects httpd.86_64 since the CentOS 7 version is 64 bit. Pour vérifier où Apache est installé, exécutez whereis httpd à partir d’une invite de commandes.To verify where Apache is installed, run whereis httpd from a command prompt.

Configurer ApacheConfigure Apache

Les fichiers de configuration pour Apache se trouvent dans le répertoire /etc/httpd/conf.d/.Configuration files for Apache are located within the /etc/httpd/conf.d/ directory. Les fichiers avec l’extension .conf sont traités par ordre alphabétique en plus des fichiers de configuration des modules dans /etc/httpd/conf.modules.d/, qui contient tous les fichiers de configuration nécessaires au chargement des modules.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.

Créez un fichier de configuration nommé helloapp.conf, pour l’application :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>

Le bloc VirtualHost peut apparaître plusieurs fois, dans un ou plusieurs fichiers sur un serveur.The VirtualHost block can appear multiple times, in one or more files on a server. Dans le fichier de configuration précédent, Apache accepte le trafic public sur le port 80.In the preceding configuration file, Apache accepts public traffic on port 80. Le domaine www.example.com est pris en charge, et l’alias *.example.com aboutit au même site web.The domain www.example.com is being served, and the *.example.com alias resolves to the same website. Pour plus d’informations, consultez Name-based virtual host support (Prise en charge des hôtes virtuels par nom).See Name-based virtual host support for more information. Les requêtes sont transmises par proxy à la racine vers le port 5000 du serveur sur 127.0.0.1.Requests are proxied at the root to port 5000 of the server at 127.0.0.1. Pour la communication bidirectionnelle, ProxyPass et ProxyPassReverse sont requis.For bi-directional communication, ProxyPass and ProxyPassReverse are required. Pour changer le port/l’adresse IP Kestrel, consultez Kestrel : configuration du point de terminaison.To change Kestrel's IP/port, see Kestrel: Endpoint configuration.

Avertissement

La spécification d’une directive ServerName incorrecte dans le bloc VirtualHost expose votre application à des failles de sécurité.Failure to specify a proper ServerName directive in the VirtualHost block exposes your app to security vulnerabilities. Une liaison générique de sous-domaine (par exemple, *.example.com) ne présente pas ce risque de sécurité si vous contrôlez le domaine parent en entier (par opposition à *.com, qui est vulnérable).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). Consultez la rfc7230 section-5.4 pour plus d’informations.See rfc7230 section-5.4 for more information.

Vous pouvez configurer la journalisation par VirtualHost à l’aide des directives ErrorLog et CustomLog.Logging can be configured per VirtualHost using ErrorLog and CustomLog directives. ErrorLog est l’emplacement où le serveur journalise les erreurs, tandis que CustomLog définit le nom de fichier et le format du fichier journal.ErrorLog is the location where the server logs errors, and CustomLog sets the filename and format of log file. Dans ce cas, c’est l’endroit où les informations des requêtes sont journalisées.In this case, this is where request information is logged. Il y a une ligne pour chaque requête.There's one line for each request.

Enregistrez le fichier et testez la configuration.Save the file and test the configuration. Si tout réussit, la réponse doit être Syntax [OK].If everything passes, the response should be Syntax [OK].

sudo service httpd configtest

Redémarrez Apache :Restart Apache:

sudo systemctl restart httpd
sudo systemctl enable httpd

Surveillance de l’applicationMonitoring the app

Apache est désormais configuré pour transférer les requêtes faites à http://localhost:80 vers l’application ASP.NET Core s’exécutant sur Kestrel à l’adresse 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. Cependant, Apache n’est pas configuré pour gérer le processus Kestrel.However, Apache isn't set up to manage the Kestrel process. Utilisez systemd pour créer un fichier de service afin de démarrer et surveiller l’application web sous-jacente.Use systemd and create a service file to start and monitor the underlying web app. systemd est un système d’initialisation qui fournit de nombreuses et puissantes fonctionnalités pour le démarrage, l’arrêt et la gestion des processus.systemd is an init system that provides many powerful features for starting, stopping, and managing processes.

Créer le fichier de serviceCreate the service file

Créez le fichier de définition de service :Create the service definition file:

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

Exemple de fichier de service pour l’application :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

Si l’utilisateur apache n’est pas utilisé par la configuration, vous devez d’abord créer l’utilisateur et l’affecter en tant que propriétaire des fichiers.If the user apache isn't used by the configuration, the user must be created first and given proper ownership of files.

Utilisez TimeoutStopSec pour configurer la durée d’attente de l’arrêt de l’application après la réception du signal d’interruption initial.Use TimeoutStopSec to configure the duration of time to wait for the app to shut down after it receives the initial interrupt signal. Si l’application ne s’arrête pas pendant cette période, le signal SIGKILL est émis pour mettre fin à l’application.If the app doesn't shut down in this period, SIGKILL is issued to terminate the app. Indiquez la valeur en secondes sans unité (par exemple, 150), une valeur d’intervalle de temps (par exemple, 2min 30s) ou infinity pour désactiver le délai d’attente.Provide the value as unitless seconds (for example, 150), a time span value (for example, 2min 30s), or infinity to disable the timeout. TimeoutStopSec prend la valeur par défaut de DefaultTimeoutStopSec dans le fichier de configuration du gestionnaire (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). Le délai d’expiration par défaut pour la plupart des distributions est de 90 secondes.The default timeout for most distributions is 90 seconds.

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

Certaines valeurs (par exemple, les chaînes de connexion SQL) doivent être placées dans une séquence d’échappement afin que les fournisseurs de configuration puissent lire les variables d’environnement.Some values (for example, SQL connection strings) must be escaped for the configuration providers to read the environment variables. Utilisez la commande suivante pour générer une valeur correctement placée dans une séquence d’échappement en vue de son utilisation dans le fichier de configuration :Use the following command to generate a properly escaped value for use in the configuration file:

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

Enregistrez le fichier et activez le service :Save the file and enable the service:

sudo systemctl enable kestrel-helloapp.service

Démarrez le service et vérifiez qu’il s’exécute :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

Le proxy inverse étant configuré et Kestrel étant géré via systemd, l’application web est maintenant entièrement configurée et accessible à partir d’un navigateur sur la machine locale à l’adresse 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. Comme l’indiquent les en-têtes de réponse, l’en-tête Server montre que l’application ASP.NET Core est traitée par 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

Affichage des journauxViewing logs

Puisque l’application web utilisant Kestrel est gérée à l’aide de systemd, les processus et les événements sont enregistrés dans un journal centralisé.Since the web app using Kestrel is managed using systemd, events and processes are logged to a centralized journal. Cependant, ce journal comprend les entrées de tous les services et processus gérés par systemd.However, this journal includes entries for all of the services and processes managed by systemd. Pour afficher les éléments propres à kestrel-helloapp.service, utilisez la commande suivante :To view the kestrel-helloapp.service-specific items, use the following command:

sudo journalctl -fu kestrel-helloapp.service

Pour le filtrage du temps, spécifiez les options appropriées dans la commande.For time filtering, specify time options with the command. Par exemple, utilisez --since today pour filtrer en fonction du jour actuel ou --until 1 hour ago pour voir les entrées de l’heure précédente.For example, use --since today to filter for the current day or --until 1 hour ago to see the previous hour's entries. Pour plus d’informations, consultez la page man pour 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"

Protection des donnéesData protection

La pile de protection des données ASP.NET Core est utilisée par plusieurs intergiciels (middleware) ASP.NET Core, notamment le middleware d’authentification (par exemple, le middleware cookie) et les protections de la falsification de requête intersites (CSRF, Cross Site Request Forgery).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. Même si les API de protection des données ne sont pas appelées par le code de l’utilisateur, la protection des données doit être configurée pour créer un magasin de clés de chiffrement persistantes.Even if Data Protection APIs aren't called by user code, data protection should be configured to create a persistent cryptographic key store. Si la protection des données n’est pas configurée, les clés sont conservées en mémoire et ignorées au redémarrage de l’application.If data protection isn't configured, the keys are held in memory and discarded when the app restarts.

Si le Key Ring est stocké en mémoire, au redémarrage de l’application :If the key ring is stored in memory when the app restarts:

  • tous les jetons d’authentification basés sur des cookies sont invalidésAll cookie-based authentication tokens are invalidated.
  • Les utilisateurs doivent se reconnecter pour envoyer leur prochaine demande.Users are required to sign in again on their next request.
  • toutes les données protégées par le Key Ring ne peuvent plus être déchiffrées.Any data protected with the key ring can no longer be decrypted. Ceci peut inclure des jetons CSRF et des cookies TempData ASP.NET Core MVC.This may include CSRF tokens and ASP.NET Core MVC TempData cookies.

Pour configurer la protection des données de façon à conserver et chiffrer le porte-clés (Key Ring), consultez :To configure data protection to persist and encrypt the key ring, see:

Sécurisation de l’applicationSecuring the app

Configurer le pare-feuConfigure firewall

Firewalld est un démon dynamique pour gérer le pare-feu avec prise en charge des zones réseau.Firewalld is a dynamic daemon to manage the firewall with support for network zones. Les ports et le filtrage des paquets peuvent toujours être gérés par iptables.Ports and packet filtering can still be managed by iptables. Firewalld doit être installé par défaut.Firewalld should be installed by default. Vous pouvez utiliser yum pour installer le package ou vérifier qu’il est installé.yum can be used to install the package or verify it's installed.

sudo yum install firewalld -y

Utilisez firewalld pour ouvrir seulement les ports nécessaires à l’application.Use firewalld to open only the ports needed for the app. Dans ce cas, les ports 80 et 443 sont utilisés.In this case, port 80 and 443 are used. Les commandes suivantes définissent l’ouverture des ports 80 et 443 de façon permanente :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

Rechargez les paramètres du pare-feu.Reload the firewall settings. Vérifiez les services et les ports disponibles dans la zone par défaut.Check the available services and ports in the default zone. Vous voyez les options disponibles en examinant le résultat de 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: 

Configuration de SSLSSL configuration

Pour configurer Apache pour SSL, vous utilisez le module mod_ssl.To configure Apache for SSL, the mod_ssl module is used. Le module mod_ssl a été installé parallèlement au module httpd.When the httpd module was installed, the mod_ssl module was also installed. S’il n’a pas été installé, utilisez yum pour l’ajouter à la configuration.If it wasn't installed, use yum to add it to the configuration.

sudo yum install mod_ssl

Pour mettre en œuvre SSL, installez le module mod_rewrite afin de permettre la réécriture d’URL :To enforce SSL, install the mod_rewrite module to enable URL rewriting:

sudo yum install mod_rewrite

Modifiez le fichier helloapp.conf pour permettre la réécriture d’URL et sécuriser les communications sur le port 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>

Note

Cet exemple utilise un certificat généré localement.This example is using a locally-generated certificate. SSLCertificateFile doit être le fichier de certificat principal pour le nom de domaine.SSLCertificateFile should be the primary certificate file for the domain name. SSLCertificateKeyFile doit être le fichier de clé généré quand la demande de signature de certificat est créée.SSLCertificateKeyFile should be the key file generated when CSR is created. SSLCertificateChainFile doit être le fichier de certificat intermédiaire (le cas échéant) qui a été fourni par l’autorité de certification.SSLCertificateChainFile should be the intermediate certificate file (if any) that was supplied by the certificate authority.

Enregistrez le fichier et testez la configuration :Save the file and test the configuration:

sudo service httpd configtest

Redémarrez Apache :Restart Apache:

sudo systemctl restart httpd

Autres suggestions pour ApacheAdditional Apache suggestions

En-têtes facultatifsAdditional headers

Afin d’assurer une protection contre les attaques malveillantes, vous devez modifier ou ajouter quelques en-têtes.In order to secure against malicious attacks, there are a few headers that should either be modified or added. Vérifiez que le module mod_headers est installé :Ensure that the mod_headers module is installed:

sudo yum install mod_headers

Sécuriser Apache contre les attaques par détournement de clicSecure Apache from clickjacking attacks

Le détournement de clic, également appelé UI redress attack, est une attaque malveillante qui amène le visiteur d’un site web à cliquer sur un lien ou un bouton sur une page différente de celle qu’il est en train de visiter.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. Utilisez X-FRAME-OPTIONS pour sécuriser le site.Use X-FRAME-OPTIONS to secure the site.

Pour atténuer les attaques par détournement de clic :To mitigate clickjacking attacks:

  1. Modifiez le fichier httpd.conf :Edit the httpd.conf file:

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

    Ajoutez la ligne Header append X-FRAME-OPTIONS "SAMEORIGIN".Add the line Header append X-FRAME-OPTIONS "SAMEORIGIN".

  2. Enregistrez le fichier.Save the file.

  3. Redémarrez Apache.Restart Apache.

Détection de type MIMEMIME-type sniffing

L’en-tête X-Content-Type-Options empêche Internet Explorer d’effectuer une détection de données MIME (détermination du Content-Type d’un fichier à partir de son contenu).The X-Content-Type-Options header prevents Internet Explorer from MIME-sniffing (determining a file's Content-Type from the file's content). Si le serveur définit l’en-tête Content-Type sur text/html et que l’option nosniff est définie, Internet Explorer restitue le contenu en tant que text/html, quel que soit le contenu du fichier.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.

Modifiez le fichier httpd.conf :Edit the httpd.conf file:

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

Ajoutez la ligne Header set X-Content-Type-Options "nosniff".Add the line Header set X-Content-Type-Options "nosniff". Enregistrez le fichier.Save the file. Redémarrez Apache.Restart Apache.

Équilibrage de chargeLoad Balancing

Cet exemple montre comment installer et configurer Apache sur CentOS 7 et Kestrel sur la même machine de l’instance.This example shows how to setup and configure Apache on CentOS 7 and Kestrel on the same instance machine. Afin de multiplier les instances en cas de défaillance, l’utilisation de mod_proxy_balancer et la modification du VirtualHost permettent de gérer plusieurs instances des applications web derrière le serveur proxy Apache.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

Dans le fichier de configuration illustré ci-dessous, une instance supplémentaire de helloapp est configurée pour s’exécuter sur le port 5001.In the configuration file shown below, an additional instance of the helloapp is set up to run on port 5001. La section Proxy est définie avec une configuration d’équilibreur qui comprend deux membres pour équilibrer la charge selon la méthode 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>

Limites du débitRate Limits

Vous pouvez utiliser mod_ratelimit, qui est inclus dans le module httpd, pour limiter la bande passante des clients :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

L’exemple de fichier limite la bande passante à 600 Ko/s sous l’emplacement racine :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>

Ressources supplémentairesAdditional resources