Система Permission з самого початку

Система Permission з самого початку – ITEDU Blog

Будь-яка операційна система має контролювати, які користувачі чи сервіси володіють доступом до даних, а які — ні. У Linux за це відповідає підсистема дискреційного керування доступом (Discretionary Access Control). Вона визначає, хто має право читати конфігураційні файли, запускати скрипти чи змінювати вміст каталогів.

З цією системою найчастіше стикаються під час виникнення помилок «Permission denied». Проте замість точкового налаштування прав інженери-початківці іноді використовують команду chmod 777, яка повністю відкриває об’єкт для всіх у системі. Це створює серйозні вразливості в безпеці інфраструктури.

То як працювати із системою permissions в Linux? Погнали розбиратись.

Хто і що контролює?

В основі моделі безпеки Linux лежить взаємодія між суб’єктом (тим, хто виконує дію) та об’єктом (над яким дію виконують). Будь-яка операція оцінюється за двома параметрами: до якої категорії належить поточний користувач і яку саме дію він намагається вчинити.

Категорії користувачів (суб’єкти)

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

  1. u (User / Owner) — власник об’єкта. Зазвичай це користувач, який його створив. Власник має першочергове право змінювати конфігурацію доступу до цього файлу.
  2. g (Group) — група користувачів. Набір облікових записів, об’єднаних у систему для надання їм однакового рівня доступу. Один файл може належати тільки одній групі одночасно.
  3. o (Others) — всі інші. Користувачі системи, які не є власниками файлу і не входять до закріпленої за ним групи.

a (All) — службове позначення, що об’єднує всі три категорії (u + g + o) для одночасного керування ними.

Типи дій (об’єкти)

Для кожної з трьох категорій користувачів можна налаштувати три базові операції, які позначаються символами r, w, x:

  • r (read) — читання. Дозволяє переглядати вміст файлу.
  • w (write) — запис. Дозволяє змінювати, редагувати або видаляти дані.
  • x (execute) — виконання. Необхідне для запуска файлу, якщо він є програмою або командним скриптом.

Як читати права доступу

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

Базовий перегляд: команда ls -l

Найчастіше для перевірки прав використовують команду ls із прапорцем -l (long listing format). Вона виводить детальний список об’єктів у каталозі.

ls -l script.sh
-rw-r--r-- 1 admin devops 424 May 24 12:00 script.sh

Найважливішою частиною цього виводу є перший блок із 10 символів (-rw-r--r--). Він чітко розділений на чотири зони:

  1. Тип об’єкта (1-й символ)
    Показує, чим є цей об’єкт для системи. Найпоширеніші варіанти: «-» означає звичайний файл, а «d» (directory) — директорію.
  2. Права власника (2, 3, 4 символи)
    У нашому прикладі це «rw-». Це означає, що користувач-власник може читати (r) та змінювати (w) файл, але не може запускати його як скрипт (-).
  3. Права групи (5, 6, 7 символи)
    Значення «r--» показує, що учасники групи, за якою закріплений файл, мають доступ лише на читання.
  4. Права інших користувачів (8, 9, 10 символи)
    Значення «r--» дозволяє всім іншим обліковим записам у системі лише читати цей файл.

Наступні стовпці виводу надають супутню інформацію:

  • 1 — кількість hard links на об’єкт;
  • admin — обліковий запис користувача-власника;
  • devops — назва групи, якій належить файл;
  • 424 — розмір файлу в байтах;
  • May 24 12:00 — дата й час останньої модифікації вмісту.

Глибокий аналіз: команда stat

Команда ls -l зручна, але вона показує права лише у символьному вигляді. Якщо вам потрібно дізнатися точний числовий (октальний) код прав або перевірити метадані, використовуйте утиліту stat:

stat script.sh

У виводі цієї команди зверніть увагу на рядок Access

Access: (0644/-rw-r--r--) Uid: ( 1000/ admin) Gid: ( 1001/ devops)

Вона відразу показує, що права файлу відповідають числу 0644. Також stat виводить точний час трьох важливих подій (timestamps):

  • Access (atime): коли файл востаннє відкривали для читання.
  • Modify (mtime): коли востаннє змінювався сам вміст файлу.
  • Change (ctime): коли востаннє змінювалися метадані або права доступу.

