Подмена HTTP-заголовка Server для различных веб-серверов

в 15:25, , рубрики: http, веб-сервер, информационная безопасность, системное администрирование, метки: , ,

Привет, читатели.

Большинство (если не все) веб-серверы при ответе на HTTP-запрос по умолчанию заявляют о себе с помощью заголовка Server, сообщая в лучшем случае название используемого ПО, а в хучшем – версию, используемые модули и т.д. Их можно удобно просматривать с помощью таких дополнений, как например Server Spy для Mozilla Firefox.

Server Spy

Но далеко не все из веб-серверов позволяют в явном виде одной директивой отключить такое поведение. На мой взгляд, это потенциальная прореха в безопасности. В данной статье показано, как отключить отсылку заголовка Server или подменить его значение на произвольное для серверов Lighttpd, Nginx, Apache, G-WAN.
Подробнее под катом.

Lighttpd

Lighttpd – единственный из перечисленных серверов, в файле конфигурации которого предусмотрена подмена заголовка Server. Выглядит это так:
server.tag = "gws"

Nginx

Не раз встречал в Сети инструкции, как изменить заголовок Server в веб-сервере Nginx. Делается все в лоб – с помощью подмены значения в исходниках и перекомпиляции. Например www.xakep.ru/post/54168/
Есть метод более простой. Достигнуть результата можно использованием комбинации модулей HttpHeadersModule и HttpHeadersMoreModule или еще более простой вариант с помощью одного HttpHeadersMoreModule.

С использованием комбинации модулей HttpHeadersModule и HttpHeadersMoreModule:
# Удаляем существующее значение заголовка Server
more_clear_headers 'Server';
# Задаем новое
add_header Server gws;

С помощью одного HttpHeadersMoreModule:
# только HttpHeadersMoreModule
more_set_headers 'Server: my-server';

Apache

В веб сервере Apache содержимое заголовка Server настраивается с помощью ServerTokens
По умолчанию используется значение Full. Показывается информация вида Apache/2.4.1 (Unix) PHP/4.2.2 MyMod/1.2
Минимум, к которому можно свести – это Apache. С помощью mod_header пробовал сделать конфигурацию, аналогичную Nginx. Не получилось – Apache игнорирует настройки и продолжает упорно выставлять значение Server согласно ServerTokens и ServerSignature.
Пришлось поставить mod_security и добавить в конфигурацию строку:
SecServerSignature "gws"
Заработало.

G-WAN

В случае с G-WAN конфига как такового не существует. Код на C в handler'е выглядит следующим образом:

xbuf_xcat(get_reply(argv),
"HTTP/1.1 200 OKrn"
"Content-type: text/htmlrn"
"Content-Length: 20rn"
"Server: gwsrn"
"Connection: keep-alivernrn"
"Hello, World");

// set the HTTP reply code
int *pHTTP_status = (int*)get_env(argv, HTTP_CODE);
if(pHTTP_status)
*pHTTP_status = 200; // 200:OK
return 2;

Тонкости настройки G-WAN не являются темой данной статьи, поэтому в детали не вдаюсь.

Замечания

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

Автор: vmkononenko


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


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js