Блог компанії 3v-Hosting

Як перевірити права доступу до файлів у Linux

Адміністрування

8 хв.


Одна з найпоширеніших помилок у Linux, з якою знайомі чи не всі адміністратори - це помилка Permission denied. Загалом вона означає, що користувач або запущений процес намагається виконати операцію, для якої у нього недостатньо прав доступу. Наприклад, веб-сервер не може прочитати файл конфігурації, PHP-додаток відмовляється зберігати завантажені зображення або ваш Bash-скрипт не запускається, хоча сам файл існує і знаходиться на своєму місці.

Причини появи цієї помилки можуть бути різними, але найчастіше подібні проблеми виникають після перенесення сайту на новий VPS, відновлення резервної копії або, наприклад, зміни налаштувань веб-сервера.

Найпростіше рішення цієї проблеми, яке часто пропонують на форумах - це виконати команду chmod 777 {file_name}. Так, помилка після цього дійсно може зникнути, але разом із нею зникнуть і обмеження доступу для решти користувачів системи. На робочому сервері, де зберігаються важливі файли та дані, такий підхід може створити величезні проблеми з безпекою. Тому НІКОЛИ так не робіть, доки не переконаєтеся, що для цього конкретного файлу дійсно потрібні такі права (що навряд чи).

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

У цій короткій статті ми з вами розглянемо основні команди для перевірки прав доступу та способи виправлення найпоширеніших помилок, пов’язаних із правами доступу.

 

 

 

 

Як влаштовані права доступу в Linux

Система прав доступу в Linux успадкувала її від Unix, де подібний механізм з’явився ще в 1970-х роках. Уже тоді Unix розроблялася як багатокористувацька операційна система, в якій кілька людей могли одночасно працювати на одному комп’ютері. І щоб користувачі не могли довільно читати, змінювати або видаляти чужі файли, знадобився механізм розмежування доступу.

Linux зберіг цю модель практично без змін, оскільки вона дуже проста і водночас елегантна. Незважаючи на її вік, вона досі використовується на серверах, робочих станціях та інших пристроях під керуванням різних дистрибутивів ОС Linux.

Суть методу досить проста. Кожен файл і каталог має власника, групу та набір прав доступу. При спробі відкрити або змінити файл ядро Linux перевіряє, від імені якого користувача виконується операція та які дії йому дозволено.

Для цього використовуються три категорії:

  • Owner (u) - власник файлу.
  • Group (g) - користувачі групи, до якої належить файл.
  • Others (o) - усі інші користувачі системи.

Для кожної категорії передбачені права доступу r (читання), w (запис) та x (виконання). Також їх можна комбінувати. Наприклад, власник може читати та змінювати файл, користувачі групи - лише читати, а решта взагалі не мати до нього доступу.

А ось під час роботи з каталогами є нюанс. Право доступу r дозволяє переглядати список імен файлів, x - звертатися до об’єктів усередині каталогу за відомими іменами, а w - змінювати його вміст. Тобто для створення та видалення файлів зазвичай потрібні одночасно w та x права.

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

Така система досить проста для повсякденного адміністрування, хоча й має свої обмеження. Так, для більш гнучкого управління доступом у системах Linux використовуються й додаткові механізми, такі як, наприклад, ACL (Access Control Lists), які дозволяють призначати окремі дозволи конкретним користувачам і групам.

Тепер, коли ми розібралися з суттю, перейдемо до практики.

 

 

 

 

Перевірка прав командою ls -l

Найпростіший спосіб переглянути права доступу до конкретного файлу - це виконати команду:

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

 

Найпоширенішими комбінаціями є такі поєднання:

Права доступу

Типове застосування

644

Звичайні файли сайту

755

Каталоги та виконувані файли

600

Приватні ключі та файли, доступні лише власнику

700

Особисті каталоги користувача

640

Конфігураційні файли сайту з паролями (наприклад, .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.

 

 

 

 

Чому файл доступний, але виникає Permission denied

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

3v-Hosting Team

Автор

3v-Hosting Team

Команда 3v-Hosting складається з групи відданих своїй справі інженерів та операторів, які повністю присвятили себе створенню та підтримці основи наших сервісів. Щодня ми занурюємося у світ віртуальних та виділених серверів, займаючись усім, від розгортання та моніторингу до усунення реальних проблем, що виникають у виробничих середовищах. Більшість наших статей ґрунтуються на практичному досвіді, а не лише на теорії. Ми ділимося своїми думками щодо викликів, з якими стикаємося: перебоїв у роботі, помилок у налаштуваннях, складнощів мережевої взаємодії та архітектурних рішень, що впливають на стабільність і надійність. Наша місія проста - ми хочемо ділитися знаннями, які допоможуть вам керувати своїми проектами з меншою кількістю несподіванок та набагато більшою передбачуваністю.