Segurança com nginx

2

Introdução

Ok, eu tenho a questão complicada (pelo menos para mim) da minha rede de produção em breve. Estou à procura de conselhos de usuários mais experientes com o Linux, especialmente conselhos sobre formas seguras para configurar a rede que eu sou sobre o descrever. Eu ainda sou um novato com tudo isso e ainda sou responsável por configurar essa nova rede.

Atualmente, estou executando mais de 150 sites em uma configuração com um balanceador de carga, três servidores da web e um servidor de dados no apache. Tudo bem por enquanto, no entanto, estou tentando configurar uma nova rede com o nginx no novo debian por causa do enorme aumento no desempenho.

Li muitas e muitas informações sobre o nginx e o apache, executei dezenas de testes para comparar o desempenho em ambas as situações e cheguei à conclusão de que o nginx sob alta pressão (executamos quase apenas sites WordPress) lida muito mais rápido depois apache principalmente por causa dos arquivos estáticos (às vezes mais de 100 em uma página, que o navegador pode descontar, obviamente, mas ainda assim).

Configuração atual

  • Debian 9
  • nginx 1.10.3
  • php-fpm (7.0)
  • ldap 3

Eu tenho todos os dados de sites montados em um diretório / sites em cada servidor da web. Os arquivos de configuração para nginx e fpm também estão localizados em um diretório de configuração. Cada site (eu vou usar example.com) tem seu próprio usuário (autenticado através do ldap) e está nos sites do grupo (também no ldap). Portanto, cada usuário tem seu diretório inicial na pasta / sites com permissões 700 owner example.com e sites do grupo. Isso é feito para que cada site funcione em sua própria "ilha" isolada.

Isso significa que para cada configuração de site eu tenho uma configuração php fpm que usa um soquete diferente para cada usuário. Ou seja, ele só pode executar arquivos php em seu próprio diretório de sites, certo? Para o PHP isso funciona bem e eu prefiro não alterar essa configuração.

Problema

Aí vem o problema, o nginx é mais rápido porque ele serve arquivos estáticos diretamente em comparação com o apache que (como nós o configuramos anteriormente) com o módulo mpm-itk cria processos separados para cada usuário que serve arquivos estáticos ou PHP.

O Nginx faz isso de forma diferente, usando php fpm com soquetes diferentes para cada usuário que eu obtenho (pelo menos com php) da mesma forma que o módulo mpm-itk faz para o apache. No entanto nginx não pode fazer isso e tenta servir todos os arquivos estáticos como o usuário nginx é executado como (www-data como padrão). Então, a saída é gerada pelo PHP (funciona bem), mas o nginx não tem permissões para mostrar os arquivos estáticos.

Estou tentando encontrar uma solução para mais de um dia e chegou a algumas conclusões diferentes.

Executar como root

Meu colega disse que rodar o nginx como root vai resolver o problema, com certeza será, mas isso não parece seguro para mim. Pode também remover toda a política de "cada site tem seu próprio usuário" se eu fizer isso.

Adicione www-data ao grupo de websites

Se eu pudesse adicionar um usuário unix (www-data neste caso) a um grupo ldap (que aparentemente não posso) eu poderia dar ao grupo (sites) permissões de leitura (em vez dos atuais 700) para que ele possa leia arquivos estáticos em todos os lugares. O único problema é que os sites podem ler arquivos uns dos outros, o que estou tentando evitar. Então, isso não parece ser uma solução adequada.

SELinux

Eu li algumas documentações e introduções sobre o SELinux e para mim isso parece ser uma maneira complicada de corrigir esse problema. Eu nunca trabalhei com isso e executar isso em uma rede de produção como esta não parece ser uma boa idéia, já que não tenho idéia do que estou fazendo com isso.

Conclusão

Então, de onde estou agora, qual caminho um usuário mais experiente poderia seguir? Faça mais pesquisas no SELinux? AppArmor? Ou existe outra maneira mais simples de obter os mesmos apaches de segurança oferecidos pelo mpm_itk.

Este é o último problema que tenho e não estou procurando todos os arquivos de configuração para configurá-lo e os comandos exatos que preciso executar.

Espero que alguém com mais experiência possa me dar algum conselho ou me apontar na direção certa. É muito apreciado de qualquer maneira!

    
por berend 06.07.2017 / 11:39

1 resposta

2

SELinux vale a pena o investimento de tempo IMHO, Na verdade não é tão complexo quanto parece quando você quer apenas fixar os direitos das pastas.

Mas deixe-me jogar uma bola curva ... Se for principalmente Wordpress, eu iria com Litespeed Webserver com o plugin Wordpress Cache. Você começa rapidamente Wordpress através do cache no nível do servidor web:

link

E o Litespeed possui um recurso chroot fácil de implementar e que cuida das suas preocupações de segurança:

link

“chroot” is a feature on Unix like system which can change the root directory of a process. A changed root process and its children process cannot access any file beyond the new root directory. It is like putting a process in a jail with physical file access boundries and the reason why this mechanism is often referred to as “chroot jail”.

Claro, o chrooting também é possível com o Nginx:

link

A GUI de Admin do Litespeed apenas torna isso muito simples, possivelmente correspondendo ao seu nível de experiência melhor do que fazer tudo do CLI.

Chroot de lado, você também tem a opção SuEXEC:

link

SuEXEC is a feature that allow LiteSpeed Web Server run CGI/FastCGI/LSAPI/PHP/Ruby or any external web applications under a UID (user id) other then the UID of the web server process.

Isso aumenta ainda mais a resolução das principais preocupações de executar o Nginx como root.

Atualmente, uso tanto o Nginx quanto o Litespeed para sites de produção do Wordpress. Para situações de tráfego intenso, como você descreve, eu recomendaria o Litespeed com o plugin dedicado em qualquer dia. Além disso, você obtém todos os outros benefícios da rápida entrega de arquivos que separa o Nginx e o Litespeed do Apache.

    
por 12.07.2017 / 17:42