6.1.5 Блокування доступу до файлів або по IP через .htaccess
Файл .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, щоб блокування залишалося актуальним.