Usuário por host virtual no Nginx

31

É possível no nginx configurar usuário diferente por host virtual?

Algo como

 server {
     user myprojectuser myprojectgroup;
     ...
 }
Alex Netkachov
fonte

Respostas:

7

Não, porque todas as sub-rotinas de servidor em uma configuração nginx são atendidas do mesmo conjunto de processos de trabalho. Além disso, do ponto de vista da segurança, é melhor executá-lo dessa maneira, pois significa que o conteúdo é automaticamente não gravável pelo servidor da web (ausência de estupidez como a chmod -R 0777), para que, se houver uma vulnerabilidade no nginx, nenhum conteúdo está em risco.

mulher
fonte
2
Portanto, não há como ocultar os arquivos do usuário de outros usuários? Todo o conteúdo do usuário deve ser legível pelo www-data?
Alex Netkachov
11
Tornar os arquivos acessíveis a www-data (ou qualquer usuário que o servidor da Web execute) não exige que os arquivos sejam acessíveis a outros usuários no sistema.
Womble
2
Dê ao root do documento um grupo www-datae permissões 0710quando você configurar o vhost (já que ele precisa do root para configurar o nginx, não é um problema ter sua automação também configurando as permissões necessárias). Então o conteúdo do docroot só precisa ser o+xpara diretórios e o+rarquivos.
Womble
13
Cuidado: se um script PHP (ou um processo cgi-bin) for executado sob www-data, todo usuário que pode servir um script PHP ou um processo cgi-bin poderá acessar qualquer arquivo acessível ao www-datausuário. Parece não ser óbvio para quem armazena senhas de banco de dados config.php.incou similares em uma máquina compartilhada.
Ivan Vučica
2
@Ricalsin Lembre-se de que o UNIX é um sistema operacional multiusuário e os servidores podem ter mais de um usuário. Por exemplo, petere john. Eles estão hospedando suas páginas na web ~/public_html. Na ausência de uma abordagem diferente, não mencionada por nenhuma das pessoas que discutiu isso acima, um script .php tem as mesmas permissões que o servidor da web que ele também está executando www-data. Isso significa que, assim como o servidor da web e o interpretador PHP, ele pode ler qualquer outro script .php.
Ivan Vučica
9

Sim. É possível e recomendado para segurança extra (veja o porquê abaixo).

Considerando que você está usando PHP-FPM (você provavelmente é, como é o mais comum), você pode criar um spool, de propriedade de um usuário diferente, para cada domínio.

PS: Eu escrevi um tutorial detalhado passo a passo aqui:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1. Crie spools:

Adicione os spools /etc/php/7.0/fpm/pool.d/www.confou crie um novo .confarquivo para cada novo spool.

Carretel # 1 (myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

Carretel # 2 (myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

PS: Mantenha seu listen.owner / listen.group no mesmo usuário do nginx (geralmente www-data ).

2. Atribua cada spool ao seu bloco de servidor (host virtual para usuários do apache):

Anfitrião 1:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser1.sock;
  }
  ...
}

Anfitrião 2:

server {
  ...
  location ~ \.php$ {
    fastcgi_pass unix:/run/php/myuser2.sock;
  }
  ...
}

Reinicie os serviços FPM e NGINX

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

Teste:

Crie um arquivo pinfo.php (ou qualquer outro nome) que mostre o usuário do processo atual:

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

Ou crie o arquivo pinfo.php via bash:

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

Em seguida, abra " http: //.../pinfo.php " no seu navegador.


Por que usar vários usuários (razões de segurança):

Se você executar todos os seus sites com o mesmo usuário ( www-data ), uma chamada PHP para system () / passthru () / exec () terá acesso a todos os sites! O NGINX não o protegerá contra isso. O PHP é apenas um exemplo, mas qualquer linguagem popular de servidor da web tem chamadas semelhantes. Como hacker, você pode " ls .. " para navegar por todos os sites e " cp / echo / mv " para escrever seu próprio código em qualquer arquivo (incluindo outros arquivos de site). Mesmo que todos os sites no servidor sejam de propriedade da mesma pessoa (ex. Você), é aconselhável executar cada site com um usuário diferente, pois isso impedirá que hackers / vírus eventuais (ex. Vírus do Wordpress) acessem seus outros sites.

Daniel Loureiro
fonte
5

Em resposta ao comentário de Ivan acima e que parece aplicável ao OP. Duas coisas:

  1. A raiz do documento do aplicativo seria algo como /blah/peterWeb/htmle /blah/johnWeb/html. O NGINX e o Apache2 não permitiriam que um examinasse ou operasse no outro diretório, mesmo se ambos estivessem executando o www-data como grupo.

  2. Colocar cada árvore de diretório sob sua própria permissão de usuário permitiria que cada usuário ssh / logon em um sistema UNIX e mantivesse seus diretórios privados para cada um - apenas não coloque cada usuário no grupo www-data. Se você concorda, então sua sentença:

    todo usuário que pode servir um script PHP ou um processo cgi-bin pode acessar qualquer arquivo acessível ao usuário www-data.

    pode ser escrito com mais precisão como:

    todo usuário que você coloca no mesmo grupo que o servidor apache / nginx (www-data) pode fazer o que quiser (incluindo a execução de um script php) em qualquer arquivo acessível a ele (que seria essencialmente tudo em uma web servidor).

EDIT 1: Tendo que resolver alguns problemas de administração do servidor, examinei mais detalhadamente este tópico. Eu não sabia o quão precisas eram as informações de Ivan! Se você pretende dar aos usuários a capacidade de fazer upload e executar scripts em uma configuração de hospedagem compartilhada, preste atenção. Aqui está uma abordagem . Gorjeta de chapéu para Ivan por ter certeza de que entendi essa vulnerabilidade.

Ricalsin
fonte
4
Não. Você está perdendo. Os scripts PHP, quando executados no processo do Apache (ou em outros servidores da web), serão executados sob os privilégios do processo de hospedagem. Em um grande número de configurações ingênuas, esse usuário é www-data. Se Johnny puder criar um script e executá-lo www-data(que em configurações ingênuas ele pode), o script de Johnny poderá ler os scripts de Peter e enviá-los de volta para Johnny. Isso não tem nada a ver com grupos. A solução adequada é ter o suPHP (se for configurado de maneira ingênua, ruim, pois um código mal escrito compromete todos os arquivos deste usuário), ou uma prisão ou um usuário da web adicional por usuário.
Ivan Vučica
(Além disso, a adição de uma resposta em vez de comentário é abuso de sites de StackOverflow do tipo, impressum você está realmente proporcionando uma resposta Por favor, evite isso..)
Ivan Vučica
@ IvanVučica Atualizou e adicionou um link útil que apóia seus conselhos. Obrigado.
Ricalsin