Назад | Перейти на главную страницу

Лучший способ поместить существующее приложение PHP / MySQL в контейнер для клиентов.

У меня есть обычный Apache / MySQL, обслуживающий веб-приложение, в которое входят компании и пользователи этих компаний. Таким образом, все из всех компаний находятся в одной таблице Users.

Хотя мой код пытается изолировать компании в PHP, например SELECT * FROM Users WHERE Company=$COMPANY , Я считаю, что вероятность внедрения SQL-кода для получения личных данных от других клиентов весьма высока, поскольку кодовая база весьма обширна. Мы проверяем код, но с такой скоростью мы закончим через годы.

Тем временем я искал Docker, чтобы, надеюсь, дать каждому из моих клиентов свой собственный контейнер с сервером Apache (с крошечным буфером и двумя рабочими php) и MySQL с жалкими 32 или 64 МБ буферного пула. Затем этот контейнер будет разрешать только 1 TCP-соединение для HTTPS, которое будет подвергаться обратному проксированию на основе имени хоста (например, customer-a.mycompany.com). На диск не записываются никакие файлы. А исходный код PHP будет обновляться с помощью git, так что, возможно, мы могли бы даже предоставить избранным клиентам, например, нашу бета-версию.

Мне сообщили, что Docker не предназначен для описанного выше сценария и не обеспечит мне необходимую безопасность.

Я понимаю, что хакер может ввести код в один контейнер и повлиять на этого одного клиента. Но разве Docker не предотвратил бы обнаружение виртуальных хостов, используемых для других клиентов, немного уменьшив вероятность того, что хакер может повлиять на большинство моих клиентов. Только с одним, с которым мы могли бы справиться, но не с 12.

Помимо безопасности, я был взволнован возможностью выделения пула буферов MySQL для каждой компании, которая собиралась сделать веб-приложение в целом быстрее, потому что, когда клиент A делает безумный отчет SQL, я предполагаю, что пул буферов перезаписывается безумным отчетом , поэтому, когда клиент B выполняет следующий простой запрос, данные должны быть снова получены с диска.

В будущем мне бы хотелось видеть эти «контейнеры» в графическом интерфейсе пользователя и иметь возможность перетаскивать их на другой сервер (быстрее, с меньшим количеством контейнеров) .. например, чтобы предлагать «более высокие» скорости некоторым опытным клиентам .

Входит ли в реальность какая-либо из вышеперечисленных мечтаний на 2017 год?

Какую платформу / инструмент, по вашему мнению, мне следует рассмотреть?

Как правило, хорошие провайдеры веб-хостинга используют Облако Linux для обеспечения изоляции и ограничения ресурсов для мультитенантного хостинга. Однако в вашем масштабе (12) я бы посоветовал вам пойти по докеру. Мне кажется, что наличие одного контейнера (или двух) для каждого клиента для обслуживания своего сайта - это хорошо. Не уверен, о какой проблеме безопасности вы имеете в виду, но вы в отличной форме, если:

  • создать отдельную сеть моста докеров для каждого клиента
  • каждый контейнер должен иметь уникальный UID и запускаться не от имени root
  • ваш балансировщик нагрузки должен выполнять уровень 7 и читать заголовок хоста, чтобы знать, на какой порт контейнера отправлять трафик. Если задействован TLS, вы должны завершить работу на LB.
  • вашему серверу потребуется гораздо больше ресурсов, чем если бы они использовали только один стек LAMP. Например, каждый контейнер mysql будет потреблять не менее 100 МБ оперативной памяти.

Если ваши клиенты совместно используют базу данных (по какой-либо причине), они, очевидно, должны иметь строгие разрешения, чтобы убедиться, что их пользователь не может запрашивать базы данных, к которым у них не должно быть доступа. Базы данных, которые ТОЛЬКО ОДИН запросы клиентов должны быть разделены в другой контейнер для максимальной безопасности. Держать ТОЛЬКО ОБЩИЕ база данных в общем контейнере.