Повышаем безопасность стека web-приложений (виртуализация LAMP)

в 7:52, , рубрики: CentOS, kvm, lamp, nginx, xen, Веб-разработка, Серверная оптимизация, Серверное администрирование

Под стеком web-приложений мы будем подразумевать множество программных продуктов с открытым исходным кодом: операционная система, web -сервер, сервер БД и среду исполняемого кода. Наиболее известным и обыденным стеком является LAMP. Это акроним для стека web-приложений на базе бесплатных решений с открытым исходным кодом. Название составлено из первых букв входящего в его состав продуктов: Linux (операционная система), web -сервер Apache, база данных MySQL, и PHP (иногда Perl или Python). Опубликованные нами ранее материалы, посвященные вопросам безопасности, рекомендуют держать различные сетевые службы на выделенных под эти цели серверах или виртуальных машинах. Это позволит изолировать скомпрометированные и взломанные злоумышленником элементы системы, в случае если последний получит возможность эксплуатации ошибок в одном из звеньев сети обслуживания. Статья также является ответом на наиболее часто задаваемые нашими читателями вопросы, присланными нам по электронной почте. В руководстве я объясню, как построить решение на базе физических или виртуальных серверов, одинаково подходящих для раздачи статического и динамического контента, для приложений, требующих наличие БД и кэширования.

От переводчика:Автор оригинального цикла статей на редкость немногословен и трудночитаем. Мы постараемся сохранить его лаконичность там, где это возможно и добавим разъяснений, где автор сам плохо понимает, что он хочет сказать. Перевод допускает ряд отступлений от принятых в профессиональной среде терминов и устойчивых выражений. Переводчик просит проявить снисхождение к подобным случаям в форме личных сообщений, если обнаруженное затрудняет понимание текста и обнажает невежественность писавшего.

LAMP: Типовая и дробная установки

