Héberger ASP.NET Core sur Linux avec NginxHost ASP.NET Core on Linux with Nginx

De Sourabh ShirhattiBy Sourabh Shirhatti

Ce guide explique comment configurer un environnement ASP.NET Core prêt pour la production sur un serveur Ubuntu 16.04.This guide explains setting up a production-ready ASP.NET Core environment on an Ubuntu 16.04 server. Ces instructions fonctionnent normalement avec les versions d’Ubuntu plus récentes, mais elles n’ont pas fait l’objet de tests avec ces versions.These instructions likely work with newer versions of Ubuntu, but the instructions haven't been tested with newer versions.

Pour plus d’informations sur les autres distributions Linux prises en charge par ASP.NET Core, consultez Prérequis pour .NET Core sur Linux.For information on other Linux distributions supported by ASP.NET Core, see Prerequisites for .NET Core on Linux.

Note

Pour Ubuntu 14.04, nous vous recommandons d’utiliser supervisord comme solution pour l’analyse du processus Kestrel.For Ubuntu 14.04, supervisord is recommended as a solution for monitoring the Kestrel process. systemd n’est pas disponible sur Ubuntu 14.04.systemd isn't available on Ubuntu 14.04. Pour obtenir des instructions pour Ubuntu 14.04, consultez la version précédente de cette rubrique.For Ubuntu 14.04 instructions, see the previous version of this topic.

Ce guide montre comment effectuer les opérations suivantes :This guide:

  • Placer une application ASP.NET Core existante derrière un serveur proxy inverse.Places an existing ASP.NET Core app behind a reverse proxy server.
  • Configurer le serveur proxy inverse pour transférer les requêtes au serveur web Kestrel.Sets up the reverse proxy server to forward requests to the Kestrel web server.
  • S’assurer que l’application web s’exécute au démarrage en tant que démon.Ensures the web app runs on startup as a daemon.
  • Configurer un outil de gestion des processus pour aider à redémarrer l’application web.Configures a process management tool to help restart the web app.

PrérequisPrerequisites

  1. Accédez à un serveur Ubuntu 16.04 avec un compte d’utilisateur standard disposant de privilèges sudo.Access to an Ubuntu 16.04 server 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 Ubuntu qui correspondent à la version Ubuntu du serveur.Select and follow the instructions for Ubuntu that match the Ubuntu version of the server.
  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.

Testez l’application :Test the app:

  1. À partir de la ligne de commande, exécutez l’application : dotnet <app_assembly>.dll.From the command line, run the app: dotnet <app_assembly>.dll.
  2. Dans un navigateur, accédez à http://<serveraddress>:<port> pour vérifier que l’application fonctionne sur Linux localement.In a browser, navigate to http://<serveraddress>:<port> to verify the app works on Linux locally.

Configurer un serveur proxy inverseConfigure a reverse 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. Un proxy inverse met fin à la requête HTTP et la transfère à l’application ASP.NET Core.A reverse proxy terminates the HTTP request and forwards it to the ASP.NET Core app.

Utiliser un serveur proxy inverseUse a reverse proxy server

Kestrel est idéal pour servir du contenu dynamique à partir d’ASP.NET Core.Kestrel is great for serving dynamic content from ASP.NET Core. Toutefois, les fonctionnalités de service web ne sont pas aussi complètes que les serveurs tels qu’IIS, Apache ou Nginx.However, the web serving capabilities aren't as feature rich as servers such as IIS, Apache, or Nginx. Un serveur proxy inverse peut décharger du travail tel que le traitement du contenu statique, la mise en cache des requêtes, la compression des requêtes et l’arrêt SSL à partir du serveur HTTP.A reverse proxy server can offload work such as serving static content, caching requests, compressing requests, and SSL termination from the HTTP server. Un serveur proxy inverse peut résider sur un ordinateur dédié ou peut être déployé à côté d’un serveur HTTP.A reverse proxy server may reside on a dedicated machine or may be deployed alongside an HTTP server.

Pour les besoins de ce guide, nous utilisons une seule instance de Nginx.For the purposes of this guide, a single instance of Nginx is used. Elle s’exécute sur le même serveur, en plus du serveur HTTP.It runs on the same server, alongside the HTTP server. Selon les exigences, un paramétrage différent peut être choisi.Based on requirements, a different setup may be chosen.

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 NginxInstall Nginx

