Каталоги и права доступа


В Apache есть много отличных функций, однако не стоит включать их всегда и везде — неряшливая настройка может чрезмерно увеличить объем информации, передаваемой с вашего веб-сайта, и даже привести к взлому сервера. Права на доступ к функциям Apache предоставляются по каталогам. Конфигурация немного похожа на XML: есть метка Directory в угловых скобках, список прав доступа и параметров, а затем закрывающая запись Directory с обратным слэшем. Любые значения или параметры между открывающим и закрывающим операторами Directory относятся к этому каталогу:

<Directory /path/to/files>
    ...параметры и настройки...
</Directory>

По умолчанию Apache применяет весьма ограничивающие права и значения параметров. Например, в файле httpd.conf в начале раздела, описывающего каталоги, можно увидеть следующую запись:

<Directory />
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

Apache разрешает пользователям загружать на сервер свои конфигурационные файлы, которые изменяют параметры настройки сервера, параметры защиты паролями, типы MIME и т. д. Строка AllowOverride None означает, что пользователи не смогут установить те или иные параметры в указанном каталоге, если это явно не разрешено. Инструкции Order и Deny означают, что ни один системный каталог не доступен из Сети. Это стратегия отказа в доступе по умолчанию. Если иное не оговорено, каждый каталог на сервере имеет такие же права доступа.

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

Управление доступом на основе IP-адресов

Параметры Allow и Deny задают IP-адреса и имена хостов, с которых разрешен доступ к содержимому каталога. Адрес клиента сравнивается со списками Allow и Deny в порядке, указанном в инструкции Order. Далее, в зависимости от результата сравнения, Apache разрешает или запрещает доступ к файлам каталога. Если порядок Order определен как deny,allow, то по умолчанию доступ открыт, если нет запрещающей инструкции Deny. Если же порядок определен как allow,deny, то по умолчанию доступ запрещен, если нет разрешающей инструкции Allow. Применяется последнее совпавшее правило.

Order allow,deny
Allow from all

В этом примере для каталога DocumentRoot определяется стратегия запрета доступа по умолчанию, а затем добавляется правило с инструкцией Allow, которое разрешает всем хостам доступ к сайту. Как и в случае с TCP Wrappers, здесь можно обозначить все хосты с помощью ключевого слова all. Можно заблокировать отдельные сайты, добавив инструкцию Deny:

Order allow,deny
Deny from 192.168.0.0/16
Allow from all

Здесь был заблокирован доступ к сайту с определенных IP-адресов. Точно так же здесь можно было бы использовать имена хостов, если при обеспечении безопасности веб-сервера вы готовы положиться на результаты обратного поиска в DNS:

Order allow,deny
Deny from *.absolutefreebsd.con
Allow from all

В этом случае все, что я должен сделать, чтобы получить доступ к сайту, — это замаскироваться под машину, которая при обратном поиске DNS не будет определяться как принадлежащая домену absolutefreebsd.com. Изменить мой обратный DNS намного проще, чем IP-адрес.

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

Order deny,allow
Allow from 192.168.0.0/16
Deny from all

Подобные примеры вы встретите во всех конфигурационных файлах Apache.

Параметры каталогов

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

Параметры для каталогов можно указывать с помощью ключевого слова Options. Например, чтобы задать параметры ExecCGI и MultiViews для каталога /var/www/mysite/cgi-bin, надо выбрать такую конфигурацию:

<Directory /var/www/mysite/cgi-bin>
Options ExecCGI, MultiViews
</Directory>

Теперь посмотрим, какие параметры поддерживает Apache.

None
Параметр None запрещает все остальные параметры. В примере файла httpd.conf параметр Options имеет значение None. Если вы создаете конфигурацию сервера на основе примера по умолчанию http.conf, вам придется явно разрешить все параметры, которые понадобятся для работы.

All
Параметр All включен в сервере Apache по умолчанию. Если не указаны никакие параметры, будут доступны почти все функции Apache. Если пользователь выгрузит на сервер сценарий для защиты своего каталога с помощью паролей, это сработает. Пользователь может выгрузить на сервер CGI-сценарий, который пробьет брешь в локальной системе и запустит командный интерпретатор от имени root на TCP-порте, открыв всем желающим двери в вашу систему. Параметр All разрешает все остальные параметры Apache, за исключением MultiViews (как показано далее).

ExecCGI
Веб-сервер Apache сможет запускать CGI-сценарии, находящиеся в этом каталоге.

FollowSymLinks
Для обращения к другим файлам на сервере можно применять символические ссылки, или псевдонимы, описываемые на странице руководства ln(1). Пользователь может создать символическую ссылку чуть ли не на каждый файл на сервере, причем этот файл будет видимым, конечно, если это позволяют права доступа к файлу.

SymLinksIfOwnerMatch
Сервер будет применять символические ссылки, если владелец ссылки также владеет файлом, на который указывает ссылка. Другими словами, пользователь может применять символические ссылки, указывающие на его документы.

Includes
Вставки на стороне сервера (Server Side Includes, SSI-файлы HTML, содержащие инструкции для командного процессора) и CGI-сценарии будут работать в каталогах с установленным параметром Includes, однако они могут быть опасны, если их писали неосторожно. В конце концов, вы позволяете посетителям вашего веб-сайта запускать команду, которая использована в этом HTML-файле. Коварные взломщики, проявив изобретательность, могут с помощью данной команды выполнить действия, которые не предусматривал веб-дизайнер. Поищите в Сети материалы, посвященные SSI и безопасности, и вы найдете себе занятие на очень долгое время. Если вы не знаете, как безопасно применять SSI, не включайте этот параметр!

