Брандмауэры и специальное программное обеспечение 8 Часть 4

Вид материалаРеферат

Содержание


Конфигурирование Apache
Подобный материал:
1   ...   78   79   80   81   82   83   84   85   ...   101

Конфигурирование Apache


В свое время сервер Apache использовал четыре конфигурационных файла: httpd.conf, access.conf, srm.conf и mime.conf. В дальнейшем для удобства файлы access.conf и srm.conf были объединены и включены в состав файла httpd.conf, однако при желании их по-прежнему можно использовать по отдельности. Перейдите в каталог /etc/httpd/conf, где вы можете обнаружить эти три файла, а также подкаталог magic и несколько подкаталогов ssl.*. Для настройки рекомендуется использовать только один файл httpd.conf, и в данной книге мы будем осуществлять настройку именно таким образом.

Файл httpd.conf, входящий в комплект Apache по умолчанию, обладает значительным размером, но в него входит большое количество примеров и объяснений. Однако все эти объяснения недостаточно подробны. В данной книге я не собираюсь подробно объяснять различные записи этого файла. Те, кто заинтересован в дополнительных разъяснениях, могут обратиться к электронной документации Apache, которую можно найти по адресу e.org/. Я сконцентрирую ваше внимание на некоторых параметрах, которые связаны с безопасностью вашего web-сервера.

Файл httpd.conf по умолчанию определяет весьма благоразумную с точки зрения безопасности конфигурацию web-сервера. Если вы не внесете в него каких-либо изменений, вы сможете запустить Apache только в нормальном режиме. Если вы запустили ваш web-сервер, не модифицировав предварительно файл httpd.conf (предполагается, что вы используете рассмотренный ранее файл httpd.conf, а не тот файл httpd.conf, который уже существует), при попытке обратиться к серверу с использованием web-браузера, нацеленного на URL-адрес /, вы будете разочарованы. Дело в том, что порт, через который ваш web-браузер по умолчанию пытается установить связь, не совпадает с портом, который по умолчанию связывается сервером Apache. Чтобы исправить ситуацию, вы должны модифицировать файл httpd.conf.

В начале файла httpd.conf большая часть значений по умолчанию вполне приемлема. Обратите внимание на параметры MaxClients и MaxRequestsPerChild. Первый из них ограничивает число клиентов, которым разрешается подключаться к серверу в любой момент времени. По умолчанию параметр имеет значение 150. однако вы можете увеличить или уменьшить это значение таким образом, чтобы оно соответствовало объему памяти, установленному на компьютере. Если вы не знаете точно, какое значение будет наиболее эффективным в вашей ситуации, на некоторое время оставьте параметр без изменений и проанализируйте, какая часть установленного в системе ОЗУ оказывается занятой в процессе подключения к серверу клиентов. Получив представление о нагрузке на сервер, модифицируйте данный параметр должным образом. Важным параметром также является MaxRequestPerChild. По умолчанию значение этого параметра равно нулю (0), что означает, что клиенту разрешается порождать неограниченное количество дочерних запросов. Такое положение дел нельзя считать вполне безопасным, так как система оказывается беззащитной перед атаками типа Denial of Service (DoS). Если вы присвоите этому параметру значение 25, этого, скорее всего, будет вполне достаточно.

Теперь перейдем далее по файлу. Пропустите список модулей и обратите внимание на параметр Port. По умолчанию данный параметр равен 8080, именно поэтому, запустив Apache и попытавшись подключиться к нему при помощи web-браузера, вы не сможете это сделать. Если вы намерены использовать стандартный порт для обеспечения доступа к web-службам, вы должны присвоить параметру Port значение 80. Помните, что при этом сервер Apache должен быть запущен на уровне привилегий root. Если вы хотите, чтобы сервер работал от лица пользователя, не являющегося пользователем root, вы должны связать web-сервер с портом, номер которого превышает 1024. Если вы запускаете Apache на этой стороне брандмауэра (то есть во внутренней сети), вы можете легко добиться этого -достаточно организовать перенаправление порта 80 в порт 8080, а порта 443 в порт 8443. Таким образом, ваш сервер Apache будет работать от лица непривилегированного пользователя, что существенно повысит уровень защищенности системы.


ПРИМЕЧАНИЕ

Ядро Linux 2.4.x обладает новыми механизмами обеспечения безопасности web-серверов, о которых будет рассказано далее, однако сейчас, чтобы соединиться с вашим web-сервером, вы должны либо связать его с портом 80, либо использовать URL :8080/.

