Se você está acompanhando desde o primeiro capítulo o nosso projeto de implantação de um servidor ubuntu para hospedagem wordpress, já viu que temos o nosso ambiente pronto.
Nesse capítulo vamos implementar algumas mudanças no nginx com foco em segurança, no entanto, isso não quer dizer que você está livre de toda e qualquer ameaça de ataques, mas as configurações aqui apresentadas podem minimizar os impactos.
SSL
Proteção no SSL
Nosso site wordpress nesse momento já possui o certificado SSL instalado, isso foi feito no segundo capítulo. No entanto, alguns usuários podem ainda tentar se conectar no nosso site pelo protocolo HTTP, quando nós adicionamos a diretiva Strict-Transport-Security aos cabeçalhos de resposta do servidor, garantirá que todas as futuras conexões sejam feitas sempre com o protocolo HTTPS.
Para realizar o procedimento, edite o nginx.conf com o comando abaixo:
sudo nano /etc/nginx/nginx.conf
E adicione o conteúdo abaixo dentro do bloco http assim como a imagem abaixo
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
Salve o arquivo e de um reload nas configurações do Nginx com o comando:
service nginx reload
Agora acesse o site do Qualys SSL Test e realize um teste de qualidade do nosso SSL.
Performance do SSL
Normalmente uma conexão HTTPS consome e demanda bastante recurso do servidor em comparação a uma conexão simples HTTP. Isso ocorre por conta do procedimento de handshake adicional necessário ao estabelecer uma conexão.
Mas podemos adicionar em cache os parâmetros da sessão SSL, o que evitará um handshake para cada conexão HTTPS do usuário. Logo, podemos melhorar levemente um pouco mais a performance do servidor.
Abra o arquivo de configuração do nginx novamente
sudo nano /etc/nginx/nginx.conf
Na diretiva abaixo de SSL Settings, adicione o conteúdo abaixo:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
Agora faça um reload do Nginx para que as configurações entrem em vigor:
sudo service nginx reload
Tipos de Ataques e Segurança com Nginx
Cross-Site Scripting (XSS)
Uma das formas que você desenvolvedor pode lidar com o XSS é garantir a validação e limpeza correta de todas as entradas do usuário no seu código, principalmente as áreas de administração do WordPress. Mas sabemos que tudo vira um caos quando existem vários plugins e templates de terceiros, é complicado você manter isso seguro.
Uma das formas que temos para poder diminuir os riscos de ataques XSS é configurando o Nginx para fornecer cabeçalhos de resposta adicionais. Mas como assim?
Imagine que um atacante conseguiu incorporar um arquivo JS malicioso no código-fonte do seu blog/site, seja por meio de um form de comentários ou algo do gênero. Por padrão, o navegador acaba permitindo que esse arquivo externo seja executado no momento do acesso, e poderá infectar o visitante ou até mesmo minerar criptomoedas torrando a CPU do seu usuário.
Quando inserimos uma política de segurança de conteúdo, o que permite definirmos uma lista de permissões de fontes totalmente aprovadas por nós para carregar ativos (JS,CSS,HTML,etc), a coisa muda de cenário. Se o script não estiver na lista de aprovados, ele não poderá ser carregado no browser do seu usuário. Legal, não?
Criar uma política de segurança é bem complicado para falar a verdade, hora ou outra acabamos bloqueando algum recurso de um template ou plugin e desconfigurando nosso site, então fica em um cenário de tentativa e erro.
Clickjacking
Clickjacking é um tipo de ataque que engana o seu usuário para que ele realize uma ação sem que ele perceba (induz o usuário a clicar), e é realizado através de iframes em uma página.
Não sou especialista em segurança, mas você pode ler um artigo que explica como funciona detalhadamente esse tipo de ataque do Clickjacking.
No Nginx podemos mitigar um pouco esse tipo de ataque, desabilitando completamente a incorporação de iframes de terceiros adicionando o cabeçalho X-Xss-Protection no nginx.conf.
Fortalecendo a segurança do WordPress com Nginx
Abra o seu nginx.conf e adicione os cabeçalhos para que os tipos de ataques acima sejam mitigados. Também inclui alguns outros cabeçalhos, que vão nos ajudar a evitar uma série de outros ataques web.
add_header Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "origin-when-cross-origin" always;
add_header Permissions-Policy interest-cohort=();
A medida que atualizarmos esse capítulo com novos tipos de ataques iremos atualizar também as configurações do Nginx.
Conclusão
Antes de configurarmos as diretivas de segurança no Nginx com foco no nosso site WordPress, o resultado de um teste e análise dos cabeçalhos resultava a seguinte nota de segurança:
Após configurarmos os cabeçalhos, os resultados obtidos são maravilhosos:
Desse modo constatamos que configuramos os cabeçalhos e que ao menos alguns ataques vão ser bem difíceis de serem feitos no nosso servidor wordpress. Se você quer analisar o seu site, acesse o site: https://securityheaders.com/