Как защитить веб-сервер Apache от взлома в Windows


Оглавление

1. Запрет доступа из вне к MariaDB/MySQL

2. Запрет доступа из вне к Apache

3. Установка пароля на MariaDB/MySQL

4. Блокировка доступа к phpMyAdmin

5. Удаление тестовых файлов, архивов с исходным кодом, резервных копий файлов

6. Запрет просмотра содержимого папок без индексного файла

7. Для публичных веб-серверов блокируйте доступ к папкам, в которых хранятся резервные копии и промежуточные результаты работы

8. Как спрятать версию веб-сервера

9. Установка файлового файервола mod_security

Заключение


Многие веб-мастера, а также программисты изучающие PHP, используют Apache в Windows для тренировки. Но не нужно забывать, что Apache — это полноценный веб-сервер, который в своей конфигурации по умолчанию призван обслуживать любые запросы, из какой бы сети они не пришли: локальной или глобальной сети Интернет. При этом в Windows веб-сервер Apache запущен с высокими привилегиями. Если резюмировать без лишних объяснений: уязвимый скрипт на веб-сервере может скомпрометировать всю систему Windows.

Если у вас белый IP, то к вашему веб-серверу может подключиться кто угодно из интернета. Также если вы, к примеру, подключены к локальной сети, например, через Wi-Fi, то опять же — к вашему веб-серверу может подключиться любой компьютер из этой локальной сети. Это может стать причиной утечки исходного кода, который вы разрабатываете или тестируете, либо компрометация компьютера.

Поэтому необходимо принять меры для правильной настройки компонентов веб-сервера. Благодаря принятым мерам веб-сервер Apache полностью сохранит свою работоспособность для пользователя, который запускает сайты работая за этим компьютером, но к этому серверу никто не сможет подключиться: ни в локальной, ни в глобальной сети.

1. Запрет доступа из вне к MariaDB/MySQL

Стандартный веб-сервер имеет две сетевые службы:

  • сам веб-сервер, который прослушивает 80 порт (при включении HTTPS, то ещё прослушивается и 443 порт)
  • сетевая служба системы управления базами данных, то есть MariaDB или MySQL, которая прослушивает порт 3306

СУБД является сетевой службой, что удобно, поскольку можно подключиться к MariaDB/MySQL с другого компьютера и выполнить разнообразные действия с базами данных. Для локальных процессов это тоже нормально — они подключаются к сетевой службе используя виртуальный сетевой интерфейс Loopback (можно перевести как «возвратная петля»). Если не вдаваться в дебри, это такой способ подключиться к сетевой службе, которая работает на этом же компьютере. То есть мы как будто делаем запрос в сеть, а сетевая служба видит эти пакеты как будто бы они пришли из сети. То есть клиент сетевой службы и сама сетевая служба работают как надо, но трафик на самом деле с компьютера никуда не уходит.

По умолчанию MariaDB/MySQL принимают подключения, пришедшие с любого компьютера. Чтобы MariaDB/MySQL принимали подключения только он веб-приложений, работающих на этом компьютере, в файле my.cnf должна содержаться строка

bind-address = 127.0.0.1

Пример конфигурационного файла my.cnf:

[mysqld]
datadir="c:/Server/data/DB/data/"
bind-address = 127.0.0.1

После внесения изменений в конфигурационный файл службу нужно перезапустить (или перезагрузить компьютер).

net stop mysql
net start mysql

Теперь MariaDB/MySQL прослушивает только IP адрес 127.0.0.1, который относится к Loopback. Это, в свою очередь, означает, что никто из вне (вне компьютера, на котором работает веб-сервер), не сможет подключиться к MariaDB/MySQL. При этом сайты и другие приложения будут работать с базами данных как ни в чём не бывало — они как раз и используют такие соединения к адресу 127.0.0.1.

2. Запрет доступа из вне к Apache

Что касается веб-сервера, то здесь настройка зависит от ваших нужд — для чего именно нужен сервер?


Если вы используете сервер только для написания скриптов, тестирования сайтов и вам не нужно, чтобы к нему могли подключаться из вне, тогда в файле C:\Server\bin\Apache24\conf\httpd.conf найдите директиву Listen, по умолчанию её значение:

Listen 80

И замените его на

Listen 127.0.0.1:80

Чтобы изменения вступили в силу, перезапустите сервер:

c:\Server\bin\Apache24\bin\httpd.exe -k restart

После этого никакое устройство ни в глобальной, ни в локальной сети не сможет подключиться к вашему веб-серверу. Но вы как и раньше без проблем сможете открывать его содержимое в веб-браузере используя адрес http://localhost/

Если вы хотите сделать так, чтобы сервер Apache был доступен для всех в локальной сети, но не доступен в глобальной сети, то есть два варианта.

  • Первый:

