15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
09.10.2024

Як налаштувати автентифікацію Apache htpasswd на Ubuntu

Автентифікація `htpasswd` в Apache забезпечує HTTP Basic Authentication — механізм контролю доступу на стороні сервера, який вимагає від браузера введення імені користувача та пароля перед відображенням вмісту. Вона не потребує жодного коду на рівні застосунку, повністю працює в межах модульної системи Apache та застосовується на рівні веб-сервера до виконання будь-якої серверної логіки PHP, Python або Node.js.

Це робить її найшвидшим і найнадійнішим методом захисту тестових середовищ, внутрішніх адміністративних панелей, збірок для розробки та будь-яких каталогів, які мають бути приховані від публічного інтернету без розгортання повноцінного провайдера ідентифікації.

Коли htpasswd є правильним інструментом — а коли ні

Перш ніж вводити будь-яку команду, зрозумійте модель загроз. HTTP Basic Authentication передає облікові дані у вигляді рядка, закодованого в Base64, у заголовку `Authorization`. Base64 — це не шифрування — він тривіально оборотний. Це означає, що автентифікація htpasswd є безпечною лише при використанні через HTTPS. Без TLS облікові дані передаються у відкритому вигляді будь-якому спостерігачу в мережі.

Відповідні випадки використання:

  • Тестові та передвиробничі середовища
  • Внутрішні інструменти та панелі розробників
  • Тимчасове обмеження доступу до сайту під час технічного обслуговування
  • Додавання додаткового рівня автентифікації перед застосунком із власним входом
  • Захист `wp-admin` або `xmlrpc.php` WordPress на рівні сервера

Невідповідні випадки використання:

  • Основна автентифікація для публічних застосунків, що обробляють конфіденційні дані користувачів
  • Середовища, де ротація облікових даних має перевірятися та реєструватися
  • Багатокористувацькі системи, що вимагають контролю доступу на основі ролей

Якщо ваш випадок використання передбачає облікові записи виробничих користувачів, розгляньте натомість OAuth2, LDAP або управління сесіями на рівні застосунку.

Передумови

  • Сервер Ubuntu 20.04, 22.04 або 24.04 з доступом root або `sudo`
  • Apache 2.4, встановлений або доступний для встановлення через `apt`
  • Зареєстрований домен із DNS, що вказує на ваш сервер (настійно рекомендується для SSL)
  • Базові знання командного рядка Linux та текстових редакторів

Якщо ви починаєте з нуля, середовище VPS Хостинг надає повний доступ root та чистий образ Ubuntu — ідеальна основа для цієї конфігурації.

Крок 1: Встановлення Apache2

Якщо Apache ще не встановлено, оновіть індекс пакетів та встановіть його:

“`bash

sudo apt update && sudo apt install apache2 -y

“`

Перевірте встановлення та переконайтеся, що служба працює:

“`bash

sudo systemctl status apache2

apache2 -v

“`

Увімкніть автоматичний запуск Apache після перезавантаження:

“`bash

sudo systemctl enable apache2

“`

Стандартний кореневий каталог документів Apache — `/var/www/html`. Основна конфігурація сайту знаходиться за адресою `/etc/apache2/sites-available/000-default.conf`.

Крок 2: Встановлення пакета apache2-utils

Двійковий файл `htpasswd` є частиною пакета `apache2-utils`. На більшості інсталяцій Ubuntu цей пакет встановлюється разом з Apache, але явно підтвердьте його наявність:

“`bash

which htpasswd

“`

Якщо команда нічого не повертає, встановіть пакет:

“`bash

sudo apt install apache2-utils -y

“`

Пакет `apache2-utils` також надає `htdigest` (для Digest Authentication), `ab` (Apache Bench для навантажувального тестування) та `htdbm` (для файлів паролів у форматі DBM). Для більшості сценаріїв `htpasswd` зі стандартним хешуванням bcrypt або MD5 є достатнім.

Крок 3: Створення файлу .htpasswd та додавання користувачів

Вибір алгоритму хешування паролів

Це деталь, яку оригінальна документація майже повсюдно опускає. Утиліта `htpasswd` підтримує кілька схем хешування, і вибір має реальні наслідки для безпеки:

АлгоритмПрапорРівень безпекиПримітки
———–—————————-
bcrypt`-B`СильнийРекомендовано; обчислювально витратний за задумом
SHA-256/512 (apr1-md5)`-m`ПомірнийСтандартний на більшості систем Linux; прийнятний
MD5 (застарілий)`-m` у деяких збіркахСлабкийНе використовуйте для нових розгортань
Відкритий текст`-p`ВідсутнійНіколи не використовуйте у виробництві
SHA-1`-s`СлабкийЗастарілий; вразливий до атак грубої сили

Завжди використовуйте bcrypt для нових файлів `.htpasswd`:

“`bash

sudo htpasswd -cB /etc/apache2/.htpasswd your_username

“`

Розбір прапорів:

  • `-c` — Створює новий файл. Критичне попередження: Якщо файл вже існує, `-c` мовчки перезаписує його, видаляючи всіх існуючих користувачів. Використовуйте `-c` лише один раз, під час першого створення файлу.
  • `-B` — Примусове використання хешування bcrypt
  • `/etc/apache2/.htpasswd` — Шлях до цільового файлу, навмисно розміщеного поза кореневим каталогом веб-сервера
  • `your_username` — Замініть на фактичне ім’я користувача

Вам буде запропоновано ввести та підтвердити пароль. Отриманий запис у файлі виглядає так:

“`

your_username:$2y$05$randomsaltandhashedpasswordstring

“`

Додавання додаткових користувачів

Щоб додати більше користувачів до існуючого файлу, опустіть прапор `-c`:

“`bash

sudo htpasswd -B /etc/apache2/.htpasswd second_user

sudo htpasswd -B /etc/apache2/.htpasswd third_user

“`

Видалення користувача

“`bash

sudo htpasswd -D /etc/apache2/.htpasswd username_to_remove

“`

Перевірка вмісту файлу

“`bash

sudo cat /etc/apache2/.htpasswd

“`

Кожен рядок представляє одного користувача у форматі `username:hashed_password`.

Крок 4: Налаштування Apache для захисту паролем

Існує два методи застосування автентифікації htpasswd: через файли `.htaccess` або безпосередньо в конфігурації віртуального хоста. Кожен має відмінні наслідки для продуктивності та обслуговування.

Порівняння методів

ФакторМетод .htaccessМетод конфігурації віртуального хоста
——–—————–—————————
Потребує перезапуску ApacheНіТак
Вплив на продуктивністьВищий (Apache читає при кожному запиті)Нижчий (завантажується один раз під час запуску)
ДеталізаціяДля кожного каталогу, делегованаЦентралізована у файлі конфігурації
Рекомендовано дляСпільний хостинг, динамічна конфігурація каталогівВиділені сервери/VPS з доступом root
Рівень безпекиДещо слабший (файл має бути доступний для читання веб-процесом)Сильніший (конфігурація недоступна через веб)

На Виділеному сервері або VPS, де у вас є повний доступ root, метод конфігурації віртуального хоста завжди є кращим з точки зору продуктивності та зручності обслуговування.

Варіант 1: Використання файлів .htaccess

Цей метод вимагає, щоб `AllowOverride` було увімкнено для цільового каталогу. Спочатку відредагуйте конфігурацію сайту:

“`bash

sudo nano /etc/apache2/sites-available/000-default.conf

“`

Знайдіть або додайте блок `<Directory>` для вашого кореневого каталогу веб-сервера та встановіть `AllowOverride All`:

“`apache

<VirtualHost *:80>

ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

<Directory /var/www/html>

AllowOverride All

Options -Indexes +FollowSymLinks

Require all granted

</Directory>

</VirtualHost>

“`

Перезапустіть Apache для застосування змін конфігурації:

“`bash

sudo systemctl restart apache2

“`

Тепер створіть файл `.htaccess` всередині каталогу, який ви хочете захистити:

“`bash

sudo nano /var/www/html/.htaccess

“`

Додайте наступні директиви автентифікації:

“`apache

AuthType Basic

AuthName "Restricted Access — Authorized Personnel Only"

AuthUserFile /etc/apache2/.htpasswd

Require valid-user

“`

Розбір директив:

  • `AuthType Basic` — Активує HTTP Basic Authentication. Альтернативою є `Digest`, який уникає надсилання облікових даних у Base64, але має ширші проблеми сумісності.
  • `AuthName` — Рядок realm, що відображається у діалозі входу браузера. Зробіть його достатньо описовим, щоб законні користувачі розуміли, до чого вони отримують доступ.
  • `AuthUserFile` — Абсолютний шлях до файлу `.htpasswd`. Має бути доступний для читання користувачем процесу Apache (`www-data`).
  • `Require valid-user` — Надає доступ будь-якому користувачу, присутньому у файлі `.htpasswd`. Ви можете додатково обмежити доступ за допомогою `Require user alice bob`, щоб дозволити лише певні облікові записи.

