É possível no nginx configurar usuário diferente por host virtual?
Algo como
server {
user myprojectuser myprojectgroup;
...
}
É possível no nginx configurar usuário diferente por host virtual?
Algo como
server {
user myprojectuser myprojectgroup;
...
}
Respostas:
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.
www-data
e permissões 0710
quando 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+x
para diretórios e o+r
arquivos.
www-data
, todo usuário que pode servir um script PHP ou um processo cgi-bin poderá acessar qualquer arquivo acessível ao www-data
usuário. Parece não ser óbvio para quem armazena senhas de banco de dados config.php.inc
ou similares em uma máquina compartilhada.
peter
e 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.
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.conf
ou crie um novo .conf
arquivo 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.
Em resposta ao comentário de Ivan acima e que parece aplicável ao OP. Duas coisas:
A raiz do documento do aplicativo seria algo como /blah/peterWeb/html
e /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.
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.
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.