Несколько дальше в файле размещается раздел, который начинается с метки и заканчивается меткой . В этом разделе содержатся два выражения Listen. Эти выражения определяют порты, через которые Apache будет ожидать поступления соединения, если сервер был запущен с аргументом startssl Эти параметры не зависят от параметра Port, который используется в случае, если Apache запущен с аргументом start. Портом незащищенной передачи данных по умолчанию является порт 8080 вместо стандартного 80, а портом защищенной передачи данных по умолчанию является порт 8443 вместо стандартного 443. Если вы намерены связать Apache со стандартными портами, вы должны изменить соответствующие параметры в файле httpd.conf. В противном случае для подключения к вашему серверу клиенты обязаны будут указывать номера нестандартных портов.


ПРИМЕЧАНИЕ

Чтобы подключиться к порту защищенной передачи данных, в графе URL-адреса вы должны указать: https://localhost:8443/. Обратите внимание, что при указании протокола на конце https стоит буква s, что означает secure — защищенный. Клиент (по крайней мере в случае использования Netscape) должен знать о том, что вы пытаетесь соединиться с сервером через защищенный порт, в противном случае соединение установить не удастся, так как через обычный порт данные HTTP передаются в виде обычного текста, а через защищенный порт данные HTTP передаются с использованием специального протокола, обеспечивающего защиту. Иными словами, в первом случае никакой шифровки не выполняется, а во втором случае передаваемые данные шифруются.

Следующими записями, которые представляют для нас интерес, являются записи, в которых определяются пользователь и группа (User and Group), от лица которых будут обслуживаться клиентские запросы. По умолчанию для этой цели используется пользователь и группа с именем nobody (в разных комплектах Linux имя группы может быть разным). В результате этого, если web-сервер запускается на уровне привилегий root (а следовательно, он связывается с портами 80 и 443), дочерние процессы, которые выполняют обслуживание поступающих от клиентов запросов, порождаются от имени пользователя nobody. Если вы взглянете на список процессов (ps aux) httpd, вы заметите, что один из процессов запущен на уровне привилегий root, а другие (по умолчанию пять процессов) работают на уровне привилегий nobody. Дочерние процессы — это те, которые выполняют обслуживание клиентов. Благодаря этому ограничивается масштаб повреждений, которые эти процессы могут нанести системе. Таким образом, если клиент должен обладать возможностью записи в некоторый каталог, этот каталог должен быть доступен для записи для пользователя nobody. Разрешение на запись в этот каталог должно быть предоставлено для владельца или для группы, но не для всего мира. В отношении каталога, в который разрешено записывать пользователю nobody, должны действовать также и другие ограничения, о которых будет рассказано далее. При желании вы можете создать другого пользователя, от лица которого будут обслуживаться web-клиенты (например, для этой цели можно использовать учетную запись www). Однако для большинства приложений пользователя и группы nobody вполне достаточно.


ПРИМЕЧАНИЕ

Если Apache запускается от лица непривилегированного пользователя, параметры User and Group (пользователь и группа) игнорируются и все дочерние процессы запускаются от лица пользователя, от лица которого запущен Apache. В подобной ситуации Apache не сможет связать порты с номерами ниже 1024.

Следующим параметром, представляющим интерес с точки зрения безопасности, является параметр DocumentRoot (корневой каталог web-документов). Если вы компилировали Apache, используя рассмотренную ранее конфигурацию, по умолчанию параметр DocumentRoot обладает значением /home/httpd/htdocs. Этот параметр определяет тюрьму с измененным корнем, в границах которой разрешается действовать клиентам Apache (если, конечно, не определено никаких псевдонимов). Как правило, именно с этого каталога начинается взаимодействие клиентов с сервером сразу же после того, как они подключились. В данном каталоге должен располагаться файл index.phpl, который по умолчанию самым первым передается клиентам, подключающимся к серверу. В состав Apache входит такой файл, содержащий в себе текст по умолчанию.