Присвоить компьютеру с сервером статичный адрес, а затем прописать его с директивой Listen локальный_IP:80. Получится именно тот эффект, который нужен: веб сервер будет отвечать на запросы из локальной сети и будет игнорировать запросы из Интернета. Подробности о настройке статичного IP смотрите в статье «Как веб-сервер на своём компьютере сделать доступным для других».

  • Также есть второй способ, более простой чем первый:

В папке C:\Server\data\htdocs\ (это наша корневая папка веб-документов), создайте файл .htaccess, и в него впишите:

Require ip 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 127.0.0.0/8 ::1/128

Этой строкой мы разрешили для доступа к серверу устройствам с IP из всех локальных диапазонов, а также петлевым адресам, для всех остальных при попытке подключиться к серверу будет выводиться сообщение:

Forbidden
You don't have permission to access / on this server.

Вы можете отредактировать приведённую выше строку под ваши нужды, например, можно убрать диапазоны 10.0.0.0/8 и 172.16.0.0/12, если они не используются в вашей локальной сети. IP адреса из 10.0.0.0/8 могут использоваться Интернет-провайдером для NAT, а 172.16.0.0/12 могут использоваться для локальных сетей на уровне города (такие есть/были у некоторых провайдеров). Следовательно, если вы оставите диапазоны 10.0.0.0/8 и 172.16.0.0/12, то при стечении ряда обстоятельств (кабель Интернет-провайдера напрямую подключён к компьютеру без роутера, а Интернет-провайдер использует диапазоны 10.0.0.0/8 и 172.16.0.0/12) пользователи этих локальных сетей смогут подключиться к вашему серверу при этих настройках.

Поэтому также попробуйте

Require ip 192.168.0.0/16 127.0.0.0/8 ::1/128

Если всё работает и проблем нет, то остановитесь именно на втором варианте.


Кстати, дополнительная информация про контроль, кто может иметь доступ к вашему сайту (локальному или на хостинге), вы найдёте в статье «Контроль доступа к сайту (блокировка по IP, User-Agent)».

3. Установка пароля на MariaDB/MySQL

По умолчанию у пользователя root пустой пароль. Поскольку мы отключили доступ к серверу MariaDB/MySQL из вне, то это не так опасно. Тем не менее остаётся угроза, что злоумышленник найдёт уязвимость в веб-приложении и сможет выполнить подключение через него. Поэтому при желании для дополнительного усиления сервера можно установить пароль для пользователя root в MariaDB/MySQL.

Для этого откройте командную строку, в неё введите:


cd C:\Server\bin\mariadb\bin\
.\mysql -u root

Внутри MySQL:

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'новый_пароль';
exit;

Замените новый_пароль на ваш пароль.

4. Блокировка доступа к phpMyAdmin

Возможно вы пропустили второй шаг, на котором был заблокирован доступ к веб-серверу с других компьютеров, поскольку, например, вам нужно, чтобы веб-сервер был доступен для подключения извне.

Если это так, то в любом случае нужно заблокировать доступ к phpMyAdmin — на локальном компьютере обычно он не должен быть открытым для других. Доступный для подключения phpMyAdmin позволяет брутфорсить пароль (взламывать методом перебора), а в случае если вы вовремя не обновляете phpMyAdmin, то атакующий также может воспользоваться найденными в старых версиях phpMyAdmin уязвимостями и проникнуть в систему.

Чтобы закрыть доступ к phpMyAdmin в папке /phpmyadmin/ на сервере создайте файл .htaccess и скопируйте в него:

Require local

Это нужно, чтобы в phpMyAdmin не могли зайти посторонние — обязательно это сделайте. Для проверки, что запрет работает, попробуйте открыть с какого-нибудь другого устройства (например, с мобильного телефона) адрес вида http://ваш_сайт/phpmyadmin/ или http://ваш_IP/phpmyadmin/ - должно появиться сообщение, что доступ запрещён и ошибка 403. Либо просто удалите папку /phpmyadmin/, если вам не нужен phpMyAdmin.

Аналогично сделайте с другими папками на сервере, в которые не должно быть доступа посторонним.

5. Удаление тестовых файлов, архивов с исходным кодом, резервных копий файлов

Удалите файл с phpinfo(); или другие проверочные файлы, которые создавались в процессе установки и тестирования веб-сервера.

6. Запрет просмотра содержимого папок без индексного файла

По умолчанию если зайти в папку без индексного файла, то показывается список всех файлов в этой папке. Скорее всего, вам это не нужно (и это хуже для безопасности). Поэтому в конфигурационном файле Apache httpd.conf найдите директиву <Directory "c:/Server/data/htdocs/">

После неё найдите строку

Options Indexes FollowSymLinks

И замените на

Options -Indexes

Чтобы изменения вступили в силу, перезапустите веб-сервер.

7. Для публичных веб-серверов блокируйте доступ к папкам, в которых хранятся резервные копии и промежуточные результаты работы

Этот пункт для тех, кто не заблокировал полностью доступ к веб-серверу с других компьютеров, а использует его в качестве публичного сервера, а также в качестве среды разработки.

Если вы разрабатываете и тестируете скрипты прямо на этом сервере, то закройте доступ к папке, в которой находятся файлы проекта с помощью .htaccess как это показано чуть выше. Не храните бэкапов, файлы резервных копий, например, index.php,bak на этом сервере!

Для настройки ограничений рекомендуется ознакомиться со статьёй «Контроль доступа к сайту (блокировка по IP, User-Agent)».


8. Как спрятать версию веб-сервера

Если в командной строке вы выполните:

curl -v localhost

То будут выведены примерно следующие данные:

* Rebuilt URL to: localhost/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 18 Feb 2019 14:19:52 GMT
< Server: Apache/2.4.34 (Win64) PHP/7.3.2
< Content-Length: 1951
< Content-Type: text/html;charset=UTF-8
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /</title>
 </head>
 <body>
<h1>Index of /</h1>
<ul><li><a href="--.htaccess"> --.htaccess</a></li>
<li><a href="-index.html"> -index.html</a></li>
<li><a href="-index.php"> -index.php</a></li>
<li><a href="-phpmyadmin/"> -phpmyadmin/</a></li>
<li><a href="-wp-config.php"> -wp-config.php</a></li>
<li><a href="-www/"> -www/</a></li>
<li><a href="PHP_errors.log"> PHP_errors.log</a></li>

Обратите внимание на строку:

Server: Apache/2.4.34 (Win64) PHP/7.3.2

Из неё можно сделать вывод о точных версиях Apache и PHP, а также о том, что веб-сервер запущен на операционной системе Windows. Это может помочь атакующему. Эта строка является часть HTTP заголовка и отправляется каждый раз, когда делается запрос к веб-серверу.

Двумя директивами можно отключить вывод данной информации.

Откройте файл httpd.conf (C:\Server\bin\Apache24\conf\httpd.conf) и добавьте туда две директивы:

ServerTokens Prod
ServerSignature Off

Чтобы изменения вступили в силу, перезапустите сервер:

c:\Server\bin\Apache24\bin\httpd.exe -k restart

Снова делаем проверку:

curl -v localhost

Как можно увидеть, теперь выводится информации намного меньше:

Server: Apache

9. Установка файлового файервола mod_security

Файловый файервол исследует каждый запрос, пришедший к веб-серверу, и в случае если этот запрос представляет угрозу для веб-приложения или веб-сайта, то файловый файервол блокирует этот запрос.

То есть даже если на вашем веб-сервере имеется уязвимый скрипт или сайт, то mod_security не позволит злоумышленнику эксплуатировать эту уязвимость

mod_security это файловый фейервол, система обнаружения и предотвращения вторжений.

Рассмотрим установку mod_security в Apache, запущенный на Windows.

[РАЗДЕЛ В ПРОЦЕССЕ ПОДГОТОВКИ]

Заключение

Относитесь к веб-серверу на своём компьютере как к публичному: всё, что не закрыто и не заблокировано это как проходной двор. Отнеситесь к этому серьёзно, так как через веб-сервер можно скомпрометировать (взломать) весь компьютер!


Рекомендуется Вам:

6 комментариев to Как защитить веб-сервер Apache от взлома в Windows

  1. Артем:

    Полезная статья, все по полочкам разложено, но не могу найти файл my.cnf, подскажите где искать?

    • Alexey:

      Приветствую! В зависимости от способа установки, файл может называться my.ini, или my.cnf, или отсутствовать (в этом случае используются настройки по умолчанию). Найти или создать этот файл можно в папке, куда установлена СУБД, в моём случае это C:\Server\bin\mysql-8.0. Я свой файл my.ini создал по этой инструкции, когда устанавливал веб-сервер (кстати, данная статья просто продолжение инструкции по установки веб-сервера, поэтому я не мог предположить, что у кого-то не окажется этого файла — нужно будет дополнить).

  2. Руслан:

    при добавлении этой строки в my.ini: bind-address = 127.0.0.1

    phpmyadmin начинае работать очень медленно. По 10 сек дет отображение таблицы простым select. Не возможно просто посмотреть таблицы. Может есть какой то другой способ прикрыть mysql?

    • Alexey:

      Конечно есть, в файерволе Windows запретите входящие соединения на порт 3306.

  3. Дмитрий:

    Доброго времени суток! Спасибо огромное автору за столь подробную инструкцию. Все отлицно работает и win7 и win10 С нетерпением жду статью на тему Установка файлового файервола! Есщё интересно былобы почитать про связку  nginx+apache на эту тему нет подробного разбора! Спасибо Вам за проделаную работу!

  4. Владимир:

    Да, автор заслуживает похвалы. Видно что потратил время для разбора и оформления этой темы. Благодарю за труд!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *