Налаштування gzip та Brotli в Nginx: стиснення HTML, CSS та JavaScript, вибір рівня стиснення, зменшення навантаження на сервер, перевірка та усунення типових п...
Блог компанії 3v-Hosting
8 хв.
Одна з найпоширеніших помилок у Linux, з якою знайомі чи не всі адміністратори - це помилка Permission denied. Загалом вона означає, що користувач або запущений процес намагається виконати операцію, для якої у нього недостатньо прав доступу. Наприклад, веб-сервер не може прочитати файл конфігурації, PHP-додаток відмовляється зберігати завантажені зображення або ваш Bash-скрипт не запускається, хоча сам файл існує і знаходиться на своєму місці.
Причини появи цієї помилки можуть бути різними, але найчастіше подібні проблеми виникають після перенесення сайту на новий VPS, відновлення резервної копії або, наприклад, зміни налаштувань веб-сервера.
Найпростіше рішення цієї проблеми, яке часто пропонують на форумах - це виконати команду chmod 777 {file_name}. Так, помилка після цього дійсно може зникнути, але разом із нею зникнуть і обмеження доступу для решти користувачів системи. На робочому сервері, де зберігаються важливі файли та дані, такий підхід може створити величезні проблеми з безпекою. Тому НІКОЛИ так не робіть, доки не переконаєтеся, що для цього конкретного файлу дійсно потрібні такі права (що навряд чи).
На щастя, у Linux є кілька простих інструментів для роботи з правами доступу до файлів і каталогів, які дозволяють з’ясувати, кому належить той чи інший файл, які операції з ним можна виконувати та чому система відмовляє у доступі до файлу.
У цій короткій статті ми з вами розглянемо основні команди для перевірки прав доступу та способи виправлення найпоширеніших помилок, пов’язаних із правами доступу.
Система прав доступу в Linux успадкувала її від Unix, де подібний механізм з’явився ще в 1970-х роках. Уже тоді Unix розроблялася як багатокористувацька операційна система, в якій кілька людей могли одночасно працювати на одному комп’ютері. І щоб користувачі не могли довільно читати, змінювати або видаляти чужі файли, знадобився механізм розмежування доступу.
Linux зберіг цю модель практично без змін, оскільки вона дуже проста і водночас елегантна. Незважаючи на її вік, вона досі використовується на серверах, робочих станціях та інших пристроях під керуванням різних дистрибутивів ОС Linux.
Суть методу досить проста. Кожен файл і каталог має власника, групу та набір прав доступу. При спробі відкрити або змінити файл ядро Linux перевіряє, від імені якого користувача виконується операція та які дії йому дозволено.
Для цього використовуються три категорії:
Для кожної категорії передбачені права доступу r (читання), w (запис) та x (виконання). Також їх можна комбінувати. Наприклад, власник може читати та змінювати файл, користувачі групи - лише читати, а решта взагалі не мати до нього доступу.
А ось під час роботи з каталогами є нюанс. Право доступу r дозволяє переглядати список імен файлів, x - звертатися до об’єктів усередині каталогу за відомими іменами, а w - змінювати його вміст. Тобто для створення та видалення файлів зазвичай потрібні одночасно w та x права.
Тому часто трапляються випадки, коли навіть файл із дозволеним читанням може виявитися недоступним, оскільки у користувача немає права проходу через один із батьківських каталогів.
Така система досить проста для повсякденного адміністрування, хоча й має свої обмеження. Так, для більш гнучкого управління доступом у системах Linux використовуються й додаткові механізми, такі як, наприклад, ACL (Access Control Lists), які дозволяють призначати окремі дозволи конкретним користувачам і групам.
Тепер, коли ми розібралися з суттю, перейдемо до практики.
Найпростіший спосіб переглянути права доступу до конкретного файлу - це виконати команду:
ls -l /var/www/html/index.php
Приклад результату:
-rw-r--r-- 1 www-data www-data 2450 Oct 20 12:30 index.php
Послідовність -rw-r--r-- показує тип файлу та його права. Перший символ - означає звичайний файл (d позначає каталог). Решта символів розділені на групи по три.
У цьому прикладі власник www-data може читати та змінювати файл, а група та інші користувачі - лише читати.
Для перевірки самого каталогу використовується команда:
ls -ld /var/www/html
Параметр -d потрібен, щоб отримати інформацію про каталог, а не про його вміст.
У Linux права доступу часто записують числами: 644, 755, 600. Кожній дії відповідає значення:
r = 4 - читання.w = 2 - запис.x = 1 - виконання.
Числа складаються окремо для кожної категорії користувачів.
Наприклад, 755 означає повний доступ для власника (7 = 4 + 2 + 1) та дозвіл на читання й виконання для решти (5 = 4 + 1).
Перевірити числові права можна за допомогою команди stat:
stat -c '%a %n' /var/www/html/index.php
Результат:
644 /var/www/html/index.php
Найпоширенішими комбінаціями є такі поєднання:
|
Права доступу |
Типове застосування |
|---|---|
|
|
Звичайні файли сайту |
|
|
Каталоги та виконувані файли |
|
|
Приватні ключі та файли, доступні лише власнику |
|
|
Особисті каталоги користувача |
|
|
Конфігураційні файли сайту з паролями (наприклад, .env або wp-config.php) |
Тут ми навели лише найпоширеніші варіанти, але конкретні права доступу залежать від вимог вашого додатка або умов безпеки вашого сервера.
Іноді помилка з правами доступу може виникнути через неправильного власника файлу або каталогу. Таке часто трапляється після перенесення сайту між серверами або відновлення файлів сайту з резервної копії.
Дізнатися власника та групу можна за допомогою команди:
stat -c '%U %G' /var/www/html/config.php
Наприклад:
root www-data
Тут власником є root, а групою - www-data.
Якщо додаток працює від імені www-data, то потрібно перевірити, чи може цей користувач прочитати даний файл:
sudo -u www-data test -r /var/www/html/config.php && echo "Читання дозволено"
Якщо повідомлення не з’явилося, то перевірка завершилася без успішного підтвердження доступу.
Зверніть увагу, що команда test -r перевіряє права лише самого файлу. І якщо повідомлення не з’явилося, то проблема може бути не в самому файлі, а, наприклад, у відсутності права на виконання x у користувача www-data щодо одного з батьківських каталогів.
Аналогічно можна перевірити права на запис, замінивши в команді параметр -r на параметр -w.
Припустимо, що файл має права 644, проте програма все одно не може його відкрити. А причина такої поведінки може критися в батьківському каталозі. І в цьому випадку зручно перевірити весь ланцюжок каталогів на шляху до потрібного файлу. Робиться це командою:
namei -l /srv/project/data/report.txt
Вона покаже права доступу кожного елемента шляху, і якщо у користувача, від імені якого виконується ця команда, відсутнє право на виконання x хоча б у одному з батьківських каталогів, то доступ до файлу буде заблоковано.
Бувають і менш очевидні причини. Наприклад, додаткові правила ACL або обмеження SELinux та AppArmor.
Помітити їх можна безпосередньо у виведенні команди ls -l. Так, якщо для файлу налаштовані правила ACL, то в кінці списку прав з’являється знак плюс (наприклад, -rw-r-----+), а при використанні SELinux - крапка (наприклад, -rw-r--r--.).
Перевірити правила ACL можна за допомогою команди:
getfacl /var/www/html/config.php
А якщо файл не запускається при правильних правах доступу, тоді потрібно перевірити параметри монтування:
findmnt -T /var/www/html/script.sh -o TARGET,OPTIONS
Приклад виводу для файлової системи, змонтованої з параметром noexec:
TARGET OPTIONS /var/www rw,nosuid,nodev,noexec,relatime
Тут rw означає, що файлова система доступна для читання та запису, а noexec забороняє безпосередній запуск виконуваних файлів з цього розділу.
Якщо ж файлова система змонтована в режимі «тільки для читання», то вивід може виглядати так:
TARGET OPTIONS /var/www ro,relatime
А ось при звичайному монтуванні, без цих обмежень, вивід має бути таким:
TARGET OPTIONS /var/www rw,relatime
Звісно, це умовні приклади, і реальні параметри залежать від конфігурації вашого сервера. Але суть, як ми вважаємо, ви зрозуміли.
Для зміни прав доступу до файлів і каталогів використовується команда chmod (від Change Mode):
chmod 640 /var/www/html/config.php
Тепер власник може читати та змінювати файл, група - лише читати, а всі інші користувачі не мають доступу до цього файлу.
Якщо ж проблема пов’язана з власником, тоді застосовується команда chown (від Change Owner):
sudo chown www-data:www-data /var/www/html/config.php
Зазначимо, що призначати власником користувача www-data потрібно лише в тих випадках, коли це дійсно потрібно вашому додатку, наприклад, якщо веб-сервер або PHP-процес має створювати та змінювати файли в певному каталозі. Для звичайних файлів сайту, які достатньо лише читати, така зміна власника зазвичай не потрібна. Більше того, якщо всі файли належать користувачеві www-data, то вразливість у веб-додатку може дозволити зловмиснику змінювати вихідний код або конфігурацію вашого сайту. Тому права на запис краще надавати лише тим каталогам і файлам, де вони дійсно необхідні.
Після перенесення сайту іноді доводиться виправляти права доступу одразу для безлічі об’єктів. Для каталогів і звичайних файлів їх краще задавати окремо:
find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +
Це типова схема для файлів публічного сайту, але застосовувати її до всього проєкту без перевірки небезпечно. Закриті конфігурації можуть вимагати більш суворих прав, а виконувані файли, наприклад, дозволу на виконання.
ВАЖЛИВО! Ще раз нагадаємо, що особливо небажано використовувати chmod -R 777, оскільки ця команда надає права на запис і виконання всім користувачам системи, що створює зайві ризики.
Отже, для усунення більшості проблем із правами доступу в Linux достатньо знати команди ls -l, stat та namei. Вони дозволяють швидко перевірити права доступу, власника файлу та доступність батьківських каталогів. Однак ніколи не варто забувати про безпеку свого сервера. Тому до роботи з правами доступу слід підходити розсудливо, заздалегідь спланувавши ті чи інші дії та перевіривши, які права і кому ви надаєте.
Покрокова інструкція з налаштування реплікації PostgreSQL 16 між двома VPS. Налаштування Primary та Standby, потокова реплікація, передача WAL, моніторинг та пе...
Як працює маскування домену та як приховати справжню URL-адресу сайту за допомогою iframe та Reverse Proxy. Налаштування Nginx, вплив на SEO, безпека та типові ...
Що робити після першого входу на VPS, як правильно налаштувати Linux-сервер, захистити SSH, закрити зайві порти та підготувати систему до запуску сайту.