Пошук блокувань доступу: команда namei

У Linux часто трапляється ситуація: ви дали повні права на файл конкретному сервісу, але він усе одно повертає помилку «Permission denied». Причина криється в тому, що для доступу до файлу процес повинен мати право пройти крізь усі батьківські теки. Якщо бодай на одному рівні вище доступ закритий, файл залишиться недосяжним.

Щоб не перевіряти кожну теку вручную за допомогою ls, використовуйте команду namei з прапорцем -l:

namei -l /var/www/html/index.php

Вивід команди наочно покаже всю структуру шляху:

f: /var/www/html/index.php drwxr-xr-x root root / drwxr-xr-x root root var drwxr-xr-x root root www drwxr-x--- root root html -rw-r--r-- root root index.php

Робота з командою chmod 

Для зміни прав доступу до файлів та директорій використовується утиліта chmod (Change Mode). Модифікувати права можна двома способами: символьним (за допомогою літерних позначень) або абсолютним (використовуючи вісімкову систему числення).

Символьний режим

Цей метод зручний, коли потрібно змінити конкретний біт безпеки для певної категорії користувачів, не зачіпаючи інші налаштування файлу. Команда будується за чіткою схемою: chmod [Категорія] [Оператор] [Право] [Шлях_до_об'єкта].

Для побудови команди використовуються такі оператори:

  • + — додати вказане право;
  • - — забрати вказане право;
  • = — встановити виключно вказані права, анулювавши всі попередні значення для цієї категорії.

Приклади:

# Додати право на виконання (x) для категорії «інші» (o) chmod o+x script.sh 
# Забрати право на запис (w) у групи (g) та інших користувачів (o) chmod go-w config.txt
# Призначити власнику (u) права на читання та запис, повністю очистивши права для групи та інших chmod u=rw,go= secret.dat

Абсолютний режим 

В цьому режимі вся матриця прав доступу записується у вигляді тризначного числа. Кожна цифра цього числа відповідає за свій клас користувачів: перша — за власника (u), друга — за групу (g), третя — за інших (o).

В основі цього режиму лежить проста математична відповідність, де кожен тип прав має свою сталу цифрову вагу:

  • Read (r) = 4
  • Write (w) = 2
  • Execute (x) = 1
  • No permissions (-) = 0

Ці числа обрані тому, що вони є степенями двійки. Це дозволяє будь-якій комбінації прав мати унікальну суму. Наприклад, отримати суму 6 можна лише одним шляхом — додавши 4 (читання) та 2 (запис). Інших варіантів у цій системі немає.

Розрахунок комбінацій прав:

  • 4 + 2 + 1 = 7 — повний доступ (rwx)
  • 4 + 2 + 0 = 6 — читання та запис (rw-)
  • 4 + 0 + 1 = 5 — читання та виконання (r-x)
  • 4 + 0 + 0 = 4 — тільки читання (r--)
  • 0 + 0 + 0 = 0 — доступ повністю закритий (---)

Приклад застосування:Якщо вам потрібно встановити права, де власник може робити все (rwx = 7), група може лише читати та запускати (r-x = 5), а всі інші не мають жодного доступу (--- = 0), команда виглядатиме так:

chmod 750 deploy.sh

Різниця між правами для файлів та директорій 

Одна з найпоширеніших помилок — вважати, що біти rwx працюють однаково як для файлів, так і для тек. У Linux директорія — це особливий тип файлу, який містить список імен об’єктів, що розташовані всередині неї, та їхні системні ідентифікатори (inodes).

Через таку архітектуру логіка базових прав суттєво змінюється залежно від типу об’єкта.

Біт Що означає для файлуЩо означає для директорії
r (Read) Дозволяє читати вміст (наприклад, відкрити текстовий файл у nano або вивести його в консоль через cat)Дозволяє отримати список об’єктів у теці за допомогою команди ls. Без цього права ви не дізнаєтесь, що лежить у каталозі 
w (Write) Дозволяє змінювати вміст (редагувати текст, дописувати логи, перезаписувати дані або очищувати файл) Дозволяє створювати, видаляти та перейменовувати будь-які файли всередині цієї теки
x (Execute) Дозволяє запускати файл на виконання (якщо це компільована програма чи виконуваний скрипт автоматизації) Дозволяє увійти всередину теки за допомогою команди cd та звернутися до метаданих об’єктів у ній 

(!) Важливо: право запису (w) на директорію контролює її структуру (список імен файлів), а не вміст об’єктів усередині.

Якщо файл production.env має права 000 (доступ закритий для всіх), але лежить у теці з правами rwx для вашого користувача, ви не зможете його прочитати чи змінити, але зможете безперешкодно повністю видалити або перейменувати. 

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

Спеціальні права (SUID, SGID, Sticky Bit) та утиліта chown 

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

Set User ID

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

  • Приклад: утиліта passwd, яка дозволяє користувачам змінювати свій пароль. Щоб записати новий пароль, програма має внести зміни у файл /etc/shadow, куди звичайному користувачу доступ повністю закритий. Завдяки встановленому біту SUID, утиліта passwd під час роботи отримує права root і успішно оновлює файл.
  • Символьний вигляд: замінює x у секції користувача на літеру s (наприклад, -rwsr-xr-x).
  • Встановлення: chmod u+s program (або додавання цифри 4 на початку октального коду: chmod 4755).

Set Group ID та керування власниками через chown

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

Якщо на теку встановити SGID, то будь-який новий файл, створений всередині неї, автоматично успадкує групу-власника цієї теки, а не первинну групу користувача, який цей файл створив.

Тут стає в пригоді утиліта chown (Change Owner), яка дозволяє налаштувати правильних власників перед увімкненням спеціальних прав. Вона вимагає прав суперкористувача (sudo).

Приклад: Створення спільної директорії /var/www/html/project для команди розробників, що входять до групи deployers:

# 1. Змінюємо власника та групу для теки (через двокрапку користувач:група) sudo chown -R root:deployers /var/www/html/project 
# Прапорець -R означає рекурсивно — зміни застосуються до всіх вкладених файлів і тек
# 2. Встановлюємо SGID на директорію chmod g+s /var/www/html/project

Тепер, коли користувач alex (що входить до групи deployers) створить всередині файл index.php, цей файл автоматично належатиме групі deployers, і колеги по команді зможуть відразу його редагувати.

  • Символьний вигляд: замінює x у секції групи на літеру s (наприклад, drwxrwsr-x).
  • Встановлення: chmod g+s directory (або додавання цифри 2 на початку октального коду: chmod 2775).

Sticky Bit

Цей біт використовується для директорій, щоб захистити файли від випадкового або навмисного видалення іншими користувачами. Якщо на теці стоїть Sticky Bit, видалити або перейменувати файл всередині неї може тільки безпосередній власник цього файлу або користувач root. Навіть якщо інші користувачі мають права запису (w) на саму теку, вони не зможуть зачепити чужі дані.

  • Приклад: системна тека для тимчасових файлів /tmp. Туди мають право писати всі сервіси та користувачі системи, але завдяки липкому біту користувач nginx ніяк не зможе видалити або пошкодити тимчасові файли користувача mysql.
  • Символьний вигляд: замінює x у секції інших користувачів на літеру t (наприклад, drwxrwxrwt).
  • Встановлення: chmod +t directory (або додавання цифри 1 на початку октального коду: chmod 1777).

Висновки

Робота з правами доступу в Linux — це не пошук тимчасових рішень за допомогою chmod 777, а точкове налаштування балансу між доступністю та безпекою інфраструктури.

Якщо ви хочете впевнено працювати з терміналом, розбиратися в архітектурі Linux та готуєтесь до роботи в DevOps чи системному адмініструванні, рекомендуємо звернути увагу на курс Адміністрування Linux. Базовий рівень від ITEDU. Він допоможе структурувати знання та перейти від теорії до реальних інфраструктурних завдань.

А для тих, хто тільки починає свій шлях в IT і хоче опанувати командний рядок з нуля, чудовим стартом стане курс Адміністрування Linux для новачків.

Залишити відповідь

Дякуємо, що поділились