Повний гайд із прав доступу до файлів у Linux: chmod, chown та інше
Права доступу до файлів у Linux визначають, хто може читати, змінювати, виконувати файли й каталоги або отримувати до них доступ. Вони впливають на повсякденну роботу із сервером, зокрема на розгортання, SSH-ключі, скрипти, завантаження файлів, резервні копії, журнали та спільні папки.
Цей гайд призначений для розробників, адміністраторів, початківців у DevOps, власників сайтів і всіх, хто працює з Linux через термінал. Вам знадобляться лише доступ до командного рядка та базові інструменти, як-от ls, chmod, chown, chgrp і find.
Якщо ви керуєте сайтами, застосунками, скриптами або базами даних на Linux VPS-сервері, розуміння прав доступу до файлів допомагає знаходити справжню причину проблем із доступом замість того, щоб покладатися на небезпечні рішення на кшталт chmod 777.
Модель прав доступу в Linux
Права доступу в Linux побудовано навколо трьох рівнів доступу: користувач, група та інші. Користувач - це власник файлу або каталогу. Група дає змогу кільком обліковим записам спільно мати контрольований доступ. Інші - це решта користувачів системи.
Ця модель проста, але практична для реальної роботи із сервером. Користувач для розгортання може керувати файлами застосунку, група вебсервера може читати те, що їй потрібно, а стороннім користувачам можна заборонити змінювати конфіденційні дані.
Linux також використовує три основні типи прав: читання, запис і виконання. Вони здаються простими, але для файлів і каталогів поводяться по-різному, і саме з цього починається багато помилок із правами доступу.
Користувачі, групи та інші, читання, запис, виконання: що дає кожне право
Кожен файл і каталог має власника та групу. Коли запитується доступ, Linux перевіряє права в такому порядку: спочатку власник, потім група, потім інші. Використовується лише перша відповідна категорія, тому права не поєднуються.
Кожна категорія може мати доступ на читання, запис і виконання. Для файлів читання означає перегляд вмісту, запис означає редагування, а виконання означає запуск файлу як скрипту чи програми. Для каталогів читання означає перегляд списку елементів, запис означає створення або видалення елементів, а виконання означає вхід до каталогу.
Останній пункт дуже важливий. Без права на виконання для каталогу користувач може бачити його назву, але все одно не зможе отримати доступ до файлів усередині. Саме тому перевірка прав має охоплювати весь шлях, а не лише кінцевий файл.
Як перевірити права доступу до файлів у Linux
Найпоширеніша команда для перевірки прав доступу до файлів у Linux:
ls -l
Типовий рядок виводу може виглядати так:
-rwxr-xr-- 1 deploy www-data 2048 May 8 app.sh
Перший символ показує тип файлу. Звичайний файл починається з -, а каталог - з d. Наступні дев'ять символів показують права для власника, групи та інших. У цьому прикладі rwx належить власнику, r-x належить групі, а r-- належить іншим.
Власник - deploy, а група - www-data. Це означає, що користувач deploy отримує права власника, а користувачі групи www-data отримують права групи. Усі інші отримують права для інших.
Як читати вивід ls -l, вісімкова та символьна нотація
Рядок прав завжди має однакову структуру. Перший символ визначає тип об'єкта. Наступні три символи належать власнику. Наступні три належать групі. Останні три належать іншим.
Наприклад:
drwxr-xr-x
Це каталог, оскільки рядок починається з d. Власник може читати його, записувати в нього та входити до нього. Група може читати його та входити до нього. Інші також можуть читати його та входити до нього, але не можуть створювати або видаляти в ньому файли.
Для звичайного файлу ви можете побачити:
-rw-r--r--
Це означає, що власник може читати та записувати, а група й інші можуть лише читати. Це поширений шаблон прав для публічних файлів сайту, статичних ресурсів і документів, які мають бути доступні для перегляду, але не для редагування всіма.
Права доступу в Linux можна записувати в символьній або вісімковій нотації. Символьна нотація використовує літери, як-от r, w і x. Вісімкова нотація використовує числа, де читання дорівнює 4, запис 2, а виконання 1.
Для кожного рівня доступу числа додаються. Читання й запис дають 6. Читання й виконання дають 5. Читання, запис і виконання дають 7. Відсутність прав дає 0. Значення на кшталт 755 означає, що власник отримує 7, група 5, а інші 5. У символьній формі це rwxr-xr-x. Значення на кшталт 644 означає, що власник може читати й записувати, а група та інші можуть лише читати.
Як змінити права доступу до файлів за допомогою chmod
Команда chmod змінює права доступу до файлів і каталогів. Вона підтримує два формати: символьний режим і числовий режим.
Символьний режим найкраще підходить для невеликих змін, наприклад, щоб додати скрипту право на виконання, не змінюючи нічого іншого. Числовий режим швидший, коли ви вже знаєте точне значення прав, наприклад 755 для каталогів або 644 для звичайних файлів.
Поширені значення прав: символьний режим (chmod u+x, chmod go-w), числовий режим (chmod 755, chmod 644)
Символьний режим використовує літери категорій, оператори та літери прав. Літери категорій: u для користувача, g для групи, o для інших і a для всіх. Оператори: + щоб додати право, - щоб прибрати право, і = щоб задати права точно.
Наприклад:
chmod u+x script.sh
Ця команда додає право на виконання для власника. Її часто використовують, коли скрипт існує, але його не можна запустити напряму.
Ще одна корисна команда:
chmod go-w file.txt
Вона прибирає право на запис у групи та інших. Це корисно, коли файл має залишатися доступним для читання, але редагувати його має лише власник.
Числовий режим задає повне значення прав однією командою. Наприклад:
chmod 755 script.sh
Це дозволяє власнику читати, записувати й виконувати файл, а групі та іншим читати й виконувати його.
Ще одна поширена команда:
chmod 644 index.html
Це дозволяє власнику редагувати файл, а групі та іншим лише читати його. Це поширене налаштування для файлів сайту.
|
Значення прав |
Типове застосування |
Що це означає |
Примітка щодо безпеки |
|
755 |
Каталоги та виконувані скрипти |
Власник може читати, записувати й виконувати. Група та інші можуть читати й виконувати |
Добре підходить для каталогів, які мають бути доступні, але не відкриті для запису всім |
|
644 |
Звичайні файли сайту, документи, публічні файли для читання |
Власник може читати й записувати. Група та інші можуть лише читати |
Хороше значення за замовчуванням для багатьох вебфайлів і статичних ресурсів |
|
777 |
Майже ніколи не підходить для продакшну |
Усі можуть читати, записувати й виконувати |
Небезпечно, оскільки будь-який користувач або процес може змінити елемент |
Значення 777 заслуговує на суворе попередження. Воно надає повний доступ усім у системі. На публічному сервері, у спільному середовищі або на Rocky Linux VPS це може дозволити вразливим скриптам, скомпрометованим користувачам або шкідливим процесам змінювати файли, які мають бути захищені. У більшості випадків chmod 777 не розв'язує справжню проблему. Ця команда лише приховує глибшу проблему з власником, членством у групі, службовими користувачами або налаштуваннями застосунку.
Зміна власника файлу за допомогою chown і chgrp
Права визначають, що можуть робити власник, група та інші. Належність файлу визначає, хто саме є його власником і групою. Саме тому chmod і chown розв'язують різні задачі.
Базовий синтаксис для зміни власника:
chown user file
Щоб змінити і власника, і групу, використайте:
chown user:group file
Щоб змінити лише групу, використайте:
chown :group file
Змінити лише групу також можна так:
chgrp group file
Наприклад:
chown deploy:www-data /var/www/example.com
Ця команда робить deploy власником, а www-data групою. У вебпроєкті це дає змогу користувачу для розгортання керувати файлами, водночас надаючи вебсерверу контрольований доступ через групу.
Рекурсивно змінити власника можна за допомогою:
chown -R user:group directory
Рекурсію слід використовувати обережно, оскільки вона змінює власника для кожного елемента всередині цільового каталогу. Перш ніж рекурсивно змінювати власника, перевірте шлях за допомогою pwd, перегляньте ціль за допомогою ls і переконайтеся, що помилково не застосовуєте зміни до широкого системного каталогу.
Практична різниця проста. Використовуйте chmod, коли файл належить правильному користувачу, але рівень доступу неправильний. Використовуйте chown або chgrp, коли файл належить не тому користувачу чи групі.
Рекурсивна зміна прав
Рекурсивна зміна прав застосовує правило до всього дерева каталогів. Вона корисна під час розгортання, міграцій, резервного копіювання та прибирання, але водночас це один із найшвидших способів створити проблеми з правами доступу.
Ризикована команда виглядає так:
chmod -R 755 /var/www/example.com
Вона застосовує 755 до кожного файлу й каталогу. Каталогам часто потрібне право на виконання, оскільки користувачі та служби мають входити до них, але звичайним файлам право на виконання зазвичай не потрібне. Якщо застосувати однакове значення до всього, звичайні файли можуть без причини стати виконуваними.
Безпечніший підхід - використати find і застосувати окремі права для каталогів і файлів:
find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;
Такий шаблон поширений у вебпроєктах. Каталоги залишаються доступними, звичайні файли залишаються доступними для читання, а змінювати вміст може лише власник. Коли застосунки працюють на серверах BlueVPS, така передбачувана структура також спрощує пошук несправностей, оскільки файли й каталоги із зрозумілої причини підпорядковуються різним правилам.
Рекурсивні команди завжди слід перевіряти перед виконанням. Невелика помилка в шляху може змінити тисячі файлів. Під час роботи з продакшн-системами краще перевірити ціль за допомогою find path -type f | head або find path -type d | head, перш ніж застосовувати зміни.
Спеціальні права: SUID, SGID і sticky bit
Linux також підтримує спеціальні біти прав, які змінюють звичайну поведінку доступу. Вони корисні в окремих випадках, але застосовувати їх слід обережно, особливо в продакшн-системах.
SUID дає змогу виконуваному файлу запускатися з правами власника файлу. Це може бути потужним інструментом, оскільки програма може виконувати дії, які поточний користувач зазвичай виконувати не може, тому SUID слід використовувати лише за наявності чіткої причини.
SGID працює з файлами й каталогами. Для файлів він запускає виконуваний файл із правами групи файлу. Для каталогів він робить так, що нові файли успадковують групу каталогу, що зручно для спільних папок проєктів.
Sticky bit часто використовують для спільних каталогів із правом запису, як-от /tmp. Він дозволяє користувачам створювати файли, але не дає їм видаляти файли, що належать іншим.
Поширені приклади:
chmod u+s file
chmod g+s directory
chmod +t directory
Спеціальні права не є повсякденними налаштуваннями для більшості файлів сайту. Їх найкраще використовувати, коли є конкретна вимога до контролю доступу, особливо в продакшн-системах.
Усунення помилок, пов'язаних із правами доступу
Помилки прав доступу не завжди спричинені кінцевим файлом. Причиною можуть бути власник, батьківські каталоги, службові користувачі, правила для SSH-ключів, параметри монтування файлової системи та системи безпеки, як-от SELinux або AppArmor.
Правильний процес пошуку несправностей починається з перевірки активного користувача, потім цільового файлу, а потім кожного батьківського каталогу в шляху. Це важливо, оскільки файл може мати правильні права, а один із батьківських каталогів усе одно блокуватиме доступ.
|
Помилка або симптом |
Імовірна причина |
Практичне рішення |
|
Активний користувач не має потрібного права на читання, запис або виконання |
Перевірте whoami, виконайте ls -l, а потім скоригуйте мінімально необхідне значення прав або власника |
|
|
Скрипт не запускається |
Файл не має права на виконання |
Виконайте chmod u+x script.sh, а потім запустіть його за допомогою ./script.sh |
|
Не вдається увійти до каталогу |
Каталог не має права на виконання |
Додайте право на виконання для потрібного користувача або групи |
|
403 Forbidden на вебсервері |
Користувач вебсервера не має доступу до файлів або батьківських каталогів |
Перевірте власника, доступ групи та права каталогів по всьому шляху |
|
Приватний SSH-ключ відхиляється |
Права на приватний ключ занадто відкриті |
Виконайте chmod 600 ~/.ssh/id_rsa і перевірте власника каталогу .ssh |
|
Застосунок не може завантажувати файли |
Службовий користувач не має права на запис у каталог завантажень |
Змініть власника або групу каталогу завантажень, а потім надайте право на запис лише там, де це потрібно |
|
Зміни через chmod не допомагають |
Неправильний власник, проблема з батьківським каталогом, SELinux, AppArmor або обмеження монтування |
Використайте namei -l path, перевірте службового користувача, а потім перегляньте політику безпеки, якщо вона ввімкнена |
На VPS у США такий пошук несправностей зазвичай виконується віддалено через SSH, тому чітка послідовність дій заощаджує час. Перевірте користувача, перегляньте цільовий файл, перевірте батьківські каталоги, переконайтеся в правильності власника, а потім застосуйте найвужчу безпечну зміну.
Коротка довідка: шпаргалка з chmod
Використовуйте цю довідкову таблицю, коли потрібно швидко пригадати команду для повсякденних завдань із правами доступу в Linux: від перевірки прав доступу до виправлення власника й застосування безпечних значень за замовчуванням для файлів і каталогів.
|
Завдання |
Команда |
|
Показати права доступу до файлу |
ls -l file |
|
Показати права по всьому шляху |
namei -l /path/to/file |
|
Зробити скрипт виконуваним для власника |
chmod u+x script.sh |
|
Прибрати право на запис у групи та інших |
chmod go-w file |
|
Задати стандартні права для файлу |
chmod 644 file |
|
Задати стандартні права для каталогу |
chmod 755 directory |
|
Захистити приватний SSH-ключ |
chmod 600 ~/.ssh/id_rsa |
|
Змінити власника файлу |
chown user file |
|
Змінити власника та групу |
chown user:group file |
|
Змінити лише групу |
chgrp group file |
|
Застосувати 755 лише до каталогів |
find path -type d -exec chmod 755 {} \; |
|
Застосувати 644 лише до файлів |
find path -type f -exec chmod 644 {} \; |
|
Додати sticky bit для спільного каталогу |
chmod +t directory |
|
Додати SGID для спільного каталогу проєкту |
chmod g+s directory |
Blog