Hospedar o ASP.NET Core no Linux com Nginx
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Este guia explica a configuração de um ambiente ASP.NET Core pronto para produção para Ubuntu, Red Hat Enterprise (RHEL) e SUSE Linux Enterprise Server.
Para obter informações sobre outras distribuições Linux suportadas pelo ASP.NET Core, consulte Pré-requisitos para .NET Core no Linux.
Este guia:
- Coloca um aplicativo ASP.NET Core existente atrás de um servidor proxy reverso.
- Configura o servidor proxy reverso para encaminhar solicitações para o servidor Web Kestrel.
- Garante que o aplicativo Web seja executado na inicialização como um daemon.
- Configura uma ferramenta de gerenciamento de processos para ajudar a reiniciar o aplicativo Web.
Pré-requisitos
- Acesso ao Ubuntu 20.04 com uma conta de utilizador padrão com privilégio sudo.
- O mais recente ambiente de execução estável do .NET instalado no servidor.
- Um aplicativo ASP.NET Core existente.
A qualquer momento no futuro, depois de atualizar a estrutura compartilhada, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.
Publicar e copiar através da aplicação
Configure a aplicação para uma implementação dependente da estrutura .
Se o aplicativo for executado localmente no ambiente de desenvolvimento e não estiver configurado pelo servidor para fazer conexões HTTPS seguras, adote uma das seguintes abordagens:
Configure o aplicativo para lidar com conexões locais seguras. Para obter mais informações, consulte a seção de configuração HTTPS.
Configure o aplicativo para ser executado no ponto de extremidade inseguro:
Desative o middleware de redirecionamento HTTPS no ambiente de desenvolvimento (
Program.cs
):if (!app.Environment.IsDevelopment()) { app.UseHttpsRedirection(); }
Para obter mais informações, consulte Usar vários ambientes no ASP.NET Core.
Remova
https://localhost:5001
(se houver) da propriedadeapplicationUrl
no arquivoProperties/launchSettings.json
.
Para obter mais informações sobre a configuração por ambiente, consulte Usar vários ambientes no ASP.NET Core.
Execute o comando dotnet publish a partir do ambiente de desenvolvimento para empacotar uma aplicação num diretório (por exemplo, bin/Release/{TARGET FRAMEWORK MONIKER}/publish
, onde o espaço reservado {TARGET FRAMEWORK MONIKER}
é o "Target Framework Moniker (TFM)" ) que possa ser executado no servidor:
dotnet publish --configuration Release
A aplicação também pode ser publicada como uma implantação independente se preferir não manter o runtime .NET Core no servidor.
Copie o aplicativo ASP.NET Core para o servidor usando uma ferramenta que se integre ao fluxo de trabalho da organização (por exemplo, SCP
, SFTP
). É comum localizar aplicativos Web no diretório var
(por exemplo, var/www/helloapp
).
Observação
Em um cenário de implantação de produção, um fluxo de trabalho de integração contínua faz o trabalho de publicar o aplicativo e copiar os ativos para o servidor.
Teste o aplicativo:
- Na linha de comando, execute o aplicativo:
dotnet <app_assembly>.dll
. - Em um navegador, navegue até
http://<serveraddress>:<port>
para verificar se o aplicativo funciona no Linux localmente.
Configurar um servidor proxy reverso
Um proxy reverso é uma configuração comum para servir aplicativos Web dinâmicos. Um proxy reverso encerra a solicitação HTTP e a encaminha para o aplicativo ASP.NET Core.
Usar um servidor proxy reverso
Kestrel é ótimo para veicular conteúdo dinâmico do ASP.NET Core. No entanto, os recursos de serviço da Web não são tão ricos em recursos quanto servidores como IIS, Apache ou Nginx. Um servidor proxy reverso pode descarregar trabalho, como servir conteúdo estático, armazenar em cache as solicitações, compactar solicitações e realizar o término do HTTPS do servidor HTTP. Um servidor proxy reverso pode residir em uma máquina dedicada ou pode ser implantado ao lado de um servidor HTTP.
Para os fins deste guia, uma única instância de Nginx é usada. Ele é executado no mesmo servidor, ao lado do servidor HTTP. Com base nos requisitos, uma configuração diferente pode ser escolhida.
Como as solicitações são encaminhadas por proxy reverso, use o Middleware de cabeçalhos encaminhados do pacote Microsoft.AspNetCore.HttpOverrides
, que é incluído automaticamente nos aplicativos ASP.NET Core por meio do de metapacote Microsoft.AspNetCore.App
da estrutura compartilhada. O middleware atualiza o Request.Scheme
, usando o cabeçalho X-Forwarded-Proto
, para que os URIs de redirecionamento e outras políticas de segurança funcionem corretamente.
O middleware de cabeçalhos encaminhados deve ser executado antes de outro middleware. Essa ordenação garante que o middleware que depende das informações de cabeçalhos encaminhados possa consumir os valores de cabeçalho para processamento. Para executar o Middleware de Cabeçalhos Encaminhados após o middleware de diagnóstico e tratamento de erros, consulte a ordem do Middleware de Cabeçalhos Encaminhados em .
Invoque o método UseForwardedHeaders antes de chamar outro middleware. Configure o middleware para encaminhar os cabeçalhos X-Forwarded-For
e X-Forwarded-Proto
:
using Microsoft.AspNetCore.HttpOverrides;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication();
var app = builder.Build();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
app.MapGet("/", () => "Hello ForwardedHeadersOptions!");
app.Run();
Se nenhum ForwardedHeadersOptions for especificado para o middleware, os cabeçalhos padrão a serem encaminhados serão None
.
Os proxies executados em endereços de loopback (127.0.0.0/8
, [::1]
), incluindo o endereço de host local padrão (127.0.0.1
), são confiáveis por padrão. Se outros proxies ou redes confiáveis dentro da organização lidarem com solicitações entre a Internet e o servidor Web, adicione-os à lista de KnownProxies ou KnownNetworks com ForwardedHeadersOptions. O exemplo a seguir adiciona um servidor proxy confiável no endereço IP 10.0.0.100
ao middleware de cabeçalhos encaminhados KnownProxies
:
using Microsoft.AspNetCore.HttpOverrides;
using System.Net;
var builder = WebApplication.CreateBuilder(args);
// Configure forwarded headers
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
builder.Services.AddAuthentication();
var app = builder.Build();
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
app.MapGet("/", () => "10.0.0.100");
app.Run();
Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Instalar Nginx
Use apt-get
para instalar Nginx. O instalador cria um script systemd
init que executa o Nginx como daemon na inicialização do sistema. Siga as instruções de instalação para o Ubuntu em Nginx: Pacotes oficiais Debian / Ubuntu.
Observação
Se módulos Nginx opcionais são necessários, a construção de Nginx a partir do código-fonte pode ser necessária.
Desde que o Nginx foi instalado pela primeira vez, inicie-o explicitamente executando:
sudo service nginx start
Verifique se um navegador exibe a página de destino padrão do Nginx. A página de destino pode ser acessada em http://<server_IP_address>/index.nginx-debian.html
.
Configurar o Nginx
Para configurar o Nginx como um proxy reverso para encaminhar solicitações HTTP para o aplicativo ASP.NET Core, modifique /etc/nginx/sites-available/default
e recrie o link simbólico. Depois de criar o arquivo /etc/nginx/sites-available/default
, use o seguinte comando para criar o link simbólico:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
Abra /etc/nginx/sites-available/default
em um editor de texto e substitua o conteúdo pelo seguinte trecho:
map $http_connection $connection_upgrade {
"~*Upgrade" $http_connection;
default keep-alive;
}
server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://127.0.0.1:5000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
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;
}
}
Se o aplicativo for um aplicativo SignalR ou Blazor Server, consulte ASP.NET Core SignalR production hosting and scaling e Host e deploy ASP.NET Core server-side Blazor apps respectivamente para obter mais informações.
Quando server_name
não corresponde a nada, o Nginx usa o servidor padrão. Se nenhum servidor padrão for definido, o primeiro servidor no arquivo de configuração será o servidor padrão. Como prática recomendada, adicione um servidor padrão específico que retorne um código de status de 444 no arquivo de configuração. Um exemplo de configuração de servidor padrão é:
server {
listen 80 default_server;
# listen [::]:80 default_server deferred;
return 444;
}
Com o ficheiro de configuração anterior e o servidor padrão, o Nginx aceita tráfego público à porta 80 com cabeçalho do host example.com
ou *.example.com
. As solicitações que não corresponderem a esses hosts não serão encaminhadas para Kestrel. Nginx encaminha as solicitações correspondentes para Kestrel em http://127.0.0.1:5000/
. Para obter mais informações, consulte Como o nginx processa uma solicitação. Para alterar o IP/porta do Kestrel, consulte Kestrel: Endpoint configuration.
Advertência
A falha em especificar uma diretiva de server_name adequada expõe seu aplicativo a vulnerabilidades de segurança. A vinculação de curinga de subdomínio (por exemplo, *.example.com
) não representa esse risco de segurança se você controlar todo o domínio pai (ao contrário de *.com
, que é vulnerável). Para obter mais informações, consulte RFC 9110: Semântica HTTP (Seção 7.2: Host e :authority).
Uma vez que a configuração do Nginx é estabelecida, execute sudo nginx -t
para verificar a sintaxe dos arquivos de configuração. Se o teste do arquivo de configuração for bem-sucedido, force o Nginx a pegar as alterações executando sudo nginx -s reload
.
Para executar diretamente o aplicativo no servidor:
- Navegue até o diretório do aplicativo.
- Execute o aplicativo:
dotnet <app_assembly.dll>
, ondeapp_assembly.dll
é o nome do arquivo assembly do aplicativo.
Se o aplicativo for executado no servidor, mas não responder pela Internet, verifique o firewall do servidor e confirme se a porta 80 está aberta. Se estiver usando uma VM do Azure Ubuntu, adicione uma regra NSG (Network Security Group) que habilite o tráfego da porta 80 de entrada. Não há necessidade de habilitar uma regra de porta de saída 80, pois o tráfego de saída é concedido automaticamente quando a regra de entrada está habilitada.
Quando terminar de testar o aplicativo, desligue-o com Ctrl+C no shell de comando.
Aumentar pedidos de keepalive
keepalive_requests
pode ser aumentado para um desempenho superior de . Para mais informações, consulte este problema no GitHub.
Monitorar o aplicativo
O servidor está configurado para encaminhar solicitações feitas ao http://<serveraddress>:80
para o aplicativo ASP.NET Core em execução no Kestrel em http://127.0.0.1:5000
. No entanto, o Nginx não está configurado para gerenciar o processo de Kestrel.
systemd
pode ser usado para criar um arquivo de serviço para iniciar e monitorar o aplicativo Web subjacente.
systemd
é um sistema init que fornece muitos recursos poderosos para iniciar, parar e gerenciar processos.
Criar o arquivo de serviço
Crie o arquivo de definição de serviço:
sudo nano /etc/systemd/system/kestrel-helloapp.service
O exemplo a seguir é um arquivo de serviço .ini
para o aplicativo:
[Unit]
Description=Example .NET Web API App running on Linux
[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_NOLOGO=true
[Install]
WantedBy=multi-user.target
No exemplo anterior, o usuário que gerencia o serviço é especificado pela opção User
. O usuário (www-data
) deve existir e ter a propriedade adequada dos arquivos do aplicativo.
Use TimeoutStopSec
para configurar a duração do tempo para aguardar o desligamento do aplicativo depois de receber o sinal de interrupção inicial. Se a aplicação não for desligada nesse período, o SIGKILL será emitido para encerrar a aplicação. Forneça o valor como segundos sem unidade (por exemplo, 150
), um valor de intervalo de tempo (por exemplo, 2min 30s
) ou infinity
para desativar o tempo limite.
TimeoutStopSec
assume como padrão o valor de DefaultTimeoutStopSec
no arquivo de configuração do gerenciador (systemd-system.conf
, system.conf.d
, systemd-user.conf
, user.conf.d
). O tempo limite padrão para a maioria das distribuições é de 90 segundos.
# The default value is 90 seconds for most distributions.
TimeoutStopSec=90
O Linux tem um sistema de arquivos que diferencia maiúsculas de minúsculas. Definir ASPNETCORE_ENVIRONMENT
para Production
resulta na pesquisa do arquivo de configuração appsettings.Production.json
, não appsettings.production.json
.
Alguns valores (por exemplo, cadeias de conexão SQL) devem ser mascarados para que os provedores de configuração leiam as variáveis de ambiente. Use o seguinte comando para gerar um valor com escape adequado para uso no arquivo de configuração:
systemd-escape "<value-to-escape>"
Os separadores de cólon (:
) não são suportados em nomes de variáveis de ambiente. Use um sublinhado duplo (__
) no lugar de dois pontos. O provedor de configuração Variáveis de Ambiente converte sublinhados duplos para dois pontos quando as variáveis de ambiente são lidas para a configuração. No exemplo a seguir, a chave da cadeia de conexão ConnectionStrings:DefaultConnection
é definida no arquivo de definição de serviço como ConnectionStrings__DefaultConnection
:
Environment=ConnectionStrings__DefaultConnection={Connection String}
Salve o arquivo e habilite o serviço.
sudo systemctl enable kestrel-helloapp.service
Inicie o serviço e verifique se ele está em execução.
sudo systemctl start kestrel-helloapp.service
sudo systemctl status kestrel-helloapp.service
◝ kestrel-helloapp.service - Example .NET Web API App running on Linux
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
Com o proxy reverso configurado e Kestrel gerenciado por meio de systemd
, o aplicativo Web é totalmente configurado e pode ser acessado a partir de um navegador na máquina local em http://localhost
. Também é acessível a partir de uma máquina remota, excluindo qualquer firewall que possa estar a bloquear. Inspecionando os cabeçalhos de resposta, o cabeçalho Server
mostra o aplicativo ASP.NET Core que está sendo servido por 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
Ver registos
Como o aplicativo Web que usa o Kestrel é gerenciado usando systemd
, todos os eventos e processos são registrados em um diário centralizado. No entanto, este diário inclui todas as entradas para todos os serviços e processos gerenciados por systemd
. Para exibir os itens específicos do kestrel-helloapp.service
, use o seguinte comando:
sudo journalctl -fu kestrel-helloapp.service
Para filtragem adicional, opções de tempo como --since today
, --until 1 hour ago
ou uma combinação delas podem reduzir o número de entradas retornadas.
sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"
Proteção de dados
O de pilha do ASP.NET Core Data Protection é usado por vários middlewares ASP.NET Core , incluindo middleware de autenticação (por exemplo, middleware cookie) e proteções de falsificação de solicitação entre sites (CSRF). Mesmo que as APIs de proteção de dados não sejam chamadas pelo código do usuário, a proteção de dados deve ser configurada para criar um armazenamento de chaves criptográfico persistente. Se a proteção de dados não estiver configurada, as chaves serão mantidas na memória e descartadas quando o aplicativo for reiniciado.
Se o porta-chaves estiver armazenado na memória quando a aplicação for reiniciada:
- Todos os tokens de autenticação baseados em cookiesão invalidados.
- Os usuários são obrigados a entrar novamente em sua próxima solicitação.
- Quaisquer dados protegidos com o porta-chaves já não podem ser desencriptados. Isso pode incluir tokens CSRF e ASP.NET cookies Core MVC TempData.
Para configurar a proteção de dados para persistir e criptografar o porta-chaves, consulte:
- Principais provedores de armazenamento no ASP.NET Core
- Criptografia de chave em repouso no Windows e no Azure usando ASP.NET Core
Campos de cabeçalho de solicitação longos
As configurações padrão do servidor proxy normalmente limitam os campos de cabeçalho de solicitação a 4 K ou 8 K, dependendo da plataforma. Uma aplicação pode exigir campos maiores do que o padrão (por exemplo, aplicações que usam ID do Microsoft Entra). Se forem necessários campos mais longos, as configurações padrão do servidor proxy exigirão ajustes. Os valores a aplicar dependem do cenário. Para obter mais informações, consulte a documentação do servidor.
Advertência
Não aumente os valores padrão dos buffers de proxy, a menos que seja necessário. O aumento desses valores aumenta o risco de saturação de buffer (estouro) e ataques de negação de serviço (DoS) por usuários mal-intencionados.
Proteja o aplicativo
Ativar AppArmor
Linux Security Modules (LSM) é uma estrutura que faz parte do kernel Linux desde o Linux 2.6. O LSM suporta diferentes implementações de módulos de segurança. AppArmor é um LSM que implementa um sistema de Controle de Acesso Obrigatório, que permite confinar o programa a um conjunto limitado de recursos. Verifique se o AppArmor está habilitado e configurado corretamente.
Configurar o firewall
Feche todas as portas externas que não estão em uso. O firewall descomplicado (ufw) fornece um front-end para iptables
fornecendo uma CLI para configurar o firewall.
Advertência
Um firewall impede o acesso a todo o sistema se não estiver configurado corretamente. A falha em especificar a porta SSH correta efetivamente bloqueia você fora do sistema se você estiver usando SSH para se conectar a ele. A porta padrão é 22. Para obter mais informações, consulte a introdução ao ufw e o manual.
Instale ufw
e configure-o para permitir o tráfego em todas as portas necessárias.
sudo apt-get install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Nginx Seguro
Alterar o nome da resposta Nginx
Editar 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;
Configurar opções
Configure o servidor com módulos adicionais necessários. Considere usar um firewall de aplicativo Web, como ModSecurity, para proteger o aplicativo.
Configuração HTTPS
Configurar o aplicativo para conexões locais seguras (HTTPS)
O comando dotnet run usa o arquivo Properties/launchSettings.json
do aplicativo, que configura o aplicativo para ouvir as URLs fornecidas pela propriedade applicationUrl
. Por exemplo, https://localhost:5001;http://localhost:5000
.
Configure o aplicativo para usar um certificado em desenvolvimento para o comando dotnet run
ou ambiente de desenvolvimento (F5 ou Ctrl+F5 no Visual Studio Code) usando uma das seguintes abordagens:
- Substitua o certificado padrão do de configuração (recomendado )
- KestrelServerOptions.ConfigureHttpsDefaults
Configurar o proxy reverso para conexões de cliente seguras (HTTPS)
Advertência
A configuração de segurança nesta seção é uma configuração geral a ser usada como ponto de partida para personalização adicional. Não podemos fornecer suporte para ferramentas, servidores e sistemas operacionais de terceiros. Use a configuração nesta seção por sua conta e risco. Para obter mais informações, acesse os seguintes recursos:
- Configurando servidores HTTPS (documentação Nginx)
- Gerador de Configuração SSL do mozilla.org
Configure o servidor para escutar o tráfego HTTPS na porta 443 especificando um certificado válido emitido por uma Autoridade de Certificação (CA) confiável.
Proteja a segurança empregando algumas das práticas descritas no seguinte arquivo de /etc/nginx/nginx.conf.
O exemplo a seguir não configura o servidor para redirecionar solicitações inseguras. Recomendamos o uso do HTTPS Redirection Middleware. Para obter mais informações, consulte Impor HTTPS no ASP.NET Core.
Observação
Para ambientes de desenvolvimento em que a configuração do servidor lida com redirecionamento seguro em vez de middleware de redirecionamento HTTPS, recomendamos o uso de redirecionamentos temporários (302) em vez de permanentes (301). O cache de link pode causar um comportamento instável em ambientes de desenvolvimento.
Adicionar um cabeçalho
Strict-Transport-Security
(HSTS) garante que todas as solicitações subsequentes feitas pelo cliente sejam feitas por HTTPS. Para obter orientação sobre como definir o cabeçalhoStrict-Transport-Security
, consulte Enforce HTTPS in ASP.NET Core.Se o HTTPS for desativado no futuro, use uma das seguintes abordagens:
- Não adicione o cabeçalho HSTS.
- Escolha um valor de
max-age
curto.
Adicione o arquivo de configuração /etc/nginx/proxy.conf:
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;
Substitua o conteúdo do arquivo de configuração /etc/nginx/nginx.conf pelo seguinte arquivo. O exemplo contém as seções http
e server
em um arquivo de configuração.
http {
include /etc/nginx/proxy.conf;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server_tokens off;
sendfile on;
# Adjust keepalive_timeout to the lowest possible value that makes sense
# for your use case.
keepalive_timeout 29;
client_body_timeout 10; client_header_timeout 10; send_timeout 10;
upstream helloapp{
server 127.0.0.1:5000;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com *.example.com;
ssl_certificate /etc/ssl/certs/testCert.crt;
ssl_certificate_key /etc/ssl/certs/testCert.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
#Redirects all traffic
location / {
proxy_pass http://helloapp;
limit_req zone=one burst=10 nodelay;
}
}
}
Observação
Blazor WebAssembly aplicações exigem um valor maior para o parâmetro burst
para acomodar o número elevado de solicitações feitas por uma aplicação. Para obter mais informações, consulte Host e implantar ASP.NET Core Blazor WebAssembly.
Observação
O exemplo anterior desativa o OCSP Stapling (Online Certificate Status Protocol). Se habilitado, confirme se o certificado suporta o recurso. Para obter mais informações e orientações sobre como habilitar o OCSP, consulte as seguintes propriedades no artigo ngx_http_ssl_module Module (documentação do Nginx):
ssl_stapling
ssl_stapling_file
ssl_stapling_responder
ssl_stapling_verify
Proteja o Nginx contra o clickjacking
Clickjacking, também conhecido como UI redress attack, é um ataque malicioso em que um visitante do site é induzido a clicar em um link ou botão em uma página diferente da que está visitando atualmente. Use X-FRAME-OPTIONS
para proteger o site.
Para mitigar ataques de "clickjacking":
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Dentro do bloco de código
http{}
, adicione a linha:add_header X-Frame-Options "SAMEORIGIN";
Salve o arquivo.
Reinicie o Nginx.
Deteção do tipo MIME
Esse cabeçalho impede que a maioria dos navegadores analise o MIME de uma resposta diferente do tipo de conteúdo declarado, pois instrui o navegador a não alterar o tipo de conteúdo da resposta. Com a opção nosniff
, se o servidor disser que o conteúdo é text/html
, o navegador o renderizará como text/html
.
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Dentro do bloco de código
http{}
, adicione a linha:add_header X-Content-Type-Options "nosniff";
Salve o arquivo.
Reinicie Nginx.
Sugestões adicionais de Nginx
Depois de atualizar a estrutura compartilhada no servidor, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.
Recursos adicionais
Este guia explica a configuração de um ambiente ASP.NET Core pronto para produção em um servidor Ubuntu 16.04. Essas instruções provavelmente funcionam com versões mais recentes do Ubuntu, mas as instruções não foram testadas com versões mais recentes.
Para obter informações sobre outras distribuições Linux suportadas pelo ASP.NET Core, consulte Pré-requisitos para .NET Core no Linux.
Observação
Para o Ubuntu 14.04, supervisord
é recomendado como uma solução para monitorar o processo de Kestrel.
systemd
não está disponível no Ubuntu 14.04. Para obter instruções do Ubuntu 14.04, consulte a versão anterior deste tópico.
Este guia:
- Coloca um aplicativo ASP.NET Core existente atrás de um servidor proxy reverso.
- Configura o servidor proxy reverso para encaminhar solicitações para o servidor Web Kestrel.
- Garante que o aplicativo Web seja executado na inicialização como um daemon.
- Configura uma ferramenta de gerenciamento de processos para ajudar a reiniciar o aplicativo Web.
Pré-requisitos
- Acesso a um servidor Ubuntu 16.04 com uma conta de usuário padrão com privilégio sudo.
- A mais recente versão final do tempo de execução .NET instalada no servidor.
- Um aplicativo ASP.NET Core existente.
A qualquer momento no futuro, depois de atualizar a estrutura compartilhada, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.
Publicar e copiar através da aplicação
Configure o aplicativo para uma implantação dependente da estrutura .
Se o aplicativo for executado localmente no ambiente de desenvolvimento e não estiver configurado pelo servidor para fazer conexões HTTPS seguras, adote uma das seguintes abordagens:
Configure o aplicativo para lidar com conexões locais seguras. Para obter mais informações, consulte a seção de configuração HTTPS.
Configure a aplicação para ser executada no endpoint inseguro:
Desative o middleware de redirecionamento HTTPS no ambiente de desenvolvimento (
Program.cs
):if (!app.Environment.IsDevelopment()) { app.UseHttpsRedirection(); }
Para obter mais informações, consulte Usar vários ambientes no ASP.NET Core.
Remova
https://localhost:5001
(se presente) da propriedadeapplicationUrl
no ficheiroProperties/launchSettings.json
.
Para obter mais informações sobre a configuração por ambiente, consulte Usar vários ambientes no ASP.NET Core.
Execute dotnet publish do ambiente de desenvolvimento para empacotar um aplicativo em um diretório (por exemplo, bin/Release/{TARGET FRAMEWORK MONIKER}/publish
, onde o espaço reservado {TARGET FRAMEWORK MONIKER}
é o Target Framework Moniker/TFM) que pode ser executado no servidor:
dotnet publish --configuration Release
O aplicativo também pode ser publicado como um de implantação independente se você preferir não manter o tempo de execução do .NET Core no servidor.
Copie o aplicativo ASP.NET Core para o servidor usando uma ferramenta que se integre ao fluxo de trabalho da organização (por exemplo, SCP
, SFTP
). É comum localizar aplicativos Web no diretório var
(por exemplo, var/www/helloapp
).
Observação
Em um cenário de implantação de produção, um fluxo de trabalho de integração contínua faz o trabalho de publicar o aplicativo e copiar os ativos para o servidor.
Teste o aplicativo:
- Na linha de comando, execute o aplicativo:
dotnet <app_assembly>.dll
. - Em um navegador, navegue até
http://<serveraddress>:<port>
para verificar se o aplicativo funciona no Linux localmente.
Configurar um servidor proxy reverso
Um proxy reverso é uma configuração comum para servir aplicativos Web dinâmicos. Um proxy reverso encerra a solicitação HTTP e a encaminha para o aplicativo ASP.NET Core.
Usar um servidor proxy reverso
Kestrel é ótimo para veicular conteúdo dinâmico do ASP.NET Core. No entanto, os recursos de serviço da Web não são tão ricos em recursos quanto servidores como IIS, Apache ou Nginx. Um servidor proxy reverso pode descarregar trabalho, como servir conteúdo estático, armazenar em cache solicitações, compactar respostas e encerramento HTTPS do servidor HTTP. Um servidor proxy reverso pode residir em uma máquina dedicada ou pode ser implantado ao lado de um servidor HTTP.
Para os fins deste guia, uma única instância de Nginx é usada. Ele é executado no mesmo servidor, ao lado do servidor HTTP. Com base nos requisitos, uma configuração diferente pode ser escolhida.
Como as solicitações são encaminhadas por proxy reverso, use o Middleware de Encaminhamento de Cabeçalhos do pacote Microsoft.AspNetCore.HttpOverrides
. O middleware atualiza o Request.Scheme
, usando o cabeçalho X-Forwarded-Proto
, para que os URIs de redirecionamento e outras políticas de segurança funcionem corretamente.
O middleware de cabeçalhos encaminhados deve ser executado antes de outros middlewares. Essa ordenação garante que o middleware que depende das informações de cabeçalhos encaminhados possa consumir os valores de cabeçalho para processamento. Para executar o middleware de Cabeçalhos Encaminhados após o middleware de diagnóstico e tratamento de erros, consulte a ordem de middleware de Cabeçalhos Encaminhados .
Invoque o método UseForwardedHeaders na parte superior do Program.cs
antes de chamar outro middleware. Configure o middleware para encaminhar os cabeçalhos X-Forwarded-For
e X-Forwarded-Proto
:
// requires using Microsoft.AspNetCore.HttpOverrides;
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
Se nenhum ForwardedHeadersOptions for especificado para o middleware, os cabeçalhos padrão a serem encaminhados serão None
.
Os proxies executados em endereços de loopback (127.0.0.0/8
, [::1]
), incluindo o endereço de host local padrão (127.0.0.1
), são confiáveis por padrão. Se outros proxies ou redes confiáveis dentro da organização lidarem com solicitações entre a Internet e o servidor Web, adicione-os à lista de KnownProxies ou KnownNetworks com ForwardedHeadersOptions. O exemplo a seguir adiciona um servidor proxy confiável no endereço IP 10.0.0.100 ao Middleware de Cabeçalhos Encaminhados KnownProxies
em Program.cs
:
using System.Net;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Instalar Nginx
Use apt-get
para instalar o Nginx. O instalador cria um script systemd
init que executa o Nginx como daemon na inicialização do sistema. Siga as instruções de instalação para o Ubuntu em Nginx: Pacotes oficiais Debian / Ubuntu.
Observação
Se módulos Nginx opcionais são necessários, a construção de Nginx a partir do código-fonte pode ser necessária.
Desde que o Nginx foi instalado pela primeira vez, inicie-o explicitamente executando:
sudo service nginx start
Verifique se um navegador exibe a página de destino padrão do Nginx. A página de destino pode ser acessada em http://<server_IP_address>/index.nginx-debian.html
.
Configurar o Nginx
Para configurar o Nginx como um proxy reverso para encaminhar solicitações HTTP para seu aplicativo ASP.NET Core, modifique /etc/nginx/sites-available/default
. Abra-o em um editor de texto e substitua o conteúdo pelo seguinte trecho:
server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
Se o aplicativo for um aplicativo SignalR ou Blazor Server, consulte ASP.NET Core SignalR hospedagem e escalonamento em produção e Hospedagem e implementação de aplicativos ASP.NET Core do lado do servidor Blazor, respectivamente, para obter mais informações.
Quando não há correspondência para server_name
, o Nginx usa o servidor predefinido. Se nenhum servidor padrão for definido, o primeiro servidor no arquivo de configuração será o servidor padrão. Como prática recomendada, adicione um servidor padrão específico que retorne um código de status de 444 no arquivo de configuração. Um exemplo de configuração de servidor padrão é:
server {
listen 80 default_server;
# listen [::]:80 default_server deferred;
return 444;
}
Com o ficheiro de configuração anterior e o servidor padrão, o Nginx aceita tráfego público na porta 80 com cabeçalho do anfitrião example.com
ou *.example.com
. As solicitações que não corresponderem a esses hosts não serão encaminhadas para Kestrel. Nginx encaminha as solicitações correspondentes para Kestrel em http://127.0.0.1:5000
. Para obter mais informações, consulte Como o nginx processa uma solicitação. Para alterar o IP/porta do Kestrel, consulte Kestrel: Endpoint configuration.
Advertência
A falha em especificar uma diretiva de server_name adequada expõe seu aplicativo a vulnerabilidades de segurança. A vinculação de curinga de subdomínio (por exemplo, *.example.com
) não representa esse risco de segurança se tiver controlo sobre todo o domínio pai (diferente de *.com
, que é vulnerável). Para obter mais informações, consulte RFC 9110: Semântica HTTP (Seção 7.2: Host e :authority).
Uma vez que a configuração do Nginx é estabelecida, execute sudo nginx -t
para verificar a sintaxe dos arquivos de configuração. Se o teste do arquivo de configuração for bem-sucedido, force o Nginx a pegar as alterações executando sudo nginx -s reload
.
Para executar diretamente o aplicativo no servidor:
- Navegue até o diretório do aplicativo.
- Execute o aplicativo:
dotnet <app_assembly.dll>
, ondeapp_assembly.dll
é o nome do arquivo assembly do aplicativo.
Se o aplicativo for executado no servidor, mas não responder pela Internet, verifique o firewall do servidor e confirme se a porta 80 está aberta. Se estiver usando uma VM do Azure Ubuntu, adicione uma regra NSG (Network Security Group) que habilite o tráfego da porta 80 de entrada. Não há necessidade de habilitar uma regra de porta de saída 80, pois o tráfego de saída é concedido automaticamente quando a regra de entrada está habilitada.
Quando terminar de testar o aplicativo, desligue-o com Ctrl+C no shell de comando.
Monitorar o aplicativo
O servidor está configurado para encaminhar solicitações feitas ao http://<serveraddress>:80
para o aplicativo ASP.NET Core em execução no Kestrel em http://127.0.0.1:5000
. No entanto, o Nginx não está configurado para gerenciar o processo de Kestrel.
systemd
pode ser usado para criar um arquivo de serviço para iniciar e monitorar o aplicativo Web subjacente.
systemd
é um sistema init que fornece muitos recursos poderosos para iniciar, parar e gerenciar processos.
Criar o arquivo de serviço
Crie o arquivo de definição de serviço:
sudo nano /etc/systemd/system/kestrel-helloapp.service
O exemplo a seguir é um arquivo de serviço para o aplicativo:
[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_NOLOGO=true
[Install]
WantedBy=multi-user.target
No exemplo anterior, o usuário que gerencia o serviço é especificado pela opção User
. O usuário (www-data
) deve existir e ter a propriedade adequada dos arquivos do aplicativo.
Use TimeoutStopSec
para configurar a duração do tempo para aguardar o desligamento do aplicativo depois de receber o sinal de interrupção inicial. Se a aplicação não for encerrada neste período, será emitido um SIGKILL para terminá-la. Forneça o valor como segundos sem unidade (por exemplo, 150
), um valor de intervalo de tempo (por exemplo, 2min 30s
) ou infinity
para desativar o tempo limite.
TimeoutStopSec
assume como padrão o valor de DefaultTimeoutStopSec
no arquivo de configuração do gerenciador (systemd-system.conf
, system.conf.d
, systemd-user.conf
, user.conf.d
). O tempo limite padrão para a maioria das distribuições é de 90 segundos.
# The default value is 90 seconds for most distributions.
TimeoutStopSec=90
O Linux tem um sistema de arquivos que diferencia maiúsculas de minúsculas. Definir ASPNETCORE_ENVIRONMENT
para Production
resulta na pesquisa do arquivo de configuração appsettings.Production.json
, não appsettings.production.json
.
Alguns valores (por exemplo, cadeias de conexão SQL) devem ter caracteres de escape para que os provedores de configuração consigam ler as variáveis de ambiente. Use o seguinte comando para gerar um valor com escape adequado para uso no arquivo de configuração:
systemd-escape "<value-to-escape>"
Os separadores de cólon (:
) não são suportados em nomes de variáveis de ambiente. Use um sublinhado duplo (__
) no lugar de dois pontos. O fornecedor de configuração para as Variáveis de Ambiente converte sublinhados duplos em dois pontos quando estas variáveis são lidas na configuração. No exemplo a seguir, a chave da cadeia de conexão ConnectionStrings:DefaultConnection
é definida no arquivo de definição de serviço como ConnectionStrings__DefaultConnection
:
Environment=ConnectionStrings__DefaultConnection={Connection String}
Salve o arquivo e habilite o serviço.
sudo systemctl enable kestrel-helloapp.service
Inicie o serviço e verifique se ele está em execução.
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
Com o proxy reverso configurado e Kestrel gerenciado por meio de systemd
, o aplicativo Web é totalmente configurado e pode ser acessado a partir de um navegador na máquina local em http://localhost
. Também é acessível a partir de uma máquina remota, excluindo qualquer firewall que possa estar a bloquear. Inspecionando os cabeçalhos de resposta, o cabeçalho Server
mostra o aplicativo ASP.NET Core que está sendo servido por 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
Ver registos
Como o aplicativo Web que usa o Kestrel é gerenciado usando systemd
, todos os eventos e processos são registrados em um diário centralizado. No entanto, este diário inclui todas as entradas para todos os serviços e processos gerenciados por systemd
. Para exibir os itens específicos do kestrel-helloapp.service
, use o seguinte comando:
sudo journalctl -fu kestrel-helloapp.service
Para filtragem adicional, opções de tempo como --since today
, --until 1 hour ago
ou uma combinação delas podem reduzir o número de entradas retornadas.
sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"
Proteção de dados
O de pilha do ASP.NET Core Data Protection é usado por vários middlewares ASP.NET Core , incluindo middleware de autenticação (por exemplo, middleware cookie) e proteções de falsificação de solicitação entre sites (CSRF). Mesmo que as APIs de proteção de dados não sejam chamadas pelo código do usuário, a proteção de dados deve ser configurada para criar um armazenamento de chaves criptográfico persistente. Se a proteção de dados não estiver configurada, as chaves serão mantidas na memória e descartadas quando o aplicativo for reiniciado.
Se o porta-chaves estiver armazenado na memória quando a aplicação for reiniciada:
- Todos os tokens de autenticação baseados em cookiesão invalidados.
- Os usuários são obrigados a entrar novamente em sua próxima solicitação.
- Quaisquer dados protegidos com o porta-chaves já não podem ser desencriptados. Isso pode incluir tokens CSRF e cookies TempData do ASP.NET Core MVC .
Para configurar a proteção de dados para persistir e criptografar o porta-chaves, consulte:
- Principais provedores de armazenamento no ASP.NET Core
- Criptografia de chave em repouso no Windows e no Azure usando ASP.NET Core
Campos de cabeçalho de solicitação longos
As configurações padrão do servidor proxy normalmente limitam os campos de cabeçalho de solicitação a 4 K ou 8 K, dependendo da plataforma. Um aplicativo pode exigir campos maiores do que o padrão (por exemplo, aplicativos que usam Azure Ative Directory). Se forem necessários campos mais longos, as configurações padrão do servidor proxy exigirão ajustes. Os valores a aplicar dependem do cenário. Para obter mais informações, consulte a documentação do servidor.
Advertência
Não aumente os valores padrão dos buffers de proxy, a menos que seja necessário. O aumento desses valores aumenta o risco de saturação de buffer (estouro) e ataques de negação de serviço (DoS) por usuários mal-intencionados.
Proteja o aplicativo
Ativar AppArmor
Linux Security Modules (LSM) é uma estrutura que faz parte do kernel Linux desde o Linux 2.6. O LSM suporta diferentes implementações de módulos de segurança. AppArmor é um LSM que implementa um sistema de Controle de Acesso Obrigatório, que permite confinar o programa a um conjunto limitado de recursos. Verifique se o AppArmor está habilitado e configurado corretamente.
Configurar o firewall
Feche todas as portas externas que não estão em uso. O firewall descomplicado (ufw) fornece um front-end para iptables
fornecendo uma CLI para configurar o firewall.
Advertência
Um firewall impedirá o acesso a todo o sistema se não estiver configurado corretamente. A falha em especificar a porta SSH correta irá efetivamente bloqueá-lo fora do sistema se você estiver usando SSH para se conectar a ele. A porta padrão é 22. Para obter mais informações, consulte a introdução ao ufw e o manual.
Instale ufw
e configure-o para permitir o tráfego em todas as portas necessárias.
sudo apt-get install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Nginx Seguro
Alterar o nome da resposta Nginx
Editar 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;
Configurar opções
Configure o servidor com módulos adicionais necessários. Considere usar um firewall de aplicativo Web, como ModSecurity, para proteger o aplicativo.
Configuração HTTPS
Configurar o aplicativo para conexões locais seguras (HTTPS)
O comando dotnet run usa o arquivo Properties/launchSettings.json
do aplicativo, que configura o aplicativo para ouvir as URLs fornecidas pela propriedade applicationUrl
. Por exemplo, https://localhost:5001;http://localhost:5000
.
Configure o aplicativo para usar um certificado em desenvolvimento para o comando dotnet run
ou ambiente de desenvolvimento (F5 ou Ctrl+F5 no Visual Studio Code) usando uma das seguintes abordagens:
- Substitua o certificado padrão da configuração (recomendado)
- KestrelServerOptions.ConfigureHttpsDefaults
Configurar o proxy reverso para conexões de cliente seguras (HTTPS)
Advertência
A configuração de segurança nesta seção é uma configuração geral a ser usada como ponto de partida para personalização adicional. Não podemos fornecer suporte para ferramentas, servidores e sistemas operacionais de terceiros. Use a configuração nesta seção por sua conta e risco. Para obter mais informações, acesse os seguintes recursos:
- Configurando servidores HTTPS (documentação Nginx)
- Gerador de Configuração SSL mozilla.org
Configure o servidor para escutar o tráfego HTTPS na porta 443 especificando um certificado válido emitido por uma Autoridade de Certificação (CA) confiável.
Proteja a segurança empregando algumas das práticas descritas no seguinte arquivo de /etc/nginx/nginx.conf.
O exemplo a seguir não configura o servidor para redirecionar solicitações inseguras. Recomendamos o uso do HTTPS Redirection Middleware. Para obter mais informações, consulte Impor HTTPS no ASP.NET Core.
Observação
Para ambientes de desenvolvimento em que a configuração do servidor lida com redirecionamento seguro em vez de middleware de redirecionamento HTTPS, recomendamos o uso de redirecionamentos temporários (302) em vez de permanentes (301). O cache de link pode causar um comportamento instável em ambientes de desenvolvimento.
Adicionar um cabeçalho
Strict-Transport-Security
(HSTS) garante que todas as solicitações subsequentes feitas pelo cliente sejam feitas por HTTPS. Para obter orientação sobre como definir o cabeçalhoStrict-Transport-Security
, consulte Enforce HTTPS in ASP.NET Core.Se o HTTPS for desativado no futuro, use uma das seguintes abordagens:
- Não adicione o cabeçalho HSTS.
- Escolha um valor de
max-age
curto.
Adicione o ficheiro de configuração para /etc/nginx/proxy.conf:
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;
Substitua o conteúdo do arquivo de configuração de /etc/nginx/nginx.conf do pelo seguinte arquivo. O exemplo contém as seções http
e server
em um arquivo de configuração.
http {
include /etc/nginx/proxy.conf;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server_tokens off;
sendfile on;
# Adjust keepalive_timeout to the lowest possible value that makes sense
# for your use case.
keepalive_timeout 29;
client_body_timeout 10; client_header_timeout 10; send_timeout 10;
upstream helloapp{
server 127.0.0.1:5000;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com *.example.com;
ssl_certificate /etc/ssl/certs/testCert.crt;
ssl_certificate_key /etc/ssl/certs/testCert.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
#Redirects all traffic
location / {
proxy_pass http://helloapp;
limit_req zone=one burst=10 nodelay;
}
}
}
Observação
Blazor WebAssembly aplicações exigem um valor de parâmetro maior para burst
para acomodar o maior número de solicitações feitas por uma aplicação. Para obter mais informações, consulte Host e implantar ASP.NET Core Blazor WebAssembly.
Observação
O exemplo anterior desabilita o grampeamento do OCSP (Online Certificate Status Protocol). Se habilitado, confirme se o certificado suporta o recurso. Para obter mais informações e orientações sobre como habilitar o OCSP, consulte as seguintes propriedades no artigo ngx_http_ssl_module Module (documentação do Nginx):
ssl_stapling
ssl_stapling_file
ssl_stapling_responder
ssl_stapling_verify
Proteja o Nginx do clickjacking
Clickjacking, também conhecido como UI redress attack, é um ataque malicioso em que um visitante do site é induzido a clicar em um link ou botão em uma página diferente da que está visitando atualmente. Use X-FRAME-OPTIONS
para proteger o site.
Para mitigar ataques de clickjacking:
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Adicione a linha:
add_header X-Frame-Options "SAMEORIGIN";
Salve o arquivo.
Reinicie o Nginx.
Detecção do tipo MIME
Este cabeçalho impede que a maioria dos navegadores identifiquem uma resposta com um tipo de conteúdo diferente do declarado, uma vez que instrui o navegador a não alterar o tipo de conteúdo da resposta. Com a opção nosniff
, se o servidor disser que o conteúdo é text/html
, o navegador o renderizará como text/html
.
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Adicione a linha:
add_header X-Content-Type-Options "nosniff";
Salve o arquivo.
Reinicie o Nginx.
Sugestões adicionais de Nginx
Depois de atualizar a estrutura compartilhada no servidor, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.
Recursos adicionais
Este guia explica a configuração de um ambiente ASP.NET Core pronto para produção em um servidor Ubuntu 16.04. Essas instruções provavelmente funcionam com versões mais recentes do Ubuntu, mas as instruções não foram testadas com versões mais recentes.
Para obter informações sobre outras distribuições Linux suportadas pelo ASP.NET Core, consulte Pré-requisitos para .NET Core no Linux.
Observação
Para o Ubuntu 14.04, supervisord
é recomendado como uma solução para monitorar o processo de Kestrel.
systemd
não está disponível no Ubuntu 14.04. Para obter instruções do Ubuntu 14.04, consulte a versão anterior deste tópico.
Este guia:
- Coloca um aplicativo ASP.NET Core existente atrás de um servidor proxy reverso.
- Configura o servidor proxy reverso para encaminhar solicitações para o servidor Web Kestrel.
- Garante que o aplicativo Web seja executado na inicialização como um daemon.
- Configura uma ferramenta de gerenciamento de processos para ajudar a reiniciar o aplicativo Web.
Pré-requisitos
- Acesso a um servidor Ubuntu 16.04 com uma conta de usuário padrão com privilégio sudo.
- O runtime .NET não pré-lançamento mais recente instalado no servidor.
- Um aplicativo ASP.NET Core existente.
A qualquer momento no futuro, depois de atualizar a estrutura compartilhada, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.
Publicar e copiar através da aplicação
Configure a aplicação para uma implementação dependente do framework .
Se o aplicativo for executado localmente no ambiente de desenvolvimento e não estiver configurado pelo servidor para fazer conexões HTTPS seguras, adote uma das seguintes abordagens:
Configure o aplicativo para lidar com conexões locais seguras. Para obter mais informações, consulte a seção de configuração HTTPS.
Configure a aplicação para executar no ponto de extremidade inseguro:
Desative o middleware de redirecionamento HTTPS no ambiente de desenvolvimento (
Program.cs
):if (!app.Environment.IsDevelopment()) { app.UseHttpsRedirection(); }
Para obter mais informações, consulte Usar vários ambientes no ASP.NET Core.
Remova
https://localhost:5001
(caso esteja presente) da propriedadeapplicationUrl
no ficheiroProperties/launchSettings.json
.
Para obter mais informações sobre a configuração por ambiente, consulte Usar vários ambientes no ASP.NET Core.
Execute dotnet publish a partir do ambiente de desenvolvimento para empacotar um aplicativo em um diretório (por exemplo, bin/Release/{TARGET FRAMEWORK MONIKER}/publish
, onde {TARGET FRAMEWORK MONIKER}
é o Target Framework Moniker/TFM) que pode ser executado no servidor:
dotnet publish --configuration Release
A aplicação também pode ser publicada como um de implantação independente se preferir não manter o tempo de execução do .NET Core no servidor.
Copie o aplicativo ASP.NET Core para o servidor usando uma ferramenta que se integre ao fluxo de trabalho da organização (por exemplo, SCP
, SFTP
). É comum localizar aplicativos Web no diretório var
(por exemplo, var/www/helloapp
).
Observação
Em um cenário de implantação de produção, um fluxo de trabalho de integração contínua faz o trabalho de publicar o aplicativo e copiar os ativos para o servidor.
Teste o aplicativo:
- Na linha de comando, execute o aplicativo:
dotnet <app_assembly>.dll
. - Em um navegador, navegue até
http://<serveraddress>:<port>
para verificar se o aplicativo funciona no Linux localmente.
Configurar um servidor proxy reverso
Um proxy reverso é uma configuração comum para servir aplicativos Web dinâmicos. Um proxy reverso encerra a solicitação HTTP e a encaminha para o aplicativo ASP.NET Core.
Usar um servidor proxy reverso
Kestrel é ótimo para veicular conteúdo dinâmico do ASP.NET Core. No entanto, os recursos de serviço da Web não são tão ricos em recursos quanto servidores como IIS, Apache ou Nginx. Um servidor proxy reverso pode descarregar trabalho, como servir conteúdo estático, armazenar em cache as solicitações, compactar solicitações e terminar conexões HTTPS do servidor HTTP. Um servidor proxy reverso pode residir em uma máquina dedicada ou pode ser implantado ao lado de um servidor HTTP.
Para os fins deste guia, uma única instância de Nginx é usada. Ele é executado no mesmo servidor, ao lado do servidor HTTP. Com base nos requisitos, uma configuração diferente pode ser escolhida.
Como as solicitações são encaminhadas por proxy reverso, utilize o Middleware de Cabeçalhos Encaminhados do pacote Microsoft.AspNetCore.HttpOverrides
. O middleware atualiza o Request.Scheme
, usando o cabeçalho X-Forwarded-Proto
, para que os URIs de redirecionamento e outras políticas de segurança funcionem corretamente.
O Middleware de Cabeçalhos Encaminhados deve ser executado antes de outros middleware. Essa ordenação garante que o middleware que depende das informações de cabeçalhos encaminhados possa consumir os valores de cabeçalho para processamento. Para executar o middleware de cabeçalhos encaminhados após o middleware de diagnóstico e tratamento de erros, consulte a ordem do middleware de cabeçalhos encaminhados em .
Invoque o método UseForwardedHeaders na parte superior do Startup.Configure
antes de chamar outro middleware. Configure o middleware para encaminhar os cabeçalhos X-Forwarded-For
e X-Forwarded-Proto
:
using Microsoft.AspNetCore.HttpOverrides;
...
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
app.UseAuthentication();
Se nenhum ForwardedHeadersOptions for especificado para o middleware, os cabeçalhos padrão a serem encaminhados serão None
.
Os proxies executados em endereços de loopback (127.0.0.0/8
, [::1]
), incluindo o endereço de host local padrão (127.0.0.1
), são confiáveis por padrão. Se outros proxies ou redes confiáveis dentro da organização lidarem com solicitações entre a Internet e o servidor Web, adicione-os à lista de KnownProxies ou KnownNetworks com ForwardedHeadersOptions. O exemplo a seguir adiciona um servidor proxy confiável no endereço IP 10.0.0.100 ao Middleware de Encaminhamento de Cabeçalhos KnownProxies
em Startup.ConfigureServices
:
using System.Net;
...
services.Configure<ForwardedHeadersOptions>(options =>
{
options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
});
Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Instalar Nginx
Use apt-get
para instalar o Nginx. O instalador cria um script systemd
init que executa o Nginx como daemon na inicialização do sistema. Siga as instruções de instalação para o Ubuntu em Nginx: Pacotes oficiais Debian / Ubuntu.
Observação
Se módulos Nginx opcionais são necessários, a construção de Nginx a partir do código-fonte pode ser necessária.
Desde que o Nginx foi instalado pela primeira vez, inicie-o explicitamente executando:
sudo service nginx start
Verifique se um navegador exibe a página de destino padrão do Nginx. A página de destino pode ser acessada em http://<server_IP_address>/index.nginx-debian.html
.
Configurar o Nginx
Para configurar o Nginx como um proxy reverso para encaminhar solicitações HTTP para seu aplicativo ASP.NET Core, modifique /etc/nginx/sites-available/default
. Abra-o em um editor de texto e substitua o conteúdo pelo seguinte trecho:
server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://127.0.0.1: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;
}
}
Se o aplicativo for um aplicativo SignalR ou Blazor Server, consulte ASP.NET Core SignalR production hosting and scaling e Host e deploy ASP.NET Core server-side Blazor apps respectivamente para obter mais informações.
Quando nenhuma server_name
corresponde, o Nginx utiliza o servidor padrão. Se nenhum servidor padrão for definido, o primeiro servidor no arquivo de configuração será o servidor padrão. Como prática recomendada, adicione um servidor padrão específico que retorne um código de status de 444 no arquivo de configuração. Um exemplo de configuração de servidor padrão é:
server {
listen 80 default_server;
# listen [::]:80 default_server deferred;
return 444;
}
Com o ficheiro de configuração anterior e o servidor padrão, o Nginx aceita tráfego público na porta 80 com o cabeçalho do host example.com
ou *.example.com
. As solicitações que não corresponderem a esses hosts não serão encaminhadas para Kestrel. Nginx encaminha as solicitações correspondentes para Kestrel em http://127.0.0.1:5000
. Para obter mais informações, consulte Como o nginx processa uma solicitação. Para alterar o IP/porta do Kestrel, consulte Kestrel: Endpoint configuration.
Advertência
A falha em especificar uma diretiva de server_name adequada expõe seu aplicativo a vulnerabilidades de segurança. A vinculação de curinga de subdomínio (por exemplo, *.example.com
) não representa esse risco de segurança se você controlar todo o domínio pai (ao contrário de *.com
, que é vulnerável). Para obter mais informações, consulte RFC 9110: Semântica HTTP (Seção 7.2: Host e :authority).
Uma vez que a configuração do Nginx é estabelecida, execute sudo nginx -t
para verificar a sintaxe dos arquivos de configuração. Se o teste do arquivo de configuração for bem-sucedido, force o Nginx a pegar as alterações executando sudo nginx -s reload
.
Para executar diretamente o aplicativo no servidor:
- Navegue até o diretório do aplicativo.
- Execute o aplicativo:
dotnet <app_assembly.dll>
, ondeapp_assembly.dll
é o nome do arquivo assembly do aplicativo.
Se o aplicativo for executado no servidor, mas não responder pela Internet, verifique o firewall do servidor e confirme se a porta 80 está aberta. Se estiver usando uma VM do Azure Ubuntu, adicione uma regra NSG (Network Security Group) que habilite o tráfego da porta 80 de entrada. Não há necessidade de habilitar uma regra de porta de saída 80, pois o tráfego de saída é concedido automaticamente quando a regra de entrada está habilitada.
Quando terminar de testar o aplicativo, desligue-o com Ctrl+C no shell de comando.
Monitorar o aplicativo
O servidor está configurado para encaminhar solicitações feitas ao http://<serveraddress>:80
para o aplicativo ASP.NET Core em execução no Kestrel em http://127.0.0.1:5000
. No entanto, o Nginx não está configurado para gerenciar o processo de Kestrel.
systemd
pode ser usado para criar um arquivo de serviço para iniciar e monitorar o aplicativo Web subjacente.
systemd
é um sistema init que fornece muitos recursos poderosos para iniciar, parar e gerenciar processos.
Criar o arquivo de serviço
Crie o arquivo de definição de serviço:
sudo nano /etc/systemd/system/kestrel-helloapp.service
O exemplo a seguir é um arquivo de serviço para o aplicativo:
[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
No exemplo anterior, o usuário que gerencia o serviço é especificado pela opção User
. O usuário (www-data
) deve existir e ter a propriedade adequada dos arquivos do aplicativo.
Use TimeoutStopSec
para configurar a duração do tempo para aguardar o desligamento do aplicativo depois de receber o sinal de interrupção inicial. Se a aplicação não for encerrada nesse período, o SIGKILL será emitido para terminar a aplicação. Forneça o valor como segundos sem unidade (por exemplo, 150
), um valor de intervalo de tempo (por exemplo, 2min 30s
) ou infinity
para desativar o tempo limite.
TimeoutStopSec
assume como padrão o valor de DefaultTimeoutStopSec
no arquivo de configuração do gerenciador (systemd-system.conf
, system.conf.d
, systemd-user.conf
, user.conf.d
). O tempo limite padrão para a maioria das distribuições é de 90 segundos.
# The default value is 90 seconds for most distributions.
TimeoutStopSec=90
O Linux tem um sistema de arquivos que diferencia maiúsculas de minúsculas. Definir ASPNETCORE_ENVIRONMENT
para Production
resulta na pesquisa do arquivo de configuração appsettings.Production.json
, não appsettings.production.json
.
Alguns valores (por exemplo, cadeias de conexão SQL) devem ter utilizados caracteres de escape de forma que os provedores de configuração possam ler as variáveis de ambiente. Use o seguinte comando para gerar um valor com escape adequado para uso no arquivo de configuração:
systemd-escape "<value-to-escape>"
Os separadores de cólon (:
) não são suportados em nomes de variáveis de ambiente. Use um sublinhado duplo (__
) no lugar de dois pontos. O fornecedor de configuração Variáveis de Ambiente converte dois sublinhados consecutivos em dois pontos quando as variáveis de ambiente são lidas para configuração. No exemplo a seguir, a chave da cadeia de conexão ConnectionStrings:DefaultConnection
é definida no arquivo de definição de serviço como ConnectionStrings__DefaultConnection
:
Environment=ConnectionStrings__DefaultConnection={Connection String}
Salve o arquivo e habilite o serviço.
sudo systemctl enable kestrel-helloapp.service
Inicie o serviço e verifique se ele está em execução.
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
Com o proxy reverso configurado e Kestrel gerenciado por meio de systemd
, o aplicativo Web é totalmente configurado e pode ser acessado a partir de um navegador na máquina local em http://localhost
. Também é acessível a partir de uma máquina remota, excluindo qualquer firewall que possa estar a bloquear. Inspecionando os cabeçalhos de resposta, o cabeçalho Server
mostra o aplicativo ASP.NET Core que está sendo servido por 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
Ver registros
Como o aplicativo Web que usa o Kestrel é gerenciado usando systemd
, todos os eventos e processos são registrados em um diário centralizado. No entanto, este diário inclui todas as entradas para todos os serviços e processos gerenciados por systemd
. Para exibir os itens específicos do kestrel-helloapp.service
, use o seguinte comando:
sudo journalctl -fu kestrel-helloapp.service
Para filtragem adicional, opções de tempo como --since today
, --until 1 hour ago
ou uma combinação delas podem reduzir o número de entradas retornadas.
sudo journalctl -fu kestrel-helloapp.service --since "2016-10-18" --until "2016-10-18 04:00"
Proteção de dados
A pilha de Proteção de Dados do ASP.NET Core é usada por vários middlewares ASP.NET Core , incluindo o middleware de autenticação (por exemplo, o middleware cookie) e proteções contra falsificação de solicitações entre sites (CSRF). Mesmo que as APIs de proteção de dados não sejam chamadas pelo código do usuário, a proteção de dados deve ser configurada para criar um armazenamento de chaves criptográfico persistente. Se a proteção de dados não estiver configurada, as chaves serão mantidas na memória e descartadas quando o aplicativo for reiniciado.
Se o porta-chaves estiver armazenado na memória quando a aplicação for reiniciada:
- Todos os tokens de autenticação baseados em cookiesão invalidados.
- Os usuários são obrigados a entrar novamente em sua próxima solicitação.
- Quaisquer dados protegidos com o porta-chaves já não podem ser desencriptados. Isso pode incluir tokens CSRF e cookies TempData do ASP.NET Core MVC .
Para configurar a proteção de dados para persistir e criptografar o porta-chaves, consulte:
- Principais provedores de armazenamento no ASP.NET Core
- Criptografia de chave em repouso no Windows e no Azure usando ASP.NET Core
Campos de cabeçalho de solicitação longos
As configurações padrão do servidor proxy normalmente limitam os campos de cabeçalho de solicitação a 4 K ou 8 K, dependendo da plataforma. Um aplicativo pode exigir campos maiores do que o padrão (por exemplo, aplicativos que usam Azure Ative Directory). Se forem necessários campos mais longos, as configurações padrão do servidor proxy exigirão ajustes. Os valores a aplicar dependem do cenário. Para obter mais informações, consulte a documentação do servidor.
Advertência
Não aumente os valores padrão dos buffers de proxy, a menos que seja necessário. O aumento desses valores aumenta o risco de saturação de buffer (estouro) e ataques de negação de serviço (DoS) por usuários mal-intencionados.
Proteja o aplicativo
Ativar AppArmor
Linux Security Modules (LSM) é uma estrutura que faz parte do kernel Linux desde o Linux 2.6. O LSM suporta diferentes implementações de módulos de segurança. AppArmor é um LSM que implementa um sistema de Controle de Acesso Obrigatório, que permite confinar o programa a um conjunto limitado de recursos. Verifique se o AppArmor está habilitado e configurado corretamente.
Configurar o firewall
Feche todas as portas externas que não estão em uso. O firewall descomplicado (ufw) fornece um front-end para iptables
fornecendo uma CLI para configurar o firewall.
Advertência
Um firewall impedirá o acesso a todo o sistema se não estiver configurado corretamente. A falha em especificar a porta SSH correta irá efetivamente bloqueá-lo fora do sistema se você estiver usando SSH para se conectar a ele. A porta padrão é 22. Para obter mais informações, consulte a introdução ao ufw e o manual .
Instale ufw
e configure-o para permitir o tráfego em todas as portas necessárias.
sudo apt-get install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Nginx Seguro
Alterar o nome da resposta Nginx
Editar 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;
Configurar opções
Configure o servidor com módulos adicionais necessários. Considere usar um firewall de aplicativo Web, como ModSecurity, para proteger o aplicativo.
Configuração HTTPS
Configurar o aplicativo para conexões locais seguras (HTTPS)
O comando dotnet run usa o arquivo Properties/launchSettings.json
do aplicativo, que configura o aplicativo para ouvir as URLs fornecidas pela propriedade applicationUrl
. Por exemplo, https://localhost:5001;http://localhost:5000
.
Configure o aplicativo para usar um certificado em desenvolvimento para o comando dotnet run
ou ambiente de desenvolvimento (F5 ou Ctrl+F5 no Visual Studio Code) usando uma das seguintes abordagens:
- Substitua o certificado padrão de configuração (recomendado)
- KestrelServerOptions.ConfigureHttpsDefaults
Configurar o proxy reverso para conexões de cliente seguras (HTTPS)
Advertência
A configuração de segurança nesta seção é uma configuração geral a ser usada como ponto de partida para personalização adicional. Não podemos fornecer suporte para ferramentas, servidores e sistemas operacionais de terceiros. Use a configuração nesta seção por sua conta e risco. Para obter mais informações, acesse os seguintes recursos:
- Configurando servidores HTTPS (documentação Nginx)
- Gerador de Configuração SSL do mozilla.org
Configure o servidor para escutar o tráfego HTTPS na porta 443 especificando um certificado válido emitido por uma Autoridade de Certificação (CA) confiável.
Proteja a segurança empregando algumas das práticas descritas no seguinte arquivo de /etc/nginx/nginx.conf.
O exemplo a seguir não configura o servidor para redirecionar solicitações inseguras. Recomendamos o uso do HTTPS Redirection Middleware. Para obter mais informações, consulte Impor HTTPS no ASP.NET Core.
Observação
Para ambientes de desenvolvimento em que a configuração do servidor lida com redirecionamento seguro em vez de middleware de redirecionamento HTTPS, recomendamos o uso de redirecionamentos temporários (302) em vez de permanentes (301). O cache de link pode causar um comportamento instável em ambientes de desenvolvimento.
Adicionar um cabeçalho
Strict-Transport-Security
(HSTS) garante que todas as solicitações subsequentes feitas pelo cliente sejam feitas por HTTPS. Para obter orientação sobre como definir o cabeçalhoStrict-Transport-Security
, consulte Enforce HTTPS in ASP.NET Core.Se o HTTPS for desativado no futuro, use uma das seguintes abordagens:
- Não adicione o cabeçalho HSTS.
- Escolha um valor de
max-age
curto.
Adicione o arquivo de configuração /etc/nginx/proxy.conf:
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;
Substitua o conteúdo do arquivo de configuração de /etc/nginx/nginx.conf do pelo seguinte arquivo. O exemplo contém as seções http
e server
em um arquivo de configuração.
http {
include /etc/nginx/proxy.conf;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server_tokens off;
sendfile on;
# Adjust keepalive_timeout to the lowest possible value that makes sense
# for your use case.
keepalive_timeout 29;
client_body_timeout 10; client_header_timeout 10; send_timeout 10;
upstream helloapp{
server 127.0.0.1:5000;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com *.example.com;
ssl_certificate /etc/ssl/certs/testCert.crt;
ssl_certificate_key /etc/ssl/certs/testCert.key;
ssl_session_timeout 1d;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
#Redirects all traffic
location / {
proxy_pass http://helloapp;
limit_req zone=one burst=10 nodelay;
}
}
}
Observação
Blazor WebAssembly aplicações requerem um valor de parâmetro burst
maior para acomodar o maior número de solicitações feitas por uma aplicação. Para obter mais informações, consulte Host e implantar ASP.NET Core Blazor WebAssembly.
Observação
O exemplo anterior desativa o OCSP Stapling (Online Certificate Status Protocol). Se habilitado, confirme se o certificado suporta o recurso. Para obter mais informações e orientações sobre como ativar o OCSP, consulte as seguintes propriedades no artigo Module ngx_http_ssl_module (documentação do Nginx):
ssl_stapling
ssl_stapling_file
ssl_stapling_responder
ssl_stapling_verify
Proteja o Nginx do clickjacking
Clickjacking, também conhecido como UI redress attack, é um ataque malicioso em que um visitante do site é induzido a clicar em um link ou botão em uma página diferente da que está visitando atualmente. Use X-FRAME-OPTIONS
para proteger o site.
Para mitigar ataques de clickjacking:
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Adicione a linha:
add_header X-Frame-Options "SAMEORIGIN";
Salve o arquivo.
Reinicie o Nginx.
Deteção do tipo MIME
Este cabeçalho impede que a maioria dos navegadores analise uma resposta que não esteja de acordo com o tipo de conteúdo declarado, pois o cabeçalho instrui o navegador a não anular o tipo de conteúdo de resposta. Com a opção nosniff
, se o servidor disser que o conteúdo é text/html
, o navegador o renderizará como text/html
.
Edite o arquivo nginx.conf:
sudo nano /etc/nginx/nginx.conf
Adicione a linha:
add_header X-Content-Type-Options "nosniff";
Salve o arquivo.
Reiniciar o Nginx.
Sugestões adicionais de Nginx
Depois de atualizar a estrutura compartilhada no servidor, reinicie os aplicativos ASP.NET Core hospedados pelo servidor.