Melhor maneira de contêineres de um aplicativo PHP / MySQL existente em locatários de clientes

1

Eu tenho um Apache / MySQL normal que atende a um aplicativo da Web para o qual as empresas e os usuários dessas empresas fazem login. Então todos de todas as empresas estão na mesma tabela de Usuários.

Embora meu código tente manter as empresas isoladas em PHP, como SELECT * FROM Users WHERE Company=$COMPANY , vejo as chances de uma injeção SQL obter dados privados de outros clientes como sendo bastante prováveis, já que a base de código é bastante vasta. Estamos revisando o código, mas a essa taxa estaremos concluídos em anos.

Enquanto isso, eu estava procurando no Docker para dar a cada um dos meus clientes seu próprio contêiner com o servidor Apache (com um buffer minúsculo e 2 funcionários php) e o MySQL com 32 ou 64 MB de buffer pool. Este contêiner permitiria apenas 1 conexão TCP para HTTPS, que seria baseada em proxies reversos no hostname (por exemplo, customer-a.mycompany.com). Nenhum arquivo é gravado no disco. E o código-fonte do PHP seria mantido atualizado usando o git, então talvez pudéssemos colocar clientes selecionados em nossa versão Beta, por exemplo.

Fui avisado que o Docker não foi projetado para o cenário acima e não me forneceria a segurança que eu procuro.

Eu entendo que um hacker poderia injetar código em um contêiner e afetaria esse cliente. Mas o Docker não impediria a descoberta dos hosts virtuais usados por outros clientes, reduzindo as chances que um hacker poderia afetar na maioria dos meus clientes. Apenas um que poderíamos lidar financeiramente, mas não 12.

Além da segurança, fiquei animado com a possibilidade de o buffer pool do MySQL ser dedicado a cada empresa tornando o webapp geralmente mais rápido, porque quando o Customer A faz um insane SQL report, eu suponho que o buffer pool seja sobrescrito com o relatório insano, portanto, quando o Cliente B fizer uma consulta simples em seguida, os dados devem ser recuperados do disco novamente.

No futuro, eu adoraria ver esses "contêineres" em uma GUI e ser capaz de arrastá-los e soltá-los em outro servidor (mais rápido, com menos contêineres) ... por exemplo, para oferecer velocidades "mais rápidas" certos clientes de energia.

Algum dos sonhos acima se encaixa na realidade de 2017?

Qual plataforma / ferramenta você acha que devo considerar?

    
por servermanfail 24.02.2017 / 20:15

1 resposta

0

Geralmente, bons provedores de hospedagem na Web usam o Cloud Linux para fornecer isolamento e limites de recursos à hospedagem de vários locatários. No entanto, na sua escala (12) eu sugiro que você vá a rota docker. Ter um único contêiner (ou dois) por cliente para servir o site parece bom para mim. Não tem certeza de qual preocupação de segurança você está se referindo, mas está em ótima forma se você:

  • crie uma rede de ponte de encaixe separada por cliente
  • cada contêiner deve ter um UID exclusivo e não ser executado como raiz
  • seu balanceador de carga deve estar fazendo a camada 7 e lendo o cabeçalho do host para saber para qual porta do contêiner enviar tráfego. Se o TLS estiver envolvido, você deve terminar no LB.
  • seu servidor precisará de muito mais recursos do que se eles compartilhassem apenas uma única pilha LAMP. Por exemplo, cada container mysql consumirá pelo menos 100MB de ram

Se seus clientes compartilham um banco de dados (por qualquer motivo), eles obviamente devem ter concessões estritas para garantir que o usuário não possa consultar bancos de dados aos quais não deveria ter acesso. Bancos de dados que SOMENTE UMA consultas do cliente devem ser separadas em outro contêiner para máxima segurança. Manter SOMENTE o banco de dados SHARED no contêiner compartilhado.

    
por 25.02.2017 / 05:47