Збережіть і закрийте файл. Перезапуск Apache не потрібен — зміни `.htaccess` набувають чинності негайно.

Варіант 2: Пряма конфігурація віртуального хоста (рекомендовано)

Це підхід виробничого рівня. Відредагуйте файл конфігурації віртуального хоста безпосередньо:

“`bash

sudo nano /etc/apache2/sites-available/000-default.conf

“`

Додайте блок `<Directory>` з директивами автентифікації всередині блоку `<VirtualHost>`:

“`apache

<VirtualHost *:80>

ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

ServerName yourdomain.com

<Directory "/var/www/html/protected">

AuthType Basic

AuthName "Internal Tools"

AuthUserFile /etc/apache2/.htpasswd

Require valid-user

Options -Indexes

</Directory>

</VirtualHost>

“`

Зверніть увагу на використання `/var/www/html/protected` замість усього кореневого каталогу веб-сервера. Обмеження автентифікації підкаталогом є набагато поширенішим на практиці — ви захищаєте `/admin`, `/staging` або `/api-docs`, залишаючи публічний сайт доступним.

Перевірте синтаксис конфігурації перед перезапуском:

“`bash

sudo apachectl configtest

“`

Ви повинні побачити `Syntax OK`. Якщо є помилки, Apache опише їх точно. Ніколи не перезапускайте Apache без проходження цієї перевірки у виробничих середовищах.

Перезапустіть Apache:

“`bash

sudo systemctl restart apache2

“`

Захист певних типів файлів замість каталогів

Маловідомий, але надзвичайно практичний підхід — використання `<FilesMatch>` для обмеження доступу до певних розширень файлів замість цілих каталогів:

“`apache

<FilesMatch ".(env|log|sql|bak)$">

AuthType Basic

AuthName "Restricted Files"

AuthUserFile /etc/apache2/.htpasswd

Require valid-user

</FilesMatch>

“`

Це особливо корисно для блокування прямого доступу до файлів `.env`, дампів баз даних або файлів журналів, які можуть існувати в кореневому каталозі веб-сервера з застарілих причин.

Крок 5: Увімкнення SSL перед запуском

Як зазначалося раніше, HTTP Basic Authentication через звичайний HTTP є небезпечним. Перш ніж відкривати будь-який ресурс, захищений htpasswd, для доступу з інтернету, примусово застосуйте HTTPS.

Встановіть Certbot для сертифікатів Let’s Encrypt:

“`bash

sudo apt install certbot python3-certbot-apache -y

sudo certbot –apache -d yourdomain.com

“`

Certbot автоматично змінить вашу конфігурацію Apache для перенаправлення HTTP на HTTPS та встановить сертифікат. Крім того, ви можете отримати комерційний сертифікат через SSL Сертифікати для доменів, що потребують розширеної перевірки або підстановочного покриття.

Після увімкнення SSL додайте перенаправлення HTTPS до вашого HTTP віртуального хоста:

“`apache

<VirtualHost *:80>

ServerName yourdomain.com

Redirect permanent / https://yourdomain.com/

</VirtualHost>

“`

Крок 6: Посилення дозволів файлу .htpasswd

Файл `.htpasswd` містить хешовані облікові дані. Незважаючи на те, що хеші bcrypt є обчислювально витратними для злому, файл має бути захищений на рівні файлової системи.

Встановіть власника як користувача процесу Apache та обмежте права на читання:

“`bash

sudo chown root:www-data /etc/apache2/.htpasswd

sudo chmod 640 /etc/apache2/.htpasswd

“`

Ця конфігурація означає:

  • `root` є власником файлу та може читати/записувати його
  • `www-data` (процес Apache) може читати його
  • Всі інші користувачі не мають доступу

Перевірте дозволи:

“`bash

ls -la /etc/apache2/.htpasswd

“`

Очікуваний результат:

“`

-rw-r—– 1 root www-data 89 Jan 15 10:23 /etc/apache2/.htpasswd

“`

Блокування прямого веб-доступу до .htpasswd

Якщо з будь-якої причини файл `.htpasswd` знаходиться всередині кореневого каталогу веб-сервера, додайте явне правило заборони до вашої конфігурації Apache або `.htaccess`:

“`apache

<Files ".htpasswd">

Require all denied

</Files>

“`