После определения параметра DocumentRoot следуют один или несколько разделов, начинающихся с выражения и заканчивающихся выражением . Каждый из этих разделов содержит в себе набор параметров, специфичных для соответствующего каталога и каталогов ниже данного. Первый раздел Directory в качестве аргумента использует каталог с именем «/». То есть содержащиеся в нем параметры относятся к определенному ранее каталогу DocumentRoot. Последующие разделы начинаются с данного корневого каталога web-документов. Внутри разделов Directory содержатся параметры, которые действуют в отношении некоторого каталога, а также всех его подкаталогов. Эти значения могут быть перекрыты значениями, определяемыми в других разделах Directory. Раздел Directory, соответствующий самому высокоуровневому каталогу документов web-сервера, по умолчанию содержит два объявления: Options None и AllowOverride None. Эти объявления в значительной степени ограничивают клиентов, работающих с вашим web-сервером. Из соображений безопасности эти записи менять не следует. В листинге 20.4 приведены выражения и объявления, которые можно использовать в разделах Directory, а также параметры, которые допускается при этом использовать. Любые аргументы являются списком разделенных пробелами значений (за исключением объявления Order).


Листинг 20.4. Выражения и объявления, которые допускается использовать в рамках разделов файла httpd.conf

Options

None, Indexes, Includes, IncludesNoExec, FollowSymLinks, SymLinksIfOwnerMatch, ExecCGI, MultiViews, All.

AllowOverride

None, Filelnfo, AuthConfig, Limit, All

Order

либо allow,deny, либо deny,allow

Allow

All или конкретные узлы, домены, сети, IP-адреса

Deny

то же, что и для Allow



раздел, который должен замыкаться меткой
и должен полностью входить в раздел

Аргументами являются: GET, POST, OPTIONS, PROPFIND, PUT, DELETE, PATCH, PROPPATCH, MKCOL, COPY, MOVE. LOCK, UNLOCK и объявления: Order, Allow, Deny, как показано ранее.

- Аргумент None для любого объявления запрещает любые изменения для данного объявления.

- Аргумент АИ соответствует полному списку всех аргументов, допустимых для данного объявления. Однако если вы хотите использовать аргумент MultiViews, вы должны явно добавить его к аргументу All, так как аргумент All для объявления Options не подразумевает использования MuitiViews.

- Аргумент Indexes разрешает клиенту просмотр содержимого каталога, если отсутствует документ Directory-Index (как определено в файле httpd.conf). Чтобы ограничить просмотр одного или нескольких файлов, см. описание выражения далее.

- Аргумент Includes разрешает включать в состав файла другие файлы, даже если эти файлы расположены вне каталога DocumentRoot или каталога, являющегося псевдонимом. Таким образом можно обеспечить выполнение файла, включенного в include. Эта возможность чрезвычайно опасна и должна использоваться с особой осторожностью.

- Аргумент IncludeNoExec разрешает включение файлов в состав других файлов, однако запрещает исполнять эти файлы. Это более безопасная альтернатива аргумента Includes.

- Аргумент FollowSymLinks разрешает клиентам перемещаться по символическим ссылкам, указывающим на ресурсы вне текущего дерева каталогов. Этот аргумент является таким же опасным, как и аргумент Includes.

- Аргумент SymLinksIfOwnerMatch — обеспечивает значительно более безопасный способ обработки символических ссылок. Разрешает следовать по ссылке только в случае, если пользователь является владельцем ресурса. Непривилегированные пользователи редко когда владеют чем-либо, расположенным за рамками непривилегированных каталогов, поэтому аргумент SymLinksIfOwnerMatch обеспечивает гибкость (в особенности внутри пользовательских каталогов) и при этом не снижает безопасность так, как это делает аргумент FollowSymLinks.

- Аргумент ExecCGI — это еще один весьма опасный аргумент, который разрешает исполнение файлов. Если эти файлы являются файлами SUID, они запускаются от лица владельца файла. Используя этот аргумент, следует быть осторожным, размещая файлы в каталоге.

- Аргумент MultiViews разрешает серверу обсудить с клиентом возвращаемое в ответ на запрос содержимое в случае, если запрашиваемый клиентом файл не существует. Этот аргумент на самом деле создает в системе безопасности огромную дыру, так как сервер и клиент получают возможность договориться о том, какой файл будет передан в ответ на запрос. Вы не обладаете никаким контролем над данным процессом, единственное, что вы можете сделать, это наложить ограничения на то, какие файлы содержатся в данном каталоге.


ВНИМАНИЕ

Будьте очень осторожны в отношении аргументов Includes, FollowSymLinks, ExecCGI и MultiViews. Везде, где это возможно, используйте более безопасные аргументы IncludesNoExec и SymLinksIfOwnerMatch. Избегайте использования MultiViews.

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

- Аргумент Options позволяет использовать файл .htaccess для изменения специальных параметров, определенных для данного каталога. Если вы не хотите использовать некоторые из параметров, вы не должны указывать AUowOverride Options или ALL

