6.1.5 Блокировка доступа к файлам или по IP через .htaccess

Htaccess Banner

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

Предварительные требования

.htaccess работает на уровне папок: правила, прописанные в этом файле, применяются ко всем файлам и подпапкам в текущей директории. Если в подпапке присутствует собственный .htaccess, его настройки перекрывают родительские ниже по древу. И так далее. Такой древообразный подход весьма гибкий, но требует внимательного подхода к структуре файлов.

Дополнительно: на практике это значит, что при наличии .htaccess только в корневой директории сайта (к примеру www/mysite.com/), его правила будут применяться ко всем файлам сайта (если отдельные директории не находятся где-то вне корневой папки). Если же мы добавим еще один .htaccess в директорию www/mysite.com/admin, то к директории /admin и нижестоящим правила нового .htaccess переписывать правила родительского .htaccess в корневой директории.

Важно: для работы .htaccess необходимо убедиться, что в конфигурации Apache включена директива AllowOverride, разрешающая использование определённых типов правил. Но на наших услугах хостинга эта директива включена по умолчанию.

Блокировка доступа к файлам

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

Блокировка файлов с определенными расширениями

Чтобы запретить доступ к файлам, например с расширениями .ini, .log и .sh, добавьте в файл .htaccess следующий код:

<FilesMatch "\.(ini|log|sh)$">
    Require all denied
</FilesMatch>

Объяснение директив:

  • <FilesMatch>. Указывает, к каким файлам будут применяться правила. Регулярное выражение в кавычках определяет целевые расширения файлов.
  • Require all denied. Полностью запрещает доступ к указанным файлам для всех пользователей. При попытке открыть такой файл в браузере, пользователь получит ошибку 403 Forbidden.
Добавление пользовательского сообщения об ошибке вместо стандартного

Чтобы сделать сообщение об ошибке более информативным, Вы можете определить собственный текст для ошибки 403. Для этого добавьте строку:

ErrorDocument 403 "Доступ к этому файлу запрещен."

Теперь при попытке доступа к защищенному файлу пользователь увидит понятное сообщение вместо стандартной ошибки.

Практические рекомендации:

  • Убедитесь, что ваши правила .htaccess не блокируют доступ к файлам, необходимым для работы сайта (например, .css, .js или картинкам).
  • Тестируйте изменения, чтобы избежать непреднамеренной блокировки. Используйте инструменты браузера или команду curl для проверки.

Блокировка доступа по IP-адресу

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

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

Чтобы запретить доступ с конкретных IP-адресов или диапазонов, используйте следующую конфигурацию в .htaccess:

Order Allow,Deny
Allow from all
Deny from 192.168.1.1
Deny from 203.0.113.0/24
</RequireAll>

Объяснение директив:

  • Order Allow,Deny. Определяет порядок применения правил. В данном случае сначала разрешается доступ (Allow), а затем применяется запрет (Deny).
  • Allow from all. Разрешает доступ всем пользователям по умолчанию.
  • Deny from. Блокирует доступ с указанных IP-адресов или диапазонов.

Практические рекомендации:

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

Блокировка доступа по странам

Для ограничения доступа на основе геолокации требуется использовать базу данных IP-адресов, соответствующих определенным странам. Такие списки можно получить у сервисов, как IP2Location или MaxMind.

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

Order Allow,Deny
Allow from all
Deny from 5.6.7.0/24  # Пример IP-диапазона для страны A
Deny from 8.9.10.0/24 # Пример IP-диапазона для страны B

На практике такие списки могут быть очень длинными, о чем следует предупредить заранее.

Практические рекомендации:

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

  • Если блокируемых диапазонов много, правила .htaccess могут замедлить загрузку сайта. В этом случае рассмотрите использование модуля mod_geoip (об этом ниже).

  • Проверьте работоспособность настроек, используя VPN или прокси-серверы для эмуляции доступа из запрещенных стран.

Автоматизация блокировки по странам

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

Внимание: mod_geoip по умолчанию не установлен на наших серверах shared-хостинга и установить его по запросу возможности нет. Но установить его можно на Вашем виртуальном или выделенном сервере. Проверить же его факт наличия на Вашем сервере с доступом root можно следующим образом:

apachectl -M | grep geoip

1. Если модуль отсутствует, установите его через менеджер пакетов вашей ОС. Например, для Ubuntu можно использовать следующую команду:

apt-get install libapache2-mod-geoip

Учтите: Модуль mod_geoip поддерживается в Apache 2.2 и 2.4. Убедитесь, что Ваш сервер использует совместимую версию (обычно apache2 -v).

2. Скачайте базу данных GeoIP (например, бесплатную версию GeoLite2 от MaxMind).

3. Укажите путь к базе в конфигурации Apache (обычно в httpd.conf или apache2.conf):

GeoIPDBFile /path/to/GeoLite2-Country.mmdb

4. После выполнения предварительных шагов добавьте следующие правила в .htaccess для автоматической блокировки:

GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry

Order Allow,Deny
Allow from all
Deny from env=BlockCountry

Объяснение директив

  • GeoIPEnable On. Включает использование модуля mod_geoip.
  • SetEnvIf GEOIP_COUNTRY_CODE. Устанавливает переменную окружения BlockCountry для пользователей из указанных стран (например, России и Китая).
  • Order Allow,Deny и Deny from env=BlockCountry. Разрешает доступ всем, кроме тех, кто соответствует переменной окружения BlockCountry.

Практические рекомендации:

  • Используйте команду для проверки целостности конфигурации Apache, например:
apachectl configtest
  • Перед внесением изменений в .htaccess создайте резервную копию файла.

  • Проверьте корректность блокировки через VPN или прокси-серверы, чтобы убедиться, что пользователи из запрещенных стран действительно заблокированы.

  • Большое количество правил .htaccess может снизить производительность. Если это проблема, перенесите правила в основную конфигурацию Apache для указанного WWW-домена.

  • Регулярно обновляйте базу GeoIP, чтобы блокировка оставалась актуальной.