Utilisez apt-get pour installer Nginx.Use apt-get to install Nginx. Le programme d’installation crée un script d’initialisation systemd qui exécute Nginx en tant que démon au démarrage du système.The installer creates a systemd init script that runs Nginx as daemon on system startup. Suivez les instructions d’installation pour Ubuntu sur le site Nginx : Les packages officiels Debian/Ubuntu.Follow the installation instructions for Ubuntu at Nginx: Official Debian/Ubuntu packages.

Note

Si des modules Nginx facultatifs sont requis, il peut s’avérer nécessaire de configurer Nginx à partir de la source.If optional Nginx modules are required, building Nginx from source might be required.

Comme il s’agit de l’installation initiale de Nginx, vous devez le démarrer explicitement en exécutant :Since Nginx was installed for the first time, explicitly start it by running:

sudo service nginx start

Vérifiez qu’un navigateur affiche la page d’accueil par défaut de Nginx.Verify a browser displays the default landing page for Nginx. La page d’accueil est accessible à l’adresse http://<server_IP_address>/index.nginx-debian.html.The landing page is reachable at http://<server_IP_address>/index.nginx-debian.html.

Configurer NginxConfigure Nginx

Pour configurer Nginx en tant que proxy inverse pour transférer les requêtes à votre application ASP.NET Core, modifiez le fichier /etc/nginx/sites-available/default.To configure Nginx as a reverse proxy to forward requests to your ASP.NET Core app, modify /etc/nginx/sites-available/default. Ouvrez-le dans un éditeur de texte et remplacez le contenu par ce qui suit :Open it in a text editor, and replace the contents with the following:

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

Si aucun server_name ne correspond, Nginx utilise le serveur par défaut.When no server_name matches, Nginx uses the default server. Si aucun serveur par défaut n’est défini, le premier serveur dans le fichier de configuration est le serveur par défaut.If no default server is defined, the first server in the configuration file is the default server. En guise de bonne pratique, ajoutez un serveur par défaut spécifique qui retourne un code d’état 444 dans votre fichier de configuration.As a best practice, add a specific default server which returns a status code of 444 in your configuration file. Voici un exemple de configuration de serveur par défaut :A default server configuration example is:

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

Avec les fichier de configuration et le serveur par défaut précédents, Nginx accepte le trafic public sur le port 80 avec un en-tête d’hôte example.com ou *.example.com.With the preceding configuration file and default server, Nginx accepts public traffic on port 80 with host header example.com or *.example.com. Les requêtes qui ne correspondent pas à ces hôtes ne sont pas transférées à Kestrel.Requests not matching these hosts won't get forwarded to Kestrel. Nginx transfère les requêtes correspondantes à Kestrel à l’adresse http://localhost:5000.Nginx forwards the matching requests to Kestrel at http://localhost:5000. Consultez How nginx processes a request (Comment nginx traite une requête) pour plus d’informations.See How nginx processes a request for more information. 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 server_name incorrecte expose votre application à des failles de sécurité.Failure to specify a proper server_name directive 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.

Une fois la configuration de Nginx établie, exécutez sudo nginx -t pour vérifier la syntaxe des fichiers de configuration.Once the Nginx configuration is established, run sudo nginx -t to verify the syntax of the configuration files. Si le test de fichier de configuration réussit, forcez Nginx à appliquer les modifications en exécutant sudo nginx -s reload.If the configuration file test is successful, force Nginx to pick up the changes by running sudo nginx -s reload.

Pour exécuter directement l’application sur le serveur :To directly run the app on the server:

  1. Accédez au répertoire de l’application.Navigate to the app's directory.
  2. Exécutez l’application : dotnet <app_assembly.dll>, où app_assembly.dll est le nom de fichier d’assembly de l’application.Run the app: dotnet <app_assembly.dll>, where app_assembly.dll is the assembly file name of the app.

Si l’application s’exécute sur le serveur, mais ne répond pas sur Internet, vérifiez que le port 80 est ouvert sur le pare-feu du serveur.If the app runs on the server but fails to respond over the Internet, check the server's firewall and confirm that port 80 is open. Si vous utilisez une machine virtuelle Azure Ubuntu, ajoutez une règle de groupe de sécurité réseau (NSG) qui autorise le trafic entrant sur le port 80.If using an Azure Ubuntu VM, add a Network Security Group (NSG) rule that enables inbound port 80 traffic. Il est inutile d’activer une règle de trafic sortant sur le port 80, car le trafic sortant est accordé automatiquement quand la règle de trafic entrant est activée.There's no need to enable an outbound port 80 rule, as the outbound traffic is automatically granted when the inbound rule is enabled.

