Isolando os virtualhosts do Apache do resto do sistema

11

Estou configurando um servidor web que hospedará vários sites diferentes como o Apache VirtualHosts, e cada um deles terá a possibilidade de executar scripts (principalmente PHP, possivelmente outros).

Minha pergunta é como isolar cada um desses VirtualHosts um do outro e do resto do sistema? Não quero que, por exemplo, o site X leia a configuração do site Y ou de qualquer um dos arquivos "privados" do servidor.

No momento, configurei o VirtualHosts com FastCGI, PHP e SUExec, conforme descrito aqui ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), mas o SUExec apenas impede que os usuários editem / executem arquivos diferentes dos seus - eles ainda podem ler informações confidenciais, como arquivos de configuração.

Pensei em remover a permissão de leitura global do UNIX para todos os arquivos no servidor, pois isso resolveria o problema acima, mas não tenho certeza se posso fazer isso com segurança sem interromper a função do servidor.

Também procurei usar o chroot, mas parece que isso só pode ser feito por servidor e não por host virtual.

Estou procurando sugestões que isolem meus VirtualHosts do resto do sistema.

PS Estou executando o servidor Ubuntu 12.04

RESPOSTA: Eu terminei quase seguindo a minha configuração atual, mas executando uma prisão chroot para todos os hosts virtuais, por exemplo, tendo a prisão chroot /var/wwwe depois tendo todos os dados dos usuários em subpastas, cada uma com permissões de grupo / outros r / w / x Desativado. Essa opção era desejável, especialmente porque tudo é possível sem nenhuma modificação no código-fonte.

Selecionei a resposta do @Chris, porque foi completamente escrita e também considerada FTP e SELinux

JesperB
fonte

Respostas:

4

Isso pode ser feito ativando o módulo mod_users no Apache.

Você precisará configurar o UserDir na sua configuração do apache. Eu sugiro que você faça isso em um arquivo de configuração separado e inclua-o. Enrole a inclusão em

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>

Posso fornecer todo o tutorial, mas isso deve ajudá-lo a configurar o Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Dica Se você estiver executando o SELinux (e deveria), teria que dar ao Apache acesso de leitura às casas de usuários. Você pode fazer isso definindo:

sudo setsebool -P httpd_enable_homedirs=On

Ele também precisa de permissões de arquivo para o diretório dirs public_html do usuário e de permissões rx nos diretórios pai até a raiz.

Obviamente, você precisa configurar o chroot para os usuários, por exemplo, no vsftpd. Instalar:

apt-get vsftpd

Para configurar o chrooting, abra o /etc/vsftpd/vsftpd.conf com vi ou nano. Localize e remova o comentário ou adicione: chroot_local_user = yes

Você pode obter o mesmo comportamento para o sftp recomendado por FTP, abra o arquivo / etc / ssh / sshd_config e adicione um bloco Match e esta linha:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match

Isso chroot qualquer usuário no grupo web_users . Além disso, você precisaria negar o acesso ao shell configurando-o para / sbin / nologin:

useradd -G "web_users" -s /sbin/nologin new_user

Se este for um servidor de produção público, sugiro também que você aplique um pouco de proteção no sistema operacional, OpenSSH, Apache, PHP, vsftpd e aplique algumas tabelas de ip estritas e wrappers TCP. Eu recomendo que você deixe o SELinux também.

Chris
fonte
3
Não vejo como mod_userdiroferece hospedagem virtual de domínios separados. Além disso, tenho preocupações com a segurança em termos de isolamento, pois não consigo encontrar nada sobre isso entre os diretórios do usuário no Apache. Parece apenas não oferecer esse recurso.
gertvdijk
6

Sugiro dar uma olhada suphpou PHP-FPM .

Basicamente, permitirá que o interpretador PHP 'su' para algum usuário específico configurado para esse VirtualHost. Isso permitirá que você utilize permissões gerais do sistema de arquivos para isolar cada VirtualHost.

Eu recomendaria o FPM por considerações de desempenho. Na página inicial, é isso que mais lhe interessa:

Também interessam as opções de usuário e grupo por pool, que permitem executar esse pool fpm específico sob o uid e gid fornecidos; adeus suphp!

gertvdijk
fonte
4

Olhe para dentro chroot.

Alguns pontos de partida:

Apache chrooting simplificado

Ambiente Chroot para Apache (Debian)

Cadeia Apache Chroot: Hospedagem Virtual

terça-feira
fonte
1
Eu olhei para esses links, mas não parece que eu possa executar um chroot por host virtual. Talvez eu deva definir um diretório www global para fazer o chroot /var/wwwe ter todos os hosts em um subdiretório, cada um desses subdiretórios removendo a permissão global de execução / leitura?
JesperB
Meu ponto principal era chroot, e você pode fazê-lo por servidor virtual. Aqui está um exemplo. Nesse caso, eles estão usando mod_chroot.
tacotuesday