Задача 3. Ограничение доступа к папке и её элементам

Опубликовано пользователем Бессонов Л.В. 02.03.2010г.

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

Наглядным примером является случай, когда один и тот же сервер обслуживает более одного веб-узла. Такая ситуация будет рассматриваться далее, в данный момент информация предоставляется как факт, например first_site.org и second_site.org могут обслуживаться одной и той же программой на одном и том же компьютере. В таком случае для каждого узла задаются различные директивы. Диапазон действия конкретной директивы может быть ограничен тремя различными способами:

  1. По каталогу с помощью директив Directory, DirectoryMatch или файла .htaccess
  2. По URL с помощью директив Location и LocationMatch
  3. По файлу с помощью директив Files и FilesMatch

Directory и DirectoryMatch

Предположим, диапазон действия некоторой директивы необходимо ограничить каталогом /htdocs/first_site и его подкаталогами. На данный момент не принципиальна функциональность указываемых правил, важно то, что требуется ограничить их действие файловым поддеревом, корнем которого является каталог /htdocs/first_site, для того, чтобы они не действовали на другие части файлового дерева рассматриваемого узла. Для примера воспользуемся ранее рассматривавшейся директивой Options. Договоримся что в директиве DocumentRoot указан путь содержащий папку htdocs, к примеру "C:/Apache/htdocs", все относительные пути будут рассчитываться от этого. Чтобы ограничить зону действия Options каталогом /htdocs/first_site и всеми подкаталогами, содержащимися в нем, достаточно эту директиву взять в окружение Directory:

  1. <Directory /first_site>
  2. Options +Indexes
  3. </Directory>

Директива DirectoryMatch действует во многом аналогично директиве Directory за исключением того, что в ней в качестве аргумента указывается регулярное выражение, а не конкретное имя каталога. Например:

  1. <DirectoryMatch /site[1-3]>
  2. Options +Indexes
  3. </DirectoryMatch>

В этом примере инструкция Options будет применена к трём каталогам /htdocs/site1, /htdocs/site2 и /htdocs/site3.

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

Location и LocationMatch

Ограничение диапазона действия директив по URL осуществляется директивами Location и LocationMatch.

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

Обычно директивы размещения задают подадрес с допущением, что он находится на данном сервере. Предположим, например, что мы проводим настройку сервера с именем site.ru с помощью следующих директив:

  1. <Location /files>
  2. #Список настроек 1
  3. </Location>

Сервер Apache будет применять "список настроек 1" в случае, когда запрашивается адрес site.ru/files

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

Files и FilesMatch

Директивы Files и FilesMatch концептуально тоже подобны директивам Directory и DirectoryMatch. Отличие заключается в том, что они применяются к отдельным файлам, или, как в случае с директивой FilesMatch, к файлам, имена которых удовлетворяют указанному регулярному выражению. Например, директива, которая делает конфигурационный файл .htaccess недоступным для всех:

  1. <Files .htaccess>
  2. Order deny,allow
  3. Deny from all
  4. </Files>

Следует отметить, что в отличие от прочих вышеперечисленных директив, которыми задаются диапазоны, директивы Files и FilesMatch можно включить в файл конфигурации .htaccess.

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

Ограничение доступа

Независимо от задач, которые призван решать узел, вопросы его безопасности (права доступа к каталогам, ограничение доступа Directory и т.д.) требуют особого внимания. Особенного внимания проблема безопасности требует при создании узла, предназначенного для электронной коммерции, хранении персональных данных, информации не публичного характера и т.д.

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

Директива allow предназначена для определения узлов или доменов, которым разрешен доступ к указанному каталогу. Например, чтобы санкционировать доступ к каталогу /some/directory всем, необходимо задать директиву.

  1. <Directory /some/directory>
  2. allow from all
  3. </Directory>

Директива deny предназначена для определения узлов или доменов, которым запрещён доступ к указанному каталогу. Например, чтобы запретить доступ к каталогу /another/directory всем, необходимо задать директиву.

  1. <Directory /some/directory>
  2. deny from all
  3. </Directory>

Директива order предназначена для определения порядка, в соответствии с которым сервер Apache будет оценивать директивы deny и allow.

Для разрешения доступа к каталогу /some/directory всем пользователям из домена sgu.ru достаточно следующих команд:

  1. <Directory /some/directory>
  2. order deny,allow
  3. deny from all
  4. allow from .sgu.ru
  5. </Directory>

В этом случае как указано в директиве order сначала будут применены запрещающие правила, что запретит доступ всем. Затем будут применены разрешающие правила, в результате чего запрет будет ослаблен и пользователям, посылающим запрос с хостов из домена sgu.ru, будет разрешено получать доступ в эту папку.

Разрешить доступ можно на основании информации о подсети. Сервер Apache будет просматривать подсеть слева направо, начиная с самого левого октета (байта). Например, Вы администратор сайта футбольного клуба, после удачной игры клуба в городе N., фанаты проигравшего клуба оставляют гневные реплики в гостевой книге. Зная что город N. находится в подсети 95.29.71.x, где x - любое число от 0 до 255, ограничим доступ в гостевую книгу.

  1. <Directory /guestbook>
  2. order deny,allow
  3. allow from all
  4. deny from 95.29.71
  5. </Directory>

Но не всегда диапазон IP-адресов так легко выделяется. Иногда нужно ограничивать доступ для подсети по маске. Apache также позволяет это. Например:

  1. <Directory /guestbook>
  2. order deny,allow
  3. allow from all
  4. deny from 95.29.71.0/255.255.252.0
  5. </Directory>

Также можно задать ограничения и разрешения по полному имени или IP-адресу хоста.

  1. <Directory /guestbook>
  2. order deny,allow
  3. deny from all
  4. # Разрешим доступ с 1 компьютера 111 аудитории
  5. allow from r111wslin01.immpu.sgu.ru
  6. # Разрешим доступ с веб-сервера факультета
  7. allow from 212.193.42.7
  8. </Directory>

Баннер SGU.RU