Це захід глибокого захисту. Файл ніколи не повинен знаходитися всередині кореневого каталогу веб-сервера, але це правило гарантує, що навіть якщо він там є, Apache поверне відповідь 403 Forbidden замість того, щоб обслуговувати файл.

Крок 7: Тестування автентифікації

Відкрийте браузер і перейдіть до захищеної URL-адреси:

“`

http://your_server_ip_or_domain/protected/

“`

Ви повинні побачити нативний діалог автентифікації браузера. Введіть облікові дані, які ви створили за допомогою `htpasswd`. Успішна автентифікація надає доступ; неправильні облікові дані повертають відповідь HTTP 401 Unauthorized.

Тестування з командного рядка

Використовуйте `curl` для перевірки поведінки автентифікації без браузера:

“`bash

Test with correct credentials — should return 200 OK

curl -u your_username:your_password -I http://yourdomain.com/protected/

Test without credentials — should return 401 Unauthorized

curl -I http://yourdomain.com/protected/

Test with wrong credentials — should return 401 Unauthorized

curl -u your_username:wrongpassword -I http://yourdomain.com/protected/

“`

Це особливо корисно в конвеєрах CI/CD або автоматизованих скриптах моніторингу, де потрібно перевірити, що автентифікація правильно застосовується після розгортань.

Розширені шаблони конфігурації

Поєднання htpasswd з контролем доступу на основі IP

Ви можете поєднати автентифікацію паролем з білим списком IP за допомогою блоків `RequireAll` або `RequireAny`:

“`apache

<Directory "/var/www/html/admin">

AuthType Basic

AuthName "Admin Panel"

AuthUserFile /etc/apache2/.htpasswd

Allow access if EITHER condition is met

<RequireAny>

Require ip 192.168.1.0/24

Require valid-user

</RequireAny>

</Directory>

“`

Або вимагати виконання ОБОХ умов одночасно (IP має збігатися І облікові дані мають бути дійсними):

“`apache

<RequireAll>

Require ip 203.0.113.0/24

Require valid-user

</RequireAll>

“`

Цей шаблон надзвичайно ефективний для адміністративних панелей: користувачі внутрішньої мережі отримують доступ із запитом пароля, тоді як зовнішні IP блокуються повністю незалежно від облікових даних.

Обмеження швидкості спроб автентифікації

HTTP Basic Authentication не має вбудованого захисту від атак грубої сили. Пом’якшіть це за допомогою `mod_evasive` або `fail2ban`:

“`bash

sudo apt install fail2ban -y

“`

Створіть власний фільтр Fail2ban для помилок автентифікації Apache за адресою `/etc/fail2ban/filter.d/apache-auth.conf`:

“`ini

[Definition]

failregex = ^<HOST> -.*"(GET|POST|HEAD).*" 401

ignoreregex =

“`

Додайте конфігурацію jail за адресою `/etc/fail2ban/jail.local`:

“`ini

[apache-auth]

enabled = true

port = http,https

filter = apache-auth

logpath = /var/log/apache2/access.log

maxretry = 5

bantime = 3600

findtime = 600

“`

Перезапустіть Fail2ban:

“`bash

sudo systemctl restart fail2ban

“`

Це блокує будь-який IP, який генерує п’ять відповідей 401 протягом десяти хвилин на одну годину — значний стримуючий фактор проти автоматизованого підбору облікових даних.

Використання блоків Location для захисту на основі URL

Для застосунків, де захищений вміст обслуговується з певного шляху URL, а не каталогу файлової системи, використовуйте `<Location>` замість `<Directory>`:

“`apache

<Location "/api/internal">

AuthType Basic

AuthName "Internal API"

AuthUserFile /etc/apache2/.htpasswd

Require user api_user service_account

</Location>

“`

Зверніть увагу на використання `Require user` з конкретними іменами користувачів замість `Require valid-user` — це обмежує доступ до кінцевої точки лише цими двома обліковими записами, навіть якщо файл `.htpasswd` містить додаткових користувачів.

Практична матриця рішень

Використовуйте цю матрицю для визначення правильного підходу до конфігурації для вашого сценарію:

СценарійРекомендований підхід
———-———————
Захист тестового підкаталогу на VPSБлок `<Directory>` віртуального хоста з bcrypt
Спільний хостинг без доступу до конфігурації ApacheМетод `.htaccess`
Адміністративна панель, доступна лише з офісного IP`RequireAll` з поєднанням IP + valid-user
Блокування файлів `.env` та `.sql` у кореневому каталозі веб-сервера`<FilesMatch>` з `Require all denied`
Сайт з високим трафіком, що потребує автентифікації на одному шляхуБлок `<Location>` у конфігурації віртуального хоста
Будь-який публічно доступний захищений ресурсОбов’язковий SSL + htpasswd + Fail2ban