Quand vous avez terminé de tester l’application, arrêtez-la avec Ctrl+C depuis l’invite de commandes.When done testing the app, shut the app down with Ctrl+C at the command prompt.

Surveiller l’applicationMonitor the app

Le serveur est configuré pour transférer les requêtes faites à http://<serveraddress>:80 à l’application ASP.NET Core s’exécutant sur Kestrel à l’adresse http://127.0.0.1:5000.The server is setup to forward requests made to http://<serveraddress>:80 on to the ASP.NET Core app running on Kestrel at http://127.0.0.1:5000. Toutefois, Nginx n’est pas configuré pour gérer le processus Kestrel.However, Nginx isn't set up to manage the Kestrel process. systemd peut être utilisé pour créer un fichier de service afin de démarrer et de surveiller l’application web sous-jacente.systemd can be used to 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

Voici un exemple de fichier de service pour l’application :The following is an example service file for the app:

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

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

[Install]
WantedBy=multi-user.target

Si l’utilisateur www-data n’est pas utilisé par la configuration, vous devez d’abord créer l’utilisateur défini ici et l’affecter en tant que propriétaire des fichiers.If the user www-data isn't used by the configuration, the user defined here must be created first and given proper ownership for 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

Linux possède un système de fichiers respectant la casse.Linux has a case-sensitive file system. Si vous définissez ASPNETCORE_ENVIRONMENT sur « Production », c’est le fichier de configurationappsettings.Production.json qui est recherché, pas le fichier appsettings.production.json.Setting ASPNETCORE_ENVIRONMENT to "Production" results in searching for the configuration file appsettings.Production.json, not appsettings.production.json.

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 Ubuntu
    Loaded: loaded (/etc/systemd/system/kestrel-helloapp.service; enabled)
    Active: active (running) since Thu 2016-10-18 04:09:35 NZDT; 35s ago
Main PID: 9021 (dotnet)
    CGroup: /system.slice/kestrel-helloapp.service
            └─9021 /usr/local/bin/dotnet /var/www/helloapp/helloapp.dll

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. Elle est également accessible à partir d’un ordinateur distant, sauf en cas de blocage par un pare-feu.It's also accessible from a remote machine, barring any firewall that might be blocking. Si l’on inspecte les en-têtes de réponse, on constate que l’en-tête Server indique que l’application ASP.NET Core est traitée par Kestrel.Inspecting the response headers, the Server header shows the ASP.NET Core app being served by Kestrel.

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

Afficher les journauxView logs

Puisque l’application web utilisant Kestrel est gérée à l’aide de systemd, tous les processus et les événements sont enregistrés dans un journal centralisé.Since the web app using Kestrel is managed using systemd, all events and processes are logged to a centralized journal. Toutefois, ce journal inclut toutes les entrées pour tous les services et les processus gérés par systemd.However, this journal includes all entries for all 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

Si vous voulez appliquer un filtrage supplémentaire, des options chronologiques, comme --since today, --until 1 hour ago ou une combinaison de ces options, peuvent réduire la quantité d’entrées retournées.For further filtering, time options such as --since today, --until 1 hour ago or a combination of these can reduce the amount of entries returned.

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

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écuriser l’applicationSecure the app

Activer AppArmorEnable AppArmor

Linux Security Modules (LSM) est un framework qui fait partie du noyau Linux depuis Linux 2.6.Linux Security Modules (LSM) is a framework that's part of the Linux kernel since Linux 2.6. LSM prend en charge différentes implémentations de modules de sécurité.LSM supports different implementations of security modules. AppArmor est un LSM qui implémente un système de contrôle d’accès obligatoire permettant de confiner le programme à un ensemble limité de ressources.AppArmor is a LSM that implements a Mandatory Access Control system which allows confining the program to a limited set of resources. Vérifiez qu’AppArmor est activé et configuré correctement.Ensure AppArmor is enabled and properly configured.

Configurer le pare-feuConfigure the firewall

Fermez tous les ports externes qui ne sont pas en cours d’utilisation.Close off all external ports that are not in use. Uncomplicated firewall (ufw) fournit une interface de ligne de commande pour iptables afin de configurer le pare-feu.Uncomplicated firewall (ufw) provides a front end for iptables by providing a command line interface for configuring the firewall.

Avertissement

