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 будуть поширюватися тільки на типи файлів, які обробляє Apache2. Якщо у вас на хостингу не спрацьовують тих чи інших правил, рекомендуємо уточнити цей момент у підтримці Вашого хостингу.

Іноді важливо обмежити доступ до певних типів файлів, щоб захистити конфіденційні дані, журнали роботи системи або скрипти від стороннього доступу. Давайте розберемо можливості .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

Пояснення директив:

  • Order Allow,Deny. Визначає порядок застосування правил. В даному випадку спочатку дозволяється доступ (Allow), а потім застосовується заборона (Deny). У випадку .htaccess це працює за іншим принципом ніж у традиційних фаєрволів і зрештою Deny from 192.168.1.1 дійсно відпрацює незважаючи на Allow from all якщо порядок вказаний Allow, а потім Deny.
  • Allow from all. Дозволяє доступ всім користувачам за промовчанням.
  • Deny from. Блокує доступ із зазначених IP-адрес або діапазонів.
Обмеження доступу по IP-адресам: заборонити всім, дозволити переліченим

Якщо Ви хочете спочатку заборонити доступ всім, а потім дозволити доступ лише певним IP-адресам або підмережам, директива .htaccess буде виглядати так:

Order Deny,Allow
Deny from all
Allow from 192.168.1.1
Allow from 203.0.113.0/24

Пояснення:

  • Order Deny,Allow. Вказує порядок застосування правил. У цьому випадку спочатку забороняється доступ (Deny), а потім дозволяється доступ (Allow). У випадку .htaccess це працює за іншим принципом ніж у традиційних фаєрволів і зрештою Allow from 192.168.1.1 дійсно відпрацює незважаючи на Deny from all якщо порядок вказаний Deny, а потім Allow.
  • Deny from all. Забороняє доступ всім користувачам за промовчанням.
  • Allow 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, щоб блокування залишалося актуальним.