Como posso seguramente permitir que um site baseado em php crie um usuário linux e interaja com o ambiente?

5

Minha empresa tem um serviço de hospedagem na web para o qual as pessoas se inscrevem. Depois que o processo de inscrição estiver concluído, entraremos manualmente e criaremos um ambiente de teste / desenvolvimento para esse cliente usar. Geralmente o processo é assim:

  1. crie um usuário do Linux, mude para esse usuário
  2. executa scripts para instalar conjuntos de arquivos e diretórios modelados em seu diretório inicial
  3. crie um arquivo Apache .conf
  4. reinicie o apache
  5. Envie um e-mail para informar que o servidor está configurado e pronto para o acesso
  6. Finalmente, o cliente pode acessar o site como somerandomstring.devserver.com

Embora usemos scripts para fazer isso, o volume determina que ter manualmente que fazer login e executá-los agora é inconveniente. Portanto, queremos automatizar esse processo para ser acionado imediatamente após a conclusão do processo de inscrição do cliente.

Eu pensei em algumas maneiras de lidar com isso.

1) Conceda ao usuário o recurso adduser e use a função PHP exec() para criar o dito usuário. Eu teria que dar essa capacidade para www-data , certo? Com o PHP em execução no modo de segurança, os comandos para exec () são restritos a um diretório especificado. Então, se eu fosse copiar / usr / sbin / adduser para / my / custom / dir onde apenas esse comando estivesse disponível, quais seriam as preocupações de segurança remanescentes? Ainda estou perdendo como eu atualizaria a pasta de sites disponíveis com o novo site, já que eles são de propriedade do root.

2) Vamos cron fazer: Uma pessoa tem que se inscrever para o serviço, então, por padrão, eles têm um nome de usuário e outros dados do cliente armazenados no mysql. De uma conta que tenha recursos adduser , execute o cron um script de rotina que verifica novas contas (talvez a cada 30 a 60 segundos). Se encontrado, crie uma conta do linux para eles, preencha os diretórios home, escreva o arquivo virtualhost do apache conf, e recarregue o apache.

A opção 2 parece ser a maneira mais segura de uma conta de administrador isolada lidar com isso sem o www-data ou o site ter que executar scripts e programas do sistema. O problema é o lote. De preferência, gostaria de encontrar uma solução de opção 1 para que um cliente seja imediatamente inscrito e eles sejam redirecionados para a instância do servidor instalado e pronto para uso. Eu também não gosto que eu estou tendo que recarregar / reiniciar o apache tanto.

As empresas fazem isso todos os dias, especialmente empresas de hospedagem na web. Bluehost, por exemplo, depois de concluir o processo de inscrição, você terá acesso imediato a / home / user / public_html com o qual poderá interagir. Como existem soluções comerciais, tenho certeza que muita coisa foi pensada sobre como realizá-lo com segurança e segurança. O que estou tentando realizar é idêntico, apenas em uma escala muito menor.

    
por user658182 20.01.2017 / 18:57

2 respostas

2

  

WARNING

     

Esse é um risco de segurança inerente e tem um lote de potencial para ir para o sul a qualquer momento. Eu recomendaria muito contra essa configuração, mas tudo bem.

     

Não me responsabilizo por nada que aconteça como resultado de você ter seguido algo fornecido neste post, nem aconselho você a seguir este sistema. Isso é principalmente para fins educacionais / de pesquisa.

O Linux tem algo conhecido como setuid que permite que qualquer programa (como sudo ) seja executado com privilégios maior que o atual usuário em execução. Você pode escrever um script de shell para fazer tudo o que precisa.

A partir daí, porque os scripts de shell não podem ser setuid , você precisa converter isso em um binário. Você pode usar algo como shc para isso.

Uma vez que você tenha seu pseudo-binário do shell (nome do exemplo: bootstrap_user ) contendo tudo o que você precisa, você pode fazer algumas alterações divertidas para prepará-lo. Ou seja, isso:

  1. Defina a propriedade root e o grupo www-data .

    chown root:www-data ./bootstrap_user
    
  2. Atribua permisses RWX para proprietrio (raiz), leia e execute para grupo, nenhum para ningum:

    chmod 750 ./bootstrap_user
    
  3. Mova o binário para algum lugar em que o PHP possa exec() it.

  4. Por fim, adicione o setuid bit a ele, para que ele seja executado como root:

    chmod u+s ./bootstrap_user
    

Em PHP, você pode agora chamar bootstrap_user como seu executável, passando quaisquer parâmetros requeridos. Certifique-se de ter cuidado para escapar e higienizar a entrada.

    
por Kaz Wolfe 20.01.2017 / 19:27
1

Acho que seria cauteloso com qualquer coisa que desse ao usuário do navegador a capacidade de gerar automaticamente um usuário Unix. Se você fez isso, provavelmente deve incorporar tanto um mecanismo de enfileiramento quanto um log ou banco de dados para que o seguinte não ocorra:

  1. O usuário pressiona o botão para que isso aconteça
  2. Seu processo começa
  3. O usuário pressiona F5 ou clica no botão de recarga
  4. O usuário depois pressiona o botão Backspace para fazer o backup de uma página em seu histórico
  5. O usuário cria um favorito nesta página e o revisita muitas vezes

Então, o que acontece quando o usuário está reiniciando algo que já foi feito ou ainda está ocorrendo?

    
por Justin Case 20.01.2017 / 23:32