Un pare-feu mal configuré bloque l’accès à l’ensemble du système.A firewall will prevent access to the whole system if not configured correctly. Faute d’avoir spécifié le port SSH approprié, vous ne pourrez pas accéder au système si vous utilisez SSH pour vous y connecter.Failure to specify the correct SSH port will effectively lock you out of the system if you are using SSH to connect to it. Le numéro de port par défaut est 22.The default port is 22. Pour plus d’informations, consultez la présentation d’ufw et le manuel.For more information, see the introduction to ufw and the manual.

Installez ufw et configurez-le de façon à autoriser le trafic sur les ports nécessaires.Install ufw and configure it to allow traffic on any ports needed.

sudo apt-get install ufw

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

sudo ufw enable

Sécuriser NginxSecure Nginx

Changer le nom de la réponse NginxChange the Nginx response name

Modifiez src/http/ngx_http_header_filter_module.c :Edit src/http/ngx_http_header_filter_module.c:

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

Configurer les optionsConfigure options

Configurez le serveur avec les modules nécessaires supplémentaires.Configure the server with additional required modules. Pour renforcer l’application, vous pouvez utiliser un pare-feu d’application web tel que ModSecurity.Consider using a web app firewall, such as ModSecurity, to harden the app.

Configurer le protocole SSLConfigure SSL

  • Configurez le serveur pour qu’il écoute le trafic HTTPS sur le port 443 en spécifiant un certificat valide émis par une autorité de certificat approuvée.Configure the server to listen to HTTPS traffic on port 443 by specifying a valid certificate issued by a trusted Certificate Authority (CA).

  • Renforcez la sécurité en appliquant certaines des pratiques mentionnées dans le fichier /etc/nginx/nginx.conf suivant.Harden the security by employing some of the practices depicted in the following /etc/nginx/nginx.conf file. Vous pouvez par exemple choisir un chiffrement plus fort et rediriger tout le trafic sur HTTP vers HTTPS.Examples include choosing a stronger cipher and redirecting all traffic over HTTP to HTTPS.

  • L’ajout d’un en-tête HTTP Strict-Transport-Security (HSTS) garantit que toutes les demandes ultérieures du client s’effectuent par le biais du protocole HTTPS.Adding an HTTP Strict-Transport-Security (HSTS) header ensures all subsequent requests made by the client are over HTTPS.

  • N’ajoutez pas l’en-tête HSTS ou choisissez une valeur max-age appropriée si le protocole SSL doit être désactivé ultérieurement.Don't add the HSTS header or chose an appropriate max-age if SSL will be disabled in the future.

Ajoutez le fichier de configuration /etc/nginx/proxy.conf :Add the /etc/nginx/proxy.conf configuration file:

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

Modifiez le fichier de configuration /etc/nginx/nginx.conf.Edit the /etc/nginx/nginx.conf configuration file. Dans l’exemple, les sections http et server figurent dans un même fichier de configuration.The example contains both http and server sections in one configuration file.

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

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

    upstream hellomvc{
        server localhost:5000;
    }

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

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

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

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

Sécuriser Nginx contre le détournement de clicSecure Nginx from clickjacking

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 nginx.conf :Edit the nginx.conf file:

    sudo nano /etc/nginx/nginx.conf
    

    Ajoutez la ligne add_header X-Frame-Options "SAMEORIGIN";.Add the line add_header X-Frame-Options "SAMEORIGIN";.

  2. Enregistrez le fichier.Save the file.

  3. Redémarrez Nginx.Restart Nginx.

Détection de type MIMEMIME-type sniffing

Cet en-tête empêche la plupart des navigateurs de détourner le type MIME d’une réponse et de remplacer le type de contenu déclaré, car l’en-tête indique au navigateur qu’il ne doit pas substituer le type de contenu de la réponse.This header prevents most browsers from MIME-sniffing a response away from the declared content type, as the header instructs the browser not to override the response content type. Avec l’option nosniff, si le serveur indique que le contenu est « text/html », le navigateur le restitue en tant que « text/html ».With the nosniff option, if the server says the content is "text/html", the browser renders it as "text/html".

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

sudo nano /etc/nginx/nginx.conf

Ajoutez la ligne add_header X-Content-Type-Options "nosniff"; et enregistrez le fichier, puis redémarrez Nginx.Add the line add_header X-Content-Type-Options "nosniff"; and save the file, then restart Nginx.

Ressources supplémentairesAdditional resources