В случае использования для работы сайтов веб-сервера Apache есть возможность ограничения доступа с помощью файла .htaccess, действие которого распространяется либо на одну директорию, либо на все вложенные поддиректории. Существует несколько видов ограничения доступа, которые могут пригодиться в разных случаях. Рассмотрим эти возможные варианты:
Ограничение по IP-адресу
Конструкция подобного ограничения очень проста:
order allow,deny deny from 1.1.1.1 deny from 2a01:230::6d0a:8406:c4e4:9e19 deny from 10.10 deny from 192.168.0.0/24 deny from domain.dom allow from all
Системные требования для работы этих правил: веб-сервер Apache 2.2.x с подключенным модулем mod_authz_host.
В этом примере я привел все возможные вариации ограничения доступа. И ниже разберем каждую строку в отдельности.
Первая строка задает логику работы последующих правил. В каком порядке будут выполняться блокирующие и разрешающие правила.
Вторая и третья строки блокируют доступ по конкретным IP-адресам (ipv4 и ipv6 соответственно).
Четвертая строка показывает, что можно указывать частично IP-адрес, и в таком случае (как указано в примере) будет обрабатываться как подсеть /16.
Пятая строка — можно блокировать целыми сетями и подсетями, указывая диапазон.
Для работы вариантов блокировки, как в шестой строке, потребуется включить параметр HostnameLookups.
И, наконец, последняя строка allow from all говорит о том, что всем остальным доступ разрешен.
Хотя Apache 2.2.x уже устарел, ог до сих пор часто используется. Для Apache 2.4.x правила будут другими:
<RequireAll> Require all granted Require not ip 1.1.1.1 Require not ip 2a01:230::6d0a:8406:c4e4:9e19 Require not ip 10.10 Require not ip 192.168.0.0/24 Require not host domain.dom </RequireAll>
Первая и последняя строки — директивы, используются для выделения группы правил.
Вторая строка — аналог блока order allow,deny + allow from all в Apache 2.2, задает логику работы правил.
Строки 3-6 — аналогичны строкам 2-5 правил Apache 2.2, а строка 7 — аналог строки 6 в Apache 2.2.
Ограничение по паролю
Рассмотрим простейший вариант ограничения доступа с авторизацией по логину и паролю:
AuthType Basic AuthName "Доступ ограничен паролем" AuthUserFile "/path/to/.htpasswd"
Системные требования для работы такой конструкции: веб-сервер Apache 2.2.x или 2.4.x с подключенными модулями auth_basic, authn_file.
Генерация пароля
Создание пары «логин-пароль» происходит с непосредственным участием приложения htpasswd, которая входит в дистрибутивную поставку Apache. При запуске без параметров данная утилита выведет справку, перевод которой я располагаю ниже:
Использование: htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password -c Создать новый файл. -n Не обновлять файл, вывести результат на экран. -m Зашифровать пароль с помощью [[MD5]]. -d Зашифровать пароль с помощью [[CRYPT]] (по умолчанию). -p Не шифровать пароль (открытый текст). -s Зашифровать пароль с помощью [[SHA]]. -b Указать пароль в параметре командной строки. -D Удалить указанного пользователя. На [[Windows]], [[NetWare]] и [[TPF]] системах флаг '-m' используется по умолчанию. На всех остальных системах флаг '-p' может не работать.
Примеры работы htpasswd
Таким образом, чтобы создать файл с логином и паролем для авторизации с зашифрованным паролем в MD5, потребуется выполнить команду:
htpasswd -bcm /path/to/.htpasswd sampleuser samplepass
Adding password for user sampleuser
Результатом будет файл .htpasswd со строкой:
sampleuser:$apr1$i5Kx715D$qkWbaZLztXohMGOdfCUy5/
Для того, чтобы добавить пользователя к уже существующим в файл, выполните команду
htpasswd -bm /path/to/.htpasswd sampleuser1 samplepass1
Updating password for user sampleuser1
В случае, если в файле указано больше одного пользователя и вам требуется удалить какого-либо, команда будет выглядеть так:
htpasswd -D /path/to/.htpasswd sampleuser2
Deleting password for user sampleuser2
Шпаргалки
Еще некоторые примеры, которые могут пригодиться при работе с .htaccess.
Запретить все в Apache 2.2.x:
Order deny,allow Deny from all
Запретить все в Apache 2.4.x:
Require all denied
Блокировка ботов в Apache 2.2.x:
SetEnvIfNoCase User-Agent «DotBot» bad_bot Deny from env=bad_bot
Блокировка ботов в Apache 2.4.x:
<If «%{HTTP_USER_AGENT} =~ m#DotBot#i»> Require expr %{HTTP_USER_AGENT} != ‘DotBot’
# DotBot — один из примеров, таких ботов может быть много.
Разрешить доступ к определенному файлу с определенного IP в Apache 2.2.x:
<Files путь_к_файлу> Order Deny,Allow Deny from all Allow from 1.1.1.1 </Files>
Разрешить доступ к определенному файлу с определенного IP в Apache 2.4.x:
<Files путь_к_файлу> Require ip 1.1.1.1 </Files>
Полезные ссылки
- Описание файла .htaccess для Apache 2.2
- Описание файла .htaccess для Apache 2.4
- Описание модуля auth_basic в Apache 2.2
- Описание модуля auth_basic в Apache 2.4
- Описание модуля authn_file в Apache 2.2
- Описание модуля authn_file в Apache 2.4
- Онлайн-генератор парольной защиты директории
- Онлайн-генератор ограничения по IP-адресам
- Описание утилиты htpasswd для Apachw 2.2.x
- Описание утилиты htpasswd для Apache 2.4.x