IncludesNOEXEC
Разрешает SSI, но запрещает функции #ехес и include в серверных вставках. Без функции #ехес код HTML не может просто запустить любую команду — все команды SSI должны быть написаны в тщательно ограниченном диапазоне параметров. По сути, этот параметр разрешает простые вставки SSI и сценарии CGI, но исключает наиболее типичные бреши безопасности. Однако исключение наиболее типичных брешей системы безопасности вовсе не означает полную безопасность; вы лишь немного прибавили работы злоумышленнику.

Indexes
Если в каталоге нет файла index.html, параметр Indexes позволит серверу вернуть хорошо отформатированный список содержимого каталога. Можно считать это брешью в системе безопасности — в зависимости от содержимого каталога. Например, если кто-либо просматривает содержимое каталога моей домашней веб-страницы, это не страшно. Но если открыт доступ к каталогу с исходными текстами моих программ, дело принимает другой оборот. (В моем случае неприятность заключается лишь в том, что эти исходные тексты содержат ошибки, но чьи-то тексты программ могут быть на самом деле дорогими.)

MultiViews
Этот параметр позволяет серверу обслуживать HTML-документы, представленные на нескольких языках. Например, веб-разработчик может создать документ HTML, содержащий текст на английском, китайском и испанском языках. Если параметр MultiViews включен, Apache посылает клиенту страницу на языке, который задан в веб-броузере.

Параметры настройки для пользователей

Одна из интересных возможностей, которые предоставляет Apache, заключается в том, что пользователи могут выгружать на сервер собственные конфигурационные файлы, а сервер будет читать их и использовать. Ключевое слово AllowOverride позволяет администратору вебсервера Apache определить, какие конфигурационные параметры заданного каталога могут или не могут изменяться пользователями. Это дает веб-разработчикам возможность взять на себя большую часть хлопот по конфигурированию, а также устанавливать небезопасные CGI-сценарии в произвольные каталоги.

Свои изменения в конфигурации пользователи помещают в файл с именем .htaccess, в требуемом каталоге. Если вы запускаете корпоративный веб-сервер, и ваш веб-разработчик так или иначе получает все, что ему нужно, нет никаких причин запрещать ему вносить изменения. Но если вы запускаете общедоступный веб-сервер или веб-сервер компании-провайдера и хотите запретить определенным группам клиентов выполнять CGI-сценарии, то надо выключить параметр ExecCGI и запретить те или иные подмены, позволяющие использовать CGL

Параметр AllowOverride размещается в отдельной строке внутри определения Directory вместе с допустимыми подменами. Вот набор разрешенных подмен, приемлемый для большинства веб-сайтов:

AllowOverride Filelnfo AuthConfig Limit Indexes

Для параметра AllowOverride определены следующие ключевые слова, разрешающие пользователям подменять что угодно путем записи в файл .htaccess.

AuthConfig
AuthConfig позволяет защищать каталоги с помощью паролей и обеспечивает довольно высокую степень безопасности. Ее применение имеет смысл при администрировании групп серверов, где учетную запись может получить любой дурак с кредитной картой.

FileInfo
FileInfo разрешает пользователям вставлять собственную информацию MIME для файлов в каталоге. Как правило, лучше добавлять такую информацию в серверный файл mime.types, но некоторым пользователям может показаться, что такая возможность им необходима.

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

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

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

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

Прочие настройки каталогов

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

Индексные документы

Параметр DirectoryIndex задает имя документа, выдаваемого по умолчанию. Когда клиент обращается к каталогу, а не к имени файла, Apache ищет в этом каталоге файлы с указанными именами согласно порядку их представления в данном операторе. Измените это значение, если вы пользуетесь таким инструментом, как РНР (имена файлов имеют расширение .php) или редакторами веб-страниц операционной системы Windows, которые дают HTML-файлам расширения .htm, или, что еще хуже, когда начальная страница хранится в файле default.htm.

DirectoryIndex index.php index.htm index.html

Псевдонимы

Параметр Alias задает псевдонимы для каталогов на вашем веб-сайте — подобно символическим ссылкам. С помощью параметра Alias вы можете объединить различные каталоги в единый сайт, не прибегая к FollowSymlinks. Это особенно удобно при работе с программами и веб-приложениями сторонних разработчиков.

Alias /icons/ "/usr/local/www/icons"

В этом примере подразумевается, что пользователь, заглянувший по адресу http://www.absolutefreebsd.com/icons, на самом деле будет просматривать содержимое каталога /usr/local/www/icons/, хотя значение параметра DocumentRoot не имеет никакого отношения к этому каталогу.

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

Нестандартные страницы с сообщениями об ошибках

Дополнительная возможность обслуживания веб-страниц — веб-сервер может отображать для клиента сообщения об ошибках. Сервер Apache содержит стандартные страницы с сообщениями об ошибках, однако вы можете создать собственные страницы и отправлять клиентов к ним. Делается это с помощью ключевого слова ErrorDocument, вслед за которым указывается код ошибки и имя файла страницы с описанием ошибки:

ErrorDocument 404 /missing.html

404 — это код ошибки «Страница не найдена». Запросив отсутствующую страницу, пользователь получит вместо нее файл missing.html.

Комментарии запрещены.