Права доступу до файлів — фундаментальний механізм безпеки Linux. Неправильні права можуть призвести до витоку конфігів із паролями або дозволити зловмиснику виконувати код.
Числова нотація chmod
| Число | Права | Застосування |
|---|---|---|
| 777 | rwxrwxrwx | Ніколи! Небезпечно |
| 755 | rwxr-xr-x | Директорії, скрипти |
| 644 | rw-r--r-- | Файли HTML, PHP |
| 600 | rw------- | Приватні ключі, конфіги |
| 400 | r-------- | Лише читання власником |
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;
chmod u+x script.sh
chmod g-w config.php
chown -R www-data:www-data /var/www/site/
Символьна нотація і типові помилки
Символьний запис змінює права відносно поточних, а не задає їх заново цілком: chmod u+x додає право на виконання власнику, не чіпаючи права групи та інших. Це зручніше за числову нотацію, коли потрібно змінити один біт, не з'ясовуючи заздалегідь поточне значення решти.
Літери u, g, o та a означають власника (user), групу (group), інших (others) і всіх одразу (all); знаки +, - та = додають, прибирають або задають права точно. Наприклад, chmod go=r файл задасть групі та іншим рівно право на читання, яким би не було попереднє значення.
Помилка: chmod -R 777 як швидке рішення
Рекурсивний 777 на весь каталог сайту «щоб нарешті запрацювало» відкриває запис у файли будь-якому користувачу системи, включно з веб-сервером інших сайтів на тому самому хостингу і будь-яким процесом, що отримає доступ до системи. Правильний шлях — знайти, кому реально не вистачає прав (зазвичай це власник процесу веб-сервера), і видати права точково через chown або ACL, а не всім підряд.
Помилка: однакові права для файлів і каталогів
Право на виконання (x) у каталогу означає право заходити всередину і відкривати файли за іменем — це не те саме, що запуск програми, як для файлу. Каталог із правами 644 замість 755 не дає зайти в нього навіть за правильних прав на файли всередині, а файл зі скриптом із правами 755, коли потрібно було 644, дозволяє його запуск, якщо веб-сервер налаштований виконувати файли за розширенням.
Спеціальні біти: SUID, SGID, Sticky
# SUID — запуск із правами власника файлу
chmod u+s /usr/bin/program # chmod 4755
# ls: -rwsr-xr-x
# SGID — успадкування групи директорії
chmod g+s /shared/dir # chmod 2755
# Sticky bit — лише власник видаляє файл
chmod +t /tmp # chmod 1777
# ls: drwxrwxrwt
# Знайти SUID-файли (потенційна загроза)
find / -perm -4000 -type f 2>/dev/null
ACL — розширені права
apt install acl -y
setfacl -m u:deploy:rw /var/www/config.php
setfacl -Rm g:devteam:rwx /var/www/project/
getfacl /var/www/config.php
setfacl -b /var/www/config.php # Видалити ACL
chmod чи ACL: що обрати
| Завдання | Звичайний chmod/chown | ACL |
|---|---|---|
| Один власник і одна група | Достатньо | Надлишково |
| Доступ кільком користувачам із різними правами до одного файлу | Не виражається | Підходить — окремий запис на кожного |
| Права за замовчуванням для нових файлів у спільному каталозі | Лише через SGID на групу | Default ACL задає точні права одразу кільком сутностям |
Коли ACL не спрацює
- Файлова система змонтована без опції
acl— більшість сучасних ext4 вмикають її за замовчуванням, але старі записи в/etc/fstabабо мережеві монтування можуть її не задавати явно. - Деякі мережеві файлові системи і старі версії NFS підтримують ACL обмежено або не підтримують зовсім — права застосовуються лише на рівні звичайного chmod.
- Архіватори та інструменти копіювання без спеціальних прапорців (наприклад, звичайний
cpбез--preserveв окремих випадках) можуть не переносити ACL разом із файлом — перевіряйтеgetfaclпісля перенесення важливих файлів на нове місце.
Перевірка результату
- Виконайте
stat -c "%a %U %G" /var/www/site/config.php— числові права і власник мають збігатися з тим, що ви задавали. - Для ACL виконайте
getfacl файлі переконайтеся, що потрібний записuser:чиgroup:присутній у виводі. - Спробуйте зайти під непривілейованим користувачем і прочитати файл із правами
600від іншого власника — доступ має бути заборонений. - Після рекурсивної зміни прав перевірте вибірково кілька файлів і каталогів через
ls -la, а не лише каталог верхнього рівня — рекурсивні команди інколи зупиняються на файлах із нестандартними іменами.
Права файлів — лише один рівень захисту сервера; спостереження за тим, хто і коли їх змінював, розбирає стаття аудит подій через auditd, а додаткове розмежування доступу на рівні процесів — налаштування SELinux і AppArmor.