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
у цьому ключі.
Блокування файлів з певними розширеннями
Щоб заборонити доступ до файлів, наприклад з розширеннями .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
):
``apache GeoIPDBFile /path/to/GeoLite2-Country.mmdb
**4.** Після виконання попередніх кроків додайте наступні правила в `.htaccess` для автоматичного блокування:
```apache
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, наприклад:
```bash
apachectl configtest
```
* Перед внесенням змін до `.htaccess` створіть резервну копію файлу.
* Перевірте коректність блокування через VPN або проксі-сервери, щоб переконатися, що користувачі із заборонених країн дійсно заблоковані.
* Велика кількість правил `.htaccess` може знизити продуктивність. Якщо це проблема, перенесіть правила до основної конфігурації Apache для зазначеного WWW-домену.
* Регулярно оновлюйте базу GeoIP, щоб блокування залишалося актуальним.