Скорее всего, ваше решение, построенное на базе одного выделенного или виртуального сервера, выглядит следующим образом:

                   Большой сервер / Виртуальная машина
               +-----------------------------------------+
               | Apache + PHP / Perl @ 75.126.153.206:80 |
               | Mysql@127.0.0.1: 3306 (или UNIX сокета) |
               | Pgsql@127.0.0.1: 5432 (или UNIX сокета) |
               | Netfilter для фильтрации трафика        |
               +-----------------------------------------+
                 *** Выделенный LAMP сервер ***
                 ОС: RHEL/CentOS/Debian/Ubuntu/*BSD/Unix
                 Оперативная память: 4-8GiB ECC
                 Процессор: Один или два Intel / AMD
                 Хранилище: RAID-1/5 сервер-класса SATA/SAS

Что случится в случае если, скажем, будет скомпрометирован web-сервер Apache? Злоумышленник получит доступ к вашей базе данных, кэш-памяти и, так же, к другим элементам системы или сети. В таком случае вам необходимо разделить службы сервера следующим образом:

//////////////////////////
/ Интернет/маршрутизатор /
//////////////////////////
           
            
             ----------| vm00
             75.126.153.206:80 - eth0
             192.168.1.1       - eth1
         +-----------------------------+
         | Реверс-прокси               |
         | Межсетевой экран (Firewall) |      eth0:192.168.1.10/vm01
         +-----------------------------+     +----------------------+
         |                                   | Lighttpd             |
         +-----------------------------------+ статический контент  |
         |                                   | /var/www/static      |
         |                                   +----------------------+
         |
         |                                    eth0:192.168.1.11/vm02
         +-----------------------------------+-----------------------+
         |                                   | Apache+php+perl+python|
         |                                   | /var/www/html         |
         |                                   +-----------------------+
         |
         |                                    eth0:192.168.1.12/vm03
         +-----------------------------------+-----------------------+
         |                                   |Кэш SQL БД             |
         |                                   |Redis/Memcached и т.д. |
         |                                   +-----------------------+
         |
         |                                   eth0:192.168.1.13/vm04
         |                       (или выделенный сервер БД на шасси RAID-10)
         +-----------------------------------+------------------------+
         |                                   | Mysql/pgsql сервер БД  |
         |                                   | @192.168.1.13:3306/5432|
         |                                   +------------------------+
         |
         |                                   eth0:192.168.1.14/vm05
         |    (или сервер-хранилище с доступом по NFSv4 на шасси RAID-10)
         +-----------------------------------+------------------------+
                                             | NFSv4 на Linux         |
                                             | /export/{static,html   |
                                             +------------------------+

Дробная установка имеет целый ряд преимуществ:

  • Безопасность
  • Масштабируемость
  • Оптимизация
  • Простота использования
  • Простота мониторинга

Добавьте к этому продвинутые возможности из области High-availability, такие как failover (перенос образов/контейнеров дробных частей системы на другие ресурсы из-за начальной настройки хост-системы vm00 на подобное сетевое взаимодействие [Virtual-IP на уровне vm00]), балансировка нагрузки, CDN, становящиеся много удобнее в случае подобной настройки системы.

Роли для каждой виртуальной машины / сервера:

Ниже приводится детальная информация о назначении машин. WordPress-блог, сайт на базе Drupal или же приложение «на заказ», размещенные на подобных серверах, могут легко обслуживать миллионы хитов в месяц.

Повышаем безопасность стека web приложений (виртуализация LAMP)VM / Сервер(Конфигурация) Описание Повышаем безопасность стека web приложений (виртуализация LAMP) Программное обеспечение (звено стека)
vm00 / 2 ядра
2Gb RAM
Это единственное звено, доступное извне. Этот узел/VM должен иметь два сетевых интерфейса. Один интерфейс, называемый публичным,  используется для подключения к вашему сайту. Другой – частный (VLAN), используется для сетевого трафика только между узлами. Nginx / HAProxy как реверс-прокси сервер и
Netfilter в качестве брандмауэра.
vm01 / 1 ядро 1 Gb RAM Узел для обслуживания статических файлов изображений/JS/CSS. Файлы хранятся на NFS-сервере vm05, монтированном в /var/www/static/ Lighttpd / tux / Nginx и
Linux NFS-клиент
vm02 / 2-4 ядра 4 Gb RAM Узел для обслуживания динамических страниц. Например, если мы установим WordPress или другое PHP5/Python/Perl приложение. Файлы приложения будем хранить на NFS-сервере vm05, смонтировав его в /var/www/html/. Логи сервера будем хранить в /var/log/apache. Apache 2 с FastCGI + php5 + Perl + Python и т.д., и
Linux NFS клиента.
vm03 / 1 ядро 1-2 Gb RAM Узел используется для ускорения работы БД web-сайтов за счет кэширования данных и объектов в оперативной памяти. Memcached, Redis и т.д.
vm04 / 2-4 ядра 2-4 Gb RAM + RAID гибридное хранилище Узел хранит данные в MySQL или PostgreSQL СУБД Postgresql или Mysql сервера.
vm05 / 4 ядра 4-6GiB RAM + RAID гибридное хранилище Узел сервер NFS (Network File System) — распределенной файловой системы. Держите на этом сервере img,JS,CSS  в /var/www/static/ и PHP,Perl,Python файлы – в /var/www/html/. Нужно привязать /var/www/static/ и /var/www/html/ директории с помощью файла конфигурации /etc/exports. Клиентские машины vm01 и vm02 запрашивают доступ экспорта этих данным, как правило, обращаясь к команде монтирования. Apache и Lighttpd демоны клиентской машины умеют работать с этой файловой системой. Кроме того, необходимо создать SSH/SFTP пользователей на этом сервере, что бы они могли самостоятельно загружать файлы в хранилище. Linux сервер NFSv4
ISP роутер или магистральный порт в ДЦ. vm00 узел подключается к Интернет. Зависит от предоставляемых аплинком условий. Можете начать и с 100Мбит/с и с 1000Мбит/с для eth0. Порт eth1 используются для трафика только между узлами VM и определяется она установками VLAN. Определяется конкретной задачей, поэтому никаких рекомендаций по аплинку.

Как это работает?

Давайте посмотрим, как работает наша система с реверс-прокси сервером. В этом примере я размещу прокси и HTTP сервера до брандмауэра. (см. рис. 1). Веб-сайт www.example.com будет размещаться по статическому IPv4-адреу 202.54.1.1, который закрепляется за устройством eth0. Внутренний IP 192.168.1.1 назначается устройству eth1. Это узел нашего реверс-прокси сервера. Остальные сервера –  внутри локальной сети и не могут быть доступны напрямую через Интернет.Повышаем безопасность стека web приложений (виртуализация LAMP)Правилами аппаратного или программного (OpenBSD/Linux) брандмауэра узла 202.54.1.1 разрешается доступ лишь к портам 80 и 443. Все остальные порты – заблокированы. На каждом узле VM также работают iptables и доступ разрешен только к необходимым портам. Ваш обратный прокси-сервер определяет пул HTTP-серверов следующим образом:

## апстрим-канал www.example.com ##
upstream mybackend {
      server 192.168.1.10:80; #server1
      server 192.168.1.11:80; #server2
      ....
      ..
      ..
      server 192.168.1.100:80; # server100
}

Apache и Lighttpd сервера получают доступ к файлам через NFS сервер, настроенный на vm05. Web-сервер Apache настроен для работы с PHP. Наши PHP приложение настроено для подключения к серверу БД, размещенному на vm04. Наше PHP приложение используют vm03 в качестве кеша SQL посредством использования Memcached сервера.Примечание: Вы можете также поместить реверс-прокси сервер на DMZ, а HTTP и другие сервера – за брандмауэром для повышения безопасности. Но это увеличит стоимость проекта.

Хватит говорить, покажи мне процесс настройки серверов

Большинство перечисленных в этой заметке действий, пишутся с предположением, что они будут выполнены root-пользователем в bash-консоли CentOS 6.x/Red Hat Enterprise Linux 6.x. Тем не менее, вы можете легко копировать настройки на любой другой *NIX подобные операционные системы.

  • Шаг №1: Настройка / Установка: NFS файловый сервер
  • Шаг №2: Настройка / установка: сервер баз данных MySQL
  • Шаг №3: Настройка / Установка: Memcached сервера кэширования
  • Шаг №4: Настройка / Установка: Apache + php5 приложение веб-сервера
  • Шаг №5: Настройка / Установка: веб-сервер Lighttpd для статических активов
  • Шаг №6: Настройка / Установка: Nginx обратный прокси-сервер

Ссылки на продолжение в конце поста будут проставлены в течение недели, по мере перевода и при вашем желании слушать дальше этот перевод.

Автор: danielnewman

* - обязательные к заполнению поля