Ключові технічні висновки

  • Завжди використовуйте bcrypt (прапор `-B`) при створенні файлів `.htpasswd`. Застарілі хеші MD5 та SHA-1 можна зламати за допомогою сучасного GPU обладнання за секунди.
  • Ніколи не розгортайте htpasswd через HTTP у будь-якому середовищі, доступному з інтернету. Кодування Base64 облікових даних Basic Auth не забезпечує жодної конфіденційності.
  • Надавайте перевагу конфігурації віртуального хоста над `.htaccess` на будь-якому сервері, де у вас є доступ root. Різниця в продуктивності вимірювана під навантаженням, оскільки Apache повторно читає файли `.htaccess` при кожному окремому запиті.
  • Обмежте захист мінімально необхідним каталогом або шляхом URL. Захист `/var/www/html` повністю, коли лише `/var/www/html/admin` потребує захисту, додає зайві незручності.
  • Встановіть дозволи `.htpasswd` на `640` з власником `root:www-data`. Файл ніколи не повинен бути доступним для читання всіма.
  • Впровадьте Fail2ban для запобігання атакам грубої сили. HTTP Basic Auth не має вбудованого обмеження швидкості або механізму блокування облікових записів.
  • Перевіряйте конфігурацію Apache за допомогою `apachectl configtest` перед кожним перезапуском у виробничих середовищах.
  • Поєднуйте htpasswd з вашою доменною інфраструктурою. Правильно налаштований домен з DNS та SSL є основою — керуйте своїм через Реєстрацію доменів, щоб тримати всі компоненти інфраструктури у одного провайдера.

Для команд, що керують кількома захищеними середовищами, VPS з cPanel надає графічний інтерфейс для керування каталогами, захищеними паролем, без прямого доступу до командного рядка, що може зменшити кількість помилок конфігурації в менш технічних командах.

FAQ

Чи працює автентифікація htpasswd з усіма браузерами?

Так. HTTP Basic Authentication визначено в RFC 7617 і підтримується кожним сучасним браузером, включаючи Chrome, Firefox, Safari та Edge. Мобільні браузери також підтримують її. Зовнішній вигляд нативного діалогу браузера відрізняється залежно від браузера та операційної системи, але базова поведінка протоколу є ідентичною.

Що відбувається, якщо шлях до файлу .htpasswd у конфігурації Apache неправильний?

Apache поверне помилку 500 Internal Server Error для будь-якого запиту до захищеного ресурсу та запише помилку, подібну до `Could not open password file: /path/to/.htpasswd`, у `/var/log/apache2/error.log`. Завжди перевіряйте правильність абсолютного шляху та наявність у користувача `www-data` прав на читання файлу.

Чи можна використовувати htpasswd для захисту адміністративної зони сайту WordPress?

Так, і це є рекомендованою практикою посилення безпеки. Додавання захисту htpasswd до `/wp-admin/` та обмеження доступу до `xmlrpc.php` додає рівень автентифікації на рівні сервера до виконання власної логіки входу WordPress, блокуючи автоматизованих ботів та скрипти грубої сили, які ніколи не досягають PHP. Налаштуйте це як блок `<Directory>` у вашому віртуальному хості, а не `.htaccess` для кращої продуктивності.

Як оновити пароль користувача в існуючому файлі .htpasswd?

Запустіть `htpasswd` без прапора `-c` та вкажіть існуюче ім’я користувача: `sudo htpasswd -B /etc/apache2/.htpasswd existing_user`. Вам буде запропоновано ввести новий пароль. Команда перезаписує лише запис цього користувача, залишаючи всіх інших користувачів незмінними.

Чи існує обмеження на кількість користувачів, які можна зберігати у файлі .htpasswd?

Apache не встановлює жорсткого обмеження. Однак, оскільки Apache виконує лінійне сканування файлу для кожного запиту автентифікації, продуктивність помітно знижується при дуже великих файлах — зазвичай понад кілька сотень користувачів. Для середовищ, що вимагають автентифікації для десятків або сотень користувачів, розгляньте `mod_authn_dbd` з бекендом бази даних або автентифікацію LDAP через `mod_authnz_ldap`, які розроблені для масштабування.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати