Сервер в кармане, или просто о сложном!

главная - Статьи - WWW (HTML, PHP и др.)

Скрыть версию Apache

Прочитал недавно статью на сайте www.debuntu.org, в которой автор (chantra) описывает способ улучшения безопасности сервера за счет сокрытия информации о версии серверного ПО. Утверждение автора, что данный способ повышает безопасность Apache довольно спорно, но об этом ниже. А пока давайте посмотрим на эксперименты автора по работе с заголовками сервера. На любой GET или HEAD запрос, отправленный серверу, Apache, помимо запрошенного контента (для GET запроса), возвращает клиенту HTTP-заголовки. Вот типичный список заголовков, полученный от сервера Apache:

Date: Tue, 25 Jul 2006 10:47:13 GMT
Server: Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2
Last-Modified: Mon, 20 Mar 2006 09:51:25 GMT
ETag: “3057-1f8-1a0f4140?
Accept-Ranges: bytes
Content-Length: 504
Connection: close
Content-Type: text/html; charset=ISO-8859-1

Для получения этого списка автор заметки использовал telnet. C его помощью chantra отправил HEAD запрос на свой локальный сервер. Вот эта сессия telnet:

~$ telnet localhost 80
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
HEAD / HTTP/1.0

Обычно данные заголовки скрыты от пользователей, так как содержат в основном служебную информацию. Однако есть много способов просмотреть этот список. Например, для пользователей браузера Firefox хочу порекомендовать плагин LiveHTTPHeaders. В этом списке нас интересует заголовок Server. Как видно из его значения [Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2], у автора установлено следующее ПО: ОС - Ubuntu, сервер - Apache 2.0.55 и PHP 5.1.4-1.dotdeb.2. Так вот, способ повышения безопасности, предложенный автором, состоит в том, чтобы скрыть от получателя (HTTP-клиента) эту информацию. Делается это с помощью директивы Apache - ServerTokens. Вот значения, которые принимает директива и соответствующие ей значения заголовка Server:

Значение директивы Значение заголовка Server
ServerTokens Prod Server: Apache
ServerTokens Major Server: Apache/2
ServerTokens Minor Server: Apache/2.0
ServerTokens Minimal Server: Apache/2.0.55
ServerTokens Os Server: Apache/2.0.55 (Ubuntu)
ServerTokens Full Server: Apache/2.0.55 (Ubuntu) PHP/5.1.4-1.dotdeb.2 my_mod1/X.Y my_mod2/W.Z

Все очень просто. Одно лишь замечание по поводу значения Full. Если используется это значение, то сервер выдает не только версии ОС и сервера, но и версии модулей, установленных на сервере - PHP/5.1.4-1.dotdeb.2 my_mod1/X.Y my_mod2/W.Z. Причем модуль сам должен добавить свою версию. Делается это с помощью функции ap_add_version_component(server_pool, "my_mod1/X.Y"). По умолчанию в Apache используется значение Full, а автор статьи рекомендует использовать Prod, тем самым сокращая информацию, отправляемую клиенту, до одного названия сервера.

Также некоторыми возможностями в этой области обладает и PHP. В файле php.ini есть переменная expose_php, которая может принимать значения: On и Off. Которые, соответственно, добавляют или удаляют информацию о версии PHP в заголовок Server (а также в X-Powered-By).

Ну и для полноты картины опишем еще одну подобную директиву, про которую автор не упомянул, а именно ServerSignature. Она также выводит данные о версии ПО, но в отличие от ServerTokens делает это не в заголовок Server, а в некоторые HTML страницы, например: листинг каталогов, страницы ошибок и т.п. Вот ее значения и соответствующие результаты:

Значение директивы Результат
ServerSignature On Apache/2.0.59 (Ubuntu) PHP/4.3.10 Server at 127.0.0.2 Port 80
ServerSignature Off  
ServerSignature Email

Apache/2.0.59 (Ubuntu) PHP/4.3.10 Server at 127.0.0.2 Port 80

Разница On и Email заключается в ссылке mailto на виртуальном хосте.

Теперь поговорим о том, насколько данный способ пригоден для повышения безопасности. Такой способ даже имеет свой термин - Security through obscurity (Безопасность через сокрытие). В практической жизни он применяется довольно часто, потому что только в теории системы безопасности могут обеспечить надежную защиту. А когда дело доходит до практики, то вся надежность улетучивается благодаря пресловутому "человеческому фактору", а точнее - ошибкам в ПО. Поэтому сокрытие всей информации о системе (помимо необходимой пользователю) повышает ее безопасность. Но, как было справедливо замечено в комментариях к статье, сегодня почти все атаки на веб-сервера производятся ботами, которые не утруждают себя проверкой версий серверного ПО - они берут количеством, а не качеством. Поэтому автор комментария рекомендует сперва использовать более надежные способы защиты, например - mod_security, а потом уж беспокоиться о заголовке Server.

Ну и напоследок, приведу цитату, касающуюся заголовка Server, из спецификации HTTP/1.1 - RFC 2616:
Note: Revealing the specific software version of the server might allow the server machine to become more vulnerable to attacks against software that is known to contain security holes. Server implementors are encouraged to make this field a configurable option.

Как вы видите, и тут есть неявная рекомендация скрывать "лишнюю" информацию о ПО. Но, как в принципе и всегда, окончательное решение остается за вами.

Автор: Сипягин Максим
Источник: ApacheDev.ru

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?