- Аргумент Filelnfo разрешает вносить изменения в сведения о файловом типе, как объявлено (или нет) в файле http.conf. Этот аргумент также позволяет изменять значки, которые используются для обозначения определенных файловых типов.

- Аргумент AuthConfig позволяет использовать в отношении подкаталога механизмы управления доступом, благодаря чему перед тем, как разрешить пользователю вход в каталог, система будет просить его аутентифицировать себя. Об этом будет подробнее рассказано далее.

- Аргумент Limit позволяет ограничивать изменения ограничений, объявляемых внутри файла .htaccess.


ВНИМАНИЕ

Объявление AUowOverride может как расширить, так и сузить возможности контроля текущего каталога. Некоторые специальные аргументы, такие как All, Options или Limit, следует использовать с осторожностью.

- Имя директивы Order (порядок применения) говорит само за себя — эта директива определяет порядок применения политик.

- Директивы Allow и Deny, доступ к которым осуществляется с использованием директивы Order, могут использоваться для того, чтобы наложить ограничения на местоположение клиентов, имеющих право обращения к системе. Это можно сделать множеством способов. Однако следует иметь в виду, что при перенаправлении клиентов с использованием механизма proxy сервер Apache может подумать, что все клиенты обращаются к серверу из одного места — proxy (такое поведение зависит от используемого proxy). При некоторых условиях директивы Allow и Deny могут обрабатываться не так, как вы этого ожидаете. Чтобы обеспечить их правильную обработку, убедитесь в том, что программное обеспечение proxy передает соединения клиентов абсолютно прозрачно.

- Выражение позволяет гибко настраивать систему доступа к каталогу таким образом, что в рамках этого каталога некоторые действия будут разрешены, в то время как некоторые другие действия будут запрещены. Внутри угловых скобок выражения указывается разделенный пробелами список аргументов. Специальные объявления Order, Allow from и/или Deny from размещаются между метками и . Совместно с допускается использовать следующие аргументы (методы):

GET — загрузить файл (через HTTP или FTP);

POST — разместить информацию в форме;

PUT — передать на сервер файл через FTP;

DELETE — удалить файл;

CONNECT — любое соединение;

OPTIONS — наложить ограничения на допустимые параметры;

TRACE — включить трассировку;

PROPFIND — получить свойства документа;

PATCH — изменить файл;

PROPATCH — изменить свойства документа;

COPY — скопировать файл;

MOVE — переместить файл;

LOCK — блокировать доступ к файлу со стороны других процессов;

UNLOCK — снять блокировку с файла.

Предполагается, что выражения Directory, расположенные ниже выражения Directory, относящегося к DirectoryRoot, относятся к каталогам, которые являются частью корневого каталога документов (DirectoryRoot). Иными словами, подразумевается, что указанный в выражении Directory подкаталог входит в иерархию каталогов, начинающуюся с DirectoryRoot. Однако выражение Directory можно отнести также и к какому-либо каталогу, который не входит в DirectoryRoot. Для этого перед этим выражением Directory следует разместить одно из трех специальных объявлений. Эти объявления перечисляются далее. Каждое из них принимает два аргумента. Первый аргумент — это аргумент доступа к каталогу — некоторая последовательность символов, которую клиент указывает в качестве составной части URL для того, чтобы получить доступ к каталогу. Второй аргумент — это местоположение каталога в файловой системе. Именно туда Apache будет перенаправлять клиентов. Аргумент доступа к каталогу, как правило, указывается в форме /cgi-bin/, а местоположение каталога — это полный путь к этому каталогу в файловой системе Linux. Местоположение может указываться в форме /home/httpd/cgi-bin/. Специальные объявления это:

- Alias (псевдоним) — позволяет перенаправлять клиента к некоторому специальному месту в файловой системе;

- ScriptAlias — то же, что и Alias, однако предполагается, что каталог обладает разрешением ExecCGI (это разрешение должно быть явно указано в соответствующем выражении );

- UserDir — домашний каталог пользователя, доступ к которому, как правило, осуществляется при помощи метки /~имя_пользователя/.

Еще одним полезным выражением, похожим на выражение , является выражение . В выражении указывается разделенный пробелами список аргументов. По умолчанию в файле httpd.conf содержатся две записи: «~» и «\ .ht». Первая запись соответствует файлам, в именах которых содержится символ тильды (~). Эта запись, как правило, используется программами, которые создают резервные копии файлов. Вряд ли вы захотите, чтобы клиенты обладали доступом к этим устаревшим версиям файлов. Вторая запись является регулярным выражением (regular expression, regex). Оно соответствует всем файлам, в именах которых первые три символа являются символами .ht. Первый символ регулярного выражения — стрелочка вверх () — обозначает первый символ имени. Второй символ — обратная косая (\) — является esc-символом. Этот символ сообщает системе, что она не должна выполнять специальную интерпретацию символа, следующего за данным. Иными словами, символ, расположенный сразу же после символа обратной косой, не интерпретируется как спецсимвол, а рассматривается как обыкновенный символ. Сразу же за символом обратной косой стоит символ точки (.). В регулярных выражениях символ точки имеет специальное значение — им обозначают любой символ (подобно символу вопросительного знака ? при работе с командной оболочкой bash). Однако в данном случае имеется в виду именно символ точки, а не любой допустимый символ, поэтому чтобы отключить специальную интерпретацию этого символа, перед ним поставлен esc-сим-вол обратной косой черты. Определив таким образом в выражении некоторый набор файлов, вы можете разместить в разделе начиная с метки и заканчивая меткой директивы Order с объявлениями Allow и/или Deny, благодаря чему вы получаете возможность контролировать доступ к заданным файлам.

В файле httpd.conf используется также объявление AccessFilesName, которое располагается, как правило, до выражения и указывает имя файла .htaccess, в котором содержится информация об изменениях (если такие изменения разрешены) правила доступа в рамках данного каталога. Если вы меняете это имя файла, вы должны также изменить соответствующее выражение , в противном случае любой желающий сможет прочитать данный файл (и, если ему разрешена запись в каталог, модифицировать или заменить данный файл).

Еще одним важным объявлением является директива DirectoryIndex, которая имеет большое значение для каталогов, содержимое которых не разрешается просматривать напрямую. В данном объявлении через пробел перечисляются допустимые имена так называемых индексных файлов. Если клиент обращается к серверу, указывая в URL только лишь имя каталога (а не конкретный файл), система произведет в указанном каталоге поиск файлов, на которые указывает директива DirectoryIndex. Поиск имен файлов будет производиться в том порядке, в котором они указаны в директиве DirectoryIndex. Первый подходящий обнаруженный системой файл будет передан в ответ на запрос пользователя. Если ни одного из указанных в директиве DirectoryIndex файлов обнаружить не удалось, сервер передаст клиенту список файлов в данном каталоге (если это разрешено). Если передача содержимого каталога клиенту запрещена, сервер вернет клиенту сообщение об ошибке. Если вы используете РНРЗ, выражение DirectoryIndex для вашего сервера может выглядеть следующим образом:

Directorylndex index.phpl index.php3 index.phtml

Кроме того, возможно, вы захотите добавить и расширить ранее закомментированную строку:

AddType application/x-httpd-php3 .php3 .phtml

Эта строка разрешает использование файлов РНРЗ, обладающих расширениями либо рhрЗ, либо phtml.

Следующие три директивы разрешают использование на сервере CGI и/или HTML-документов, грамматический разбор которых выполняется на стороне сервера. Директива CGI разрешает запуск сценариев CGI из каталогов, которые не объявлены как ScriptAlias. Если каталог объявлен как ScriptAHas, для него не требуется использовать директиву CGI.

#AddHandler cgi-script .cgi

#AddType text/html .shtml

#AddHandler server-parsed .shtml

Комбинация двух последних директив объявляет тип файлов shtml и предписывает серверу выполнять грамматический анализ HTML-файлов на стороне сервера. Возможность грамматического анализа на стороне сервера добавляет вашему серверу гибкости, однако также увеличивает риск. Как директива CGI, так и директивы shtml снижают уровень защиты сервера и часто используются злоумышленниками для того, чтобы получить доступ к системе. Для некоторых web-узлов эти директивы являются необходимостью, однако если вы можете обойтись без CGI и грамматического разбора на стороне сервера, вы не должны использовать данные директивы.

Чтобы защитить вашу систему от непреднамеренных ошибок в конфигурации, добавьте в нее следующее выражение:



Order deny,allow

Deny from all



Это выражение запрещает кому-либо намеренный или непреднамеренный просмотр всей вашей файловой системы. Связанные с этим предупреждения содержатся в разделе «Дополнительные замечания, связанные с безопасностью» далее в данной главе.

Также будет лучше, если вы отключите доступ к пользовательскому каталогу учетной записи root. Для этого используется следующая простая директива:


UserDir disabled root